一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java 如何實現多語言配置i18n

java 如何實現多語言配置i18n

2021-11-05 10:2641攝氏度男 Java教程

這篇文章主要介紹了java 如何實現多語言配置i18n的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

java 實現多語言配置i18n

1、創建資源包和資源文件

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

例如:一個資源包的基名是“inspectionJsonMsg”,則與中文、英文環境相對應的資源文件名則為: "inspectionJsonMsg_zh_CN.properties" "inspectionJsonMsg_en_US.properties"

java 如何實現多語言配置i18n

2、資源文件的書寫格式

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

例如:

國際化的中文環境的properties文件

java 如何實現多語言配置i18n

國際化的英文環境的properties文件

java 如何實現多語言配置i18n

3、在Spring配置文件中增加多語言配置

applicationContext.xml

<!--多語言的配置 開始-->
	<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>
	<!--多語言的配置 結束-->

4、如何使用

(1)編寫常量類

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

(2)編寫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;
 
/**
 * 多語言查詢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");
    }
    /**
     * 根據CODE查詢,默認無通配參數,Local跟隨當前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);
    }
 
    /**
     * 根據CODE查詢,自定義默認值,默認無通配參數,Local跟隨當前cookie
     * @Author: wanjiadong
     * @Description:
     * @Date: 2017-11-6
     * @param: code
     */
    public static String getMessage(String code,String defaultMessage){
        return getMessage(code,null,defaultMessage,getLocal());
    }
    /**
     * 根據CODE和args查詢,Local跟隨當前cookie
     * @Author: wanjiadong
     * @Description:
     * @Date: 2017-11-6
     * @param: code
     * @param: args 通配符的參數
     */
    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;
        }
 
    }
 
    //解析用戶區域
    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國際化

i18n(其來源是英文單詞internationalization的首末字符i和n,18為中間的字符數)是“國際化”的簡稱。對程序來說,在不修改內部代碼的情況下,能根據不同語言及地區顯示相應的界面。

這就要求,僅僅是頁面語言的翻譯是不夠的,即便在一個國家在不同地區都可能會存在不同習慣方言操作習慣等等(例如我們國家搜索結果習慣左對齊,但是有的國家就習慣右對齊),這就導致了“本地化”(L10n)機制的出現。

國際化和本地化的出現,在語言、文化、書寫習慣、閱讀習慣、符合當地主題的全面配置,使得一個Web應用程序在運行時能夠根據客戶端請求所來自的國家和語言顯示不同的用戶界面。

【示例】

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

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

【實踐】

1.locale方法

Java.Util中有一個locale方法,該方法的其中一個構造方法為:

Locale(Stringlanguage,String country):根據語言和國家構造一個語言環境。每個國家都有一個locale信息,通過對象可以取得locale信息,locale信息來源于操作系統。如下:

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());
 
 }
}

運行結果為:

country=CN

language=zh

但是在我們下面的實踐中,為了方便我們就直接進行設置了。

2.ResourceBundle資源包

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

因為資源文件必須是Latin-1后者Unicode編碼的字符,所以實踐過程中,準備英文好說,準備中文的話,需要使用相應的Unicode編碼,使用jdk自帶的native2ascii.exe,將中文資源文件進行轉換,如下:

如下:

java 如何實現多語言配置i18n

java 如何實現多語言配置i18n

也可以直接在資源文件中添加,會自動轉換成Unicode編碼,如下:

java 如何實現多語言配置i18n

結果如下:

java 如何實現多語言配置i18n

Demo中我們中文和英文準備的都是:k1=你好/hello,k2=再見/goodbye。

【實踐代碼】

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) {
		// 為了實驗,就不每次都修改操作系統的語言了,直接設置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());
 
		// 根據locale信息尋找相應的資源包中的配置
		ResourceBundle rb = ResourceBundle.getBundle(
				"com.bjpowernode.resources.MessagesBundle", currentLocale);
		System.out.println(rb.getString("k1"));
		System.out.println(rb.getString("k2"));
		// 在配置文件中用占位符來加入自定義設置,如登陸時顯示:你好,***
		MessageFormat mf = new MessageFormat(rb.getString("k1"));
		System.out.println(mf.format(new Object[] { "張三" }));
	}
}

運行結果為:

country=US

language=en

hello,{0}

good bye

hello,張三

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/baidu_20608025/article/details/79112884

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
主站蜘蛛池模板: 幻女free性俄罗斯第一次摘花 | 亚洲四虎影院 | 日本午夜影院 | a v在线男人的天堂观看免费 | 搡60一70岁的老女人小说 | 毛片区| 波多野结衣在线观看视频 | 操小女人 | 91精品综合久久久久m3u8 | 四虎影院观看 | 碰91精品国产91久久婷婷 | 能播放18xxx18女同 | 99视频精品国在线视频艾草 | spank日本网站脱裤子打屁股 | 国产精品女主播自在线拍 | 波多野结衣两女调教 | 成人一区二区免费中文字幕 | 乳环贵妇堕落开发调教番号 | 嫩草视频在线观看免费 | 性欧美13处丶14处 | 蜜桃视频在线观看www | 日本一道高清不卡免费 | 女上男下gifxxoo动态视频 | 国产成人一区二区三区在线视频 | 亚洲一区二区成人 | 国产精品拍拍拍福利在线观看 | 大学生按摩黄a级中文片 | 天堂网www在线中文天堂 | 北条麻妃黑人 | 国产精品视频二区不卡 | 国产精品免费精品自在线观看 | 91在线精品国产丝袜超清 | 日本免费三片在线播放 | 亚洲国产午夜看片 | 地址二地址三2021变更 | 国产毛片在线观看 | 日本久久影视 | 青青草成人影院 | 色香婷婷| juliaann厨房大战 | 被教官揉了一晚上的奶小说 |