在 Laravel 5.x 中为 trans() 组织本地化文件的好策略是什么?

Which are good strategies for organizing localization files for trans() in Laravel 5.x?

This is a question about methodology and suggested practices. I know it is not strictly attached to the framework and not even PHP, and the answer might be "its up to you". But my concern is about best practices and methodology, as there usually exists a best approach for a certain context.

我想知道对于 Laravel[=42 的 trans() 函数,键命名 的最佳实践是什么=] 5.1 ?

考虑到内置的 Laravel 翻译存储在一个数组中,我关心的是哪种层次结构允许我实现以下目标:

一致性:所以我尽量减少使用不同词表示相同含义的可能性,或者创建许多最终具有相同翻译的不同键(如常用词)。

可重用性:所以我尽量减少整体翻译文件的大小并尽可能少翻译,并保持灵活性。

可读性:翻译者即使在缺乏翻译价值的情况下也能识别出关键的用途。

组织:因此开发人员可以轻松记住完整的密钥路径,并尽量减少每次检查转换文件。


举个例子,假设我想为管理配置文件的用户模型更新命名一个成功的警报。可能的方法是:

trans('manager.user.update.alert.sucess')

trans('alerts.success.manager.user.update')

trans('manager.user.alert.update.success')

trans('alert.the_user_was_updated_successfully')

更新

到 2016 年 11 月,看起来 Laravel 5.4 is introducing a JSON based translation mechanism 可能会简化翻译文件。尽管如此,关心智能文件结构和组织良好的文本是一个加号。

我的建议是使用 Laravel 中的参数化翻译选项。

我建议采用这样的结构:

对于通用且可重复使用的内容:

trans('messages.alerts.update.success', ['item' => 'User']);   // results in: 'User has successfully been updated'
trans('messages.alerts.update.success.default');               // results in: 'Updated was successfull.'

对于与特定 area/problem...(在本例中为经理)严格相关的内容:

trans('manager.alerts.update.user.success');   // results in: 'User has successfully been updated'

trans('manager.alerts.update.success', ['item' => 'User']);   // results in: 'User has successfully been updated'
trans('manager.alerts.update.success.default');               // results in: 'Updated was successfull.'

我们的想法是,对于经理特定的事情,例如更新成功消息可能与其他更新成功消息不同,您应该从特定消息开始,例如:manager.alerts... . 在一般情况下(同一条消息可以在多个用例中使用)你应该从像 messages.alerts.update....

这样的通用内容开始

我认为应该避免像 trans('alert.the_user_was_updated_successfully') 这样的命名,因为当您想要更改消息时可能会遇到大问题。键将仍然反映旧值,而值将是新值。

关于您的目标:

一致性可重用性:一定数量的内容会被复制。这是无法避免的。然而,这个问题可以通过结构化内容和拥有一个包含常用单词和短语的文件来最小化,例如。 commons.words commons.phrases 或 2 个文件(单词和短语),其中包含几个类别。示例:commons.time.day , commons.hello_world ...

可读性:这将是一个问题,除非您给译者一个已经具有所有值的文件(使用 he/she 的默认语言或起始语言)可以翻译自)。我真的不明白你为什么没有首字母 translation/content.

组织:您必须尝试像开发人员一样思考。如果你想找一些具体的东西,你会想并尝试在那个特定的主题下找到一些东西(manager.alerts.... 在这种情况下) 但如果您正在搜索更通用的东西,您更有可能搜索通用的东西(messages.alerts.... 在这种情况下)

我有类似的问题并发布了 question 关于它。 不幸的是,人们对该主题也没有太大兴趣。