【问题标题】:PHP localizationPHP本地化
【发布时间】:2012-06-13 20:12:39
【问题描述】:

我正在做一个小项目,该项目由后端的注册、登录、密码重置和用户管理组成。我必须为不同的语言创建翻译文件,而不是使用 gettext 之类的东西(我对此一无所知),我决定为每个语言文件使用一个静态数组来实现一个非常简单的方法,如下所示:

function plLang($phrase) {
    $trimmed = trim($phrase);
    static $lang = array(
    /* -----------------------------------
    1. REGISTRATION HTML
    ----------------------------------- */
    'LNG_1'     => 'some text',
    'LNG_2'     => 'some other text',
    etc. ...
    );

    $returnedPhrase = (!array_key_exists($trimmed,$lang)) ? $trimmed : $lang[$trimmed];
    echo $returnedPhrase;
}

它工作正常,在这个阶段非常快,但我的标记现在到处都是 php 语言标签,我不确定我是否做出了正确的决定。我以前从未这样做过,所以我不知道我在期待什么。似乎当我全部完成时,这个文件将有一英里长。

这是一个好方法吗?有没有更好的方法可以推荐?

谢谢!

【问题讨论】:

标签: php localization


【解决方案1】:

这就是我在我的 cms 中所做的:

  • 对于我开发的each 插件/程序/实体(你可以命名),我创建了一个/translations 文件夹。
  • 我把我所有的翻译都放在那里,命名为 el.txt、de.txt、uk.txt 等所有语言
  • 我将翻译数据存储在 JSON 中,因为它易于存储、易于阅读并且每个人都可以轻松发布自己的数据。
  • 文件可以很容易地在文件中进行 UTF8 编码,而不会弄乱数据库,从而可以在文件模式下读取它们。 (只是JSON.parse他们)
  • 在安装此类插件时,我只是遍历所有翻译并将它们放入数据库中,每个表行的每种语言。 (等a data column of TEXT datatype
  • 对于每个页面渲染,我只需查询一次数据库以获取所选语言的这一行,然后调用json_decode() 对整个结果进行一次获取;然后将其放入 $_SESSION 中,以便下次获取当前所选语言的快速翻译字符串

整个开发过程都考虑到性能和兼容性

在您的情况下,此类文件中的一行可能类似于:

en.txt

{"id":"LNG_1","str":"My word"}

de.txt

{"id":"LNG_1","str":"Mein Wort"}

当前语言可以像 $_SESSION["language"]; 一样存储在会话中并使用 那作为起点。 然后,您可以阅读以下翻译:

lang("LNG_1");

【讨论】:

  • 这是非常好的信息。谢谢!我决定实施这一点,它的效果非常好。一个小问题是我无法将 cmets 添加到 json 中,这使得它们很难排序。
  • 谢谢。我通过在一行前面添加一个“#”解决了评论问题。我只是测试解析的每一行的第一个字符(过程的第 5 步),如果是这个字符,我只是“继续”到循环中的下一行。有效的 JSON 以“{”开头,因此“#”可以很好地作为第一个字符。
  • 每种语言有超过 3000 种翻译。这个数组可以有多大??有限制吗?
【解决方案2】:

许多框架将这些语言数组存储在单独的文件中,其中任何语言的每个数组都具有相同的名称。然后,您的语言功能只需要用户选择的语言 (require('lang.en.php')) 的相应文件。

// lang.en.php
$languageStrings = array(
    'login' => 'Log in',
);

// lang.ru.php
$languageStrings = array(
    'login' => 'Авторизовать в системе',
);

// lang.ja.php
$languageStrings = array(
    'login' => 'ログイン',
);

当前正在使用哪种语言(例如由用户选择),可以通过一些全局可访问的变量来确定。

想法:使用IETF language tags 作为语言键。

【讨论】:

    【解决方案3】:

    您应该使用支持国际化的模板引擎。
    例如,我自己的模板引擎允许我执行以下操作:

    <p>(_text to be localized here)</p>
    

    并且该标记内的文本将被翻译。这样可以避免每次打开模板文件中的 php 标签,如:

    <p><?php plLang('lang'); ?></p>
    

    无论如何,标准解决方案是使用 gettext http://php.net/manual/en/book.gettext.php

    例子:

    // alias _() for gettext()
    echo _("Have a nice day");
    

    【讨论】:

    • 您的意思是您没有要显示的翻译的语言文件?自动翻译?
    • 我有语言文件,但当然位于其他地方。
    • 好吧,那么我所拥有的是完全相同的东西。
    • 我只是使用这样的标签:plLang('LNG_2');
    • @yes123 模板引擎对本地化并不重要。应用程序应该知道使用哪种语言并将翻译后的字符串传递给 tpl 引擎。根据您的回答:_('some string') 是对一个 Wordpress 核心函数的调用,但您可以通过其他方法检索翻译后的字符串,因为 WP 知道如何处理本地化字符串而不是模板(可能由第三方创建)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2014-06-10
    相关资源
    最近更新 更多