问题已更新而非提出新问题......

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

<强> 1)结果 i18n是什么意思,我在研究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的答案中使用了一些代码

有帮助吗?

解决方案

不要重新发明轮子。例如,使用 gettext Zend_Translate

其他提示

最好定义一个处理语言映射的函数。这样,如果您想要在以后更改其工作方式,那么在使用 $ 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.php fr.php 等)和 require()适合用户的一个。

这可能会更好:

function _L($phrase){
static 

这可能会更好:

<?php
function setSessionLanguageToDefault() {
    $ip=

这可能会更好:

function _L($phrase){
static 

这可能会更好:

<*>

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

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

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

<*>

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

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

这可能会更好:

<*>

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

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

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

<*>

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

L)) ? $phrase :

这可能会更好:

<*>

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

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

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

<*>

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

L[$phrase]; }

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

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

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

<*>

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

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

这可能会更好:

function _L($phrase){
static 

这可能会更好:

<*>

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

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

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

<*>

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

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

这可能会更好:

<*>

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

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

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

<*>

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

L)) ? $phrase :

这可能会更好:

<*>

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

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

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

<*>

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

L[$phrase]; }

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

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

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

<*>

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

SESSION["_LANGUAGE"]=$country; } if (!isset(

这可能会更好:

function _L($phrase){
static 

这可能会更好:

<*>

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

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

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

<*>

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

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

这可能会更好:

<*>

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

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

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

<*>

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

L)) ? $phrase :

这可能会更好:

<*>

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

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

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

<*>

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

L[$phrase]; }

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

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

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

<*>

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

SESSION["_LANGUAGE"])) { setSessionLanguageToDefault(); } if (file_exists(APP_DIR.'/language/'.

这可能会更好:

function _L($phrase){
static 

这可能会更好:

<*>

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

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

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

<*>

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

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

这可能会更好:

<*>

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

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

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

<*>

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

L)) ? $phrase :

这可能会更好:

<*>

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

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

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

<*>

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

L[$phrase]; }

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

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

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

<*>

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

SESSION["_LANGUAGE"].'.php')) { include(APP_DIR.'/language/'.

这可能会更好:

function _L($phrase){
static 

这可能会更好:

<*>

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

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

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

<*>

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

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

这可能会更好:

<*>

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

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

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

<*>

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

L)) ? $phrase :

这可能会更好:

<*>

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

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

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

<*>

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

L[$phrase]; }

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

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

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

<*>

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

SESSION["_LANGUAGE"].'.php'); } else { include(APP_DIR.'/language/'.DEFAULT_LANG.'.php'); } ?>

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

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

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

<*>

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

L = array( 'NO_PHOTO' => 'No photo\'s available', 'NEW_MEMBER' => 'This user is new' ); return (!array_key_exists($phrase,

这可能会更好:

<*>

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

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

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

<*>

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

L)) ? $phrase :

这可能会更好:

<*>

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

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

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

<*>

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

L[$phrase]; }

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

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

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

<*>

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

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

由于其他答案并没有真正回答所有问题,我会在答案中提出一个明智的选择。

1) I18n是国际化的缩写,与I-tenighte-n有一些相似之处。

2) 在我看来,gettext是浪费时间。

3) 你的方法很好看。您应该寻找的是语言变量。 WoltLab社区框架2.0 实现了双向语言系统。一旦存在保存在数据库中和模板内的语言变量,只使用变量的名称,然后将该变量的名称替换为当前语言中变量的内容(如果可用)。系统的第二部分提供了一种以多种语言保存用户生成内容的方法(需要多种语言输入)。

基本上,您拥有开发人员定义的界面文本以及用户定义的内容。内容的多语言文本保存在语言变量中,然后语言变量的名称将用作特定内容表中文本字段的值(因为单语言内容也是可能的)。

WCF的结构遗憾的是,在框架之外重用代码非常困难,但您可以将其用作灵感。系统的范围完全取决于您希望通过站点实现的目标。如果它比你大,你应该看看WCF系统。如果它很小的几个专用语言文件(de.php,en.php等),将包含当前语言的正确语言文件。

不幸的是 gettext 无法正常工作,并且在各种情况下遇到问题,例如在不同的操作系统(Windows或Linux)上,并使其工作非常困难。

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

如果开发人员想要简单地获取文本的翻译,他应该只设置.mo文件路径,并使用一个函数来翻译(“hello”,“en_EN”);使用gettext这是不可能的。

为什么不把它作为多维数组......比如这个

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

?>

你可以这样做:

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;

我们仍然避免使用数组并依赖常量来进行查找,我认为比直接使用常数更昂贵。上方是查找可以在找不到密钥时使用后备。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top