ios - Phonegap/Sencha 语言本地化

标签 ios json localization cordova sencha-touch

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

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

我的问题:

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

  2. 我会遇到原生 Sencha 的问题(比如日期选择器)吗?

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


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

PhoneGap.exec("PixFileDownload.getSystemLanguage");

第 2 部分(回调函数):

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- Is there an easier way to implement language localization with my setup?

我不知道。 Stuart 的评论提供了此链接 Sencha-touch localization. Use a store or a global JSON object?其中有一些关于使用类覆盖的方法的有用信息。我不喜欢这种方法,因为它将我的语言翻译传播到不同的类(class)。但当然,如果您正在做一些简单的事情,或者您想要一些更强大的东西,也许您应该调查一下。

2- Will I run into issues with native sencha stuff (like datepickers)?

我现在特意留下英文的“datepickers”。但其他一切都相对容易定制。几乎每个图形 UI 元素都可以更改其文本。

3- When loading/reloading language json files, will I have performance issues (require a webview reload?, sencha object resizing issues, etc).

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

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

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

语言.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"]

这将访问 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'

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

关于ios - Phonegap/Sencha 语言本地化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7908766/

相关文章:

qt - 如何更新 CMake Qt 项目中的 *.ts(用于 Qt Linguist)文件?

PHP JWT 兼容 JSON Web Tokens Draft 11

javascript - Angular.js ng-repeat 使用 json 没有数据

php - 使用 Symfony 2 在 Twig 中本地化日期

javascript - 使用 momentjs 格式化时间跨度的结束日期

java - 为什么 Jackson 会搞乱 application/javascript 的解析?

ios - iphone - 如何在使用 Facebook IOS SDK 创建事件时添加图像

ios - IBDesignable 仅在 Storyboard 中呈现,而不是在独立的 XIB 中

ios - 为什么在 React Native 中添加父 View 标签会改变样式?

ios - 在后台 Swift 中发送用户的位置