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

2022-08-30 15:38:51

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

我真的很想在我正在构建的社交网站上提供一些替代语言,然后是英语,这将是我第一次做任何语言翻译,所以请耐心等待。
我正在研究,所以我是耳朵和开放的想法,我已经有很多在这里是问题。

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

2)
大多数人说使用gettext PHP有它的扩展或支持,好吧,
我一直在研究它,我对它有一个基本的了解,据我所知,走这条路有很多额外的工作,
我的意思是编码我的网站使用它的功能,即;_('hello world i's in English for English') 或者 gettext ('hello world i's in English for Now') 是没有问题的,因为我去的任何路线都需要它。
但是,您必须在服务器上安装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
?>

*下面从Brianreavis的答案中使用的一些代码


答案 1

最好定义一个处理语言映射的函数。这样,如果您以后确实想更改其工作方式,则不必强制在数百个脚本中搜索您使用过的情况,并用其他内容替换它们。$lang[...]

像这样的东西会起作用,而且会很好,而且速度很快:

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

确保数组在函数内部声明,以便每次调用函数时都不会重新分配。当真的很大时,这一点尤其重要。static$lang

要使用它:

echo lang('NO_PHOTO');

要处理多种语言,只需在多个文件(如 、等)中定义此函数,并为用户提供适当的函数。en.phpfr.phprequire()


答案 2

这可能效果更好:

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];
}

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

您应该注意,数组可以包含不超过约 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');
}

?>

它还没有完成,但我认为这可能有很大帮助。


推荐