2011-10-26 3 views
11

Проблема:
Я собираюсь реализовать язык локализацию в уже очень большое приложении Ipad, который был построен с использованием Сенча сенсорного завернутым в PhoneGap. У меня есть английский и испанский переводы в json-файлах.PhoneGap/Сенч Язык Локализация

Что я планирую делать:
Я планирую, чтобы загрузить файлы JSon в Сенча сенсорный магазин, создавая глобальный объект. Затем в каждом месте, где я вызываю текст, который отображается, я заменю текст вызовом глобального объекта.

Мой вопрос (ы):

  1. Есть ли более простой способ реализовать язык локализации с моей установки?

  2. Будет ли я сталкиваться с проблемами с родными материалами sencha (например, datepickers)?

  3. При загрузке/перезагрузки языка JSon файлов, будет ли у меня производительность вопросы (требуют WebView перезагружать ?, объект Сенча изменение размера проблемы, и т.д.)


редактировать 1: Полезные относящиеся Info:
Для тех, кто идет по этой дороге, быстро становится полезным написать простой плагин для телефонных разговоров, чтобы установить языковые настройки устройства 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: кодировка символов При добавлении дополнительных символов языка для проекта сенча (или любого WebView PhoneGap проекта), убедитесь, что у вас есть соответствующие кодировки, указанные в индексном файле. Это тег, который мне нужен.

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

Посмотрите на этот ответ о том, как загрузить текст локализации в качестве переопределений. Так Sencha делает это, чтобы локализовать встроенные виджеты. http://stackoverflow.com/questions/8226173/sencha-touch-localization-use-a-store-or-a-global-json-object/8227539#8227539 – Stuart

ответ

3

Я закончил плагин локализации этого языка. Это не удивительно, но он работал лучше, чем я предполагал. Ниже приведены короткие ответы на каждый из вопросов.

1 - Есть ли более простой способ реализации языковой локализации с моей установкой ?

Не то, чтобы я знал. Комментарий Стюарта предоставил ссылку Sencha-touch localization. Use a store or a global JSON object?, в которой была хорошая информация о том, как вы можете использовать переопределения класса. Мне не понравился этот подход, потому что он распространял мои языковые переводы на разные классы. Но, конечно, если вы делаете что-то простое или хотите что-то более мощное, возможно, вам следует это расследовать.

2 Будет ли я сталкиваться с проблемами, связанными с родными материалами Sencha (например, datepickers)?

В итоге я оставил «datepickers» на английском языке. Но все остальное было относительно легко настроить. Почти каждый графический элемент пользовательского интерфейса может изменить его текст.

3- При загрузке/перегрузочном языковых файлы JSon, будет ли у меня производительность вопросы (требует WebView перезарядки ?, объект Сенча изменения размера проблемы, и т.д.).

Метод, который я использовал (см. Ниже), работал исключительно хорошо в отношении производительности. Единственная проблема, которая у вас есть, правильная, когда вы переключаете языки, вам нужна эта страница для перезагрузки. Сенча справлялся с изменением размера без каких-либо недостатков, кроме случаев, когда я был глупым и статически установленным.

Некоторые из того, что я сделал, были описаны в изменениях к вопросу. Вот подробный обзор моего решения. (предупреждение, это не самое изящное решение.)

Вместо использования чистого файла JSON я закончил с использованием только функции javascript. Это не самое лучшее решение, потому что оно требует некоторого минимального обслуживания, но JSON-анализ с помощью phonegap/sencha не самый лучший. (Я получаю файлы 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 для форматирования. Кроме того, языковые идентификаторы являются уникальными идентификаторами без пробелов.Я рекомендую просто использовать Excel для форматирования первых 3-4 слова word1_word2_word3_word4 английского перевода.

word1_word2_word3 : 'word1 word2 word3' 

Надеюсь, это поможет вам! Я буду рад ответить на любые вопросы

Смежные вопросы