PHP/MySQL Web 应用程序使用枚举数据库字段进行国际化

标签 php mysql internationalization enums

我最近加入了一个项目,现在正在致力于其国际化改进。使用的技术有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/

相关文章:

php - PDF X-1a :2001 format in PHP

php - 无法保存 MySQL 查询

PHP MySQL 排序规则问题 - 连接表

ruby-on-rails - Rails 3.1 i18n 和 memcache

php - 无法从具有数组的查询填充表

php - 这个过程会计算行数吗?我如何从 php 调用这个过程?

php - 处理 PHP 到 mysql 查询的最佳实践?

mysql - 类似于 MSSQL 的 MySQL Profiler 程序

php - 用于 PHP/Android 的 Xliff 工具

internationalization - gettext (gettext-commons) 或坚持使用 java i18n