Phonegap/Sencha语言本地化

hat*_*ike 11 json localization ios sencha-touch cordova

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

我正在计划做什么:
我计划将json文件加载到sencha触摸存储中,创建一个全局对象.然后在我调用显示的文本的每个地方,我将通过调用全局对象替换文本.

我的问题:

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

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

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


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

PhoneGap.exec("PixFileDownload.getSystemLanguage");
Run Code Online (Sandbox Code Playgroud)

第2部分(回调函数):

setLanguage(returnedLanguage)
{
   GlobalVar.CurrentLanguage = returnedLanguage; //GloablVar.CurrentLanguage already defined
}
Run Code Online (Sandbox Code Playgroud)

目标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];

}
Run Code Online (Sandbox Code Playgroud)

编辑2:字符编码 将其他语言字符添加到sencha项目(或任何webview phonegap项目)时,请确保在索引文件中指定了正确的编码.这是我需要的标签.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Run Code Online (Sandbox Code Playgroud)

hat*_*ike 3

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

\n\n
\n

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

\n
\n\n

据我所知。Stuart 的评论提供了此链接Sencha-touch 本地化。使用存储还是全局 JSON 对象?其中有一些关于使用类覆盖的一种方法的好信息。我不喜欢这种方法,因为它把我的语言翻译分散到了不同的班级。但当然,如果你正在做一些简单的事情,或者你想要一些更强大的东西,也许你应该对此进行调查。

\n\n
\n

2- 我会遇到原生 sencha 东西(比如日期选择器)的问题吗?

\n
\n\n

我最终特意将“datepickers”保留为英语。但其他一切都相对容易定制。几乎每个图形 UI 元素都可以更改其文本。

\n\n
\n

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

\n
\n\n

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

\n\n

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

\n\n

我最终没有使用纯 JSON 文件,而是使用了 javascript 函数。这不是最好的解决方案,因为它需要一些最少的维护,但使用phonegap/sencha 进行 JSON 解析并不是最好的。(我从翻译器获取 JSON 文件,然后快速粘贴到 javascript 文件中。大约需要 2 分钟,请参阅下面的进一步说明)。

\n\n

语言.js

\n\n
function setLanguage(language)\n{\n\n    if(language == "en")\n    {\n        //console.log("inside if Language == en");\n        GlobalLanguage.CurrentLanguage = language;\n\n        GlobalLanguage.ID = {"glossary": [\n        {   \n            //CONVERTED JSON\n            about : \'About\',\n            checking_for_updates : \'Checking for updates...(This may take a few minutes.)\'\n            //Any additional translations\n\n        }\n        ]};\n    }\n    if (language == "es"){\n        //console.log("inside language == es");\n        GlobalLanguage.CurrentLanguage = language;\n        GlobalLanguage.ID = {"glossary": [\n            {\n            //CONVERTED JSON\n            about : \'Acerca de \',\n            checking_for_updates : \'Verificando actualizaciones... (Capas que demore algunos minutos).\'\n            //Any additional translations\n\n        }]};\n    }\n        if (language == "pt"){\n        //console.log("inside language == pt");\n        GlobalLanguage.CurrentLanguage = language;\n        GlobalLanguage.ID = {"glossary": [\n            {\n             //CONVERTED JSON\n              about : \'Sobre\',\n              checking_for_updates : \'Verificando se h\xc3\xa1 atualiza\xc3\xa7\xc3\xb5es... (pode demorar alguns minutos.)\'\n              //Any additional translations\n\n        }]};\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,该文件支持 3 种语言(葡萄牙语、英语和西班牙语)。设置语言后,您可以访问对象中任何位置的每个本地化字符串。例如,如果您需要访问“about”一词,只需使用:

\n\n
GlobalLanguage.ID.glossary[0]["about"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将访问 GlobalLanguage 对象,该对象将加载到属性中的任何语言。因此,在您的整个项目中,您可能会进行这些调用。不过,我建议更进一步

\n\n
function langSay(languageIdentifier){\n\n\n   // console.log("inside langSay");\n\n    if(!GlobalLanguage.ID.glossary[0][languageIdentifier]){\n        return "[! LANGUAGE EXCEPTION !]";\n    }\n    else{\n        return GlobalLanguage.ID.glossary[0][languageIdentifier];\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这可以防止您出现语言异常和程序崩溃而不知道在哪里(您可能在该 language.js 文件中设置了数百或数千个属性)。所以现在简单地说:

\n\n
langSay("about")\n
Run Code Online (Sandbox Code Playgroud)\n\n

关于 JSON 格式化的附加说明。您希望语言文件采用的格式是:

\n\n
languageIdentifier : \'Translation\',\nlanguageIdentifier : \'Translation\',\nlanguageIdentifier : \'Translation\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

我使用 Excel 进行格式化。另外,语言标识符是不带空格的唯一标识符。我建议仅使用 Excel 来格式化英文翻译的前 3 到 4 个单词 word1_word2_word3_word4。

\n\n
word1_word2_word3 : \'word1 word2 word3\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n