Phonegap / Sencha语言本地化

时间:2011-10-26 20:49:37

标签: ios json localization cordova sencha-touch

问题:
我即将实现语言本地化到已经非常大的ipad应用程序,该应用程序是使用包含在phonegap中的sencha touch构建的。我在json文件中有英文和西班牙文翻译。

我打算做什么:
我计划将json文件加载到sencha touch store中,创建一个全局对象。然后在我调用显示的文本的每个地方,我将用调用全局对象替换文本。

我的问题:

  1. 有没有更简单的方法来实现我的语言本地化 设置?

  2. 我是否会遇到本机sencha(如datepickers)的问题?

  3. 加载/重新加载语言json文件时,我是否有性能 问题(需要webview重新加载?,sencha对象调整大小问题, 等)


  4. 编辑1:有用的相关信息
     对于那些沿着这条路走下去的人来说,编写一个简单的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:字符编码 向sencha项目(或任何webview phonegap项目)添加其他语言字符时,请确保在索引文件中指定了正确的编码。这是我需要的标签。

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

1 个答案:

答案 0 :(得分:3)

我已经完成了这个语言本地化插件。这并不奇怪,但它比我最初推测的更好。以下是每个问题的简短答案。

  

1-是否有更简单的方法来实现我的语言本地化   设置?

不是我知道的。 Stuart的评论提供了这个链接Sencha-touch localization. Use a store or a global JSON object?,它提供了一些关于可以使用类重写的方法的一些好信息。我不喜欢这种方法,因为它将我的语言翻译扩展到不同的类。但当然,如果你做的事情很简单,或者你想要的东西可能更强大,也许你应该调查一下。

  

2-我是否会遇到本机sencha(如datepickers)的问题?

我最后特意将“datepickers”留给英语。但其他一切都非常容易定制。几乎每个图形UI元素都可以更改它的文本。

  

3-加载/重新加载语言json文件时,我是否有性能   问题(需要webview重新加载?,sencha对象调整大小问题,   等)。

我采用的方法(见下文)在性能方面表现出色。当您切换语言时,您遇到的一个问题是正确的,您需要重新加载该特定页面。 Sencha处理了没有任何缺陷的大小调整,除了我愚蠢和静态设置的大小。

我所做的一些事情是在对问题的编辑中描述的。以下是我的解决方案的详细概述。 (警告,这不是最优雅的解决方案。)

我最后只使用了一个javascript函数,而不是使用纯JSON文件。这不是最好的解决方案,因为它需要一些最小的维护,但使用phonegap / sencha进行JSON解析并不是最好的。 (我从translater获取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'

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