F21*_*F21 5 php database-design gettext internationalization
我正在构建一个需要国际化的php web应用程序.我决定将get-text用于系统相关的字符串,也许还有一些数据库表用于用户生成的内容.
例如,用户可能能够发布博客帖子.他应该能够以不同的语言发布该帖子的不同版本.我可以通过在posts表中存储所有帖子以及表示语言的额外列来实现这一点.
困难的一点是试图国际化存储在数据库中的系统字符串.
例如,我有一个存储权限的表.每个权限都应该有一个描述此权限的字符串.
目前,它存储在这样的表中:
我计划使用像PoEdit这样的应用程序来生成gettext文件.它能够搜索所有的php文件以获取字符串.但是在这样的情况下,字符串存储在数据库中,提取字符串进行转换可能是一项相当大的工作.处理这个的一些技巧和解决方案是什么?
最后,假设我有一些用户可以在应用程序中创建和定义的数据类型和表单.例如,为购物车定义"产品类型".这意味着该产品将拥有自己独特的属性和描述集.这些属性需要与描述一起进行翻译.
形式相同的情况.用户可以创建可以存储在一组表中的表单.然后需要翻译这些表格.
我可以使用哪些数据库模型来存储表单和产品类型的翻译?
干杯:)
Hna*_*att -1
我认为 gettext 更适合用于消息、按钮、标题等的翻译。而不是动态内容。为此,您可以根据项目要求采用多种不同的方法。首先,您应该决定:
对于具有最大灵活性和可扩展性的解决方案,您可以采用以下方式。原始表格保持原样,没有任何变化。对于翻译,您添加一个translations包含列的表格:
id首要的关键object_table翻译后的表名object_id对翻译对象的引用language或者language_id如果您需要动态管理语言field翻译字段名称original_md5原始字段值的哈希值(如果您需要跟踪更改) translationauthor_id、published、date以及审核所需的其他字段(如果您需要)。然后,在另一个表或配置文件中描述要翻译哪些表和字段。您还可以描述字段的类型,例如、text、textarea等。htmlfile
例如:
$translatedFields = array(
// here key stands for translated table name
'posts' => array(
// here key stands for translated field
// and value for field's type
'title' => 'text',
'body' => 'html',
),
);
Run Code Online (Sandbox Code Playgroud)
然后,在数据访问层中,您确定当前语言并将所有 SELECT 查询替换为要翻译的表。一点正则表达式的魔力和严格的查询语法可以在这里为您提供帮助。查询SELECT title, body FROM posts WHERE posts.id='1'变成
SELECT
IF(posts_title_translation.translation IS NULL,
posts.title,
posts_title_translation.translation) AS title,
IF(posts_body_translation.translation IS NULL,
posts.body,
posts_body_translation.translation) AS body
FROM posts
LEFT JOIN translations AS posts_title_translation
ON posts_title_translation.object_id = posts.id
AND posts_title_translation.object_table = 'posts'
AND posts_title_translation.language = '$language'
AND posts_title_translation.field = 'title'
---- And if you need premoderation, then filter off unpublished translations
--AND posts_title_translation.published
LEFT JOIN translations AS posts_body_translation
ON posts_body_translation.object_id = posts.id
AND posts_body_translation.object_table = 'posts'
AND posts_body_translation.language = '$language'
AND posts_body_translation.field = 'body'
--AND posts_body_translation.published
WHERE posts.id = '1'
Run Code Online (Sandbox Code Playgroud)
(SELECT 部分中的 IF 表达式允许您在没有完成或发布翻译的情况下选择原始字段)。
这就是您如何拥有灵活的 i18n 系统的方法。对每个单独的字段进行翻译,并在选择时在数据访问层中自动替换。
这有点棘手,而且必须说,部分受到Joomla! 的Joom!Fish扩展的影响,但这就是我这样做的方式。
我将添加另一个更简单的解决方案的答案,因为这已经太大了。