Phonegap/Sencha语言本地化



问题:
我将在一个已经非常大的ipad应用程序中执行语言本地化,该应用程序使用封装在phonegap中的sencha touch构建。我有英语和西班牙语翻译json文件。

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

我的问题:

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

  2. 我会遇到本地sencha的东西(如日期pickers)的问题吗?

  3. 当加载/重新加载语言json文件,我会有性能问题(需要重新加载web视图?, sencha对象大小调整问题;等)


编辑1:有用的相关信息:
对于那些沿着这条路走下去的人来说,编写一个简单的phonegap插件来将ipad/iphone设备的语言设置放入javascript中很快就会变得有用。这需要一个插件,它看起来像这样:
Javascript :
part 1:

PhoneGap.exec("PixFileDownload.getSystemLanguage");

part 2(callback Function):

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

Objective - 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-是否有一个更容易的方法来实现语言本地化与我的设置?

我不知道。Stuart的评论提供了Sencha-touch本地化的链接。使用存储还是全局JSON对象?它提供了一些关于使用类覆盖的一种方法的有用信息。我不喜欢这种方法,因为它把我的语言翻译分散到不同的班级。但是可以肯定的是,如果你正在做一些简单的事情,或者你想要做一些更强大的事情,也许你应该研究一下。

2-我会遇到问题与本地sencha的东西(如日期pickers)?

我最后特意留下了"datepickers"这个英文单词。但是其他的东西都很容易定制。几乎每一个图形UI元素都可以修改它的文本。

3-当加载/重新加载语言json文件,我会有性能问题(需要重新加载web视图?, sencha对象大小调整问题;等等)。

我采用的方法(见下文)在性能方面工作得非常好。你有一个问题,当你切换语言时,你需要重新加载那个特定的页面。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种语言(葡萄牙语、英语和西班牙语)。在设置语言之后,您可以在对象中的任何位置访问每个本地化字符串。例如,如果您需要访问单词"about",只需使用:

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

这将访问globalllanguage对象,该对象将把任何语言加载到属性中。所以在你的项目中,你可以有这些调用。然而,我建议更进一步

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'

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

最新更新