| 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);
/** Public language routes, flag switcher and safe SEO readiness. No API calls on public views. */
function p11_lang(): string {
$lang = strtolower((string)($_GET['lang'] ?? ''));
if (in_array($lang,['pl','en','de','es'],true)) return $lang;
$p = parse_url((string)($_SERVER['REQUEST_URI'] ?? '/'),PHP_URL_PATH) ?: '/';
if (preg_match('~^/(en|de|es)(?:/|$)~',$p,$m)) return $m[1];
if (function_exists('polana_lang')) {
$fromLegacy = polana_lang();
if (in_array($fromLegacy,['pl','en','de','es'],true)) return $fromLegacy;
}
return 'pl';
}
function p11_base_path(string $path): string {
$path = parse_url($path,PHP_URL_PATH) ?: '/';
$path = preg_replace('~^/(?:en|de|es)(?=/|$)~','',$path);
if (!$path || $path==='') $path='/';
$aliases = ['/chef'=>'/andrzej-polan','/contact'=>'/kontakt','/reservation'=>'/rezerwacja',
'/privacy'=>'/polityka-prywatnosci','/allergens'=>'/alergeny','/gallery'=>'/galeria',
'/cooperation'=>'/wspolpraca','/newsletter'=>'/newsletter.php','/reviews'=>'/opinie',
'/review'=>'/opinia'];
return $aliases[$path]??$path;
}
function p11_path(string $path,string $lang): string {
$rawQuery=(string)(parse_url($path,PHP_URL_QUERY) ?: '');
parse_str($rawQuery,$params);
$suffix=isset($params['kind']) && in_array($params['kind'],['food','soft','wine'],true) ? '?kind='.rawurlencode((string)$params['kind']) : '';
$base=p11_base_path($path);
if($lang==='pl')return $base.$suffix;
if(!in_array($lang,['en','de','es'],true))$lang='pl';
if($lang==='pl')return $base.$suffix;
$aliases=['/andrzej-polan'=>'/chef','/kontakt'=>'/contact','/rezerwacja'=>'/reservation',
'/polityka-prywatnosci'=>'/privacy','/alergeny'=>'/allergens','/galeria'=>'/gallery',
'/wspolpraca'=>'/cooperation','/newsletter.php'=>'/newsletter',
'/opinie'=>'/reviews','/opinia'=>'/review'];
$base=$aliases[$base]??$base;
return '/'.$lang.($base==='/'?'/':$base).$suffix;
}
function p11_page_ready(string $path,string $lang): bool {
if($lang==='pl')return true;
if(!in_array($lang,['en','de','es'],true))return false;
$path=p11_base_path($path);
static $cache=[];
$key=$path.'|'.$lang;
if(array_key_exists($key,$cache))return $cache[$key];
if(preg_match('~^/blog/([a-z0-9-]+)$~',$path,$m)){
// During sitemap generation prefetch all published blog language readiness once.
static $blogReady=null;
if($blogReady===null){
$blogReady=[];
try{
$all=db()->query("SELECT slug,title_en,content_en,title_de,content_de,title_es,content_es FROM blog_posts WHERE status='published' AND publish_at<=NOW() AND publish_at IS NOT NULL")->fetchAll(PDO::FETCH_ASSOC);
foreach($all as $article){
foreach(['en','de','es'] as $code){
$blogReady[$article['slug'].'|'.$code]=trim((string)($article['title_'.$code]??''))!=='' && trim((string)($article['content_'.$code]??''))!=='';
}
}
}catch(Throwable $e){error_log('P11 blog readiness: '.$e->getMessage());}
}
return $cache[$key]=(bool)($blogReady[$m[1].'|'.$lang]??false);
}
// Static pages, including blog index, require explicit full-page editorial review.
try{
$q=db()->prepare('SELECT ready FROM polana_v11_page_locales WHERE path=? AND lang=? LIMIT 1');
$q->execute([$path,$lang]);return $cache[$key]=((int)$q->fetchColumn()===1);
}catch(Throwable $e){return $cache[$key]=false;}
}
function p11_hreflang(string $canonicalPath): array {
$path=p11_base_path($canonicalPath);
$out=['pl'=>site_url(p11_path($path,'pl'))];
foreach(['en','de','es'] as $lang)if(p11_page_ready($path,$lang))$out[$lang]=site_url(p11_path($path,$lang));
return $out;
}
function p11_render_switcher(): void {
$url=(string)($_SERVER['REQUEST_URI']??'/');
$base=p11_base_path($url);$selected=p11_lang();
$langNames=['pl'=>'Polski','en'=>'English','de'=>'Deutsch','es'=>'Español'];
$images=['pl'=>'pl.svg','en'=>'gb.svg','de'=>'de.svg','es'=>'es.svg'];
$query=parse_url($url,PHP_URL_QUERY);
parse_str((string)$query,$q);
$kind=isset($q['kind']) && in_array($q['kind'],['food','wine','soft'],true)?'?kind='.rawurlencode((string)$q['kind']):'';
echo '<div class="p11-language-bar" role="navigation" aria-label="Wybierz język strony">';
foreach($langNames as $lang=>$label){
$path=p11_path($base,$lang);
if(preg_match('~^/blog/([a-z0-9-]+)$~',$base) && !p11_page_ready($base,$lang) && $lang!=='pl')$path=p11_path('/blog',$lang);
$href=$path.$kind;
echo '<a class="p11-lang '.($selected===$lang?'is-active':'').'" href="'.htmlspecialchars($href,ENT_QUOTES,'UTF-8').'" lang="'.$lang.'" hreflang="'.$lang.'" aria-label="'.htmlspecialchars($label,ENT_QUOTES,'UTF-8').'" title="'.htmlspecialchars($label,ENT_QUOTES,'UTF-8').'"'.($selected===$lang?' aria-current="page"':'').'><img src="/assets/flags/'.$images[$lang].'" width="24" height="16" alt=""><span>'.$langNames[$lang].'</span></a>';
}
echo '</div>';
}
/** Curated public meta text. Dynamic blog articles retain their own translated meta. */
function p11_meta(string $path,string $lang): ?array {
$key=p11_base_path($path);
if($lang==='pl'||!in_array($lang,['en','de','es'],true))return null;
$words=[
'/'=>[
'en'=>['Polish Restaurant in Kraków Kazimierz | Moja Polana Smaków','Discover seasonal Polish flavours at Moja Polana Smaków, Andrzej Polan’s restaurant in Kraków’s Kazimierz district.'],
'de'=>['Polnisches Restaurant in Krakau Kazimierz | Moja Polana Smaków','Entdecken Sie saisonale polnische Küche im Restaurant Moja Polana Smaków von Andrzej Polan im Krakauer Stadtteil Kazimierz.'],
'es'=>['Restaurante polaco en Kazimierz, Cracovia | Moja Polana Smaków','Descubre la cocina polaca de temporada en Moja Polana Smaków, el restaurante de Andrzej Polan en Kazimierz, Cracovia.']],
'/menu'=>[
'en'=>['Restaurant Menu in Kraków | Moja Polana Smaków','Explore current seasonal dishes, soft drinks and wines at Moja Polana Smaków in Kraków.'],
'de'=>['Speisekarte in Krakau | Moja Polana Smaków','Entdecken Sie saisonale Gerichte, alkoholfreie Getränke und Weine im Restaurant Moja Polana Smaków in Krakau.'],
'es'=>['Carta del restaurante en Cracovia | Moja Polana Smaków','Consulta los platos de temporada, bebidas sin alcohol y vinos de Moja Polana Smaków en Cracovia.']],
'/andrzej-polan'=>[
'en'=>['Andrzej Polan | Chef of Moja Polana Smaków','Get to know chef Andrzej Polan and the philosophy behind the seasonal Polish cuisine at Moja Polana Smaków.'],
'de'=>['Andrzej Polan | Küchenchef von Moja Polana Smaków','Lernen Sie Andrzej Polan und seine Leidenschaft für saisonale polnische Küche kennen.'],
'es'=>['Andrzej Polan | Chef de Moja Polana Smaków','Conoce al chef Andrzej Polan y su filosofía de cocina polaca de temporada.']],
'/kontakt'=>[
'en'=>['Contact and Location | Moja Polana Smaków, Kraków','Find Moja Polana Smaków at Bożego Ciała 15 in Kraków’s Kazimierz district and get in touch.'],
'de'=>['Kontakt und Anfahrt | Moja Polana Smaków Krakau','Besuchen Sie Moja Polana Smaków in der Bożego Ciała 15 im Krakauer Stadtteil Kazimierz.'],
'es'=>['Contacto y ubicación | Moja Polana Smaków Cracovia','Encuentra Moja Polana Smaków en Bożego Ciała 15, en el barrio de Kazimierz de Cracovia.']],
'/rezerwacja'=>[
'en'=>['Restaurant Reservations | Moja Polana Smaków','Request a table at Moja Polana Smaków, a Polish restaurant in Kraków’s Kazimierz district.'],
'de'=>['Tischreservierung | Moja Polana Smaków','Reservieren Sie einen Tisch im Restaurant Moja Polana Smaków im Krakauer Stadtteil Kazimierz.'],
'es'=>['Reservas de mesa | Moja Polana Smaków','Solicita una mesa en Moja Polana Smaków, restaurante de cocina polaca en Kazimierz, Cracovia.']],
'/galeria'=>[
'en'=>['Photo Gallery | Moja Polana Smaków','See photos from Moja Polana Smaków, its seasonal dishes and restaurant atmosphere in Kraków.'],
'de'=>['Bildergalerie | Moja Polana Smaków','Entdecken Sie Fotos der Gerichte und Atmosphäre von Moja Polana Smaków in Krakau.'],
'es'=>['Galería de fotos | Moja Polana Smaków','Descubre fotos de los platos y el ambiente de Moja Polana Smaków en Cracovia.']],
'/alergeny'=>[
'en'=>['Ingredients and Allergens | Moja Polana Smaków','Information about ingredients and allergens in dishes served at Moja Polana Smaków.'],
'de'=>['Zutaten und Allergene | Moja Polana Smaków','Informationen über Zutaten und Allergene in den Gerichten von Moja Polana Smaków.'],
'es'=>['Ingredientes y alérgenos | Moja Polana Smaków','Información sobre ingredientes y alérgenos de los platos de Moja Polana Smaków.']],
'/polityka-prywatnosci'=>[
'en'=>['Privacy Policy | Moja Polana Smaków','Read the privacy policy and information about personal data processing at Moja Polana Smaków.'],
'de'=>['Datenschutzerklärung | Moja Polana Smaków','Lesen Sie unsere Datenschutzerklärung und Informationen zur Verarbeitung personenbezogener Daten.'],
'es'=>['Política de privacidad | Moja Polana Smaków','Consulta nuestra política de privacidad y el tratamiento de datos personales.']],
'/blog'=>[
'en'=>['Food and Kraków Kazimierz Blog | Moja Polana Smaków','Discover stories about Kraków Kazimierz, seasonal ingredients, Polish dishes and cooking at Moja Polana Smaków.'],
'de'=>['Kulinarischer Blog aus Krakau Kazimierz | Moja Polana Smaków','Geschichten über Kazimierz, saisonale Zutaten, polnische Gerichte und die Küche von Moja Polana Smaków.'],
'es'=>['Blog gastronómico de Kazimierz, Cracovia | Moja Polana Smaków','Historias de Kazimierz, ingredientes de temporada y cocina polaca de Moja Polana Smaków.']],
'/wspolpraca'=>[
'en'=>['Work With Us | Moja Polana Smaków','Learn about opportunities to collaborate with Moja Polana Smaków in Kraków.'],
'de'=>['Zusammenarbeit | Moja Polana Smaków','Erfahren Sie mehr über Möglichkeiten zur Zusammenarbeit mit Moja Polana Smaków in Krakau.'],
'es'=>['Colaboración | Moja Polana Smaków','Conoce las posibilidades de colaboración con Moja Polana Smaków en Cracovia.']]
];
$value=$words[$key][$lang]??null;
return $value?['title'=>$value[0],'description'=>$value[1]]:null;
}