模型属性的翻译

时间:2016-09-03 12:06:03

标签: php mysql internationalization filesystems

我正在开发一个MVC框架(请不要质疑,我知道..)并且目前正在设计一种翻译机制以最大限度地简化应用程序的翻译,到目前为止我有一个包含翻译文件的lang文件夹对于不同的页面

./lang/en/system.php
./lang/es/system.php
./lang/fr/system.php

等等。假设此文件包含系统消息的翻译,例如

./lang/en/system.php

<?php

return array(
    'yourIP' => 'Your IP address is :1'
);

要在页面中访问它,我将使用外观类Lang,它将根据所选语言(存储在会话中)获取文件并为我提供翻译。

控制器

public function index() {
    return new View('index', ['translations' => Lang::get('system')]);
}

视图

<h1><?= $translations->get('yourIP', System::getClientIP()) ?></h1>

这似乎工作得非常快,因为我可以在单独的文件/页面中有效地将翻译分组。

我现在要解决的问题是翻译模型。例如,假设我正在构建一个多语言博客并在数据库中保存帖子。每个帖子都需要自己的翻译,但理论上可以有无限量的帖子。我正在使用的当前方法似乎不太实用。

我需要做的是创建一个子目录并存储翻译,如

./lang/en/posts/post-1.php
./lang/en/posts/post-2.php
...
./lang/en/posts/post-n.php

这将适用于所有语言,在此文件中,我将存储模型的所有可翻译(这是一个单词?)字段,并将其加载到模型的构造函数中。

有关此解决方案的问题:

  • 文件系统会塞满许多非常小的文件 - 我不是真正的文件系统专家,我想问一下这样的大量小文件是否会对文件系统本身造成伤害,包括读取速度减慢等等。
  • 检索一组模型时会有n个文件系统读取,其中n是模型的数量。硬盘驱动器是计算机中最慢的组件,在脚本中执行大量FS读取会显着减速,现在SSD可能不是那么多但仍然不是一个小问题。

我提出的另一个解决方案是使用一个额外的系统数据库表,它将按表和主键存储翻译,如

table INT
model_pk INT
lang INT
translations TEXT

其中table将是翻译所属表格的crc32编码编号,model将是模型的PK(id){{1}无需解释,lang将是一个包含所有可翻译属性的序列化字符串。

这种方法存在问题:

  • 强制开发人员使用数据库并强制他们拥有某个表(目前框架不需要您拥有数据库,因此当您实际使用数据库时没有系统表)。
  • 具有复合主键的模型将无法从中受益,因为translations列无法存储复合键,因此只有具有单列主键的模型才可以翻译。

这些只是我的观察和想法,我可能错了,或者我可能会遗漏一些东西。我正在发布这个问题,以获得有关哪个解决方案对于经验丰富或提出完全不同的人的问题较少的建议,我对所有事情持开放态度。

1 个答案:

答案 0 :(得分:0)

如果你需要首先构建一些优秀的东西,你必须明白你到目前为止所做的是所谓的本地化(设置应用语言,这将是静态数据的案例转换),但你仍然需要进行翻译(这意味着翻译动态数据,如数据)来自数据库)

有关详细信息http://content.lionbridge.com/the-difference-between-translation-and-localization-for-multilingual-website-projects-definitions/

有关本地化的更多信息:https://laravel.com/docs/5.3/localization 另见https://github.com/mcamara/laravel-localization

有关翻译的更多信息,您可以找到感兴趣的{Laravel Framework https://github.com/dimsav/laravel-translatable

这个包