问题:
我即将实现语言本地化到已经非常大的ipad应用程序,该应用程序是使用包含在phonegap中的sencha touch构建的。我在json文件中有英文和西班牙文翻译。
我打算做什么:
我计划将json文件加载到sencha touch store中,创建一个全局对象。然后在我调用显示的文本的每个地方,我将用调用全局对象替换文本。
我的问题:
有没有更简单的方法来实现我的语言本地化 设置?
我是否会遇到本机sencha(如datepickers)的问题?
加载/重新加载语言json文件时,我是否有性能 问题(需要webview重新加载?,sencha对象调整大小问题, 等)
编辑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">
答案 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'
希望这会帮助你!我很乐意回答任何问题