本地化(或缺乏)什么时候是一件坏事?

When is localization (or lack of) a bad thing?

下面的代码returns一条消息,说明输入值是否是回文:

(为了这个 post,语法并不重要,或者用任何特定语言编写)

function isPalindrome(
    value: string, 
    successMessage: string = "Is palindrome", 
    failureMessage: string = "Is not palindrome"): string {

    return value.reverse() == value ? successMessage : failureMessage;
}

请注意,在上面的代码中,默认消息是用英语编写的,但是由于它们是作为参数提供的,因此可以轻松地本地化此方法,并且由于该方法具有消息的默认值,因此这并不强制开发商提供它们;例如:

isPalindrome("level") // returns "Is palindrome"

但是我们可以展示本地化;例如,西班牙语:

isPalindrome("level", "es palíndromo", "no es palíndromo") // returns "es palíndromo"

这让我开始思考,什么时候在设计代码时 应该考虑本地化?

另一个例子是有例外;例如:

class PalindromeException : Exception("Is not a palindrome")

function validatePalindrome(value: string): void {
    if (value.reverse() != value) {
        throw PalindromeException();
    }
}

请注意,在此示例中,无法在异常中本地化消息。我知道这可以使用第一个示例中的相同原则轻松解决,但它是有意设计的,以证明缺乏全球化。

因此,什么时候应该将全球化应用于代码,以便它可以本地化?什么时候重要,什么时候不重要?

这在很大程度上取决于您的用例。我建议立即本地化显示在前端的消息。我的经验是,以后再做成本很高。对于调试或监控消息,我可能会只使用英文,因为大多数开发人员都能阅读英文消息。

我相信,没有理想的答案 - 一切都取决于您的架构和用例。

不过,我建议采用以下模式:

  1. 所有日志消息(服务器和客户端)都应该是英文的
  2. 所有错误 API 响应都应始终提供英文描述和唯一的错误代码,您可以在客户端将其翻译成友好的消息
  3. 为了提供良好的用户体验,所有客户端消息都应使用用户的语言

一般来说,最好使用英文提供所有技术数据(日志、错误等)。所有面向用户的数据都必须是用户可以理解的。

所有标签 需要翻译。

对于此定义,文本 是最终用户正在阅读 的信息。在这种情况下,label 是一段 text,同时不是 user input用户数据.

举个例子,在'Save as'对话框中,文件名将是用户输入文件内容用户数据保存两个按钮上的 Cancel 标签将是 labels(因此需要翻译)。

鉴于此定义,规则如下:

只有用户界面代码需要翻译,它会翻译所有标签。相反,业务逻辑代码 不直接面向最终用户(如图书馆或后端服务)根本不应该翻译。此外,业务逻辑实现和业务逻辑API都不处理用户输入[=52以外的文本=] 或 用户数据

因此,该规则还涉及 业务逻辑代码 用户界面代码 的完全分离。这对测试非常方便。

对于回文示例,函数将是业务逻辑,它不会return一个文本而是一些东西更合适例如布尔值或枚举。 用户界面代码然后会适当地评估return和翻译。这同样适用于异常。

唯一应该进行本地化的地方是 UI。如果您坚持使用 MVC principle of separation of concerns(或类似 MVP 之类的东西),那么本地化只发生在 View 部分。您的 isPalindrome 函数听起来更像是属于 Model 部分的业务逻辑,因此根本不应该关注 i18n。异常也不应该担心它,因为任何异常都不应该按原样打印到 UI(除了提供调试信息,不需要 be/shouldn 本地化)。

您的函数应该只 return truefalse,并且完全独立的 UI 部分应该将其转换为面向用户的内容,并可能在此过程中对其进行本地化.与例外相同,它应该被加载适当本地化的东西捕获 UI 向用户解释问题。