2014-07-07 86 views
0

我正在開發一個jsp web應用程序,它不是多語言的,但現在他們希望它能夠根據瀏覽器語言環境更改用戶界面語言。Java AOP或i18n的註釋

因此,爲標籤和其他固定元素實現i18n很容易,但是我們做了一個儀表板框架,它有一些標準報告,標題,列標題和其他元素也被固定,但是從DB中檢索到,並且不是所有的人都會被翻譯。

我正在考慮用一些符號來解決這個問題,以指出哪個字段值是可翻譯的元素。例如,也許使用一些#{resource.bundle.key.element}表示法。

那麼,儀表板實體使用JPA。所以,我想知道是否有可能使用資源包進行i18n翻譯,並且在從數據庫檢索值之後執行區域設置轉換,而不執行侵入式編碼,可能使用註釋或AOP實現。

這樣的事情可能嗎?或者我可以使用另一種方法?

回答

0

國際化是一個交叉問題,因此是AOP的理想選擇。使用AspectJ,你可以做這樣的事情(簡單,簡單的例子,只是作爲一個概念證明):

驅動程序:

package de.scrum_master.app; 

public class Application { 
    public enum Language { EN, DE, FR }; 

    public final Language language; 

    public Application(Language language) { 
     this.language = language; 
    } 

    public static void main(String[] args) { 
     for (Language language : Language.values()) 
      new Application(language).printStuff(); 
    } 

    private void printStuff() { 
     System.out.println("Hello world"); 
     System.out.println("This error message will not be translated."); 
     System.out.println("one"); 
     System.out.println("two"); 
     System.out.println("three"); 
     System.out.println("This error message will also not be translated."); 
     System.out.println("Goodbye"); 
     System.out.println(); 
    } 
} 

翻譯方面:

請注意:靜態翻譯的東西應該存儲在屬性文件中。我知道這樣很醜。

package de.scrum_master.aspect; 

import java.util.HashMap; 
import java.util.Map; 

import de.scrum_master.app.Application; 
import de.scrum_master.app.Application.Language; 

public aspect TranslationAspect { 
    private static final Map<String, Map<Language, String>> dictionary = new HashMap<>(); 

    static { 
     Map<Language, String> translations = new HashMap<>(); 
     translations.put(Language.EN, "Hello world"); 
     translations.put(Language.DE, "Hallo Welt"); 
     translations.put(Language.FR, "Bonjour tout le monde"); 
     dictionary.put("Hello world", translations); 
     translations = new HashMap<>(); 
     translations.put(Language.EN, "Goodbye"); 
     translations.put(Language.DE, "Auf Wiedersehen"); 
     translations.put(Language.FR, "Au revoir"); 
     dictionary.put("Goodbye", translations); 
     translations = new HashMap<>(); 
     translations.put(Language.EN, "one"); 
     translations.put(Language.DE, "eins"); 
     translations.put(Language.FR, "un"); 
     dictionary.put("one", translations); 
     translations = new HashMap<>(); 
     translations.put(Language.EN, "two"); 
     translations.put(Language.DE, "zwei"); 
     translations.put(Language.FR, "deux"); 
     dictionary.put("two", translations); 
     translations = new HashMap<>(); 
     translations.put(Language.EN, "three"); 
     translations.put(Language.DE, "drei"); 
     translations.put(Language.FR, "trois"); 
     dictionary.put("three", translations); 
    } 

    void around(Application application, String text) : 
     call(* *.println(String)) && this(application) && args(text) 
    { 
     proceed(
      application, 
      dictionary.get(text) == null ? text : dictionary.get(text).get(application.language) 
     ); 
    } 
} 

控制檯輸出:

Hello world 
This error message will not be translated. 
one 
two 
three 
This error message will also not be translated. 
Goodbye 

Hallo Welt 
This error message will not be translated. 
eins 
zwei 
drei 
This error message will also not be translated. 
Auf Wiedersehen 

Bonjour tout le monde 
This error message will not be translated. 
un 
deux 
trois 
This error message will also not be translated. 
Au revoir 

享受!