一般,项目的语言包由几个properties文件组成。

例如A项目中有1个properties文件global.properties,文件中有若干key,其中一个是:BUTTON_OK=OK。如果项目A需要英语、德语、简体中文等种语言的界面。那么,我们应该另外准备三个properties文件,分别为:global_en_US.properties,global_de_DE.properties,global_zh_CN.properties。

_en代表“英语”,_US代表美国,之所以带个地区代码是因为有些地区虽然都说英语但是不同地区的语言存在细微差别,带上国家代码以示区分。那么,_de就是德语,_DE即为德国;_zh为汉语,_CN为中国(当然还有_TW台湾地区、_HK香港和_MO澳门)。

而global.properties文件的名字后面没有任何语言、地区代码,这个文件被称为default资源文件,也即程序获取key的值时,如果其他相对应的语言文件中都没有与此key相对应的值,那么就取default资源文件中与此key相对应的值。

但是,需要注意的是:JDK的ResouceBundle类在获取key的对应值时,也是有一定逻辑的。如果项目在运行的时候传给ResouceBundle的locale是en,而项目中又没有相对应的语言资源包,那么,按常理猜想ResourceBundle应该去取default文件中的值。但是,注意,事实恰恰相反。ResourceBundle会根据当前用户JDK的默认语言去取相对应的语言包。

也就是说,如果告诉ResourceBundle去获取en资源,而恰好没有en对应的资源,那么ResourceBundle不会立刻去取default资源,而是去获取JDK的默认语言环境(其实就是JDK所在OS的地区设置),然后根据JDK的默认语言环境去获取对应的资源包。如果与JDK相对应的资源也不存在,这时才去取default资源。

所以,当我们的项目需要支持en语言时,不能仅在default资源写上en语言就完事儿了,还要切切实实的准备一份_en.properties文件(地区代码是可以省略掉的)。哪怕是准备一份空白的_en.properties文件,这都是必须的。