21
In $Babelfish habe ich eine kleine Korrektur vorgenommen, auf gd-ie (eine Variante, um irisches Gälisch zu bezeichnen) muß natürlich vor gd (schottisches Gälisch) geprüft werden.
Es war ziemlich zeitraubend, alles so umzuformatieren, daß es den Ansprüchen in deinem Forum einigermaßen entspricht. Aber falls ich dafür erfahre, was da schließlich noch schiefgelaufen ist, dann hat sich das gelohnt.
Ranma
$Babelfish=array(array('中文 (繁體/正字)','pu','zh-tw','zh-hk','zh-hant','zh-cht'),array('中文 (简体)','cn','zh-cn','zh-sg','zh-hans','zh- chs'),array('Ελληνικά','el'),array('Magyar','hu'),array('Íslenska','is'),array('Bahasia Indonesia','id','in'),array('Kalaallisut','kl'),array('ᐃᓄᒃᑎᑐᑦ','iu'),array('Català','ca'),array('العربية','ar'),array('עִבְרִית','he'),array('Gaeilge','ga','gd- ie'),array('Gàidhlig','gd'),array('Italiano','it'),array(' 日本語','ja','jp'),array('韓國語/朝鮮語 ','ko'),array('Latviešu','lv'),array('Lietuvių','lt'),array('Македонски','mk'),array('Malti','mt'),array('Norsk','no','nn','nb'),array(' ພາສາລາວ','lo'),array('کوردی','ku'),array('ภาษา ไทย','th'),array('ქართული','ka'),array('Sámegiella','sz'),array('Slovenščina','sl'),array('Slovenčina','sk'),array('Српски','sr'),array('Русский','ru'),array('Suomi','fi'),array('Français','fr'),array('Bosanski','bs'),array('Беларуская','be'),array('Română','ro'),array('Português','pt'),array('Polski','pl'),array('Svenska','sv'),array('Türkçe','tr'),array('Українська','uk'),array('Nederlands','nl'),array('Eesti','et'),array('Български','bg'),array('Euskara','eu'),array('Shqip','sq'),array('Hrvatski','hr'),array('Čeština','cs','cz'),array('Dansk','da'),array('اردو','ur'),array('Tiếng Việt','vi'),array('יידיש','yi','ji'),array('Español','es'),array('lingua latina','la'),array('فارسی','fa'),array('English','en'),array('Deutsch','de'));
// Außer einer kleinen Korrektur der gleiche zweidimensionale Array
// wie in Beitrag #1.
if(!isset($_SESSION['language'])):
$short=array(); $long=array();
// meiner Erfahrung nach funktionieren Arrays einfach nicht, wenn man sie nicht vorformatiert.
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])):
foreach($Babelfish as $Sprache):
$part=$Sprache;
// diese Variable (immernoch ein Array) wird mit unterschiedlichen Indizes gebraucht.
$dummy0=array_shift($part);
// schon sind die Indizes unterschiedlich, der Eigenname der Sprache ist nicht mehr
// in $part, wo nur auf die Kürzel geprüft wird.
$test=FALSE;
foreach($part as $code):
if(preg_match('@(\W|^)'.$code.'@ismuU',$_SERVER['HTTP_ACCEPT_LANGUAGE'])):
$test=TRUE;
$where=strpos($_SERVER['HTTP_ACCEPT_LANGUAGE'],$code);
$long[$where]=$Sprache[0];
$short[$where]=$Sprache[1];
endif;
endforeach;
// Das war das Suchen nach Treffern mittels einem Regulärem Ausdruck.
endforeach;
if(preg_match('@(\W|^)zh@ismuU',$_SERVER['HTTP_ACCEPT_LANGUAGE'])and!in_array('cn',$short)and!in_array('pu',$short)):
$long[strpos($_SERVER['HTTP_ACCEPT_LANGUAGE'],'zh')]='中文 (繁體/正字)';$short[strpos($_SERVER['HTTP_ACCEPT_LANGUAGE'],'zh')]='pu';$long[strpos($_SERVER['HTTP_ACCEPT_LANGUAGE'],'zh')+1]='中文 (简体)';$short[strpos($_SERVER['HTTP_ACCEPT_LANGUAGE'],'zh')+1]='cn';
endif;
// Das Kürzel zh ist nicht eindeutig, sondern kann sowohl auf traditionelles als
// auch auf vereinfachtes Chinesisch verweisen. Jetzt sind zwei Einträge daraus
// geworden. Der Index für den zweiten ließ sich problemlos um eines hochzählen,
// weil zh zwei Zeichen lang ist.
else:
$long[0]='English';
$short[0]='en';
endif;
// Falls die Umgebungsvariable garnicht erst gesetzt ist, gehen wir mal davon aus,
// daß sich das um einen Ami handeln muß, der nicht weiß, daß es außerhalb
// Nordamerikas noch andere Gegenden mit anderen Kulturen und Sprachen gibt.
ksort($short); ksort($long);
// Komischerweise funktioniert die Sortierung nur mit ksort(), obwohl es sich eigentlich
// weiterhin um numerische Arrays handeln sollte.
$prefered=array(array(),array()); $alltogether=array(array(),array());
// am besten gleich zweidimensional vorformatiert, um keine bösen Überraschungen zu erleben.
$prefered=array_map(NULL,$long,$short);
// aus zwei eindimensionalen Arrays wird ein zweidimensionales gemacht.
// Bis hierhin war es relativ einfach.
$prefered_assoc=array(); $Babelfish_assoc=array(); $without_assoc=array(); $alltogether_assoc=array();
for($i=1;$i<5;$i++):
${'dummy'.$i}=array();
endfor;
// vorformatieren von Arrays ist echt wichtig.
foreach($Babelfish as $part):
$dummy1[]=$part[0];
$dummy2[]=$part[1];
endforeach;
// Zerlegung des zweidimensionalen Arrays in zwei eindimensionale Arrays.
foreach($prefered as $part):
$dummy3[]=$part[0];
$dummy4[]=$part[1];
endforeach;
// Das Gleiche. Auf den ersten Blick könnte es so aussehen als wären $dummy3 und $dummy4
// gleich $long und $short; die Werte sind zwar gleich, aber die Indizes nicht.
// Die Indizes folgten bei $long und $short nicht direkt aufeinander, das ist aber
// notwendig, damit $without hintendran angehängt wird und nicht untergemischt.
$Babelfish_assoc=array_combine($dummy1,$dummy2);
$prefered_assoc=array_combine($dummy3,$dummy4);
// Umwandlungen in assoziative Arrays.
$without_assoc=array_diff_assoc($Babelfish_assoc,$prefered_assoc);
// Das geht. Zweidimensionale Arrays hätten sich nicht subtrahieren lassen.
$alltogether_assoc=array_merge($prefered_assoc,$without_assoc);
// Zwei der assoziativen Arrays aneinanderhängen. Schon fast das gewünschte Ergebnis.
$part=array_keys($alltogether_assoc);
// Die Schlüssel des vorläufigen Ergebnisses (das sind übrigens die Eigennamen der Sprachen)
// in ein eigenes Array abtrennen. Möglicherweise hätte es völlig ausgereicht, nur die
// Hilfsvariablen miteinander zu vereinen?
$alltogether_assoc=array_values($alltogether_assoc);
// Die Werte des vorläufigen Ergebnisses wieder numerisch indizieren.
$alltogether=array_map(NULL,$part,$alltogether_assoc);
// Die beiden eindimensionalen Arrays mit den beiden Teilen des vorläufigen Ergebnisses
// zu einem zweidimensionalem Array mit dem endgültigem Ergebnis zusammenfügen.
// Dadurch kann weiterhin in anderen Teilen des Skriptes wie bisher auf eine
// zweidimensionale Variable zugegriffen werden, so daß dort keine Änderungen
// erforderlich sind. Der Teil innerhalb des IF-Blocks (der ganz außenherum)
// funktioniert bis hierher.
$_SESSION['language']=array(array(),array());
// Das Vorformatieren von Arrays hat schon manches Problem gelöst, aber hier bringt
// es anscheinend nichts.
$_SESSION['language']=$alltogether;
// Damit nicht alles immer wieder durchlaufen werden muß, wird das Endergebnis in eine
// SESSION-Variable gepackt und mit dem IF-Block ganz außenherum abgefragt, ob die
// schon gesetzt ist. Das führt dazu, daß keine Auswahloptionen mehr angezeigt werden.
// Und zwar nachdem im Rest des Skriptes überall $_SESSION['language'] für $alltogether
// gesetzt wurde und zwar ausschließlich per copy&paste, damit sich nichtmal ein
// Tippfehler einschleichen konnte.
endif;
Es war ziemlich zeitraubend, alles so umzuformatieren, daß es den Ansprüchen in deinem Forum einigermaßen entspricht. Aber falls ich dafür erfahre, was da schließlich noch schiefgelaufen ist, dann hat sich das gelohnt.
Ranma