【问题标题】:Angular app and internationalization and localizationAngular 应用程序和国际化和本地化
【发布时间】:2015-02-17 17:45:00
【问题描述】:

我们有一个现有的 Silverlight 应用程序,它在浏览器 + 硬件上运行。

我们想用 Angular js 和 html5 重写这个应用程序。

新系统的关键要求之一是支持国际化和本地化。目前目标国家是美国、巴西、意大利。

是这个领域的新手,有很多基本问题。

  1. 是否需要重新设计现有数据库以支持相同的?我的意思是识别需要具有特定于区域设置的数据的列(产品名称/客户名称等),然后存储每个区域设置的数据并修改 sprocs 和 webapi 以接受语言参数,然后根据该参数获取内容。 ? 我相信我们需要为此类列使用 nvarchar。

  2. db 中的货币和日期时间列会发生什么情况?说有数量列,那么 db 中该列的数据类型应该是什么?如果当前语言环境是葡萄牙语,那么 qty 将以葡萄牙语数字存储。

  3. 存储和检索货币列的最佳实践是什么 基于区域设置。

  4. 存储和检索日期列的最佳做法是什么 基于区域设置。

  5. webapi方法中如何处理字符串检查、数字检查?

  6. 如何在 javascript 中对字符串、数字、日期时间进行比较和检查

请分享一些有用的链接。

简而言之,从 javascript 到 .net webapi 再到数据库 (sql),我们应该如何处理依赖于语言环境的逻辑和字段

谢谢。

【问题讨论】:

    标签: javascript angularjs localization internationalization asp.net-web-api2


    【解决方案1】:

    很多问题,看看我能不能回答。

    1. 如果您现有的应用程序正确国际化,我认为没有必要修改数据库。只需确保它能够处理国际字符(MS SQL 中的NCHARNVARCHARNTEXT,其他中的有效字符编码)。
      至于数据库设计,最好尽可能地保持区域独立。例如,最好将密钥存储在数据库中并在运行时解析它们。但是,如果您的数据是动态的(即您的产品名称及其描述经常更改),那么唯一的方法是使用翻译表并使用有效的语言环境查找数据。这在关系世界(即联接)中相当复杂,但可以做到。

    2,3。所有数字列都应保持与语言环境无关,并在 UI 端进行格式化。更成问题的是价格和销售订单 - 您需要一个额外的列来存储货币代码(即 12.34 | USD)。在 UI 方面,您需要将代码传递给 Angular 货币过滤器。这里唯一的问题是,Angular 不支持简单的语言环境上下文切换,因此您需要使用像 Angular Dynamic Locale 这样的 hacky 库来为您加载格式。

    1. 类似。保持与语言环境无关。 DB 内置类型应该自动为您处理,并给您很好的DateTime/DateTimeOffset(在.Net 世界中)。唯一的问题是时区 - 使用DATETIMEOFFSET MS SQL 类型可能有意义,因为其他人不存储时区。
      有另一种方法可以在数据库中存储日期和时间 - 您可以决定将其存储为自 1970 年 1 月 1 日 UTC 以来的毫秒数 - 为 BIGINT 类型。特别是如果您要直接将其阅读到 JS,您将能够在有效时区轻松地重新创建 JS Date 对象(如果您需要它来进行计算或其他事情)(它也可以反过来工作)。格式化日期所需要做的就是使用这个数字(不是日期,即 AFAIR)和 Angular 的日期过滤器,以 UTC 作为参数。

    2. 我想我不明白你在问什么。我想问题是关于用户输入的验证,而不是 API。好吧,小心使用正则表达式,因为 JavaScript 不能很好地处理 Unicode(至少在这方面)。你需要问更准确的问题。

    3. 假设您有 Number 和 Date 对象(即typeof o == 'number'),这很简单(如obj1 === obj2)。
      就字符串而言......好吧,如果你想准确的话,str1 === str2 会给你有效的答案。如果您想对它们进行排序,现代网络浏览器(Chrome 14+、Firefox 29+、IE11+)实现了EcmaScript 402 Internationalization API,因此您可以执行str1.localeCompare(str2, locale)see this article 之类的操作。
      当您想要比较两个不区分大小写和不区分重音的字符串是否相等时(与排序相反的排序),真正的问题就出现了。基本上,没有办法(即使在 Java 或 C# 等“大型”编程语言中也是如此)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2011-12-08
      • 1970-01-01
      • 2011-02-07
      • 2012-08-31
      • 2015-07-07
      相关资源
      最近更新 更多