我在建立网站时多次遇到这个问题。
我将以使用 PHP 和 Laravel 为例进行解释,但这个问题在多个平台中都很常见。
这已经在几个问题中得到了解决(post1 https://stackoverflow.com/questions/31785471/which-are-the-suggested-key-naming-strategies-for-trans-in-laravel/33650126#33650126, post2 https://stackoverflow.com/questions/7507640/translate-website-into-different-language?rq=1,post3 https://stackoverflow.com/questions/10852817/best-way-to-translate-a-website?rq=1, post4 https://stackoverflow.com/questions/954160/php-how-to-translate-a-website-into-multiple-languages?rq=1和其他一些)但这些帖子并没有真正得到很好的答案。
问题是:在语言文件中构建翻译内容的最佳方法是什么?
我目前正在使用 Laravel (我没有提及版本,因为两者拉拉维尔 4 http://laravel.com/docs/4.2/localization and 拉拉维尔 5 http://laravel.com/docs/5.0/localization具有类似的本地化功能,至少对于本主题的目的而言足够相似)。
本地化构建跨语言文件(en、es、de、fr...)的内容,其中可以有多个 .php 文件,其中包含返回多级字典结构的 return 语句。
/lang
/en
messages.php
/es
messages.php
这些文件包含如下内容:
<?php
return [
'example1' => 'example message for value exaple-key',
'example2' => [
'sub-example' => 'example message for example1.sub.example',
],
];
调用它是通过执行以下操作来完成的:
//Laravel 5
trans('messages.example1'); //outputs 'example message for value exaple-key'
trans('messages.example2.sub-example'); //outputs 'example message for example1.sub.example'
//Laravel 4
Lang::get('messages.example1'); //outputs 'example message for value exaple-key'
Lang::get('messages.example2.sub-example'); //outputs 'example message for example1.sub.example'
我想到了几种分组方法:
-
按网站内容
例子:homepage.php, page1.php, page2.php...
-
按逻辑域:
例子:auth.php, validation.php, pagination.php...
-
by html:
例子:buttons.php, popup_messages.php, form_data.php...
-
直接翻译:
例子:simple_words.php, phrases.php...
并且包含类似内容'password-to-short' => 'your password is to long'
前面提到的一些混合/组合
所有这些都有一些明显的优点和缺点,我不会尝试详细说明,但5th选项很可能是最好的解决方案,但仍然存在一个问题,即在哪里划清界限,以尽量减少短语和内容的重复。
另一个问题就是如何解决某些情况下首字母大写、其他情况下首字母小写以及末尾标点符号的问题。
我对这个问题进行了研究,但没有明确的指南和/或好的例子可供学习。
欢迎所有意见。