【问题标题】:Multiple language php application多语言php应用程序
【发布时间】:2013-09-14 17:29:26
【问题描述】:

目前我的 php 应用程序以英语运行。我们现在必须迎合其他几种语言。我们注意到有些人对所有表格进行了一整套翻译,并根据翻译的语言放入一个新的文件夹标签。这是一种优化方法吗?

【问题讨论】:

  • 不,这不是优化方法。
  • @AndyGee 那你有什么建议?
  • 那么您如何存储将要翻译的数据?数据库? .html 文件?你使用模板系统吗?
  • 占位符和数据库。通过一个方法回显每个占位符,该方法从数据库中获取这个占位符并根据用户设置的语言返回翻译
  • 在这种情况下,您应该在数据库表上运行翻译。为每种新语言添加一个额外的列,并根据语言请求数据。

标签: php translation


【解决方案1】:

您应该使用包含您的句子的文件(或使用数据库)并根据所选语言包含它们。

例如:

Language_FR.txt:

hello = 'Salut'
delete='Supprimer'

Language_EN.txt:

hello = 'Hello !'
delete='Delete'

【讨论】:

  • 是的,我计划相应地为每种语言创建单独的文件?
【解决方案2】:

我仍然支持数据库的想法。

假设您有输入字段,旁边有英文的“用户名”,默认值为“输入您的用户名”。你可以有类似的东西:

<td><?=$obj->translate('username');?></td>
<td><input type="text" name="username" value="<?=$obj->translate('enter_username');?>" /></td>

所以你有即在你的数据库表translations

id | placeholder     |         en          |    pl                      |
-------------------------------------------------------------------------
1  | username        |      Username       | Nazwa użytkownika          |
2  | enter_username  | Enter your username | Wprowadź nazwę użytkownika |

所以你的客户是波兰人,你设置他$_SESSION['language'] = 'pl'

您构建函数/方法 translate(),它返回当前语言翻译。

public function translate($word) {
    $sql = "SELECT $_SESSION['language'] FROM translations WHERE placeholder = '$word';";
    $this->db->query($sql);
    return $this->db->result();
}

因此,基本上,当您为波兰客户运行 $obj-&gt;translate('enter_username'); 时,您会进行如下查询:

SELECT pl FROM translations WHERE placeholder = 'enter_username';

返回 'Wprowadź nazwę użytkownika'

每次您需要打印某些内容时,您都必须将其占位符插入到您的数据库中,稍后或立即将其插入翻译。

如果您需要通过 javascript 发出错误警报,例如,对于错误的用户名,您可以在数据库中添加一个占位符,即“wrong_username_from_login_form”最近用英文翻译为“您输入了错误的用户名。请返回并重试”。

你可以拥有:

<script>
alert("<?=$obj->translate('wrong_username_from_login_form');?>");
</script>

如果您的客户是英国人,他会在屏幕上提示:“您输入了错误的用户名。请返回并重试”

【讨论】:

  • @但这会导致我大量的数据库操作正确,因为我需要搜索查找每个单词。 javascript部分怎么样?
  • 查询很简单。您在 WHERE 中有一个占位符的一列搜索。即使是关于这个的数百万个查询也不会减慢核心的速度。关于 JS - 查看答案的编辑
  • 我的大部分 javascript 错误消息都是例如feeError.innerHTML = " * 费用只能包含数字";我也在使用这些过滤器 var isNumeric = /^[0-9]+$/; var isLetters = /^[a-zA-Z]+$/;这些将如何实现?
  • 占位符="fee_only_digits_allowed",英语=" * Fee must only contain digits "feeError.innerHTML = "&lt;?=$obj-&gt;translate('fee_only_digits_allowed');?&gt;"; 所以你的 feeError 变量将是“* 费用必须只包含数字”在你的脚本编译时为英语用户,无论它是波兰语等。:) 你有一个文本,你需要使用方法和占位符作为参数传递。 isNumeric 和 isLetters 是您不需要翻译的正则表达式。这里只有feeRror 需要翻译。正如我所说的 - 你在任何地方都回响着一些东西。
  • 我的 isLetter 对来自不同语言的不同字母有何影响?
【解决方案3】:

这取决于翻译的数量。您可以为所有语言使用一个 php 包含文件,或者将每种语言分成一个单独的文件。

$lang['en']['submit'] = 'submit';//english
$lang['fr']['submit'] = 'soumettre';//french
$lang['es']['submit'] = 'presentar';//spanish

并在基于占位符的 html 中使用

<?php
$lang = 'fr'; //set the language somewhere
<button><?=$tang[$lang]['submit'];?></button>
?>

这将输出&lt;button&gt;soumettre&lt;/button&gt;

不要复制整个网站,否则编辑将意味着每次您要进行更改时都要编辑翻译计数。

【讨论】:

    【解决方案4】:

    大多数实现基本上使用由语言索引的查找表 (在数据库或文本文件中)。

    然后在你的代码中,每当你显示一个用户界面元素时,你都会有一个函数来查找你想要显示的语言的正确字符串。

    一个非常简单的方法可能是根据语言包含正确的文件。

    在你的文本文件中(让我们称之为'de.php')类似:

    $lang[] = ['Are you Sure?']['Sind Sie sicher?'];

    $lang[] = ['Cancel']['Abbrechen'];

    那么你的代码可能有:

    //加载合适的语言

    包括($userLang.".php");

    ....

    echo $lang['你确定吗?'];

    【讨论】:

      【解决方案5】:

      您永远不应该尝试在数据库中存储用户界面元素(我们称它们为“静态”)的翻译。而是使用适合您的技术的本地化文件格式。使用 PHP 时,这可以是 Gettext (PO)、CSV 或只是一个简单的 PHP 数组文件。

      优点: - 您可以将文件发送到翻译/翻译服务,而无需从数据库中提取它们 - 您不必为应用程序的开发/暂存版本发送数据库转储 - 您可以很容易地将您的翻译用于其他技术 - 速度:在 PHP 中解析 CSV/Ini 文件比在每个页面上执行 n 次查询要快得多

      我认为 Andy Gee 和 FaceOfJock 很好地展示了您的解决方案的外观。

      【讨论】:

        猜你喜欢
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        • 2012-03-21
        • 2015-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多