本地化(或缺乏)什么时候是一件坏事?
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();
}
}
请注意,在此示例中,无法在异常中本地化消息。我知道这可以使用第一个示例中的相同原则轻松解决,但它是有意设计的,以证明缺乏全球化。
因此,什么时候应该将全球化应用于代码,以便它可以本地化?什么时候重要,什么时候不重要?
这在很大程度上取决于您的用例。我建议立即本地化显示在前端的消息。我的经验是,以后再做成本很高。对于调试或监控消息,我可能会只使用英文,因为大多数开发人员都能阅读英文消息。
我相信,没有理想的答案 - 一切都取决于您的架构和用例。
不过,我建议采用以下模式:
- 所有日志消息(服务器和客户端)都应该是英文的
- 所有错误 API 响应都应始终提供英文描述和唯一的错误代码,您可以在客户端将其翻译成友好的消息
- 为了提供良好的用户体验,所有客户端消息都应使用用户的语言
一般来说,最好使用英文提供所有技术数据(日志、错误等)。所有面向用户的数据都必须是用户可以理解的。
所有标签 需要翻译。
对于此定义,文本 是最终用户正在阅读 的信息。在这种情况下,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 true
或 false
,并且完全独立的 UI 部分应该将其转换为面向用户的内容,并可能在此过程中对其进行本地化.与例外相同,它应该被加载适当本地化的东西捕获 UI 向用户解释问题。
下面的代码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();
}
}
请注意,在此示例中,无法在异常中本地化消息。我知道这可以使用第一个示例中的相同原则轻松解决,但它是有意设计的,以证明缺乏全球化。
因此,什么时候应该将全球化应用于代码,以便它可以本地化?什么时候重要,什么时候不重要?
这在很大程度上取决于您的用例。我建议立即本地化显示在前端的消息。我的经验是,以后再做成本很高。对于调试或监控消息,我可能会只使用英文,因为大多数开发人员都能阅读英文消息。
我相信,没有理想的答案 - 一切都取决于您的架构和用例。
不过,我建议采用以下模式:
- 所有日志消息(服务器和客户端)都应该是英文的
- 所有错误 API 响应都应始终提供英文描述和唯一的错误代码,您可以在客户端将其翻译成友好的消息
- 为了提供良好的用户体验,所有客户端消息都应使用用户的语言
一般来说,最好使用英文提供所有技术数据(日志、错误等)。所有面向用户的数据都必须是用户可以理解的。
所有标签 需要翻译。
对于此定义,文本 是最终用户正在阅读 的信息。在这种情况下,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 true
或 false
,并且完全独立的 UI 部分应该将其转换为面向用户的内容,并可能在此过程中对其进行本地化.与例外相同,它应该被加载适当本地化的东西捕获 UI 向用户解释问题。