作者 | Hemanth Murali
译者 | 张卫滨
策划 | 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 它提供了一种基本但有效的方法来编写样本:
复制代码
在上述样例中,getWelcomeMessage 根据 locale 指定语言返回欢迎信息。语言是由 getUserLocale 确定方法。虽然这种方法非常基本,但它展示了根据用户特定的本地语言提供内容的原则。然而,随着内容的进展,我们将深入研究更先进的技术,了解为什么这种基本的方法可能无法扩展和高效地应用于大型应用程序。
覆盖范围广:由于所有的翻译都嵌入到代码中,我们可以使用多种语言,而不必担心外部依赖或缺乏翻译。无网络调用:翻译直接从代码中获取,无需任何网络费用或从外部源获取翻译相关延迟。方便的代码搜索:由于所有的翻译都是源代码的一部分,因此搜索特定的翻译或调查相关问题变得非常简单和容易。可读性:开发人员可以立即理解特定翻译背后的流程和逻辑,从而简化调试和维护。减少外部依赖:不需要依赖外部翻译服务或数据库,这意味着应用程序中缺少一个故障点。
更新操作需要发布新版本:在移动应用程序或独立应用程序场景中,用户需要下载并更新最新版本的应用程序,以添加新语言或调整现有翻译。冗余代码:随着语言数量的增加,switch 还会相应增加条件语句,导致代码重复和臃肿。合并冲突:由于多个开发人员可能会添加或修改各种语言,因此在版本控制系统中发生合并冲突的风险将会增加。代码维护面临的挑战:随着时间的推移,应用程序将扩展并支持更多的本地语言,直接管理和更新代码中的翻译将变得繁琐和容易出错。灵活性有限:很难添加复数形式、特定上下文的翻译或动态获取翻译等特征。性能费用:对于大规模应用,只使用大量翻译数据的一小部分会导致资源短缺和效率低下。
在前一种方法的基础上,我们努力保留它的优点,解决它的缺点。为了实现这一点,我们将代码库中的硬编码字符串值过渡到基于配置的设置。我们将使用单独的配置文件来使用每种本地语言 JSON 编码格式。这种模块化方法简化了翻译的添加和修改,不需要更改代码。
以下是英语和西班牙语本地语言的配置文件:
文件名:en.json
复制代码
文件名:es.json
复制代码
首先,我们需要一种阅读 JSON 文件的方式。这通常使用图像 Jackson 或 GSON 这样的库。在本例中,我们将使用它 Jackson。
复制代码
Internationalization 实例化时,类会根据提供的本地语言读取上述代码中的相关信息 JSON 配置。getTranslation 该方法使用标识符获取所需的翻译字符串。
保留了上述方法的所有优点:覆盖面广,加载后无需使用网络即可翻译,代码易于搜索和阅读。动态加载:翻译可根据用户的本地语言动态加载。只需加载必要的翻译,从而带来潜在的性能优势。可扩展性:更容易添加新语言。应用程序只需要在没有任何代码修改的情况下添加一个新的配置文件。更整洁的代码:逻辑与翻译分离,代码更简洁,更容易维护。集中管理:所有翻译都集中在文件中,因此更容易管理、审查和更新。该方法提供了一种更可扩展、更简单的国际处理方法,特别适用于大型应用程序。
随着应用程序的增长和对各种语言的支持,这些配置文件可能会变得相当大。这可能会导致应用程序的初始加载滞后,特别是在配置文件需要早期加载的情况下。
大规模配置文件的缓解方法之一是将其托管到内容分发网络(Content Delivery Network,CDN)上。这样,应用程序只能根据用户的本地语言加载必要的配置文件。这样既能保证应用程序的运行速度,又能减少用户不必要下载的数据量。当用户切换本地语言或检测到不同的本地语言时,可以根据需要从 CDN 获取配置。这为大规模应用程序提供了速度和灵活性之间的最佳平衡。为了简单起见,我们考虑使用基础 HTTP 库获取配置文件。在这个 Java 在样本中,我们将使用虚构的 HttpUtil 库:
复制代码
注意:上述代码只是一个简化的例子,在实际情况下可能需要错误处理、缓存机制和其它优化。
这里的想法是根据用户的本地语言直接从 CDN 获取必要的配置文件。用户的本地语言决定了文件的配置 URL,获取后,分析配置文件以获得所需的翻译。如果找不到相应的地键,则返回默认信息。该方法的优点是,应用程序只需加载必要的翻译,以确保最佳性能。
继承了前一种方法的所有优点。易于组织和添加新的本地语言翻译。只需获得必要的翻译,因此加载效率高。
庞大的配置文件可能会降低应用程序的初始化速度。字符串必须是静态的。当需要运行时,不能直接支持动态字符串或计算字符串。如果需要在翻译中插入动态数据,这可能是一个限制。依赖外部服务(CDN)。如果 CDN 如果出现故障或问题,应用程序将无法获得翻译内容。
但是,为了解决这些缺点,我们可以采取以下措施:第一个缺点可以通过 CDN 存储配置文件并在必要时加载以缓解。第二个缺点可以通过在静态字符串中使用占位符来解决,并在运行过程中根据上下文进行替换。第三个缺点需要一个强大的错误处理机制和一些潜在的储备策略。
如果要翻译的部分字符串是动态的,则需要更灵活的解决方案。以 Facebook 为例,在 News Feed 在这里,我们将看到使用自定义字符串来表示每篇文章的“Likes”信息。例如,如果文章只有一篇文章“Likes“信息,那么你可能会看到“John likes your post.”。如果有两个“如果有两个”Likes“信息,那么你可能会看到“John and David like your post.”。如果有两个以上的“Likes你可能会看到“信息”John, David and 100 others like your post.”。在这种情况下,需要一些自定义。动词“like”和“likes根据喜欢文章的人数来确定。如何做到这一点?
考虑以下样例:“John, David and 100 other people recently reacted to your post.",在这里"David”、“John”、“100”、“people”和“reacted都是动态元素。
让我们分析一下:
“David”和“John用户名可以从与用户相关的方法或数据库中获得。“100”可以是从与文章相关的方法或数据库中获得的反应文章的总数,不包括 David 和 John。当代指的是一个集体,“people可以是名词“人”的复数形式。“reacted用户可以用爱、关注或愤怒的图标来反应文章,而不是表达他们喜欢的图标。
实现此类动态内容的一种方法是在配置文件中使用占位符,并在运行过程中根据上下文更换占位符。
如下是一个 Java 样例:
配置文件(英语)
复制代码
配置文件(法语):
复制代码
Java 实现:
复制代码
开发有效的国际化(i18n)和本地化(l10n)框架对软件应用至关重要,无论规模如何。这种方法可以确保您的应用程序与用户的母语和文化背景产生共鸣。虽然字符串翻译是 i18n 和 l10n 它是一个重要的组成部分,但它只是软件全球化的一个更具挑战性的方面。
有效的本地化不仅是翻译,还解决了其他关键问题,如写作方向、阿拉伯语和其他语言的写作方向(从右到左)和不同的文本长度或大小,泰米尔语和其他语言可能比英语长。通过精心定制这些策略来满足特定的本地化需求,您可以为软件提供真正全球化的用户体验,适合不同的文化。
原文链接:构建国际框架,Web开发让语言无阻_框架_InfoQ选文章
网友评论