5

我是Python Django開發人員Java EE i18n和默認項目結構

我想嘗試一點Java。

在Django我用來做我的翻譯,因爲它遵循:

from django.utils.translation import ugettext_lazy as _ 

,然後,如果在區域.po文件中指定的翻譯/ EN/django.po文件

_("hello world") 

問題1:Java中是否有類似的東西?

我發現那些:

但他們都不是我所期待的

我照例子

import java.util.ResourceBundle; 
import java.util.MissingResourceException; 

public class i18n { 
    private static ResourceBundle myResources = ResourceBundle.getBundle("messages"); 

    public static String _ (String originalStr) { 
     try { 
      return myResources.getString(originalStr); 
     } catch (MissingResourceException e) { 
      return originalStr; 
     } 
    } 

} 

後來

import static i18n._; 

問題2:可是往哪裏放messages.properties文件?

  • 我想有一個單獨的語言環境目錄與這些文件。
  • 從整個包和子包

    • 區域/ messages_en_US.properties
    • 區域/ messages_en_UK.properties
    • 區域/ messages_en_AU.properties
    • 等等...
    • 翻譯

問題3:這部分用Excep重捕沒有效果,你知道爲什麼嗎?

問題4:i18n是否有JavaEE標準?

我認爲Java EE應該有一個標準化的應用程序目錄佈局,i18和戰爭目錄內容,但幾天與Java鬼混我覺得它非常混亂。因此,我能夠在互聯網上找到的每個示例開放源代碼都是完全不同的。從Google Wave協議項目開始,以示例小應用程序結束。

問題5:JavaEE編碼理念還是最佳實踐?

我發現Strategy for Web Applications但開發人員似乎並不關心它。測試安置,同樣的事情。每個人都有不同的地方。像模板中的SQL查詢邏輯,WTF ...

+0

有沒有基於源代碼自動生成.properties文件的方法?像http://www.gted.org/gettext_java_tutorial.htm哪一個(gettext或ResourceBundle)是行業標準? – 2011-03-27 23:19:33

回答

11

沒有人真正放置資源文件的地方;這通常是應用程序開發人員的決定。將所有文件放在一個標準位置可能對所有體系結構都沒有意義,所以規範不會添加不必要的限制。

您應該如何加載和引用資源包可能會受到您正在使用的框架的影響。例如,在JSTL應用程序中,您可以使用bundle標籤;在JSF應用程序中,您可以使用loadBundle標籤。其他視圖技術將定義他們自己的機制。

一般......從classpath

ResourceBundle.getBundle加載資源,所以,如果你想使用的目錄,它或它的某個父應在應用程序類路徑。在WAR中,捆綁包應位於WEB-INF/lib目錄或WEB-INF/classes目錄中的JAR文件中。

所以,對於捆綁集...

/WEB-INF/classes/locale/messages.properties 
/WEB-INF/classes/locale/messages_fr.properties 
/WEB-INF/classes/locale/messages_de.properties 

...你會通過獲取請求Locale並調用加載包:

ResourceBundle.getBundle("locale.messages", locale); 

這是一個缺陷將束分配給單個靜態變量:

//BUG! this loads the properties file for the server default locale only! 
private static ResourceBundle myResources = ResourceBundle.getBundle("messages"); 

您必須獲取用戶的語言環境from the request。靜態分配只適用於客戶端應用程序(如IDE)。


注意,它一般是一個好主意,提供根messages.properties基本文件爲不支持的語言環境回退。

作爲一般的本地化而言,如果密鑰對於包是唯一的,那麼使用原始字符串作爲密鑰的方法只會是確定的。否則,如果存在由於上下文而翻譯得不同的相同源字符串,則會發生衝突。