我正在尝试将asp.net mvc应用程序重写为codeigniter。
基本上,codeigniter遵循mvc模式,所以它非常好。现在我陷入了本地化。
我不想更改网址,以便/Company/About
在英语和德语中保持不变。内部视图我在asp.net Views/Index.cshtml
中默认为德语,Views/Index.en.US.cshtml
为英语本地化页面。
我将在我的asp网站上描述完美的场景。
我如何将此方法应用于codeigniter,或至少类似?
由于
答案 0 :(得分:1)
我认为为每种语言提供单独的文件不是一个好主意。您可以使用其他易于实现的技术轻松完成。
在我的一个CI项目上工作时,我需要支持多种语言。当我在其他多语言系统(如Prestashop)工作时,我从那里借鉴了想法并在我的CI项目中实现了它。
我已按照以下方式实施:
1)我将文字存储在语言文件中。每种语言的单个文件都被命名为语言ISO代码,对于英语,其名称为en.php。在此语言文件中,单词存储为 file_name_md5(单词),如下所示 Hello World 在视图文件hello.php中。
$_lang = array(
'hello_b10a8db164e0754105b7a99be72e3fe5' => 'hallo Welt',
...
...
...
)
$ _lang关联数组的键是附加文件名的世界,要翻译,值是翻译。
存储单词并从这些语言文件中取出单词,由我创建的翻译库处理。
2)视图文件中的所有静态文本都是用英文编写的。我为它创建了一个名为" l" ,小L的辅助函数。假设我想在我看来 Hello world (比如hello.php)并且应该翻译成多种语言。所以在我看来,我写的就像
<?=$this->l('Hello World...', 'hello')?>
3)现在 l 辅助函数对传递给它的参数执行小操作。它需要md5的世界,并附上文件名,如上所示。然后它调用我的Translation库的成员函数,它查找$ _lang数组以找到该匹配项。如果找到匹配,则返回翻译。如果没有找到该单词的翻译,则 l 辅助函数将返回原始文本。
4)我创建了自己的控制器库,扩展了所有控制器。为了保留CI功能,我的父控制器从默认CI控制器扩展。在我的父控制器中,我根据用户语言加载语言文件。这样,$ _lang数组可供翻译库查找单词。
5)在我的管理员方面,我创建了一个翻译系统,该系统读取我的所有View文件以获取特定模式,如下所示
<?=$this->l('Hello World...', 'hello')?>
代码生成一个表单,在该表单中为每个单词创建一个文本字段。文本字段名称与$ _lang数组键相同,如filename_md5_of_word。在这种情况下,文本字段标签是原始单词&#34; Hello World ...&#34;。并且必须将翻译写入文本字段。
在保存时,翻译将存储到选定用于翻译的特定语言的特定语言文件中。
使用此方法,您将来可以添加任意数量的语言,而无需为每种语言创建视图文件,因此它非常灵活。
我希望我已经解释得足以让您了解如何轻松实现翻译系统,并避免每种语言的单独视图文件。
如果您有任何疑问,请随时与我联系。
谢谢