2011-10-26 12 views
11

El problema:
Estoy a punto de poner en práctica la localización del idioma a una aplicación iPad ya muy grande que se construyó utilizando el tacto sencha envuelto en PhoneGap. Tengo las traducciones de inglés y español en archivos json.Phonegap/Sencha de localización de idioma

Lo que estoy pensando en hacer:
planeo para cargar los archivos JSON en una tienda toque sencha, la creación de un objeto global. Luego, en cada lugar donde llamo texto que se muestra, reemplazaré el texto con una llamada al objeto global.

Mi pregunta (s):

  1. ¿Existe una manera más fácil de implementar localización de idioma con mi configuración ?

  2. ¿Tendré problemas con las cosas de sencha nativo (como datapickers)?

  3. Al cargar/recargar los archivos de lenguaje de JSON, voy a tener un rendimiento cuestiones (requieren una vista web recargar ?, cuestiones de cambio de tamaño de objetos sencha, etc)


edición 1: útil relacionada Información:
Para aquellos que están por este camino, rápidamente se vuelve útil escribir un plugin de teléfono simple para obtener la configuración de idioma del dispositivo de iPad en su javascript. Esto requiere un plugin, que se verá algo como esto:
Javascript:
parte 1:

PhoneGap.exec("PixFileDownload.getSystemLanguage"); 

parte 2 (función de devolución de llamada):

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

Objetivo 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]; 

} 

editar 2: codificación de caracteres Al añadir caracteres de idiomas adicionales a un proyecto sencha (o cualquier proyecto vistaweb PhoneGap), asegúrese de que tiene la correcta codificación especificada en el archivo de índice. Esta es la etiqueta que necesitaba.

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

Mire esta respuesta sobre cómo cargar texto de localización como anulaciones. Esta es la forma en que Sencha lo hace para localizar los widgets incorporados. http://stackoverflow.com/questions/8226173/sencha-touch-localization-use-a-store-or-a-global-json-object/8227539#8227539 – Stuart

Respuesta

3

He terminado este plugin de localización del idioma. No es sorprendente, pero funcionó mejor de lo que originalmente especulé. Aquí están las respuestas cortas a cada una de las preguntas.

1- ¿Existe alguna manera más fácil de implementar la localización del idioma con la configuración ?

No es que yo sepa. El comentario de Stuart proporcionó este enlace Sencha-touch localization. Use a store or a global JSON object? que contenía buena información sobre una forma en que puede utilizar anulaciones de clase. No me gustó este enfoque, porque extendió mis traducciones de idiomas a diferentes clases. Pero sin duda, si estás haciendo algo simple, o si quieres algo que podría ser más poderoso, tal vez deberías investigar eso.

2- ¿Tengo problemas con las cosas de sencha nativo (como datapickers)?

Terminé dejando específicamente "datepickers" en inglés por el momento. Pero todo lo demás fue realmente relativamente fácil de personalizar. Casi todos los elementos gráficos de UI pueden tener su texto alterado.

3- Al cargar/recargar archivos JSON lenguaje, voy a tener problemas de rendimiento (requiere una serie de cuestiones vistaweb recarga ?, objeto sencha cambio de tamaño, etc).

El método que empleé (ver a continuación) funcionó excepcionalmente bien en lo que respecta al rendimiento. El único problema que tiene es correcto cuando cambia los idiomas, necesita esa página específica para volver a cargar. Sencha manejaba el cambio de tamaño sin ningún defecto, excepto donde yo había sido estúpido y tenía tallas estáticas.

Parte de lo que hice se describió en ediciones de la pregunta. Aquí hay una descripción detallada de mi solución. (advertencia, no es la solución más elegante.)

En lugar de utilizar un archivo JSON puro, terminé simplemente usando una función de JavaScript. Esta no es la mejor solución porque requiere un mantenimiento mínimo, pero el análisis JSON con phonegap/sencha no es el mejor. (Obtengo archivos JSON de Translater, y los pego rápidamente en el archivo Javascript. Toma alrededor de 2 minutos, ver más explicaciones a continuación).

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 

     }]}; 
    } 
} 

Como se puede ver, este archivo permite que durante 3 idiomas (portugués, inglés y español). Después de configurar el idioma, puede acceder a cada cadena localizada en cualquier lugar de su objeto. Por ejemplo, si necesita acceder a la palabra "aproximadamente" simplemente utilizar:

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

Esto acceder al objeto GlobalLanguage que tendrá cualquier idioma carga en las propiedades. Entonces, a lo largo de su proyecto, podría tener estas llamadas. Sin embargo, yo recomiendo tomar un paso más allá

function langSay(languageIdentifier){ 


    // console.log("inside langSay"); 

    if(!GlobalLanguage.ID.glossary[0][languageIdentifier]){ 
     return "[! LANGUAGE EXCEPTION !]"; 
    } 
    else{ 
     return GlobalLanguage.ID.glossary[0][languageIdentifier]; 
    } 
} 

Esto lo protege de tener excepciones del lenguaje y tener su caída del programa sin saber dónde (que puede tener cientos o miles de propiedades están establecidas en ese archivo language.js) Así que ahora simplemente:

langSay("about") 

Una nota adicional sobre el formateo de JSON. El formato en el que desea que estén sus archivos de idioma es:

languageIdentifier : 'Translation', 
languageIdentifier : 'Translation', 
languageIdentifier : 'Translation' 

Utilicé Excel para el formateo. Además, los languageIdentifiers son identificadores únicos sin espacios.Recomiendo simplemente usar Excel para formatear las primeras 3 a 4 palabras word1_word2_word3_word4 de la traducción al inglés.

word1_word2_word3 : 'word1 word2 word3' 

Espero que esto te ayude! Estaré encantado de responder a cualquier pregunta

Cuestiones relacionadas