构建网站翻译文件

问题描述 投票:0回答:3

我在建立网站时多次遇到这个问题。 我将以使用 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' => 'your password is to long'

  5. 的内容
  6. 之前提到的一些混合/组合

所有这些都有一些明显的优点和缺点,我不会尝试详细说明,但5th选项很可能是最好的解决方案,但仍然存在一个问题,即在哪里划清界限以最小化短语重复和内容。

另外一个问题是如何解决首字母大写、首字母小写以及末尾标点符号的问题。

我确实研究过这个问题,但没有明确的指南和/或好的例子可供学习。

欢迎大家提出意见。

php laravel web laravel-4 translation
3个回答
3
投票

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

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

所以在另一个项目中,我的目录结构可能如下所示:

  • /资源
    • /郎
      • /zh
        • auth.php
        • 电子邮件.php
        • events.php
        • news.php
        • 分页.php
        • 密码.php
        • 验证.php

希望这有帮助。


0
投票

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

trans('app.username_and_password_do_not_match')

如果它位于名为 Auth 的第三方库中,那就是

trans('auth.username_and_password_do_not_match')

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

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


0
投票

我会选择#4,所以你会得到这样的结果:

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

这做了一些事情:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.