我在建立网站时多次遇到这个问题。 我将以使用 PHP 和 Laravel 为例进行解释,但这个问题在多个平台中都很常见。 这已经在几个问题中得到了解决(post1、post2、post3、post4 和其他一些问题),但这些帖子并没有真正得到很好的答案。
问题是:在语言文件中构建翻译内容的最佳方式是什么?
我目前正在使用 Laravel(我没有提及版本,因为 Laravel 4 和 Laravel 5 都有类似的本地化功能,至少对于本主题的目的而言足够相似)。
本地化构建跨语言文件(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...
通过 html:
示例:
buttons.php, popup_messages.php, form_data.php...
直接翻译:
示例:
simple_words.php, phrases.php...
并且包含类似 'password-to-short' => 'your password is to long'
之前提到的一些混合/组合
所有这些都有一些明显的优点和缺点,我不会尝试详细说明,但5th选项很可能是最好的解决方案,但仍然存在一个问题,即在哪里划清界限以最小化短语重复和内容。
另外一个问题是如何解决首字母大写、首字母小写以及末尾标点符号的问题。
我确实研究过这个问题,但没有明确的指南和/或好的例子可供学习。
欢迎大家提出意见。
我倾向于将 Laravel 应用程序中的功能分组为独立的“组件”。例如,我最近一直在为应用程序开发电子邮件活动功能,因此将服务提供商类、模型、服务类放在app/Email的文件夹中。
考虑到这一点,我以类似的方式组织我的翻译。因此,即使在这个项目中我们不翻译字符串,如果我们是的话,我会创建一个 resources/lang/en/email.php 文件,并将电子邮件组件的翻译字符串放入其中。
所以在另一个项目中,我的目录结构可能如下所示:
希望这有帮助。
根据我的经验,除了尝试在其他地方使用您的翻译之外,没有理由建立不同的小组。我通常将所有项目消息放在名为 app 的组中,并且对于每个共享库,我使用单独的组名称(因为我可能会在其他项目中使用它们)。 我的网站中登录失败消息的一个示例是
trans('app.username_and_password_do_not_match')
如果它位于名为 Auth 的第三方库中,那就是
trans('auth.username_and_password_do_not_match')
并记住写下完整的消息作为消息键,而不是使用短名称(如app.login.fail)。这样您就不需要每次翻译都检查网站内容。
我没有完全理解你的上一个问题,所以你可能想澄清一下。
我会选择#4,所以你会得到这样的结果:
/lang/
/en
messages.php
words.php
/fr
message.php
words.php
/de
messages.php
words.php
这做了一些事情:
需要注意的一件事是,如果您的应用程序变得非常大并且非常国际化,您可能需要使用 ISO 语言代码。 例如,欧洲葡萄牙语 (pt_PT) 和巴西葡萄牙语是不同的,对于全球受众,您可能希望同时涵盖这两种语言。