代码之家  ›  专栏  ›  技术社区  ›  matt b

用大量标记将文本国际化的最佳实践?

  •  4
  • matt b  · 技术社区  · 16 年前

    我正在做一个网页项目,希望有一天可以用几种语言(我说“希望”,因为虽然我们今天只计划了一个英语网站,但我公司的其他产品都是多语言的,我希望我们也能成功地需要它)。

    我知道最好的实践(我使用Java,Spring MVC,这里的速度)是把用户在外部文件中看到的所有文本都放进去,并按名称在UI文件中引用它们,例如:

    #in messages_en.properties:
    welcome.header = Welcome to AppName!
    
    #in the markup
    <title>#springMessage("welcome.header")</title>
    

    但是,我以前从来没有在项目上亲自经历过这个过程,我很好奇处理这个问题的最佳方法是什么,当您的一些UI段对标记很重要时,例如:

    <p>We are excited to announce that Company1 has been acquired by
    <a href="http://www.companydivisionx.com" class="boldLink">Division X</a>,
    a fast-growing division of <a href="http://www.company2.com" class="boldLink">Company 2</a>, Inc. 
    (Nasdaq: <a href="http://finance.google.com/finance?q=blah" class="boldLink">BLAH</a>), based in...
    

    我能想到的一个选择是将这种“低级”的标记存储在messages.properties本身中,用于消息,但这似乎是最糟糕的选择。

    我能想到的其他选择是:

    • 将每个非标记内部片段存储在messages.properties中,例如 acquisitionAnnounce1 , acquisitionAnnounce2 , acquisitionAnnounce3 . 这似乎 非常 虽然冗长乏味。
    • 将此消息分解为更可重用的组件,例如 Company1.name , Company2.name , Company2.ticker 等等,因为它们中的每一个都可能在许多其他消息中重用。这可能占到这条消息中80%的单词。

    有没有处理国际化文本的最佳实践,这些文本中包含大量这样的标记?你只需要咬紧牙关忍受撕碎每一段文字的痛苦吗?从你个人处理过的项目中,最好的解决方案是什么?

    4 回复  |  直到 16 年前
        1
  •  6
  •   j pimmel    16 年前

    通常,如果使用模板引擎,例如 Sitemesh Velocity 您可以更有效地将这些较小的HTML构建基块作为子模板进行管理。

    通过这样做,您可以逐步地将纯国际化字符串分解为组,并使它们与那些标记子模板相关。在为一个应用程序使用模板完成了这类工作之后,这个应用程序跨越了同一语言环境中的多个语言以及多个语言环境,我们从未在消息包中放置过标记。

    我建议一个关键的好做法是避免在消息属性文件中放置标记(即使是放在较低的级别)。 不惜一切代价! 这对于释放地狱的潜力并不是一件可以忽略的事情——咬住子弹并正确地分解东西,远比使用分散的HTML标记管理许多文件要简单得多。重要的是,您可以将标记可视化为整体块,并将其分散开来,使日常开发变得繁琐,因为:

    • 您将丢失IDE颜色突出显示和语法验证
    • 当设计/标记的更改被过滤掉时,很可能会错过一个或另一个区域设置文件

    把事情分解(到一个现实的角度,如逻辑句子结构,但没有更好的)是有点困难的前期工作,但值得努力。

    关于字符串分解粒度,下面是我们所做的示例:

        comment.atom-details=Subscribe To Comments
        comment.username-mandatory=You must supply your name
        comment.useremail-mandatory=You must supply your email address 
        comment.email.notification=Dear {0}, the comment thread you are watching has been updated.
        comment.feed.title=Comments on {0}
        comment.feed.title.default=Comments
        comment.feed.entry.title=Comment on {0} at {1,date,medium} {2,time,HH:mm} by {3}
    
    
        comment.atom-details=Suscribir a Comentarios
        comment.username-mandatory=Debes indicar tu nombre
        comment.useremail-mandatory=Debes indicar tu direcci\u00f3n de correo electr\u00f3nico
        comment.email.notification=La conversaci\u00f3n que estas viendo ha sido actualizada
        comment.feed.title=Comentarios sobre {0}
        comment.feed.title.default=Comentarios
        comment.feed.entry.title=Comentarios sobre {0} a {1,date,medium} {2,time,HH:mm} por {3}
    

    因此,您可以对如何在消息包中替换字符串做一些有趣的事情,这也可以帮助您保留它的逻辑含义,但允许您在句中操作它。

        2
  •  6
  •   Marek Jedliński    16 年前

    正如其他人所说,请不要将字符串拆分为段。你会让译者伤心,因为他们不得不强迫他们的语言语法遵守你无意中创建的特殊规则。通常不可能提供语法正确的翻译,尤其是在不同的上下文中重用某些片段时。

    也不要删除标记。

    请不要假设专业的翻译人员在记事本中工作:)计算机辅助翻译(CAT)工具,如Trados套件,非常了解标记。如果标记是HTML,而不是某种自定义XML格式,则不需要特殊的准备。Trados将保护标签不受意外修改的影响,同时允许在必要时进行更改。请注意,标记的某些元素通常需要进行本地化,例如alt文本或某些查询字符串,因此仅剥离所有标记是行不通的。

    最重要的是,除非你是在一个零预算的个人项目上工作,否则考虑联系一个本地化供应商。本地化就像网页设计一样是一项服务。一个有能力的供应商将帮助您为您的项目选择最佳的解决方案/格式,并指导您完成源材料的准备和合并本地化结果。当然,他们和他们的翻译人员将拥有所有必要的工具。(完全披露:我是翻译/本地化专家。不要把字符串分开:)

        3
  •  3
  •   Ryan Doherty    16 年前

    首先, 不要 把你的弦分开。这使得定位器更难翻译文本,因为他们看不到整个字符串。

    我可能会尝试在链接周围使用占位符:

    <a href=“%Link1%”class=“%Link1Class%”>部门X</a>

    当我将一个站点本地化为30种语言时,就是这样做的。这不是完美的,但很有效。

    我认为不可能(或不容易)从字符串中删除所有标记,您需要有一种方法来插入URL和任何额外的标记。

        4
  •  2
  •   Robert J. Walker    16 年前

    你应该避免断线。这不仅会成为翻译的噩梦,而且还会做出语法假设,这些假设在目标语言中可能不正确。

    虽然占位符对很多事情都有帮助,但我不建议为URL使用占位符。这允许您为不同的区域设置自定义URL。毕竟,当他们的语言是阿根廷西班牙语时,把他们发送到英语页面是没有意义的!