2011-10-26 103 views
11

問題:
我即將實現語言本地化到使用煎茶觸摸裹着的PhoneGap構建已經非常大的iPad應用。我有json文件中的英文和西班牙文翻譯。的PhoneGap /煎茶語言本地化

我打算在這樣做的:
我打算在JSON文件加載到煎茶觸摸店,創建一個全局對象。然後,在我稱之爲顯示的文本的每個地方,我將用對全局對象的調用替換文本。

我的問題(S):

  1. 有沒有實現我的 設置本地化語言更簡單的方法?

  2. 我會遇到原生sencha問題(如datepickers)?

  3. 在加載/重裝語言JSON文件,我會表現 問題(需要的WebView重裝?煎茶對象尺寸調整問題, 等)


編輯1:有用的相關Info
對於那些走上這條道路的人來說,編寫一個簡單的phonegap插件將ipad/iphone設備的語言設置到您的javascript中會很有用。這需要一個插件,這將是這個樣子:
的Javascript
部分1

PhoneGap.exec("PixFileDownload.getSystemLanguage"); 

部分2(回調函數):

setLanguage(returnedLanguage) 
{ 
    GlobalVar.CurrentLanguage = returnedLanguage; //GloablVar.CurrentLanguage already defined 
} 

目的C

-(void)getSystemLanguage:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options 
{ 
    /*Plugin Details 
    PhoneGap.exec("PixFileDownload.getSystemLanguage"); 
    Returns Language Code 
    */ 

    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults]; 
    NSArray* languages = [defs objectForKey:@"AppleLanguages"]; 
    NSString *language = [languages objectAtIndex:0]; 
    NSLog(@"####### This is the language code%@",language); 
    NSString *jsCallBack; 
    jsCallBack = [NSString stringWithFormat:@"setLanguage('%@');",language];  
[self.webView stringByEvaluatingJavaScriptFromString:jsCallBack]; 

} 

編輯2:字符編碼 當添加其他語言的字符到煎茶項目(或任何的WebView的PhoneGap項目),確保您在索引文件中指定正確的編碼。這是我需要的標籤。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
+0

查看關於如何加載本地化文本作爲覆蓋的答案。這是Sencha爲了本地化內置小部件的方式。 http://stackoverflow.com/questions/8226173/sencha-touch-localization-use-a-store-or-a-global-json-object/8227539#8227539 – Stuart

回答

3

我已經完成了這個語言本地化插件。這並不奇妙,但它比我原先推測的更好。以下是每個問題的簡短答案。

1-是否有更簡單的方法來實現語言本地化與我的 設置?

不是我所知道的。 Stuart的評論提供了這個鏈接Sencha-touch localization. Use a store or a global JSON object?,其中有一些關於你可以使用類覆蓋的很好的信息。我不喜歡這種方法,因爲它將我的語言翻譯分爲不同的類。但是,當然,如果你正在做簡單的事情,或者你想要更強大的東西,也許你應該調查一下。

2-我會遇到原生sencha問題(如datepickers)?

我最終專門留下了「datepickers」英文現在。但其他一切都很容易定製。幾乎每個圖形用戶界面元素都可以修改文本。

3-裝載在/重裝語言JSON文件,將我的表現 問題(需要的WebView重裝?煎茶對象尺寸調整問題, 等)。

我採用的方法(見下文)在性能方面表現出色。您切換語言時遇到的一個問題是正確的,您需要重新加載特定頁面。 Sencha處理調整大小沒有任何缺陷,除非我是愚蠢的和靜態設置的大小。

我所做的一些事情是在編輯問題中描述的。以下是我的解決方案的詳細概述。 (警告,這不是最優雅的解決方案。)

而不是使用純粹的JSON文件,我結束了只是使用JavaScript函數。這不是最好的解決方案,因爲它需要一些最小的維護,但使用phonegap/sencha解析JSON並不是最好的解決方案。 (我從翻譯器中獲取JSON文件,並快速粘貼到JavaScript文件中。大約2分鐘,請參閱下面的進一步解釋)。

Language.js

function setLanguage(language) 
{ 

    if(language == "en") 
    { 
     //console.log("inside if Language == en"); 
     GlobalLanguage.CurrentLanguage = language; 

     GlobalLanguage.ID = {"glossary": [ 
     { 
      //CONVERTED JSON 
      about : 'About', 
      checking_for_updates : 'Checking for updates...(This may take a few minutes.)' 
      //Any additional translations 

     } 
     ]}; 
    } 
    if (language == "es"){ 
     //console.log("inside language == es"); 
     GlobalLanguage.CurrentLanguage = language; 
     GlobalLanguage.ID = {"glossary": [ 
      { 
      //CONVERTED JSON 
      about : 'Acerca de ', 
      checking_for_updates : 'Verificando actualizaciones... (Capas que demore algunos minutos).' 
      //Any additional translations 

     }]}; 
    } 
     if (language == "pt"){ 
     //console.log("inside language == pt"); 
     GlobalLanguage.CurrentLanguage = language; 
     GlobalLanguage.ID = {"glossary": [ 
      { 
      //CONVERTED JSON 
       about : 'Sobre', 
       checking_for_updates : 'Verificando se há atualizações... (pode demorar alguns minutos.)' 
       //Any additional translations 

     }]}; 
    } 
} 

正如你可以看到,該文件允許3種語言(葡萄牙語,英語和西班牙語)。設置語言後,您可以訪問對象中任何位置的每個本地化字符串。例如,如果您需要訪問「約」字簡單地使用:

GlobalLanguage.ID.glossary[0]["about"] 

這將訪問GlobalLanguage對象,這將有什麼語言裝入屬性。因此,在整個項目中,您可以接聽這些電話。不過,我建議你把它一步

function langSay(languageIdentifier){ 


    // console.log("inside langSay"); 

    if(!GlobalLanguage.ID.glossary[0][languageIdentifier]){ 
     return "[! LANGUAGE EXCEPTION !]"; 
    } 
    else{ 
     return GlobalLanguage.ID.glossary[0][languageIdentifier]; 
    } 
} 

這可以保護您無需語言異常和有你的程序崩潰不知道在哪裏(你可以有屬性的數百或數千在language.js文件被設置)。所以現在簡單地說:

langSay("about") 

關於從JSON格式化的另外一個注意事項。你想要你的語言文件的格式是:

languageIdentifier : 'Translation', 
languageIdentifier : 'Translation', 
languageIdentifier : 'Translation' 

我用Excel格式化。此外languageIdentifiers是沒有空格的唯一標識符。我建議使用Excel格式化英文翻譯的前3到4個單詞word1_word2_word3_word4。

word1_word2_word3 : 'word1 word2 word3' 

希望這可以幫助你!我很樂意回答任何問題