多语言php应用程序

时间:2013-09-14 17:29:27

标签: php translation

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

5 个答案:

答案 0 :(得分:2)

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

例如:

<强> Language_FR.txt:

hello = 'Salut'
delete='Supprimer'

<强> Language_EN.txt:

hello = 'Hello !'
delete='Delete'

答案 1 :(得分:1)

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

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

以及基于占位符的html with

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

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

不要制作整个网站的副本,否则编辑将意味着每次您想要进行更改时编辑翻译次数。

答案 2 :(得分:1)

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

然后在代码中,只要显示用户界面元素,就会有一个函数可以查找要显示的语言的正确字符串。

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

在你的文本文件中(我们称之为'de.php'),例如:

  

$ lang [] = ['你确定吗?'] ['Sind Sie sicher?'];

     

$ lang [] = ['取消'] ['Abbrechen'];

然后您的代码可以:

  

//加载适当的语言

     

包括($ userLang。 “PHP”);

     

...

     

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

答案 3 :(得分:1)

我仍然是为了数据库的想法。

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

<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->translate('enter_username');时,您可以进行以下查询:

SELECT pl FROM translations WHERE placeholder = 'enter_username';

返回'Wprowadźnawwęüżytkownika'

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

如果您需要并通过javascript提示错误,例如,对于错误的用户名,您在数据库中添加占位符,即“wrong_username_from_login_form”,最近用英语翻译为“您输入了错误的用户名”。请回去再试一次“。

你可以:

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

如果您的客户是英语,他会在屏幕上发出警告:“您输入了错误的用户名。请返回并重试”

答案 4 :(得分:0)

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

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

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