2015-11-05 64 views
7

我在构建网站时多次遇到此问题。 我会解释一下使用PHP和Laravel作为例子,但这个问题是一个常见的多平台。 这已经解决了几个问题(post1,post2,post3,post4和其他一些),但帖子并没有真正得到一个很好的答案。构建网站翻译文件

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

我目前使用Laravel(我不是提版本,因为这两个Laravel 4Laravel 5有类似的定位功能,至少是相似的足以让这个话题的效果影响不大)。

本地化结构的内容跨越语言文件(en,es,de,fr ...),其中可能有多个.php文件包含返回多级字典结构的返回语句。

/lang 
    /en 
     messages.php 
    /es 
     messages.php 

和文件包含的东西是这样的:

//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' 

的分组浮现在脑海中的几种方法:

<?php  
return [ 

    'example1' => 'example message for value exaple-key', 
    'example2' => [ 
     'sub-example' => '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'

  • 提到的那些的一些混合/组合的内容通过直接翻译中将不会尝试去int,但5th选项最有可能是最好的解决方案,但仍然存在着在哪里画线以获得最小重复的短语和内容的问题。

    另一个问题是如何解决在某些情况下大写第一个字符和其他情况下小写以及末尾标点符号的问题。

    我对此问题做了研究,但没有明确的指导方针和/或可用的示例。

    欢迎您提出意见。

  • +0

    您是否认为您提到的问题没有提供明确答案,可能是因为没有包含项目中所有可能用例的权威解决方案?你已经列出了5种可能的解决方案,所有这些解决方案都是可行的。所以只要选择一个最适合你的项目。至于你的问题的第二部分,它可以像使用['ucfirst'](http://php.net/manual/en/function.ucfirst.php)或['lcfirst'](http:/ /php.net/manual/en/function.lcfirst.php),如果需要,或者需要复杂的话,因为再次没有通用的解决方案。 – Bogdan

    +1

    我知道没有确定的解决方案。尽管如此,即使如此,对于更复杂的用例,也应该存在一些指导方针和示例,或者至少应该有一个普遍认同的做法。 – Traveller

    +0

    这正是我所强调的,没有“普遍认同的做事方式”_。这里的地面工作由[Laravel的本地化](http://laravel.com/docs/5.1/localization)提供,就结构而言,这取决于您,以及最适合您项目的东西。因为不同的应用程序有不同的内容,建议一个适合所有人的通用结构非常困难,并且通常你只会得到每个人的意见,这是[off-topic](http://stackoverflow.com/help/on-主题)在这里堆栈溢出。 – Bogdan

    回答

    0

    根据我的经验,除了试图在其他地方使用您的翻译外,没有理由拥有不同的团体。我通常把我所有的项目信息放在一个名为app的组中,对于我的每个共享库我使用一个单独的组名(因为我可能在其他项目中使用它们)。 在我的网站AA失败的登录信息的一个例子是

    trans('app.username_and_password_do_not_match') 
    

    ,如果它在一个名为验证第三方库这将是

    trans('auth.username_and_password_do_not_match') 
    

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

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

    +0

    这很好,短文本,简单的句子和短语。如何处理长内容。如何使它可重用,以及如何在不查看lang文件的情况下找到某些东西。你建议的方式工作得很好,直到你通过几百个代理。 – Traveller

    +0

    @Traveller很长的内容不是由程序员写的!给他们的网站管理员。让他们把它放在他们的面板上。您不需要在翻译字符串中设置长的HTML内容。 –

    +0

    @Traveller只要您生成不会成为问题的翻译文件。翻译发生器处理所有事情。 –

    0

    我将与第4个选项去,所以你有这样的事情:

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

    这做了几件事情:

    • 它细分了一切非常清楚。你知道在哪里找到哪种语言。你知道与该语言相关的文件中有什么。
    • 以上内容使得维护工作更加轻松,因为您可以找到相关内容。
    • 它为您提供可通过语言单独翻译的文件。
    • 它把所有的信息放在一个明确定义的地方。

    需要注意的一件事是,如果您的应用程序真的很大且真的是国际化的,您可能需要使用ISO语言代码。例如,欧洲葡萄牙语(pt_PT)和巴西葡萄牙葡萄酒是不同的,并且全球观众可能都想要覆盖这两者。

    +0

    是的,但这不是问题。 lang的结构方式是,语言位于具有相同子结构的单独文件夹中,并且默认情况下完成。问题是:如何在特定语言(en,fr,de)内部构造东西? #4选项的问题是有两个巨大的文件可以在长时间(或大型应用程序)中搜索不到。 – Traveller

    1

    我倾向于将我的Laravel应用程序中的功能组合为自包含的“组件”。例如,我最近一直在为应用程序开发电子邮件营销活动功能,因此将服务提供商类,模型和服务类放在文件夹中的应用程序/电子邮件

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

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

    • /资源
      • /郎
        • /EN
          • auth.php
          • email.php
          • events.php
          • news.php
          • pagination.php
          • passwords.php
          • validation.php

    希望这会有所帮助。

    +0

    这是一个很好的结构,我在lang包中看到过类似的东西,但是如何解决重叠内容的问题?这是两个区域共有的东西。另一个问题是,如果您必须针对不同的上下文环境具有相似但不同的内容(例如:管理视图,注册用户视图,访问者视图)。 – Traveller

    +0

    重叠内容:通用** messages.php **文件。不同的上下文并不重要,字符串'找不到结果'会将其转换为另一种语言,无论它在管理控制台还是用户帐户中。 –

    +0

    ** messages.php ** - >会不会那个文件真的是一团糟?在我看来,** messages.php **最终会产生重要且常用的内容,但会在内部找到一些内容。关于管理员/用户视图的 – Traveller