0

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

4

5 回答 5

2

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

例如 :

语言_FR.txt:

hello = 'Salut'
delete='Supprimer'

语言_EN.txt:

hello = 'Hello !'
delete='Delete'
于 2013-09-14T17:32:09.203 回答
1

这取决于翻译的数量。您可以为所有语言使用一个 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>
?>

这将输出<button>soumettre</button>

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

于 2013-09-14T17:43:11.803 回答
1

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

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

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

在您的文本文件中(我们称其为“de.php”),例如:

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

$lang[] = ['取消']['缩写'];

那么你的代码可能有:

//加载合适的语言

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

……

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

于 2013-09-14T17:46:02.787 回答
1

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

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

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

所以你有 ie 在你的数据库表中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->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>

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

于 2013-09-14T17:54:36.260 回答
0

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

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

我认为 Andy Gee 和 FaceOfJock 很好地展示了您的解决方案应该是什么样子。

于 2013-09-16T15:32:35.977 回答