Avatar billede comeback Nybegynder
09. november 2003 - 22:55 Der 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;
}
?>
Avatar billede exp Juniormester
09. november 2003 - 22:59 #1
<?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;
}
?>
Avatar billede exp Juniormester
09. november 2003 - 22:59 #2
Du skal lige huske at definere country som en variabel :-)

$ <== husk den
Avatar billede comeback Nybegynder
09. november 2003 - 23:01 #3
Parse error: parse error, unexpected '[' in /usr/web/jys0242/HOUNO.COM/index.php on line 8
Avatar billede detox Nybegynder
09. november 2003 - 23:02 #4
PHP_SERVER["HTTP_ACCEPT_LANGUAGE"];
skal vel osse være:
$_SERVER["HTTP_ACCEPT_LANGUAGE"];
Avatar billede schaefner Juniormester
09. november 2003 - 23:03 #5
$country = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
Avatar billede jakoba Nybegynder
09. november 2003 - 23:04 #6
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"
Avatar billede comeback Nybegynder
09. november 2003 - 23:07 #7
Der sker intet! Er der nogen der gider at lave et HELT scrip0t der virker?
-->jacoba du snakker lidt forbi mig der
Avatar billede comeback Nybegynder
09. november 2003 - 23:10 #8
Ups havde lige glemt min location kald i en onload...
Avatar billede comeback Nybegynder
09. november 2003 - 23:12 #9
Dammit hvad går det galt ? <html>
<head>
<title></title>

</head>
<?php

$country = $_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;
}
?>

<body OnLoad=(location="<? echo $location?>");>
</body>
</html>


DER er ingen forskel om jeg bruger en dansk eller en engelsk browser??!!
Avatar billede detox Nybegynder
09. november 2003 - 23:14 #10
Det burde virke!
Avatar billede erikjacobsen Ekspert
09. november 2003 - 23:15 #11
Du kan ikke bare sammenligne på den måde. Der kan stå mange sjove ting
i den variabel, fx

  en-us,en;q=0.5

Du skal pille dem ud een for een, og hvis det så er een af dem du kender,
så bruge den, og ellers kigge på den næste.
Avatar billede jakoba Nybegynder
09. november 2003 - 23:19 #12
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.

mvh JakobA
Avatar billede detox Nybegynder
09. november 2003 - 23:19 #13
Sikken ringe standardisering!
Avatar billede tjens Nybegynder
09. november 2003 - 23:23 #14
Hvad står der i $country?
prøv >> echo $country
Avatar billede rackbox Nybegynder
10. november 2003 - 00:08 #15
<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 ;-)
Avatar billede jakoba Nybegynder
10. november 2003 - 00:34 #16
Ok, et komplet og anvendeligt eksempel. det er ikke andet end hvad diverse mennesker har sagt allerede, bare samlet :-)

<?php  //dette er allerførste linie i din fil.

$country = $_SERVER["HTTP_ACCEPT_LANGUAGE"];

$country = substr( $country, 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;
    default:
          $location="english_version/index.php";
        break;
}
header( "location: " .$location  );    // send den side istedetfor
exit();

// linien herunder er allersiste linie i filen. ingen html kode overhovedet
?>

mvh JakobA
Avatar billede rackbox Nybegynder
10. november 2003 - 00:40 #17
Heh! Ja - det er sandt!
Avatar billede erikjacobsen Ekspert
10. november 2003 - 00:46 #18
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.
Avatar billede jakoba Nybegynder
10. november 2003 - 00:52 #19
Du har ret. og jeg var klar over det.

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.

mvh JakobA
Avatar billede erikjacobsen Ekspert
10. november 2003 - 00:54 #20
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):

cs,da;q=0.7,en;q=0.3
Avatar billede erikjacobsen Ekspert
10. november 2003 - 00:56 #21
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.

Ha, google ser sjov ud med denne indstilling ;))
Avatar billede jakoba Nybegynder
10. november 2003 - 01:15 #22
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.

men ok, lad os tage det hele med:


<?php  //dette er allerførste linie i din fil.

$countryfull = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
$countryarr = explode( ",", $countryfull )
$index = 0;

unset( $location );  // sørg for $location ikke har nogen værdi

while ( !isset( $location ) && $index < count( $countryarr ) ) {

    $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 :-))

mvh JakobA
Avatar billede jakoba Nybegynder
10. november 2003 - 01:17 #23
og se når man sådan overdriver går det galt.
linien
    $index = 0;
skal være
    $i = 0;
Avatar billede jakoba Nybegynder
10. november 2003 - 01:19 #24
og ditto det andet sted der står  $index
Avatar billede tipsen Nybegynder
10. november 2003 - 02:17 #25
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?
Avatar billede comeback Nybegynder
10. november 2003 - 08:50 #26
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?
Avatar billede exp Juniormester
10. november 2003 - 08:52 #27
Prøv lige at ændre dette i jakoba's ex:

    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!";
    }
Avatar billede comeback Nybegynder
10. november 2003 - 09:02 #28
Hmm det skete der stadig ikke noget ved, stadig bare en blank hvis side uden fejl!( har rette det manglende ';' der manglede i linie 4...)
Avatar billede jensgram Nybegynder
10. november 2003 - 10:46 #29
Hej knejter ;)

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');
Avatar billede jensgram Nybegynder
10. november 2003 - 10:47 #30
UPS ;) Måske du også vil have klassen med...

Her kommer meget:

<?php

/* << Documentation: JgMultiLanguage >>

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;
        }
    }
}
Avatar billede jensgram Nybegynder
10. november 2003 - 10:50 #31
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.
Avatar billede comeback Nybegynder
10. november 2003 - 11:01 #32
Skal jeg forstå det sådan at jeg skal tage alt det du har skrevet og sætte ind i et dok? eller hvordan skal mit dokument se ud???
Avatar billede jensgram Nybegynder
10. november 2003 - 11:12 #33
ja, lav en fil (include.php), der indeholder:


<?php

/* << Documentation: JgMultiLanguage >>

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');

?>
Avatar billede jensgram Nybegynder
10. november 2003 - 11:16 #34
Det burde virke, og vil løbe hele HTTP_ACCEPT_LANGUAGE igennem for at finde et sprog, der matcher dem, du har defineret i

$ml->SetLanguages('en', 'da', 'fr', 'ge', 'sv');

Bemærk, at argumenterne i

$location = $ml->GetByLanguage('english_version', 'dansk', 'francais', 'deutsch', 'svenska');

Skal komme i samme rækkefølge som i SetLanguages()... $location vil så indeholde det argument, der stemmer overens med sproget:

eg:

$location: 'dansk', hvis HTTP_ACCEPT_LANGUAGE ser ud som da,en;q=0.5
Avatar billede comeback Nybegynder
10. november 2003 - 13:43 #35
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.

www.minside.dk/svenska/index.php
Avatar billede comeback Nybegynder
10. november 2003 - 13:44 #36
ligespm når man skriver www.minside.dk/index.php?lang=sv
Avatar billede comeback Nybegynder
10. november 2003 - 13:54 #37
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.

Mange tak for hjælpen drenge!
Avatar billede jensgram Nybegynder
11. november 2003 - 02:08 #38
Så vil jeg da lige smide et...
Avatar billede comeback Nybegynder
11. november 2003 - 11:31 #39
Til alle Jer andre. I havde chancen og siden i ikk ehar svaret må det skyldes at i ikke vil have point ( ellers må i lige sige til)
Avatar billede jensgram Nybegynder
11. november 2003 - 11:42 #40
Nå, det var sgu da ikke 50 pts. værd...

Hvis I andre vil have, så kan vi da dele ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester