09. november 2003 - 22:55Der er
37 kommentarer og 3 løsninger
Gå til en bestemt index fil...afhængig af sprog
Jeg vil gerne lave et script der skal sende brugeren videre til den rigtige side afhængig af browser. Jeg havde forstillet mig noget i den stil...Men det virker ikke. Er det ikke noget der har et lign script ? Eller kan finde fejlen? <?php
country = PHP_SERVER["HTTP_ACCEPT_LANGUAGE"];
switch (country) { case da: $location="dansk/index.php"; break; case fr: $location="francais/index.php"; break; case en: $location="english_version/index.php"; break; case ge: $location="deutsch/index.php"; break; case sv: $location="svenska/index.php"; break; default: $location="english_version/index.php"; break; } ?>
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
og prøv evt al akkumulere en logfil med værdier fra PHP_SERVER["HTTP_ACCEPT_LANGUAGE"] jeg har set strenge længere end 2 bogstaver, fx: "en-uk" og "en-us"
flyt din php kode helt op øverst i filen så du ikke udskriver NOGETETSOMHELST før du har test om der skal redirectes.
og istedet for den der body kan du så skrive: header( "location: $location" ); exit(); // den exit() er vigtig. den forhindrer scriptet i at generere noget output førend headeren har fortalt broseren at der er en anden fil den skal have.
<body OnLoad=(location="<? echo $location?>");> skal erstattes af <body OnLoad="location.href='<? echo $location?>'">
Resten af de øvrige svar er også gode at overveje i din løsning, såsom $_SERVER['HTTP_ACCEPT_LANGUAGE'] og $ i country. jakoba rejser en interessant pointe med sin header(), men den kan kun bruges, såfremt der ikke er skrevet andet på siden endnu...
Og så skal du nok poste dit spørgsmål under Javascript ;-)
Næh, jeg har sagt noget mere. Hvis man nu har "xx"-sproget som første prioritet og "sv" som nummer 2, så skal man have den svenske i det eksempel der anføres her. Det gør du ikke, jakoba.
Jeg vil så forsvare mig med at alle de steder der står fx "en-uk,en;..." så plejer de 2 første bogstaver at være den mest generiske form sproget har. Der er danskere der laver en 'engelsk' version, men der er ikke mange der laver forkellige versioner for amerikanere og briter.
Jah, vi kan godt nøjes med de 2 første bogstaver her. Om der står color eller colour kan de vel leve med. Men hvad så med denne (som jeg netop har sat min browser til):
tjekkisk, dansk, engelsk i denne prioriterede rækkefølge.
Ja, bøvlet måske, og ikke mange bruger disse indstillinger, men skal vi tage lidt hensyn til slutbrugeren, når vi nu kan gøre det, så kan vi lige så godt gøre det ordentligt.
Ja der slår den så fejl. og brugeren kommer til a klikke på de vælge-sprog links der (forhåbenlig) er på defaultsiden for at komme over til et sprog han kan lide.
$country = substr( $countryarr[$i], 0, 2 ); // kun de 2 første bogstaver
switch ($country) { case "da": $location="dansk/index.php"; break; case "fr": $location="francais/index.php"; break; case "en": $location="english_version/index.php"; break; case "ge": $location="deutsch/index.php"; break; case "sv": $location="svenska/index.php"; break; // bemærk: default er fjernet herfra } $i++;
} //endwhile
if ( !isset( $location ) ) { // vi fandt ikke et ordentligt sprog $location="english_version/index.php"; // så sæt denne default }
header( "location " .$location ); // hent den side istedetfor exit();
// linien herunder er allersiste linie i filen. ingen html kode overhovedet ?>
OK, næsten det hele. det angivne format tyder på at brugeren kan prioritere sprogene så det sprog han helst vil have er det der nævnes sidst. men pokker om jeg gider. det må du selv vise os hvordan erik :-))
Er der egentlig ikke noget med, at man kan styre valg af sprog-filer direkte via Apache og så bare kalde sine filer noget med sproget - eksempelvis index.en.htm og index.dk.htm?
Hold da op, det var da dejligt at vågne op til alle de svar. Men problemet er bare at når jeg bruger øsningen (fra Jakoba) så sker der ingenting. Den går det igennem og viser bare en blank side... Hvorfor mon det nu?
switch ($country) { case "da": $location="dansk/index.php"; break; case "fr": $location="francais/index.php"; break; case "en": $location="english_version/index.php"; break; case "ge": $location="deutsch/index.php"; break; case "sv": $location="svenska/index.php"; break; default: echo "Her er fejlen!"; }
Sad lige og læste tråden, og kom så i tanker om, at jeg har lavet en klasse, der lige præcis kan bruges til det du efterlyser, comeback.
Jeg er godt klar over, at det er lidt meget kildekode, men til gengæld kan skal du ikke selv skrive andet end dette:
$ml = new JgMultiLanguage(); $ml->SetLanguages('en', 'da', 'fr', 'ge', 'sv'); $ml->SetIntelliLanguage('en', $_GET['lang']); // vil benytte 'en', hvis ikke der findes et match i HTTP_ACCEPT_LANGUAGE. Desuden kan brugeren overskrive alt ved at skrive fx. ?lang=da (osv.) $location = $ml->GetByLanguage('english_version', 'dansk', 'francais', 'deutsch', 'svenska'); header('Location: ' . $location . '/index.php');
Description: JgMultiLanguage is an object, which makes it easy to switch between languages. It contains functions to set languages to choose from, set chosen language and get data in the chosen language.
Installation: JgMultiLanguage can be used as-is. See "Required objects" for further information.
Required objects: JgBasics
Function description: Constructor: void JgMultiLanguage() The constructor will see if JgBasics is loaded.
Public functions: void SetLanguages(string languages1 [, string languagesn...]) SetLanguages() makes an array containing the languages passed to it. These are the languages, which can be used by the script. See SetIntelliLanguage() for more information on standard language names. string SetLanguage(string language) SetLanguage() will set the current language to the language passed to the function. Changes will take effect after the function is called. SetLanguage() returns the resulting language which is useful if the language chosen by the user is invalid. string SetIntelliLanguage([string language [, string forceLanguage]]) SetIntelliLanguage will try and match the HTTP-Accept-Language header with the available languages. Therefore it is important to use standardised language names in SetLanguages(). E.g.: 'en' for English, 'da' for Danish, 'en-us' for US English and so forth. This function will return the resulting language just like SetLanguage(). The optional language parameter will be used if no valid language is found in the HTTP-Accept-Language header. Optional parameter forceLanguage can be used to overwrite the HTTP-Accept-Language header and the language parameter. It is good practice to give the user an opportunity to do so, since HTTP-Accept-Language does not always fit the current user. mixed GetByLanguage(mixed arg1 [, mixed argn...]) GetByLanguage() is used to get any type of information in the language set in SetLanguage() or SetIntelliLanguage(). The arguments must be passed to this function in the same order as in SetLanguages() to get the expected result. This function will return the argument corresponding to the chosen language.
Private functions: boolean _IsValidLanguage(string language) This function returns true if the language string passed to it is valid - false otherwise. Valid means that the language is set in SetLanguages().
Example: $ml = new JgMultiLanguage(); $ml->SetLanguages('da', 'en', 'de', 'en-us');
// Set language from GET-var ('lang') $used_lang = $ml->SetLanguage($_GET['lang']); // ($used_lang now contains the resulting language - usefull if the language chosen by the user is invalid) print $ml->GetByLanguage('Dansk', 'English', 'Deutch', 'US English'); // Print text in chosen language ('Dansk' if $_GET['lang'] == 'da' etc.)
// Set language from GET-var ('lang') if set. Else; set language to 'de' (German) if no appropriate language is found in HTTP-Accept-Language $used_lang = $ml->SetIntelliLanguage('de', $_GET['lang']); // ($used_lang now contains the resulting language) print $ml->GetByLanguage('Dansk', 'English', 'Deutch', 'US English'); // Print text in chosen language
Change log: October 14th 2003: Functional version of JgMultiLanguage is made. October 15th 2003: SetLanguage() now returns the resulting language. array_search() replaced with array_flip() in SetLanguage(). October 16th 2003: SetIntelliLanguage() was added. This function will try and use HTTP-Accept-Language to set the language. October 17th 2003: Errors are now handled by Error() in JgBasics. The constructor will terminate the script if JgBasics is not loaded. JgMultiLanguage is properly documented with description, installation, function description and example.
To do: Nothing.
*/
Class JgMultiLanguage { var $mLanguages; // (array) Array containing languages var $mLanguageIndex; // (integer) Index of current language var $mNumLanguages; // (integer) Number of languages
function JgMultiLanguage() { if (class_exists('JgBasics') == false) { // Is JgBasics loaded? exit("<br />\n<b>Fatal error</b>: Required object: JgBasics was not found in <b>JgMultiLanguage</b> - script is terminated<br />\n"); // If not - terminate script and write an error } }
function SetLanguages() { $this->mNumLanguages = func_num_args(); // Number of languages if ($this->mNumLanguages > 0) { // At least one language must be defined $this->mLanguages = func_get_args(); // Make indexed array containing languages } else { JgBasics::Error('Fatal error', 'You must pass at least one language to <b>SetLanguages()</b>'); // Write error-message for missing language(s) } }
function SetLanguage($language) { if ($this->_IsValidLanguage($language) == true) { // Is the chosen language valid? $flipped_lang_array = array_flip($this->mLanguages); // Flip array to avoid use of array_search() $this->mLanguageIndex = $flipped_lang_array[$language]; // Set language-index } else { JgBasics::Error('Warning', 'Invalid language: "' . $language . '" in <b>SetLanguage()</b> (possibly caused by invalid language in GetIntelliLanguage()) - language set to default: "' . $this->mLanguages[0] . '"'); // Write warning for invalid language $this->mLanguageIndex = 0; // Set language-index to the default (first) language } return $this->mLanguages[$this->mLanguageIndex]; // Return resulting language }
function SetIntelliLanguage($language = '', $forceLanguage = '') { if (strlen($forceLanguage) > 0) { // Did the user pass a language to be forced? $language = $forceLanguage; // If yes - use $forceLanguage } else { // Else; try and use HTTP-Accept-Language. If this is unsuccessful $language will be used $accept_lang = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); // Split HTTP-Accept-Language on ',' for ($i = 0; $i < sizeof($accept_lang); $i++) { // Iterate through accepted languages $accept_lang[$i] = trim(ereg_replace(';(.)*$', '', $accept_lang[$i])); // Trim current chunk and remove everything after ';' - eg: ';q=0.5' if ($this->_IsValidLanguage($accept_lang[$i]) == true) { // See if the current language is valid $language = $accept_lang[$i]; // If yes - use current language break; // End loop } } } return $this->SetLanguage($language); // Set language and return the resulting language }
function GetByLanguage() { $num_args = func_num_args(); // Number of arguments passed to the function if ($num_args <= $this->mNumLanguages) { $args = func_get_args(); if (isset($args[$this->mLanguageIndex])) { // Is there an argument for the chosen language? return $args[$this->mLanguageIndex]; // Return appropriate argument } else { JgBasics::Error('Warning', 'Missing argument for chosen language: "' . $this->mLanguages[$this->mLanguageIndex] . '" in <b>GetByLanguage()'); // Write warning if there is no argument for the chosen language return false; } } else { // Too many arguments were passed JgBasics::Error('Warning', 'Too many arguments (' . $num_args . ') passed to <b>GetByLanguage()</b> - only ' . $this->mNumLanguages . ' languages defined'); // Write warning if there more arguments than languages } }
function _IsValidLanguage($language) { return in_array($language, $this->mLanguages); // Return true if $language is a valid language } }
?>
Og så lige et udsnit af JgBasics, som du også skal have:
Class JgBasics { function Error($errorType, $errorMessage) { $valid_error_types = array('Fatal error', 'Warning'); // Array containing known error-types if (in_array($errorType, $valid_error_types) == false) { // Is the current error known? JgBasics::Error('Fatal error', 'Invalid error-type: "' . $errorType . '" in <b>Error()</b>'); // If not - print a 'Fatal Error' (will terminate the script) } print "<br />\n<b>" . $errorType . "</b>: " . $errorMessage . "<br />\n"; // Write error-message if ($errorType == 'Fatal error') { // If the error is fatal the script will be terminated exit; } } }
PS: Jeg er godt klar over, at det ser voldsomt ud. Det er da nok også lidt meget kode at bruge til den opgave, men hvis du læser dokumentationen kan det være du får nogle andre idéer til brugen...
Klassen er i hvert fald skrevet til nøjagtigt det formål at kunne ændre sprog.
Description: JgMultiLanguage is an object, which makes it easy to switch between languages. It contains functions to set languages to choose from, set chosen language and get data in the chosen language.
Installation: JgMultiLanguage can be used as-is. See "Required objects" for further information.
Required objects: JgBasics
Function description: Constructor: void JgMultiLanguage() The constructor will see if JgBasics is loaded.
Public functions: void SetLanguages(string languages1 [, string languagesn...]) SetLanguages() makes an array containing the languages passed to it. These are the languages, which can be used by the script. See SetIntelliLanguage() for more information on standard language names. string SetLanguage(string language) SetLanguage() will set the current language to the language passed to the function. Changes will take effect after the function is called. SetLanguage() returns the resulting language which is useful if the language chosen by the user is invalid. string SetIntelliLanguage([string language [, string forceLanguage]]) SetIntelliLanguage will try and match the HTTP-Accept-Language header with the available languages. Therefore it is important to use standardised language names in SetLanguages(). E.g.: 'en' for English, 'da' for Danish, 'en-us' for US English and so forth. This function will return the resulting language just like SetLanguage(). The optional language parameter will be used if no valid language is found in the HTTP-Accept-Language header. Optional parameter forceLanguage can be used to overwrite the HTTP-Accept-Language header and the language parameter. It is good practice to give the user an opportunity to do so, since HTTP-Accept-Language does not always fit the current user. mixed GetByLanguage(mixed arg1 [, mixed argn...]) GetByLanguage() is used to get any type of information in the language set in SetLanguage() or SetIntelliLanguage(). The arguments must be passed to this function in the same order as in SetLanguages() to get the expected result. This function will return the argument corresponding to the chosen language.
Private functions: boolean _IsValidLanguage(string language) This function returns true if the language string passed to it is valid - false otherwise. Valid means that the language is set in SetLanguages().
Example: $ml = new JgMultiLanguage(); $ml->SetLanguages('da', 'en', 'de', 'en-us');
// Set language from GET-var ('lang') $used_lang = $ml->SetLanguage($_GET['lang']); // ($used_lang now contains the resulting language - usefull if the language chosen by the user is invalid) print $ml->GetByLanguage('Dansk', 'English', 'Deutch', 'US English'); // Print text in chosen language ('Dansk' if $_GET['lang'] == 'da' etc.)
// Set language from GET-var ('lang') if set. Else; set language to 'de' (German) if no appropriate language is found in HTTP-Accept-Language $used_lang = $ml->SetIntelliLanguage('de', $_GET['lang']); // ($used_lang now contains the resulting language) print $ml->GetByLanguage('Dansk', 'English', 'Deutch', 'US English'); // Print text in chosen language
Change log: October 14th 2003: Functional version of JgMultiLanguage is made. October 15th 2003: SetLanguage() now returns the resulting language. array_search() replaced with array_flip() in SetLanguage(). October 16th 2003: SetIntelliLanguage() was added. This function will try and use HTTP-Accept-Language to set the language. October 17th 2003: Errors are now handled by Error() in JgBasics. The constructor will terminate the script if JgBasics is not loaded. JgMultiLanguage is properly documented with description, installation, function description and example.
To do: Nothing.
*/
Class JgMultiLanguage { var $mLanguages; // (array) Array containing languages var $mLanguageIndex; // (integer) Index of current language var $mNumLanguages; // (integer) Number of languages
function JgMultiLanguage() { if (class_exists('JgBasics') == false) { // Is JgBasics loaded? exit("<br />\n<b>Fatal error</b>: Required object: JgBasics was not found in <b>JgMultiLanguage</b> - script is terminated<br />\n"); // If not - terminate script and write an error } }
function SetLanguages() { $this->mNumLanguages = func_num_args(); // Number of languages if ($this->mNumLanguages > 0) { // At least one language must be defined $this->mLanguages = func_get_args(); // Make indexed array containing languages } else { JgBasics::Error('Fatal error', 'You must pass at least one language to <b>SetLanguages()</b>'); // Write error-message for missing language(s) } }
function SetLanguage($language) { if ($this->_IsValidLanguage($language) == true) { // Is the chosen language valid? $flipped_lang_array = array_flip($this->mLanguages); // Flip array to avoid use of array_search() $this->mLanguageIndex = $flipped_lang_array[$language]; // Set language-index } else { JgBasics::Error('Warning', 'Invalid language: "' . $language . '" in <b>SetLanguage()</b> (possibly caused by invalid language in GetIntelliLanguage()) - language set to default: "' . $this->mLanguages[0] . '"'); // Write warning for invalid language $this->mLanguageIndex = 0; // Set language-index to the default (first) language } return $this->mLanguages[$this->mLanguageIndex]; // Return resulting language }
function SetIntelliLanguage($language = '', $forceLanguage = '') { if (strlen($forceLanguage) > 0) { // Did the user pass a language to be forced? $language = $forceLanguage; // If yes - use $forceLanguage } else { // Else; try and use HTTP-Accept-Language. If this is unsuccessful $language will be used $accept_lang = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); // Split HTTP-Accept-Language on ',' for ($i = 0; $i < sizeof($accept_lang); $i++) { // Iterate through accepted languages $accept_lang[$i] = trim(ereg_replace(';(.)*$', '', $accept_lang[$i])); // Trim current chunk and remove everything after ';' - eg: ';q=0.5' if ($this->_IsValidLanguage($accept_lang[$i]) == true) { // See if the current language is valid $language = $accept_lang[$i]; // If yes - use current language break; // End loop } } } return $this->SetLanguage($language); // Set language and return the resulting language }
function GetByLanguage() { $num_args = func_num_args(); // Number of arguments passed to the function if ($num_args <= $this->mNumLanguages) { $args = func_get_args(); if (isset($args[$this->mLanguageIndex])) { // Is there an argument for the chosen language? return $args[$this->mLanguageIndex]; // Return appropriate argument } else { JgBasics::Error('Warning', 'Missing argument for chosen language: "' . $this->mLanguages[$this->mLanguageIndex] . '" in <b>GetByLanguage()'); // Write warning if there is no argument for the chosen language return false; } } else { // Too many arguments were passed JgBasics::Error('Warning', 'Too many arguments (' . $num_args . ') passed to <b>GetByLanguage()</b> - only ' . $this->mNumLanguages . ' languages defined'); // Write warning if there more arguments than languages } }
function _IsValidLanguage($language) { return in_array($language, $this->mLanguages); // Return true if $language is a valid language } }
Class JgBasics { function Error($errorType, $errorMessage) { $valid_error_types = array('Fatal error', 'Warning'); // Array containing known error-types if (in_array($errorType, $valid_error_types) == false) { // Is the current error known? JgBasics::Error('Fatal error', 'Invalid error-type: "' . $errorType . '" in <b>Error()</b>'); // If not - print a 'Fatal Error' (will terminate the script) } print "<br />\n<b>" . $errorType . "</b>: " . $errorMessage . "<br />\n"; // Write error-message if ($errorType == 'Fatal error') { // If the error is fatal the script will be terminated exit; } } }
?>
Så laver du en fil, der indeholder:
<?php
require_once('include.php'); // nu henter vi de to klasser...
$ml = new JgMultiLanguage(); $ml->SetLanguages('en', 'da', 'fr', 'ge', 'sv'); $ml->SetIntelliLanguage('en', $_GET['lang']); // vil benytte 'en', hvis ikke der findes et match i HTTP_ACCEPT_LANGUAGE. Desuden kan brugeren overskrive alt ved at skrive fx. ?lang=da (osv.) $location = $ml->GetByLanguage('english_version', 'dansk', 'francais', 'deutsch', 'svenska'); header('Location: ' . $location . '/index.php');
hvordan kan jeg teste at jeg den virker? Jeg har engelsk browser på min bærbare men bliver sendt til den danske side. Og så vil gerne have at man i adresse feltet kan se at man nu er på eks. den svenske side.
Jeg har har fundet svar på ovenstående og det VIRKER! Nu er mit problem at jeg meget gerne vil dele pointene til ALLE jer der har deltaget. derfor har jeg lagt lidt ekstra i pulven og jeg vil gerne have Jer til at lægge et svar.
jakoba mr noname erikjacobsen exp har smidt et svar rackbox har også smid et svar i dag så skal jeg fordele det i morgen.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.