【问题标题】:Structuring Website Translation files构建网站翻译文件
【发布时间】:2015-11-05 16:06:28
【问题描述】:

我在构建网站时多次遇到这个问题。 我将以使用 PHP 和 Laravel 为例进行说明,但这个问题在多个平台中很常见。 这已经在几个问题中得到解决(post1post2post3post4 和其他一些问题),但这些帖子并没有真正得到很好的答案。

问题是:在语言文件中构建翻译内容的最佳方式是什么?

我目前正在使用 Laravel(我没有提及版本,因为 Laravel 4Laravel 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'

我想到了几种分组方法:

  1. 按网站内容

    例如:homepage.php, page1.php, page2.php...

  2. 按逻辑域:

    例如:auth.php, validation.php, pagination.php...

  3. 通过 html:

    示例:buttons.php, popup_messages.php, form_data.php...

  4. 直译:

    示例:simple_words.php, phrases.php... 并包含类似 'password-to-short' =&gt; 'your password is to long' 的内容

  5. 前面提到的一些混合/组合

所有这些都有一些明显的优点和缺点,我不会尝试去理解,但 第 5 个 选项很可能是最好的解决方案,但仍然存在划线的问题尽量减少短语和内容的重复。

另一个问题是如何解决某些情况下首字母大写,另一些情况下小写以及结尾的标点符号的问题。

我对这个问题进行了研究,但没有明确的指导方针和/或可供学习的好例子。

欢迎所有意见。

【问题讨论】:

  • 您是否认为您引用的问题没有提供明确的答案可能是因为没有涵盖项目中所有可能用例的明确解决方案?您已经列出了 5 种可能的解决方案,所有这些看起来都可行。因此,只需选择最适合您给定项目的那个。至于你问题的第二部分,它可以像在需要的地方使用 ucfirstlcfirst 一样简单,也可以尽可能复杂,因为同样没有通用的解决方案。
  • 我知道没有明确的解决方案。尽管如此,仍然应该存在一些针对更复杂用例的指南和示例,或者至少是一种普遍认可的做事方式。
  • 这正是我所强调的,没有“普遍同意的做事方式”。这里的基础工作由Laravel's Localization 提供,至于结构,这取决于您并且最适合您的项目。因为不同的应用程序有不同的内容,建议一个适合所有人的通用结构非常困难,而且通常你只会得到每个人的意见,off-topic 在 Stack Overflow 上。
  • 是的,但仍然几乎没有任何大型用例的示例
  • 尝试在 Laravel 4 中使用 trans 函数,我使用它,它就像 trans("menu.labels.users") 这样的魅力,我将得到我使用的确切值,trans("menu.labels")将返回标签数组中的所有值

标签: php laravel web laravel-4 translation


【解决方案1】:

我倾向于将 Laravel 应用程序中的功能分组为独立的“组件”。例如,我最近一直在为一个应用程序开发电子邮件活动功能,因此将服务提供者类、模型、服务类放在 app/Email 的文件夹中。

考虑到这一点,我以类似的方式组织我的翻译。所以即使在这个项目中我们没有翻译字符串,如果我们是的话,我会创建一个 resources/assets/lang/en/email.php 文件,并将电子邮件组件的翻译字符串放在那里.

所以在另一个项目中,我的目录结构可能是这样的:

  • /资源
    • /语言
      • /zh
        • auth.php
        • email.php
        • events.php
        • news.php
        • 分页.php
        • passwords.php
        • validation.php

希望这会有所帮助。

【讨论】:

  • 这是一个很好的结构,我在 lang 包中看到过类似的东西,但是你将如何解决重叠内容的问题? 2个领域共有的东西。另一个问题是当您必须为不同的上下文情况(例如:管理员视图、注册用户视图、访问者视图)提供相似但不同的内容时。
  • 重叠内容:一个通用的 messages.php 文件。不同的上下文并不重要,无论是在管理面板还是用户帐户中,字符串“未找到结果”都会将其翻译成另一种语言。
  • messages.php -> 那个文件不是很乱吗?在我看来,messages.php 最终会包含重要且常用的内容,但在其中查找内容会很麻烦。
  • 关于管理员/用户视图。在我之前的问题中,我想向您询问有关管理员的消息与用户的消息略有不同的情况。一个示例是登录欢迎消息(用户:您已成功登录到您的主面板,管理员:您已成功登录到系统或用户:您已成功登录,管理员:您上次登录是在 YYYY:MM: DD HH:MM:SS)
  • @Traveller 我尽量让我的消息保持通用性以避免这种情况。拥有多条基本上说“您已登录”的消息是在浪费您的时间和翻译人员的时间。如果您支付外部翻译费用,那么时间也是金钱。
【解决方案2】:

根据我的经验,除了尝试在其他地方使用您的翻译外,没有理由拥有不同的组。我通常将我所有的项目消息放在一个名为 app 的组中,并且对于我的每个共享库,我使用一个单独的组名(因为我可能会在其他项目中使用它们)。 我的网站中的登录失败消息示例如下:

trans('app.username_and_password_do_not_match')

如果它在名为 Auth 的第三方库中,它会是

trans('auth.username_and_password_do_not_match')

并记住将完整的消息写为您的消息密钥,而不是使用短名称(如 app.login.fail)。这样您就不需要检查每个翻译的网站内容。

我没有完全理解你的最后一个问题,所以你可能想澄清一下。

【讨论】:

  • 短文本、简单句子和短语都可以。如何处理长内容。如何使其可重用以及如何在不总是查看 lang 文件的情况下找到一些东西。您建议的方法可以正常工作,直到您通过几百个条目。
  • @Traveller 长内容不应该是程序员写的!将它们交给站点管理员。让他们在他们的面板中设置它。您没有在翻译字符串中设置长 html 内容。
  • @Traveller 只要生成翻译文件就没有问题。翻译生成器负责一切。
  • 当然,程序员不会写长内容,但仍然存在语言结构化的问题,因此您或其他人不必在每次他想使用时查看和检查语言某事
  • @Traveller 为什么每次要写东西都要检查?
【解决方案3】:

我会选择选项#4,所以你会有这样的东西:

/lang/
    /en 
      messages.php
      words.php
    /fr
      message.php
      words.php
    /de
      messages.php
      words.php

这会做一些事情:

  • 它非常清楚地分割了所有内容。您知道在哪里可以找到哪种语言。而且您知道文件中与该语言相关联的内容。
  • 以上内容让以后的维护变得更容易,因为你可以找到东西。
  • 它按语言为您提供可以单独翻译的文件。
  • 它将所有信息放在一个明确定义的位置。

需要注意的一点是,如果您的应用变得非常大并且非常国际化,您可能希望使用 ISO 语言代码。例如,欧洲葡萄牙语 (pt_PT) 和巴西葡萄牙语是不同的,对于全球观众,您可能希望同时涵盖两者。

【讨论】:

  • 是的,但这不是问题所在。语言的结构方式是语言位于具有相同子结构的单独文件夹中,并且默认情况下完成。问题是:如何在特定语言(en、fr、de)中构建事物? #4 选项的问题是有 2 个大文件,从长远来看(或大型应用程序)可能无法搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多