2024-04-12 10:20:16|网友 |来源:互联网整理
打开此电脑,在路径栏输入:控制面板\所有控制面板项\程序和功能.在列表里找到locleemulator,点击右键选择卸载,按提示操作就可以了。
视频介绍
译者 | 张卫滨
策划 | Tina
国际化(i18n)和本地化是 Web 开发中的关键流程,能够确保软件适用于不同的语言和地区,并确保软件实际适配这些特定的需求。
尽管以 JavaScript 为核心的 i18n 库(如 i18next、react-intl 和 react-i18next)是该领域的主流工具,可帮助开发人员高效地处理翻译和本地化相关的配置,但它们仅适用于基于 JavaScript 的 Web 应用。
我们需要一个与语言无关的国际化框架。
JSON 是一种广泛接受的格式,可用于存储翻译和本地化相关的配置,无论使用何种语言和框架,都能在各种应用程序中轻松集成和动态替换内容。
内容分发网络(Content Delivery Network,CDN)可被战略性地用于高效提供本地化相关的配置文件,从而减轻加载大型配置文件潜在的弊端。
构建自定义国际化框架,并将其与数据库或数据存储解决方案集成,可以实现动态和上下文感知的翻译,从而增强不同地区和语言的用户体验。
你是否已经涉足 Web 开发的汪洋大海?如果答案是肯定的,那你很快就会意识到,Web 不仅仅是为英语使用者服务的,它是面向全球的。
假设法国用户看到了一条令人困惑的纯英文错误信息,在你被类似的投诉淹没之前,我们先来讨论一下什么是国际化(internationalization,通常简写为 i18n)和本地化。
想象一下,在这个世界上,无论每个人的母语是什么,你的软件都可以与他们流畅地交流。
这就是国际化和本地化要实现的目标。
虽然乍看上去没啥特别之处,但是请记住,本地化应用程序不仅仅是翻译文本。
而是要根据用户的文化、地区和语言偏好提供量身定制的体验。
但是,这里有个障碍在等着你。
深入了解 i18n 库的工具箱,你会发现以 JavaScript 为核心的解决方案占据了主导地位,尤其是那些围绕 React 的解决方案(如 i18next、react-intl 和 react-i18next )。
如果跳出 JavaScript 的范畴,可选的方案就会越来越少。
更糟糕的是,这些现成的工具通常都带有“一刀切”的特点,缺乏适配特定用例的能力。
不过,不必担心!如果鞋子不合适的话,为何不自己动手做呢?请继续往下阅读,我们将指导你从头开始构建一个国际化框架:一个为你的应用程序量身定制、跨语言和跨框架的解决方案。
准备好为你的应用程序签发全球通行证了吗?让我们开始这段旅程吧。
掌握国际化精髓的一个简单方法就是使用一个函数,该函数能够根据用户所在的地域获取信息。
如下是一个使用 Java 编写的样例,它提供了一个基本但有效的方法:
public class InternationalizationExample { public static void main(String[] args) { System.out.println(getWelcomeMessage(getUserLocale())); } public static String getWelcomeMessage(String locale) { switch (locale) { case &34;: return &34;; case &34;: return &34;; case &34;: return &34;; default: return &34;; } } public static String getUserLocale() { // This is a placeholder method. In a real-world scenario, // you&39;s locale from their settings or system configuration. return &34;; // This is just an example. } }
复制代码
在上面的样例中,getWelcomeMessage 根据 locale 指定的语言返回欢迎信息。
语言是由 getUserLocale 方法确定的。
这种方法虽然非常基础,但是展示了根据用户特定的本地语言提供内容的原则。
但是,随着内容的进展,我们将深入研究更先进的技术,并了解为何这种基础的方式对于大型应用程序可能无法具备可扩展性和高效率。
:由于所有的翻译都嵌入在代码中,因此我们可以使用多种语言,而不必担心外部依赖或缺失翻译。
无网络调用:翻译直接从代码中获取,无需任何网络开销或从外部源获取翻译相关的延迟。
便利的代码搜索:由于所有的翻译都是源码的一部分,因此搜索特定翻译或排查相关的问题变得很简单易行。
可读性:开发人员可以立即理解选择特定翻译背后的流程和逻辑,从而简化调试和维护。
减少外部依赖:无需依赖外部翻译服务或数据库,这意味着应用程序中少了一个故障点。
:在移动应用或独立应用的场景中,添加新语言或调整现有的翻译需要用户下载并更新最新版本的应用。
冗余代码:随着要支持语言数量的增加,switch 和条件语句也会相应地增加,从而导致代码的重复和臃肿。
合并冲突:由于多个开发人员可能会对各种语言进行添加或修改,所以版本控制系统中出现合并冲突的风险会随之增加。
代码维护所面临的挑战:随着时间的推移,应用程序会进行扩展并支持更多的本地语言,直接在代码中管理和更新翻译会变得繁琐且容易出错。
灵活性有限:采用这种静态的方式很难添加像复数形式、特定上下文的翻译或动态获取翻译等特性。
性能开销:对于大规模应用而言,加载大块的翻译数据却仅使用其中很小的一部分会导致资源紧张,造成效率低下。
在前一种方法的基础之上,我们努力保留其优点,同时解决其缺点。
为了实现这一点,我们将代码库中的硬编码字符串值过渡到基于配置的设置。
我们会为每种本地语言使用单独的配置文件,并以 JSON 格式进行编码。
这种模块化方式简化了翻译的添加和修改,无需进行代码的变更。
如下是英语和西班牙语本地语言的配置文件:
文件名:en.json
{ &34;: &34;}
复制代码
文件名:es.json
{ &34;: &34;}
复制代码
首先,我们需要一种读取 JSON 文件的方式。
这通常会使用像 Jackson 或 GSON 这样的库。
在本例中,我们将使用 Jackson。
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.IOException; import java.util.Map; public class Internationalization { private static final String CONFIG_PATH = &34;; private Map<String, String> translations; public Internationalization(String locale) throws IOException { ObjectMapper mapper = new ObjectMapper(); translations = mapper.readValue(new File(CONFIG_PATH + locale + &34;), Map.class); } public String getTranslation(String key) { return translations.getOrDefault(key, &34;); } } public static class Program { public static void main(String[] args) throws IOException { Internationalization i18n = new Internationalization(getUserLocale()); System.out.println(i18n.getTranslation(&34;)); } private static String getUserLocale() { // This method should be implemented to fetch the user&39;s just return &34; for simplicity. return &34;; } }
复制代码
Internationalization 类在实例化的时候,会根据提供的本地语言读取上述代码中相关的 JSON 配置。
getTranslation 方法使用标识符获取所需的翻译字符串。
:覆盖面广,加载后无需使用网络就能进行翻译,代码易于搜索和阅读。
动态加载:可根据用户的本地语言动态加载翻译。
只需加载必要的翻译,从而带来潜在的性能优势。
可扩展性:添加新语言更容易。
只需为该语言添加一个新的配置文件,应用程序就能处理它,无需任何代码修改。
更整洁的代码:逻辑与翻译分离,代码更简洁、更易维护。
中心化的管理:所有的翻译都集中在一个文件中,因此更易于管理、审查和更新。
这种方法提供了一种更可扩展、更简洁的国际化处理方式,尤其适用于大型应用程序。
:随着应用程序的增长和对多种语言的支持,这些配置文件可能会变得相当大。
这可能会导致应用程序的初始加载出现滞后,尤其是在配置文件需要前期加载的情况中。
缓解可能出现大型配置文件的一种方法是将其托管到内容分发网络(Content Delivery Network,CDN)上。
通过这种方式,应用程序可以根据用户的本地语言只加载必要的配置文件。
这样既能保证应用程序的运行速度,又能减少用户不必要下载的数据量。
当用户切换本地语言或探测到不同的本地语言时,可以根据需要从 CDN 获取配置。
这为大规模应用程序提供了速度和灵活性之间的最佳平衡。
为了简单起见,我们考虑使用基础的 HTTP 库来获取配置文件。
在这个 Java 样例中,我们将使用虚构的 HttpUtil 库:
import java.util.Map; import org.json.JSONObject; public class InternationalizationService { private static final String CDN_BASE_URL = &34;; public String getTranslatedString(String key) { String locale = getUserLocale(); String configContent = fetchConfigFromCDN(locale); JSONObject configJson = new JSONObject(configContent); return configJson.optString(key, &34;); } private String fetchConfigFromCDN(String locale) { String url = CDN_BASE_URL + locale + &34;; return HttpUtil.get(url); // Assuming this method fetches content from a given URL } private String getUserLocale() { // Implement method to get the user&34;en&34;David&34;en&34;US&34;David&34;John&34;en&34;US&34;David&34;John&34;en&34;US&34;David&34;fr&34;FR&34;David&34;John&34;fr&34;FR&34;David&34;John&34;fr&34;FR&34;MessagesBundle&34;&34;oneUserAction&34;likeSingular&34;David likes your post&34;twoUserAction&34;likePlural&34;David and John like your post&34;multiUserAction&34;people&34;likePlural&34;David, John and 100 other people like your post&结论
无论规模大小,开发有效的国际化(i18n)和本地化(l10n)框架对于软件应用都至关重要。
这种方法可以确保你的应用能够与用户的母语和文化背景产生共鸣。
虽然字符串翻译是 i18n 和 l10n 的一个重要组成部分,但它只是软件全球化这一更广泛挑战的一个方面而已。
有效的本地化不仅仅是翻译,还要解决其他的关键问题,例如书写方向,阿拉伯语等语言的书写方向(从右到左)和文本长度或大小各不相同,泰米尔语等语言的文字可能比英语更长。
通过精心定制这些策略来满足特定的本地化需求,你就可以为软件提供真正全球化的、适用于不同文化的用户体验。
原文链接:构建国际化框架,Web开发让语言无阻_框架_InfoQ精选文章
复制本文链接攻略资讯文章为拓城游所有,未经允许不得转载。