我最近加入了一个项目,现在正在致力于其国际化改进。使用的技术有PHP/MySQL/Zend Framework/Dojo。 I18n 是使用 gettext 实现的,几乎如此处所述 link to SO question在第二个答案中。
但是我遇到了一个问题。特定于某些数据库表的某些信息存储在这些表中的枚举类型列中。例如,表“user”中有一个字段 usr_online_status,它可以是“在线”或“离线”之一。有许多这样的表,其中包含枚举字段,其中包含 ('yes' ,'no') ,('download', 'upload') 等信息。当然,无论用户当前选择的语言如何,此信息都会以英语显示。
我想解决这个不便。但不知道在性能和易于实现方面做到这一点的最佳方法是什么。
我看到两种可能的选择:
1) 为每个使用此类枚举的表创建特定于语言的字典表。
2)从枚举下载所有信息。翻译它。制作一个脚本,可以根据需要更改每个表并用所需的翻译替换这些枚举。
但是这个问题可能有更简单或更好的解决方案。
你会做什么?
感谢您的回答。
UPD1 重要评论。枚举中的信息不仅显示在 GUI 上,而且还用于搜索。例如 - 网页上有一个网格,其中包含有关用户的信息。您可以在搜索字段中输入“line”,结果将仅是信息中包含“%line%”一词的用户,例如“在线”状态。
最佳答案
您肯定需要字典表:只有有了这些表,应用程序的 2 个不同用户才能同时使用不同的语言。
我建议将其中一些字典表放入 PHP 中,因为这已被证明是一种非常无干扰且高性能的方法 - 例如
$translation=array('yes'=>'Ja','no'=>'Nein', ..)
//...
$row=mysql_fetch_row($qry);
//$row[1] has yes/no
$row[1]=$translation[$row[1]];
//...
$translation 可以根据当前用户的语言首选项、URL 或其他内容进行 require_once()
编辑
基本上,您可以用一些 RAM 来换取速度和易用性。
更新:
随着 Gior312 添加有关搜索的信息,这是我的解决方案:在数据库表中进行反向翻译(您甚至可以使用它为每个脚本创建 $translation):
CREATE TABLE translations (
id INT PRIMARY KEY AUTO_INCREMENT,
languageid INT NOT NULL,
enumword VARCHAR(m) NOT NULL,
langword VARCHAR(n) NOT NULL,
-- n and m to your needs
INDEX(languageid)
-- other indices to your needs
)
现在当到目前为止的搜索是
$line=... //Maybe coming from $_POST['line'] via mysql_real_escape_string()
$sql="SELECT * FROM sometable WHERE somefield LIKE '%$line%'";
你现在要做的是
$line=... //Maybe coming from $_POST['line'] via mysql_real_escape_string()
$sql="SELECT enumword FROM translations WHERE languageid=$currentlanguageid AND langword LIKE '%$line%'";
//fetch resulting enumwords into array $enumwords
$enumlist=implode("','",$enumwords);
//This assumes, that the field enumwords contains nothing, that needs to be escaped
$sql="SELECT * FROM sometable WHERE somefield IN ('$enumlist')";
以不同方式对待前向和反向翻译的基本原理是:
- 您显示的代码行数比您搜索的代码行数要多,因此正向翻译的非侵入性更为重要
- 正向翻译必须按行(使用连接)完成,反向翻译只能按每个查询完成,因此正向翻译的性能比反向翻译的性能更重要
关于PHP/MySQL Web 应用程序使用枚举数据库字段进行国际化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8926064/