| Server IP : 188.114.96.3 / Your IP : 216.73.216.143 Web Server : Apache System : Linux sv058.home.net.pl 6.8.2 husak_dirty_pages_fix #1 SMP PREEMPT_DYNAMIC Tue Apr 2 22:06:51 CEST 2024 x86_64 User : ( 3194769) PHP Version : 8.5.12 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : OFF Directory : /polana/includes/ |
Upload File : |
<?php
declare(strict_types=1);
/** POLANA V15 - language-consistent menu renderer. No translation on public GET requests. */
function p15_menu_lang(): string {
$path=(string)(parse_url((string)($_SERVER['REQUEST_URI']??'/'),PHP_URL_PATH)?:'/');
if(preg_match('~^/(en|de|es)(?:/|$)~',$path,$m))return $m[1];
$fromGet=strtolower((string)($_GET['lang']??''));
if(in_array($fromGet,['pl','en','de','es'],true))return $fromGet;
if(function_exists('p11_lang')) {
$l=p11_lang();if(in_array($l,['pl','en','de','es'],true))return $l;
}
if(function_exists('polana_lang')) {
$l=polana_lang();if(in_array($l,['pl','en','de','es'],true))return $l;
}
return 'pl';
}
function p15_menu_type(string $type): string {return in_array($type,['food','soft','wine'],true)?$type:'food';}
function p15_menu_type_label(string $type): string {
$labels=[
'pl'=>['food'=>'Dania','soft'=>'Napoje bezalkoholowe','wine'=>'Wina'],
'en'=>['food'=>'Food','soft'=>'Soft drinks','wine'=>'Wines'],
'de'=>['food'=>'Speisen','soft'=>'Alkoholfreie Getränke','wine'=>'Weine'],
'es'=>['food'=>'Platos','soft'=>'Bebidas sin alcohol','wine'=>'Vinos'],
];
return $labels[p15_menu_lang()][p15_menu_type($type)];
}
function p15_menu_url(string $route,string $kind='food'):string {
$lang=p15_menu_lang();$kind=p15_menu_type($kind);
if($lang!=='pl' && $route==='/alergeny')$route='/allergens';
$path=($lang==='pl'?'':'/'.$lang).$route;
return $path.'?kind='.rawurlencode($kind).'&lang='.rawurlencode($lang);
}
function p15_menu_text(array $record,string $field):string {
$base=trim((string)($record[$field]??''));
$lang=p15_menu_lang();if($lang==='pl')return $base;
$value=trim((string)($record[$field.'_'.$lang]??''));
// Never silently substitute EN for DE/ES. Until review, fallback to the actual Polish original.
return $value!==''?$value:$base;
}
function p15_menu_complete(array $categories,?string $language=null):bool {
$lang=$language??p15_menu_lang();if($lang==='pl')return true;
if(!in_array($lang,['en','de','es'],true))return false;
if(!$categories)return false;
$hasItems=false;
foreach($categories as $cat){
if(empty($cat['items']))continue;
$hasItems=true;
if(trim((string)($cat['name_'.$lang]??''))==='')return false;
foreach($cat['items'] as $item){
if(trim((string)($item['name_'.$lang]??''))==='')return false;
foreach(['description','allergens'] as $field){
if(trim((string)($item[$field]??''))!=='' && trim((string)($item[$field.'_'.$lang]??''))==='')return false;
}
}
}
return $hasItems;
}
function p15_active_menu(string $kind='food'): ?array {
$kind=p15_menu_type($kind);$today=date('Y-m-d');
$stmt=db()->prepare("SELECT * FROM menus WHERE menu_type=? AND status='published'
AND (valid_from IS NULL OR valid_from<=?) AND (valid_to IS NULL OR valid_to>=?)
ORDER BY COALESCE(valid_from,'1900-01-01') DESC,id DESC LIMIT 1");
$stmt->execute([$kind,$today,$today]);
$record=$stmt->fetch(PDO::FETCH_ASSOC);
// Same-kind fallback only; never display wine as food, or drinks as wine.
if($record)return $record;
$stmt=db()->prepare("SELECT * FROM menus WHERE menu_type=? AND status='published'
ORDER BY id DESC LIMIT 1");
$stmt->execute([$kind]);
return $stmt->fetch(PDO::FETCH_ASSOC)?:null;
}
function p15_menu_tabs(string $currentType='food',string $base='/menu'):void {
$type=p15_menu_type($currentType);
echo '<nav class="p15-menu-tabs" aria-label="'.htmlspecialchars(p15_menu_ui('Menu restauracji'),ENT_QUOTES,'UTF-8').'" style="display:flex;justify-content:center;flex-wrap:wrap;gap:9px;margin:15px auto 18px">';
foreach(['food','soft','wine'] as $kind){
$url=p15_menu_url($base,$kind);
$current=$kind===$type;
echo '<a href="'.htmlspecialchars($url,ENT_QUOTES,'UTF-8').'"'
.($current?' aria-current="page"':'')
.' style="padding:9px 13px;border-radius:22px;border:1px solid #a5a5a5;background:'.($current?'#9acd32':'#fff').';color:#111;font-weight:650;text-decoration:none">'
.htmlspecialchars(p15_menu_type_label($kind),ENT_QUOTES,'UTF-8').'</a>';
}
echo '</nav>';
}
function p15_menu_ui(string $pl):string {
$dict=[
'Aktualna karta'=>['en'=>'Current menu','de'=>'Aktuelle Speisekarte','es'=>'Carta actual'],
'Pokaż menu'=>['en'=>'View menu','de'=>'Speisekarte anzeigen','es'=>'Ver carta'],
'Składniki i alergeny'=>['en'=>'Ingredients and allergens','de'=>'Zutaten und Allergene','es'=>'Ingredientes y alérgenos'],
'Wersja tekstowa menu'=>['en'=>'Text version of the menu','de'=>'Speisekarte als Text','es'=>'Carta en texto'],
'Drukuj / zapisz PDF'=>['en'=>'Print / save PDF','de'=>'Drucken / als PDF speichern','es'=>'Imprimir / guardar PDF'],
'Menu restauracji'=>['en'=>'Restaurant menu','de'=>'Speisekarte','es'=>'Carta del restaurante'],
'Zamknij'=>['en'=>'Close','de'=>'Schließen','es'=>'Cerrar'],
'Wróć do menu'=>['en'=>'Back to menu','de'=>'Zurück zur Speisekarte','es'=>'Volver a la carta'],
'Składniki:'=>['en'=>'Ingredients:','de'=>'Zutaten:','es'=>'Ingredientes:'],
'Alergeny:'=>['en'=>'Allergens:','de'=>'Allergene:','es'=>'Alérgenos:'],
'Karta w przygotowaniu'=>['en'=>'Menu coming soon','de'=>'Speisekarte in Vorbereitung','es'=>'Carta en preparación'],
];
$lang=p15_menu_lang();return $dict[$pl][$lang]??$pl;
}