目前我的 php 应用程序以英语运行。我们现在必须迎合其他几种语言。我们注意到有些人对所有表格进行了一整套翻译,并根据翻译的语言放入一个新的文件夹标签。这是一种优化方法吗?
5 回答
您应该使用包含您的句子(或使用数据库)的文件,并根据所选语言包含它们。
例如 :
语言_FR.txt:
hello = 'Salut'
delete='Supprimer'
语言_EN.txt:
hello = 'Hello !'
delete='Delete'
这取决于翻译的数量。您可以为所有语言使用一个 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>
但是不要复制整个网站,否则编辑将意味着每次要进行更改时编辑翻译计数次数。
大多数实现基本上使用由语言索引的查找表(在数据库或文本文件中)。
然后在你的代码中,每当你显示一个用户界面元素时,你都会有一个函数来查找你想要显示的语言的正确字符串。
一个非常简单的方法可能是根据语言包含正确的文件。
在您的文本文件中(我们称其为“de.php”),例如:
$lang[] = ['Are you Sure?']['Sind Sie sicher?'];
$lang[] = ['取消']['缩写'];
那么你的代码可能有:
//加载合适的语言
包括($userLang.".php");
……
echo $lang['你确定吗?'];
我仍然支持数据库的想法。
假设您有输入字段,旁边有英文的“用户名”,默认值为“输入您的用户名”。你可以有类似的东西:
<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>
如果您的客户是英国人,他会在屏幕上提示:“您输入了错误的用户名。请返回并重试”
您永远不应该尝试在数据库中存储用户界面元素(我们称它们为“静态”)的翻译。而是使用适合您的技术的本地化文件格式。使用 PHP 时,这可以是 Gettext (PO)、CSV 或只是一个简单的 PHP 数组文件。
优点: - 您可以将文件发送到翻译/翻译服务,而无需从数据库中提取它们 - 您不必为应用程序的开发/暂存版本发送数据库转储 - 您可以非常轻松地使用您的翻译另一种技术 - 速度:在 PHP 中解析 CSV/Ini 文件比在每个页面上执行 n 次查询要快得多
我认为 Andy Gee 和 FaceOfJock 很好地展示了您的解决方案应该是什么样子。