1. 程式人生 > >《實戰開發》實現後臺國際化過程中所遇到的問題

《實戰開發》實現後臺國際化過程中所遇到的問題

目前。越來越多專案中都使用到了國際化的技術,不僅僅是頁面的國際化顯示,就是後臺的資訊都已經涉及到了國際化的問題。今天就分享下前幾天在實現後臺國際化過程中走到坑。


  • 首先百度了一下,實現後臺國際化需要用到jdk中的ResourceBundle類庫,然後照著網上的方法實現了一次,程式碼如下:**
public class ResourceBundleTest {

    public static void main(String[] args) {
        Locale locale1 = new Locale("zh", "CN");
        ResourceBundle rb1 = ResourceBundle.getBundle("ResourceBundleTest"
, locale1); //中文 System.out.println(rb1.getString("user")); ResourceBundle rb2 = ResourceBundle.getBundle("ResourceBundleTest", Locale.getDefault()); // 中文 System.out.println(rb2.getString("user")); Locale locale3 = new Locale("en", "US"); ResourceBundle rb3 = ResourceBundle.getBundle("ResourceBundleTest"
, locale3); //英文 System.out.println(rb3.getString("user")); } }

這是一個java類,同時還需要建立三個配置檔案。一個配置中文,一個配置英文,一個是預設的。
這裡寫圖片描述

  • 到目前為止,這就是一個很簡單的一個後臺國際化的小demo了。不過這裡需要注意的是,剛開始我也遇到了很多人可能遇到的一個問題,就是控制檯輸出:如下報錯異常
 Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name

該報錯資訊的意思是說,找不到我們的配置檔案,這裡說一下解決方法:網上說什麼要把配置檔案放到classpath裡面,描述的實在不同俗,簡單來說,就是把配置檔案放到src的根目錄下,同時,將需要事先後臺國際化的java類放在預設包中(比如上圖所顯示的目錄結構),這樣就可以輕鬆實現正常輸出了。

那麼問題又來了,我們既然是做開發的,專案結構怎麼可能是上圖所示的那樣呢,簡直不科學。下面就說說專案實戰中,的後臺國際化的實現方式

這裡寫圖片描述

  • 大家可以看到,上圖才是一個正常專案中的目錄結構,下面我們把後臺國際化的檔案放到專案中。這裡,我們建立一個包名叫做:com.cupdata.coas.bundle 的包,然後將檔案放到該包中。當前的結構如下圖所示:
    這裡寫圖片描述

然後,我們回車,發現,竟然又報錯了,錯誤資訊依然是找不到配置檔案,這個時候看下我們的java類裡面的路徑,確實有問題,隨後改成下圖的路徑就可以實現了。

這裡寫圖片描述

  • 總結一下:一般情況下我們需要將java類和三個配置檔案都放在用一個路徑下面,並且需要將讀取配置檔案的路徑寫全。如果只是自己建立一個小demo的話,可以件三個配置檔案放到src的根目錄下,將java類放到預設包當中。配置檔案的路徑直接用配置檔名的字首就好。

本以為到此就能結束了,結果我將專案打包,釋出之後竟然發現,在這個包下面的三個配置檔案消失了!!!專案中的後臺國際化也開始報錯。無奈的我瞬間懵逼,後來問了寫朋友,他們告訴我說,配置檔案是不能和java檔案放在一起的,這樣在打包後就不會顯示,隨後經過各種力量的嘗試,始終無法解決,最終只能借用該類的事項方式,自己單獨去寫了一個後臺國際化的實現工具。供各位參考

實現原理:讀取國際化的配置檔案,根據當前語言環境來顯示不同的文字資訊。

  • 專案結構如下:
    這裡寫圖片描述

然後開啟這個ResourceBundleTest

public class ResourceBundleTest {

    public static void main(String[] args) {
        Prop po = PropKit.use("resourceBundle_zh_CN.properties");  //預設中文;
         String txt = po.get("user");
         System.out.println(txt);
    }

}

備註:該專案架構為jfinal,因此用的是框架自帶的取值方式,其他框架的實現原理是一樣的。到此為止,後臺國際化的實現過程已經完美解決了。歡迎各位互相交流