在PHP中检测浏览器语言并相应地设置$locale

5
我希望当有人访问我的WordPress页面时,可以加载他所选语言的.po(语言)包。目前,通过在URL中添加?lang=参数,可以更改语言。但是我希望根据浏览器语言选择正确的语言。
我的代码:
<?php
// start the session 
session_start();
$browserlang = " ".$_SERVER['HTTP_ACCEPT_LANGUAGE'];

// if there's a "lang" parameter in the URL...  
if( isset( $_GET[ 'lang' ] ) ) { 

    // ...set a session variable named WPLANG based on the URL parameter...     
    $_SESSION[ 'WPLANG' ] = $_GET[ 'lang' ]; 

    // ...and define the WPLANG constant with the WPLANG session variable 
    $locale = $_SESSION[ 'WPLANG' ];
    echo 'Based on URL parameter';

// if there isn't a "lang" parameter in the URL...  
} else {

    // if the WPLANG session variable is already set...
    if( isset( $_SESSION[ 'WPLANG' ] ) ) {

        // ...define the WPLANG constant with the WPLANG session variable 
        $locale = $_SESSION[ 'WPLANG' ];
        echo 'Based on session variable';

   // if the WPLANG session variable isn't set...
   } else { 

        // set the WPLANG constant to your default language code is (or empty, if you don't need it)        
        $locale = $browserlang;
        echo 'Should be based on browser language. It is:' . $browserlang;

    } 
};
?>

$locale 用于设置语言并选择正确的.po文件。

现在我想默认将 $locale 设置为

$locale = 'en_US'

但是当有人进入默认语言为"de"、"de_DE"、"de_CH"或"de_AT"的页面时,应该是:

$locale = 'de_DE'

目前我正在使用的代码无法正常工作。

$browserlang = " ".$_SERVER['HTTP_ACCEPT_LANGUAGE'];
echo $browserlang;

显示了正确的语言,即“de_DE”,但$locale = $browserlang没有任何作用。另一方面,当我设置$locale = 'de_DE'时,它可以正常工作... 感谢各位的帮助。
编辑:当我使用echo $locale时,它显示为de-DE。这很奇怪,因为它不起作用...
编辑2:这是因为它必须是de_DE(下划线),而不是de-DE(减号)...如何解决?
编辑3:最终它可以正常工作了。

1
你为什么在变量前面加了一个 " "?如果你去掉它,它就应该可以工作了。 - putvande
2
使用str_replace函数将语言标识符由de-DE更改为de_DEstr_replace('-','_',$browserlang); - Gabriel Moretti
1
这个文件是用于语言配置的吗? - Gabriel Moretti
1
你的问题中的代码。如果你的应用程序可能会扩展,那么你应该寻找一个更通用的解决方案。否则,你将需要为每种新的可用语言添加条件(而且在我看来,这违反了开闭原则)。 - Gabriel Moretti
1
@GabrielMoretti 目前没有计划进行其他语言的翻译。只有德语和英语。上面的文件位于 wp-lang.php 中,并在 wp-config.php 中调用 require_once( dirname( __FILE__ ) . '/wp-lang.php' ) - Pintolus
显示剩余4条评论
2个回答

2
展示给我正确的语言,即“de_DE”。
不应该。您展示给我们的代码在头部值之前插入了一个空格。
此外,您的代码没有处理多值 accept-language 头部,它也可以包括偏好设置(例如在这里查看解析器)。
如何规范化值({"de", "de_DE", "de_CH","de_AT"} -> "de_DE")由您决定。

那么也许我应该将我的解决方案与此线程上发布的解决方案结合起来:https://dev59.com/WW865IYBdhLWcg3whfBf?rq=1?其中一些解决方案可以处理多种语言和q值。 - Pintolus
1
你可以这样做 - 但我不熟悉WordPress中的API以及它们如何公开语言可用性。 - symcbean
这个问题与WordPress无关。返回给WordPress的唯一参数是 $browserlang,它必须包含所选语言。 - Pintolus

0

编辑3:

搞定了:

<?php
// start the session 
session_start();

// if there's a "lang" parameter in the URL...  
if( isset( $_GET[ 'lang' ] ) ) { 

    // ...set a session variable named WPLANG based on the URL parameter...     
    $_SESSION[ 'WPLANG' ] = $_GET[ 'lang' ]; 

    // ...and define the WPLANG constant with the WPLANG session variable 
    $locale = $_SESSION[ 'WPLANG' ];
    $languagemsg = 'based on url parameter';

// if there isn't a "lang" parameter in the URL...  
} else {

    // if the WPLANG session variable is already set...
    if( isset( $_SESSION[ 'WPLANG' ] ) ) {

        // ...define the WPLANG constant with the WPLANG session variable 
        $locale = $_SESSION[ 'WPLANG' ];
        $languagemsg = 'based on session variable';

    // if the WPLANG session variable isn't set...
    } else { 

        // set the WPLANG constant to your default language code is (or empty, if you don't need it) 
        $browserlang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);
        if ($browserlang == 'de') {$browserlang = 'de_DE';}
        else {$browserlang = 'en_US';}
        $_SESSION[ 'WPLANG' ] = $browserlang;
        $locale = $browserlang;
        $languagemsg = 'based on browser language';

    } 
};
?>

现代浏览器总是将首选语言列在其他语言之前。这就是为什么我只选择字符串的前两个字母:

$browserlang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);

现在我设置$browserlang = de_DE,用于所有以“de”开头的语言代码。对于所有其他语言,我设置$browserlang = en_US

“$languagemsg”仅用于调试目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接