欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 如何實(shí)現(xiàn)多語(yǔ)言配置i18n

 更新時(shí)間:2021年08月04日 17:05:37   作者:41攝氏度男  
這篇文章主要介紹了java 如何實(shí)現(xiàn)多語(yǔ)言配置i18n的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java 實(shí)現(xiàn)多語(yǔ)言配置i18n

1、創(chuàng)建資源包和資源文件

一個(gè)資源包中的每個(gè)資源文件都必須擁有共同的基名。除了基名,每個(gè)資源文件的名稱中還必須有標(biāo)識(shí)其本地信息的附加部分。

例如:一個(gè)資源包的基名是“inspectionJsonMsg”,則與中文、英文環(huán)境相對(duì)應(yīng)的資源文件名則為: "inspectionJsonMsg_zh_CN.properties" "inspectionJsonMsg_en_US.properties"

2、資源文件的書(shū)寫(xiě)格式

資源文件的內(nèi)容通常采用"關(guān)鍵字=值"的形式,軟件根據(jù)關(guān)鍵字檢索值顯示在頁(yè)面上。一個(gè)資源包中的所有資源文件的關(guān)鍵字必須相同,值則為相應(yīng)國(guó)家的文字。并且資源文件中采用的是properties格式文件,所以文件中的所有字符都必須是ASCII字碼,屬性(properties)文件是不能保存中文的,對(duì)于像中文這樣的非ACSII字符,須先進(jìn)行編碼

例如:

國(guó)際化的中文環(huán)境的properties文件

國(guó)際化的英文環(huán)境的properties文件

3、在Spring配置文件中增加多語(yǔ)言配置

applicationContext.xml

<!--多語(yǔ)言的配置 開(kāi)始-->
	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basenames">
			<list>
				<value>language/inspectionJsonMsg</value>
			</list>
		</property>
 
		<property name="defaultEncoding" value="UTF-8" />
	</bean> 
 
	<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
		<property name="cookieName" value="spmsLanguage"/>
		<property name="cookieMaxAge" value="94608000"/>
		<property name="defaultLocale" value="zh_CN" />
	</bean>
	<!--多語(yǔ)言的配置 結(jié)束-->

4、如何使用

(1)編寫(xiě)常量類

public class InspectionConst { 
	//設(shè)備查詢成功
	public static final String INSPECTION_DEVICE_QUERY_SUCCESS = "ny.spms.java.inspection.device.query.success";
	//設(shè)備查詢失敗
	public static final String INSPECTION_DEVICE_QUERY_ERROR = "ny.spms.java.inspection.device.query.error";
}

(2)編寫(xiě)I18n工具類,I18nUtil.java

package com.hikvision.energy.util.i18n; 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.i18n.LocaleContextHolder; 
import com.hikvision.energy.core.util.AppContext; 
import java.util.Locale;
 
/**
 * 多語(yǔ)言查詢value工具類
 * 
 * @author wanjiadong
 * @date 2017-11-6
 *
 */
public class I18nUtil { 
    private static MessageSource messageSource; 
    private final static Logger log = LoggerFactory.getLogger(I18nUtil.class); 
    static {
        messageSource = AppContext.getBean("messageSource");
    }
    /**
     * 根據(jù)CODE查詢,默認(rèn)無(wú)通配參數(shù),Local跟隨當(dāng)前cookie
     * @Author: wanjiadong
     * @Description:
     * @Date: 2017-11-6
     * @param: code
     */
    public static String getMessage(String code){
        return getMessage(code,null,getLocal());
    }
 
    public static String getMessage(String code,Locale locale){
        return getMessage(code,null,locale);
    }
 
    /**
     * 根據(jù)CODE查詢,自定義默認(rèn)值,默認(rèn)無(wú)通配參數(shù),Local跟隨當(dāng)前cookie
     * @Author: wanjiadong
     * @Description:
     * @Date: 2017-11-6
     * @param: code
     */
    public static String getMessage(String code,String defaultMessage){
        return getMessage(code,null,defaultMessage,getLocal());
    }
    /**
     * 根據(jù)CODE和args查詢,Local跟隨當(dāng)前cookie
     * @Author: wanjiadong
     * @Description:
     * @Date: 2017-11-6
     * @param: code
     * @param: args 通配符的參數(shù)
     */
    public static String getMessage(String code,Object[] args){
        return getMessage(code,args,getLocal());
    }
 
    public static String getMessage(String code,Object[] args,String defaultMessage,Locale locale){
        return messageSource.getMessage(code,args,defaultMessage,locale);
    }
 
    public static String getMessage(String code, Object[] args, Locale locale){
        try{
            return messageSource.getMessage(code,args,locale);
        }catch (Exception e){
            log.error("Query message value by key[{}] error. The reason is:"+e.getMessage(),code);
            return null;
        } 
    }
 
    public static String getMessage(MessageSourceResolvable resolvable, Locale locale){
        try{
            return messageSource.getMessage(resolvable,locale);
        }catch (Exception e){
            log.error("Query message value error. The reason is:"+e.getMessage());
            return null;
        } 
    }
 
    //解析用戶區(qū)域
    public static Locale getLocal() {
        return LocaleContextHolder.getLocale();
    }
}

(3)具體使用:

I18nUtil.getMessage(InspectionConst.TEMPORARY_JOB_OVER_BEGIN_TIME, new Object[]{InspectionConst.TEMPORARA_TIME})

I18nUtil.getMessage(InspectionConst.INSPECTION_TEMPORARY_JOB_ADD_SUCCESS)

Java I18N國(guó)際化

i18n(其來(lái)源是英文單詞internationalization的首末字符i和n,18為中間的字符數(shù))是“國(guó)際化”的簡(jiǎn)稱。對(duì)程序來(lái)說(shuō),在不修改內(nèi)部代碼的情況下,能根據(jù)不同語(yǔ)言及地區(qū)顯示相應(yīng)的界面。

這就要求,僅僅是頁(yè)面語(yǔ)言的翻譯是不夠的,即便在一個(gè)國(guó)家在不同地區(qū)都可能會(huì)存在不同習(xí)慣方言操作習(xí)慣等等(例如我們國(guó)家搜索結(jié)果習(xí)慣左對(duì)齊,但是有的國(guó)家就習(xí)慣右對(duì)齊),這就導(dǎo)致了“本地化”(L10n)機(jī)制的出現(xiàn)。

國(guó)際化和本地化的出現(xiàn),在語(yǔ)言、文化、書(shū)寫(xiě)習(xí)慣、閱讀習(xí)慣、符合當(dāng)?shù)刂黝}的全面配置,使得一個(gè)Web應(yīng)用程序在運(yùn)行時(shí)能夠根據(jù)客戶端請(qǐng)求所來(lái)自的國(guó)家和語(yǔ)言顯示不同的用戶界面。

【示例】

根據(jù)以上簡(jiǎn)介和查看的具體軟件的配置,理解一下i18n吧,所以小編查看了一下QQ的i18n配置文件,如下:

<?xml version="1.0" encoding="utf-8" ?>
<i18n>
	<!-- 默認(rèn)的語(yǔ)言,以主程序的優(yōu)?-->
	<locale id="2052" />
	<!-- 語(yǔ)言文字列表 -->
	<StringBundle>
		<configfile name="GFStringBundle.xml"/>		
		<configfile name="StringBundle.xml"/>
		<configfile name="UrlBundle.xml"/>
	</StringBundle>
	<!-- 地區(qū)信息,目前只需要一?-->
	<Location2>
		<configfile name="LocList.xml"/>
	</Location2>
	<LangList>
		<configfile name="LangList.xml"/>
	</LangList>
</i18n>

又查看了一下要讀取的LangList.xml文件,很壯觀,如下:

<?xml version="1.0" encoding="utf-8"?>
<Languages>
	<Language LCID="1078" Name="南非荷蘭語(yǔ)" Code="af"/>
	<Language LCID="1052" Name="阿爾巴尼亞語(yǔ)" Code="sq"/>
	<Language LCID="1025" Name="阿拉伯語(yǔ)" Code="ar"/>
	<Language LCID="1067" Name="亞美尼亞語(yǔ)" Code="hy"/>
	<Language LCID="2092" Name="阿塞拜疆語(yǔ)" Code="az"/>
	<Language LCID="1059" Name="白俄羅斯語(yǔ)" Code="be"/>
	<Language LCID="5146" Name="波斯尼亞語(yǔ)" Code="bs-ba"/>
	<Language LCID="1026" Name="保加利亞語(yǔ)" Code="bg"/>
	<Language LCID="1109" Name="緬甸語(yǔ)" Code="my"/>
	<Language LCID="3076" Name="中文(繁體)" Code="zh-hk"/>
	<Language LCID="1027" Name="加泰羅尼亞語(yǔ)" Code="ca"/>
	<Language LCID="1050" Name="克羅地亞語(yǔ)" Code="hr"/>
	<Language LCID="1029" Name="捷克語(yǔ)" Code="cs"/>
	<Language LCID="1030" Name="丹麥語(yǔ)" Code="da"/>
	<Language LCID="1043" Name="荷蘭語(yǔ)" Code="nl"/>
	<Language LCID="1033" Name="英語(yǔ)" Code="en-us"/>
	<Language LCID="1061" Name="愛(ài)沙尼亞語(yǔ)" Code="et"/>
	<Language LCID="1065" Name="波斯語(yǔ)" Code="fa"/>
	<Language LCID="1035" Name="芬蘭語(yǔ)" Code="fi"/>
	<Language LCID="1036" Name="法語(yǔ)" Code="fr"/>
	<Language LCID="2108" Name="蓋爾語(yǔ)" Code="gd"/>
	<Language LCID="1031" Name="德語(yǔ)" Code="de"/>
	<Language LCID="1032" Name="希臘語(yǔ)" Code="el"/>
	<Language LCID="1095" Name="古吉拉特語(yǔ)" Code="gu"/>
	<Language LCID="1037" Name="希伯來(lái)語(yǔ)" Code="he"/>
	<Language LCID="1081" Name="印地語(yǔ)" Code="hi"/>
	<Language LCID="1038" Name="匈牙利語(yǔ)" Code="hu"/>
	<Language LCID="1039" Name="冰島語(yǔ)" Code="is"/>
	<Language LCID="1057" Name="印度尼西亞語(yǔ)" Code="id"/>
	<Language LCID="1040" Name="意大利語(yǔ)" Code="it"/>
	<Language LCID="1041" Name="日語(yǔ)" Code="ja"/>
	<Language LCID="1107" Name="高棉語(yǔ)" Code="km"/>
	<Language LCID="1042" Name="朝鮮語(yǔ)" Code="ko"/>
	<Language LCID="1108" Name="老撾語(yǔ)" Code="lo"/>
	<Language LCID="1062" Name="拉脫維亞語(yǔ)" Code="lv"/>
	<Language LCID="1063" Name="立陶宛語(yǔ)" Code="lt"/>
	<Language LCID="1071" Name="馬其頓語(yǔ)" Code="mk"/>
	<Language LCID="1086" Name="馬來(lái)西亞語(yǔ)" Code="ms"/>
	<Language LCID="2052" Name="中文(簡(jiǎn)體)" Code="zh-cn"/>
	<Language LCID="1104" Name="蒙古語(yǔ)" Code="mn"/>
	<Language LCID="1044" Name="挪威語(yǔ)" Code="no"/>
	<Language LCID="1045" Name="波蘭語(yǔ)" Code="pl"/>
	<Language LCID="2070" Name="葡萄牙語(yǔ)" Code="pt"/>
	<Language LCID="1094" Name="旁遮普語(yǔ)" Code="pa"/>
	<Language LCID="1048" Name="羅馬尼亞語(yǔ)" Code="ro"/>
	<Language LCID="1049" Name="俄語(yǔ)" Code="ru"/>
	<Language LCID="3098" Name="塞爾維亞語(yǔ)" Code="sr"/>
	<Language LCID="1113" Name="信德語(yǔ)" Code="sd"/>
	<Language LCID="1051" Name="斯洛伐克語(yǔ)" Code="sk"/>
	<Language LCID="1060" Name="斯洛文尼亞語(yǔ)" Code="sl"/>
	<Language LCID="1143" Name="索馬里語(yǔ)" Code="so"/>
	<Language LCID="1034" Name="西班牙語(yǔ)" Code="es"/>
	<Language LCID="1089" Name="斯瓦西里語(yǔ)" Code="sw"/>
	<Language LCID="1053" Name="瑞典語(yǔ)" Code="sv"/>
	<Language LCID="1097" Name="泰米爾語(yǔ)" Code="ta"/>
	<Language LCID="1092" Name="韃靼語(yǔ)" Code="tt"/>
	<Language LCID="1054" Name="泰語(yǔ)" Code="th"/>
	<Language LCID="1055" Name="土耳其語(yǔ)" Code="tr"/>
	<Language LCID="1058" Name="烏克蘭語(yǔ)" Code="uk"/>
	<Language LCID="1056" Name="烏爾都語(yǔ)" Code="ur"/>
	<Language LCID="1066" Name="越南語(yǔ)" Code="vi"/>
	<Language LCID="1106" Name="威爾士語(yǔ)" Code="cy-gb"/>
	<Language LCID="1085" Name="意第緒語(yǔ)" Code="yi"/>
	<Language LCID="1130" Name="約魯巴語(yǔ)" Code="yo"/>
</Languages>

【實(shí)踐】

1.locale方法

Java.Util中有一個(gè)locale方法,該方法的其中一個(gè)構(gòu)造方法為:

Locale(Stringlanguage,String country):根據(jù)語(yǔ)言和國(guó)家構(gòu)造一個(gè)語(yǔ)言環(huán)境。每個(gè)國(guó)家都有一個(gè)locale信息,通過(guò)對(duì)象可以取得locale信息,locale信息來(lái)源于操作系統(tǒng)。如下:

package com.bjpowernode.i18n; 
import java.util.Locale; 
public class I18nSample { 
 public static void main(String[] args) { 
  Locale defaultLocale = Locale.getDefault();
  System.out.println("country=" + defaultLocale.getCountry());
  System.out.println("language=" + defaultLocale.getLanguage()); 
 }
}

運(yùn)行結(jié)果為:

country=CN

language=zh

但是在我們下面的實(shí)踐中,為了方便我們就直接進(jìn)行設(shè)置了。

2.ResourceBundle資源包

我們需要將硬編碼文本轉(zhuǎn)移到外部的資源文件,對(duì)資源文件的命名必須使用一定的規(guī)則,一般是以“統(tǒng)一字符+locale信息”命名,如MessagesBundle_zh_CN.properties,MessagesBundle_en_US.properties。準(zhǔn)備資源包的過(guò)程,就是把對(duì)應(yīng)不同語(yǔ)言的用戶所涉及的文本和圖片保存在多個(gè)文本文件中,客戶端根據(jù)不同的環(huán)境需要進(jìn)行更換。這些文件被稱為“屬性文件”,所有屬性文件合在一起被稱為資源包(ResourceBundle)。

因?yàn)橘Y源文件必須是Latin-1后者Unicode編碼的字符,所以實(shí)踐過(guò)程中,準(zhǔn)備英文好說(shuō),準(zhǔn)備中文的話,需要使用相應(yīng)的Unicode編碼,使用jdk自帶的native2ascii.exe,將中文資源文件進(jìn)行轉(zhuǎn)換,如下:

如下:

也可以直接在資源文件中添加,會(huì)自動(dòng)轉(zhuǎn)換成Unicode編碼,如下:

結(jié)果如下:

Demo中我們中文和英文準(zhǔn)備的都是:k1=你好/hello,k2=再見(jiàn)/goodbye。

【實(shí)踐代碼】

package com.bjpowernode.i18n; 
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
 
public class I18nSample { 
	public static void main(String[] args) {
		// 為了實(shí)驗(yàn),就不每次都修改操作系統(tǒng)的語(yǔ)言了,直接設(shè)置locale信息
		// Locale currentLocale = new Locale("zh", "CN");
		Locale currentLocale = new Locale("en", "US");
 
		System.out.println("country=" + currentLocale.getCountry());
		System.out.println("language=" + currentLocale.getLanguage());
 
		// 根據(jù)locale信息尋找相應(yīng)的資源包中的配置
		ResourceBundle rb = ResourceBundle.getBundle(
				"com.bjpowernode.resources.MessagesBundle", currentLocale);
		System.out.println(rb.getString("k1"));
		System.out.println(rb.getString("k2"));
		// 在配置文件中用占位符來(lái)加入自定義設(shè)置,如登陸時(shí)顯示:你好,***
		MessageFormat mf = new MessageFormat(rb.getString("k1"));
		System.out.println(mf.format(new Object[] { "張三" }));
	}
}

運(yùn)行結(jié)果為:

country=US

language=en

hello,{0}

good bye

hello,張三

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring學(xué)習(xí)之創(chuàng)建項(xiàng)目 Hello Spring實(shí)例代碼

    spring學(xué)習(xí)之創(chuàng)建項(xiàng)目 Hello Spring實(shí)例代碼

    這篇文章主要介紹了spring學(xué)習(xí)之創(chuàng)建項(xiàng)目 Hello Spring實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • IDEA MyBatis Plugins自動(dòng)生成實(shí)體類和mapper.xml

    IDEA MyBatis Plugins自動(dòng)生成實(shí)體類和mapper.xml

    這篇文章主要介紹了IDEA MyBatis Plugins自動(dòng)生成實(shí)體類和mapper.xml,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringBoot操作Redis三種方案全解析

    SpringBoot操作Redis三種方案全解析

    這篇文章主要介紹了SpringBoot操作Redis三種方案全解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Spring中使用自定義ThreadLocal存儲(chǔ)導(dǎo)致的坑及解決

    Spring中使用自定義ThreadLocal存儲(chǔ)導(dǎo)致的坑及解決

    這篇文章主要介紹了Spring中使用自定義ThreadLocal存儲(chǔ)導(dǎo)致的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解

    基于SpringBoot集成測(cè)試遠(yuǎn)程連接Redis服務(wù)的教程詳解

    這篇文章主要介紹了基于SpringBoot集成測(cè)試遠(yuǎn)程連接的Redis服務(wù)的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot AOP如何配置全局事務(wù)

    SpringBoot AOP如何配置全局事務(wù)

    這篇文章主要介紹了SpringBoot AOP如何配置全局事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring?Boot如何利用攔截器加緩存完成接口防刷操作

    Spring?Boot如何利用攔截器加緩存完成接口防刷操作

    流的需求出現(xiàn)在許多常見(jiàn)的場(chǎng)景中,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot如何利用攔截器加緩存完成接口防刷操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • idea解決程序包不存在報(bào)錯(cuò)的八種解決方法

    idea解決程序包不存在報(bào)錯(cuò)的八種解決方法

    這篇文章主要介紹了idea解決程序包不存在報(bào)錯(cuò)的八種解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • Java Stopwatch類,性能與時(shí)間計(jì)時(shí)器案例詳解

    Java Stopwatch類,性能與時(shí)間計(jì)時(shí)器案例詳解

    這篇文章主要介紹了Java Stopwatch類,性能與時(shí)間計(jì)時(shí)器案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Thymeleaf渲染網(wǎng)頁(yè)時(shí)中文亂碼的問(wèn)題及解決

    Thymeleaf渲染網(wǎng)頁(yè)時(shí)中文亂碼的問(wèn)題及解決

    這篇文章主要介紹了Thymeleaf渲染網(wǎng)頁(yè)時(shí)中文亂碼的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論