2011-10-26 88 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' 

希望这可以帮助你!我很乐意回答任何问题