最有效的方式做到语言文件在PHP?(Most efficient way to do languag

2019-07-17 19:11发布

更新的问题,而不是制造新的问题...

我真的想为我的社交网站一些替代语言的其他然后英语我建设,这将是我第一次做任何一种语言翻译,所以请多多包涵。
我研究所以我人的耳朵和开放的思想和我有很多已经在这里有问题。

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

2)
大多数人认为使用gettext的 PHP有它的延伸或支持,
好,我一直在研究它,我对它有一个基本的了解,据我可以告诉它是一个很多额外的工作来走这条路线,
我的意思是编码我的网站使用它的职能,即; _(“世界你好我是用英文现在”)或其他的gettext(“世界你好我现在在英语”)是没有问题的,因为我去将需要的任何途径。
但你有你的服务器上安装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的答案使用一些代码

Answer 1:

不要重新发明轮子。 例如使用的gettext或把Zend_Translate 。



Answer 2:

它可能会是最好的定义处理你的语言映射功能。 这样,如果想改变它的工作原理后,您就不必非得冲刷数百脚本用于在您使用的情况下, $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.php等), require()一个合适的用户。



Answer 3:

这可能会更好地工作:

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

?>

它尚未完成,但嗯,我想这可能有很大的帮助。



Answer 4:

不要写你自己的语言框架。 使用gettext的 。 PHP有标准的绑定 ,您可以安装。



Answer 5:

至于其他的答案真的不回答所有的问题,我会去,在我的答案加上提供一个明智的选择。

1)的I18n是短期的国际化和具有一定的相似性,以I-18-n中。

2)在我的真实想法的gettext是在浪费时间。

3)你的方法看起来不错。 你应该寻找是语言的变量。 该WoltLab社区框架2.0实现了双向语言系统。 因为一旦有被保存在数据库和模板一个内部语言变量只使用其随后将与变量的当前语言的内容(如果可用)取代了变量的名称。 该系统的第二部分提供了一种方法,以节省(在需要多语言输入)以多种语言用户生成的内容。

基本上你有一个由开发人员定义的界面文本,由用户定义的内容。 内容的多语言文本保存在语言变量,然后该语言变量的名称被用作在所述特定内容表中的文本字段的值(如单语言内容也是可能的)。

在WCF的结构是可悲的方式,框架之外重用代码是很困难的,但你可以使用它作为灵感。 该系统的范围完全取决于你想要达到与您的网站内容。 如果将是很大的比你一定要看看WCF的系统。 如果是小一些专门的语言文件(de.php,en.php等),从正确的当前语言包括,将尽。



Answer 6:

可惜的getText不行好,有这样不同的操作系统上(Windows或Linux)在不同情况下的问题,使其正常工作是非常困难的。

此外,它要求你设置环境变量和域的很多的,这没有任何意义。

如果开发者想简单地得到一个文本的翻译,他应该只设置的.mo文件路径,并像翻译(“你好”,“的en_EN”)一个函数得到的转换。 随着gettext的,这是不可能的。



Answer 7:

你可以这样做:

class T {
const language = "English";
const home = "Home";
const blog = "Blog";
const forum = "Forum";
const contact = "Support";
}

你必须为每种语言这样的文件。 使用文字:

There is no place like <?=T::home?>.

缺点是,如果添加一个新的常数,你必须做的每一个的langauge文件 。 如果您忘记了该语言,您的分页符。 这是一个有点讨厌,但由于它并不需要创建一个大的关联数组和可能的值甚至可以内联是有效的。

也许访问有待改进,例如:

class T {
    const home = "home";

    public static function _ ($name) {
        $value = @constant("self::$name");
        return $value ? $value : $name;
    }

    // Or maybe through an instance:
    public function __get ($name) {
        $value = @constant("self::$name");
        return $value ? $value : $name;
    }
}
echo "There is no " . T::_("place") . " like " . T::_("home");
$T = new T();
echo "There is no " . $T->place . " like " . $T->home;

我们仍然避免阵列,并依靠不断做的查找,我以为是不是直接使用常量更昂贵。 UP侧为查找可以使用回退时找不到键。



Answer 8:

为什么你不只是使它的多阵列时二维......像这样的

<?php

$lang = array(
    'EN'=> array(
        'NO_PHOTO'=>'No photo\'s avaiable',
        'NEW_MEMBER'=>'This user is new',
    ),
    'MY'=> array(
        'NO_PHOTO'=>'Tiada gambar',
        'NEW_MEMBER'=>'Ini adalah pengguna baru',
    )
);

?>


文章来源: Most efficient way to do language file in PHP?