在PHP中使用语言文件最有效的方法?

Jas*_*vis 26 php multiple-languages

问题更新而不是提出新问题......

我真的想在我建立的社交网站上提供除英语之外的一些替代语言,这将是我第一次进行任何语言翻译,所以请耐心等待.
我正在研究,所以我很感兴趣并且对这些想法持开放态度,我已经有了很多问题.

1)
i18n是什么意思,我在研究SO上的语言翻译时经常看到它?

2)
大多数人说使用gettext PHP有扩展或支持它,
我一直在研究它,我对它有一个基本的了解,据我所知,这条路线需要做很多额外的工作,
我意味着编码我的网站使用它的功能,即; _('你好世界我现在用英语')或者gettext('hello world我现在用英语')没问题,因为我去的任何路线都需要这样.
但是你必须在你的服务器上安装gettext并让它工作,
然后使用一些特殊的编辑器创建特殊的文件并编译它们我认为呢?

听起来很痛苦,我知道这应该是最好的路线,好像每个人都说是这样.
那么有人可以告诉我为什么这是要走的路线?

3)
我真的很喜欢这种方法的简单性,只需构建一个语言数组并在类似下面的例子的函数中调用你需要的短语,然后你就可以只包含一个带有相应语言数组的文件.

我真正想知道的是,与使用gettext相比,这对于高流量和相当大的网站来说是不是更好的性能方法吗?如果是这样,你能解释为什么好吗?

<?PHP
//Have seperate language files for each language I add, this would be english file
function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
//Then in application where there is text from the site and not from users I would do something like this
echo lang('NO_PHOTO');  // No photo's available would show here
?>
Run Code Online (Sandbox Code Playgroud)

*brianreavis的答案中使用了一些代码

bri*_*vis 21

最好定义一个处理语言映射的函数.这样,如果您确实希望稍后更改它的工作方式,那么您不必为使用过的情况搜索数百个脚本,$lang[...]并将其替换为其他内容.

像这样的东西会工作,并且会很好而且快速:

function lang($phrase){
    static $lang = array(
        'NO_PHOTO' => 'No photo\'s available',
        'NEW_MEMBER' => 'This user is new'
    );
    return $lang[$phrase];
}
Run Code Online (Sandbox Code Playgroud)

确保该数组声明static在函数内部,因此不会在每个函数被调用一次重新分配.$lang当真的很大时,这一点尤为重要.

要使用它:

echo lang('NO_PHOTO');
Run Code Online (Sandbox Code Playgroud)

为了处理多国语言,只是有在多个文件中定义该功能(如en.php,fr.php等)和require()相应的一个用户.

  • 仅供参考,这个解决方案不如弗拉斯沃斯的建议:`gettext`.Gettext绝对是这种事情的更好途径.但是,如果你要推出自己的基本系统,这就是你要做的. (2认同)

Rob*_*ist 10

这可能会更好:

function _L($phrase){
static $_L = array(
    'NO_PHOTO' => 'No photo\'s available',
    'NEW_MEMBER' => 'This user is new'
);

     return (!array_key_exists($phrase,$_L)) ? $phrase : $_L[$phrase];
}
Run Code Online (Sandbox Code Playgroud)

这就是我现在用的东西.如果找不到该语言,它将返回短语,而不是错误.

您应该注意,数组可以包含不超过约65500个项目.应该足够但很好,只是说.

这是我用来检查用户语言的一些代码:

<?php
function setSessionLanguageToDefault() {
    $ip=$_SERVER['REMOTE_ADDR'];
    $url='http://api.hostip.info/get_html.php?ip='.$ip;
    $data=file_get_contents($url);
    $s=explode (':',$data);
    $s2=explode('(',$s[1]);

    $country=str_replace(')','',substr($s2[1], 0, 3));

    if ($country=='us') {
        $country='en';
    }

    $country=strtolower(ereg_replace("[^A-Za-z0-9]", "", $country ));
    $_SESSION["_LANGUAGE"]=$country;
}

if (!isset($_SESSION["_LANGUAGE"])) {
    setSessionLanguageToDefault();
}

if (file_exists(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php')) {
    include(APP_DIR.'/language/'.$_SESSION["_LANGUAGE"].'.php');
} else {
    include(APP_DIR.'/language/'.DEFAULT_LANG.'.php');
}

?>
Run Code Online (Sandbox Code Playgroud)

它尚未完成,但我认为这可能会有很大帮助.


Fra*_*rth 5

不要编写自己的语言框架.使用gettext.PHP具有可以安装的标准绑定.

  • @future 读者,我会说,如果您的网站或应用程序不使用数百到数千个单词,那么使用关联数组的方式比 gettext 更好。Gettext 的实现极其过时,可能是调试的噩梦。我只花了三天时间试图让它在我的服务器上工作。它有很多问题并且没有得到很好的维护。相信我,您会遇到一些问题。最好使用 php-gettext(gettext 模拟器)、其他一些实现或编写自己的库。 (2认同)

ras*_*spi 4

不要重新发明轮子。例如使用gettextZend_Translate