【问题标题】:Which javascript framework excels at handling internationalization?哪个 javascript 框架擅长处理国际化?
【发布时间】:2012-03-30 01:08:55
【问题描述】:

假设我正在构建一个相当大的基于浏览器的交互式媒体应用程序,并且我有以下要求:

  • 仅限 Webkit(假设桌面上使用 chrome)
  • 平板电脑和台式机版本,用户界面可能略有不同
  • 完全客户端:没有任何服务器交互
  • 可能的最佳性能
  • 完全国际化
  • 我将构建大量此类应用程序
  • 长期可维护性不是优先事项(此处没有 TDD)
  • 重用和从项目到项目是一个优先事项
  • 设计师称雄 - 大量时间将花在外观和动画上
  • 非常短的开发时间表
  • 小而精的团队

我正在寻求以前做过类似事情的人的建议,以避免事先做出一些错误的选择。

我对 JS 和 CSS3 了如指掌,但我足够聪明/经验丰富/年纪大,知道使用别人开发的架构框架而不是自己开发的架构框架有好处。但是,只有当我编写的应用程序符合框架开发人员的目标时,这些好处才有效。

我花了一天时间尝试了解 SenchaTouch,并得出结论认为它非常适合构建与我正在构建的完全不同的东西。 (以此类推,SenchaTouch/ExtJS 是 Swing,我正在寻找 Flash。)此外,Sencha 似乎费了很大力气将 Javascript 更改为基于类的系统,而不是仅仅接受/拥抱它是一个原型- 为基础的系统。这让我很烦。

我花了一天时间学习所有关于backbone.js,我真的很喜欢它,除了1)我真的不需要任何服务器交互的东西(尽管我可能会用它来引导所有的UI元素资源文件),以及 2)它完全强调保持视图是最新的。但也许这是件好事?这个我不是很清楚。

我查看了 knockout.js,虽然它确实非常担心保持视图的更新,但我查看的演示都没有解决国际化问题。我的 i18n 需求很简单:我的应用程序中出现的每个文本字符串都需要来自一个表格(并且可以随时更改使用的语言)。当我在 knockout.js 主页中看到这样的内容时:

optionsCaption="choose..."

我担心根据运行时变量设置使该字符串动态化是多么容易。也就是说,如果我想写相当于:

optionsCaption=l10n("choose")

是否有一种相当轻松的方法来做到这一点,让语言更改自动在整个 UI 中传播涉及什么?

有什么强烈的建议可以让我看看另一个框架,这可能更合适?

另外,我假设我们将使用 jquery/ui 或 zepto,可能是 zepto,以消除动态页面更新和动画内容中的大量样板。对架构的这一部分有什么有用的想法吗?

【问题讨论】:

  • 您能接受其中一个答案吗?我在 KnockoutJS + Jed 中为您提供了 i18n 的演示。
  • 抱歉,Magnus,但是这个项目的优先级降低了,我还没有回复它。在我对它们进行全面评估之前,我无法真正接受答案,这仍在我的待办事项清单上。

标签: jquery backbone.js sencha-touch knockout.js zepto


【解决方案1】:

我想您会发现有很多 种 JavaScript 可以满足您的需求。如果您想快速了解各种框架的感觉,我建议您查看TodoMVC project,其中相同的应用程序已在 18 个不同的 JavaScript 框架中实现,包括您为这个问题标记的那些。我有 just added a GWT implementation 参与这个项目 - 我认为 GWT 是一项值得考虑的技术。它具有许多“企业”功能,例如内置 i18n,加上使用强类型 Java 语言使得重用非常更容易。

【讨论】:

    【解决方案2】:

    我还没有尝试过这些,但它们似乎很容易与任何框架一起使用:

    获取 javascript 的文本:http://slexaxton.github.com/Jed/

    灵活的复数和性别形式:https://github.com/SlexAxton/messageformat.js

    【讨论】:

      【解决方案3】:

      只需从服务器端生成所有 html 并使用语言标签。我使用 PHP 执行此操作并使用 knockoutjs 和 sammyjs。 html 使用所有语言的标签,并且每种语言都有一个不同的 PHP 文件,其中包含该语言的所有标签及其值。

      此解决方案的“缺点”是您可能需要在更改语言时重新加载页面(如果您要使用单页应用解决方案,这可能只是一个缺点)。

      【讨论】:

      • 也许我不清楚。没有“服务器端”。这是一个本地应用,恰好在浏览器中运行。
      【解决方案4】:

      我自己也对此很好奇(一个淘汰赛 + i18n 搜索让我在这里),我用 Jed 实用程序和 Akasha 建议的 knockoutjs 做了一个快速而肮脏的 JSFiddle。我还不得不使用一点 JQuery。

      看看这里:http://jsfiddle.net/yUE7a/5/

      我创建了一个绑定到您当前语言环境的自定义绑定 (i18n)。 i18n 绑定从元素中获取文本并将其用作键并将其替换为来自 Jed 的翻译文本。

      语言环境本身是作为 ko.obervable 实现的,因此您可以更改语言环境值并让 knockoutjs 一次性更新所有翻译标签(您可能必须在 init 和 update 之间缓存键,因为它被$(element).html() 调用)。

      一个问题仍然存在,当我将 Jed 包含在 JsFiddle 中时,所有样式都消失了。我不知道为什么,如果这是 Jed + KnockoutJS 或只有 Jed + JsFiddle 的实际问题。

      我以前从未使用过 Jed,所以我不知道它是否符合您的目的,但它应该足够简单,可以用另一个 i18n 框架替换 Jed。

      希望这会有所帮助!

      【讨论】:

      • 不错的演示,虽然 knockout-2.0.0.js 链接现在似乎已损坏(因此演示当前无法运行)
      【解决方案5】:

      我最近遇到了同样的问题,而且由于有很多 JS 工具可以解决这个问题,因此(据我发现)它们都不能很好地与 KnockoutJS 配合使用,并且能够在不刷新页面的情况下更改语言。

      因此,我创建了一个我自己的工具来处理它,称为KnockoutJS-i18n

      它适用于简单文本和变量:

      <div data-bind="html: i18n.get('hello')"></div>
      <div data-bind="html: i18n.get('hello_name',{'name' : 'John Doe'})"></div>
      

      【讨论】:

        猜你喜欢
        • 2011-03-23
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多