我正在开发一个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
列无法存储复合键,因此只有具有单列主键的模型才可以翻译。这些只是我的观察和想法,我可能错了,或者我可能会遗漏一些东西。我正在发布这个问题,以获得有关哪个解决方案对于经验丰富或提出完全不同的人的问题较少的建议,我对所有事情持开放态度。
答案 0 :(得分:0)
如果你需要首先构建一些优秀的东西,你必须明白你到目前为止所做的是所谓的本地化(设置应用语言,这将是静态数据的案例转换),但你仍然需要进行翻译(这意味着翻译动态数据,如数据)来自数据库)
有关本地化的更多信息:https://laravel.com/docs/5.3/localization 另见https://github.com/mcamara/laravel-localization
有关翻译的更多信息,您可以找到感兴趣的{Laravel Framework https://github.com/dimsav/laravel-translatable
这个包