为什么您的Java应用程序该说人话了?
\n\n您是否想过,为什么我们每天使用的应用程序——从Spotify到Notion——能立刻“明白”该用什么语言和您交流?它们不会读心术,也不会根据IP地址猜测。它们使用的是国际化(i18n)。
\n\n对于Java开发者来说,让应用程序支持多语言不仅仅是一个“亮点”,如果您瞄准全球市场,这是一项必备技能。想象一下:您编写了一个很酷的任务管理服务。它在俄罗斯火了。但一旦您想把它卖到德国或日本——用户会看到俄语的“创建任务”按钮。然后他们会关掉标签页。很遗憾,对吧?
\n\n在本文中,我们不只是谈论理论。我们将拿一个Java应用程序(最普通的,控制台或Web应用),并逐步为其添加俄语、英语和德语支持。您会发现Java国际化并不可怕,反而非常优雅。开始吧!
\n\n什么是国际化和本地化?别搞混了!
\n\n这两个概念经常被混淆。让我们来理清它们。
\n\n- \n
- 国际化(i18n)——这是设计应用程序的过程,使其能够适应不同的语言和地区,而无需修改代码。您需要预先设置好用于翻译的“钩子”。 \n
- 本地化(l10n)——这是用特定国家的具体翻译、日期格式、货币和排序规则来填充这些“钩子”的过程。 \n
在Java中,负责国际化的是java.util包中的类:Locale和ResourceBundle。记住它们——它们是您最好的朋友。
步骤1. 认识Locale——国际化的核心
\n\nLocale类代表一个特定的区域(语言+国家)。例如:
- \n
Locale.US——英语(美国) \n Locale.GERMANY——德语(德国) \n new Locale("ru", "RU")——俄语(俄罗斯) \n
Locale用于选择正确的字符串翻译、数字、日期和货币的格式。没有它,国际化是不可能的。
\n\n如何获取当前区域设置?
\n\nimport java.util.Locale;\n\npublic class Main {\n public static void main(String[] args) {\n // 默认区域设置(通常与系统设置一致)\n Locale defaultLocale = Locale.getDefault();\n System.out.println("当前区域设置: " + defaultLocale);\n\n // JVM中可用的区域设置\n Locale[] available = Locale.getAvailableLocales();\n System.out.println("总共可用: " + available.length);\n }\n}\n\n输出可能是,例如:当前区域设置: ru_RU。但我们不会依赖系统区域设置——在Web应用程序中,它通常由用户的浏览器传递。
步骤2. ResourceBundle——您的翻译官
\n\n现在最有趣的部分:如何存储翻译?在Java中,这通过属性文件(.properties)来实现。每个文件都是一组键=值对。
创建翻译文件
\n\n在src/main/resources目录(或直接在源文件夹中)创建三个文件:
1. Messages.properties(默认语言——英语)
\ngreeting=Hello, {0}!\nfarewell=Goodbye!\napp.title=Task Manager\n\n2. Messages_ru_RU.properties(俄语)
\ngreeting=Привет, {0}!\nfarewell=До свидания!\napp.title=Менеджер задач\n\n3. Messages_de_DE.properties(德语)
\ngreeting=Hallo, {0}!\nfarewell=Auf Wiedersehen!\napp.title=Aufgabenverwaltung\n\n注意后缀:_ru_RU,_de_DE。Java根据以下模式查找文件:基础名称