PHP本地化

4

我正在进行一个小项目,包括注册、登录、密码重置和用户管理等后端功能。我需要为不同的语言创建翻译文件,而我决定采用非常简单的方法,使用静态数组来实现每个语言文件,而不是使用我知之甚少的 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语言标签,我不确定我是否做出了正确的决定。我以前从未做过这个,所以不知道自己期望什么。同时,似乎到最后,这个文件会变得很长。

这是一个好的方式吗?您有更好的建议吗?

谢谢!


在我看来,YAML 格式是本地化的更好解决方案。请查看我的问题:https://dev59.com/Y1_Va4cB1Zd3GeqPXdZX - Oyeme
3个回答

8

这是我在我的CMS中做的:

  • 对于每个插件/程序/实体(你可以自己命名),我都会创建一个/translations文件夹。
  • 我将所有翻译放在那里,以el.txt、de.txt、uk.txt等命名所有语言。
  • 我使用JSON存储翻译数据,因为它易于存储和读取,并且对于每个人来说最容易发布。
  • 文件可以轻松地在文件内进行UTF8编码,而无需与数据库混淆,这使得可以在文件模式下读取它们。(只需用JSON.parse将它们解析即可)
  • 在安装此类插件时,我只需要循环遍历所有翻译,并将它们放入数据库中,每种语言一行表格。(例如TEXT数据类型的数据列
  • 对于每个页面呈现,我只需查询一次数据库以获取所选语言的该行,并调用json_decode()来获取整个结果,然后将其放入$_SESSION中,以便下次为当前选择的语言获取“闪电般快速”的翻译字符串。

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

在您的情况下,这样文件中的一行可以是:

en.txt

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

de.txt 文件中。
{"id":"LNG_1","str":"Mein Wort"}

当前语言可以像 $_SESSION["language"]; 这样存储在会话中,并将其用作起始点。然后,您可以读取译文,例如:
lang("LNG_1");

这是非常好的信息。谢谢!我决定实现它,它真的很好用。唯一的小问题是我无法添加注释到JSON中,这使得它们有点难以分类。 - user1002039
谢谢。我通过在一行前面添加“#”来解决注释问题。我只测试了解析的每行的第一个字符(步骤5),并且在出现此字符的情况下,我只是在循环中“继续”到下一行。有效的JSON以“{”开头,因此“#”作为第一个字符效果很好。 - user1299518
我有每种语言超过3000次的翻译。这个数组可以有多大?是否存在限制? - lio

3
许多框架将这些语言数组存储在单独的文件中,其中每种语言的每个数组都具有相同的名称。您的语言函数只需要为用户选择的语言加载适当的文件(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语言标签作为语言键。

0

你应该使用支持国际化的模板引擎。
例如,我的模板引擎允许我这样做:

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

而且标记内部的文本将被翻译。这避免了每次在模板文件中打开php标记的需要:

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

标准解决方案是使用 gettext http://php.net/manual/zh/book.gettext.php

示例:

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

你的意思是说你没有包含想要显示的翻译的语言文件吗?自动翻译? - user1002039
我有语言文件,但它们存储在其他地方。 - dynamic
1
那么,我所拥有的就是完全相同的东西。 - user1002039
我只是像这样使用标记:plLang('LNG_2'); - user1002039
@yes123 模板引擎对于本地化来说是较为重要的。应用程序应知道使用的语言,并将翻译好的字符串传递给tpl-engine。从您的回答中可以了解到:_('some string') 是调用WordPress核心功能之一,但是您也可以通过其他方法获取已翻译的字符串,因为WP知道如何处理本地化字符串,而不是模板(可能由第三方创建)。 - feeela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接