2012-01-16 14 views
8

I construyó una aplicación web Lua y ha quedado claro que necesito para comenzar la internacionalización ("i18n") para mis clientes en el extranjero.Lua - ¿Cómo hacer la internacionalización?

En Lua, ¿cuál es la mejor manera de internacionalización mi solicitud?

Me doy cuenta de que esta es una tarea importante, especialmente porque parte de mi pantalla está codificada en plantillas HTML y algunos campos de datos están actualmente en mi base de datos orientada a los Estados Unidos.

Cualquier orientación sería apreciada.

+0

Esta es una manera de gran pregunta a responder. Estrechar las cosas un poco. ¿Cuál es tu aplicación? ¿Qué necesita ser traducido? ¿Qué estás usando para generar páginas web exactamente? Etcétera. –

Respuesta

5

Editar: se ha añadido material metatabla

qué alguien cuenta que el código de ejemplo anterior un poco más clara

Ciertamente.

En un archivo que define una variable i18n con los siguientes métodos:

local i18n = { locales = {} } 

local currentLocale = 'en' -- the default language 

function i18n.setLocale(newLocale) 
    currentLocale = newLocale 
    assert(i18n.locales[currentLocale], ("The locale %q was unknown"):format(newLocale)) 
end 

local function translate(id) 
    local result = i18n.locales[currentLocale][id] 
    assert(result, ("The id %q was not found in the current locale (%q)"):format(id, currentLocale) 
    return result 
end 

i18n.translate = translate 

setmetatable(i18n, {__call = function(_,...) return translate(id) end}) 

return i18n 

En el mismo archivo, o en otra (s), se incluyen los lugares que necesita dentro i18n.locales.

local i18n = require 'i18n' -- remove this line if on the same file as before 

i18n.locales.en = { 
    helloWorld = "Hello world", 
    loginWarning = "You need to be logged in to do that" 
} 

i18n.locales.es = { 
    helloWorld = "Hola mundo", 
    loginWarning = "Debes haber iniciado una sesión para hacer eso" 
} 
... 

Uso:

local i18n = require 'i18n' 
require 'locales' -- if using a separate file for the locales, require it too 

print(i18n.translate('helloWorld')) -- Hello world 
i18n.setLocale('es') 
-- using i18n() instead of i18n.translate() 
print(i18n('helloWorld')) -- Hola mundo 
+0

kikito, muchas gracias por la publicación detallada. Solo como un pensamiento, ¿es posible no usar la tabla de traducción si la implementación usó un metatable? De esa forma, el uso sería tan simple ahora como llamar a i18n ('helloWorld'), en lugar de i18n.translate ('helloWorld') – nickb

+0

@nickb, claro, he editado mi respuesta para incluirla. También eliminé el T local. – kikito

+0

Gracias, esto fue muy útil, pero encontré un error, y edité tu código, la traducción se debe llamar translate (...) para pasar el ID de la cadena a traducir, ¡salud! –

2

En Lua Es bastante fácil de usar tablas de traducción. Primero escriba su código para que cada cadena que necesite ser traducida se use a través de una llamada a función, como por ejemplo i18n"Hello World". Luego, escriba tablas de traducción para los idiomas que desea apoyar. Por ejemplo, English={["Hello World"]="Hello World"} (o añadir un metamétodo índice que simplemente devuelve la clave, para evitar la repetición de cadenas) y French={["Hello World"]="Salut le monde"}. Finalmente, escriba function i18n(s) return Language[s] end y configure Language=French cuando lo necesite.

+0

¿Algo así?
cadenas = {}
cuerdas [ "alemania"] = { "Anwendung", "Fenster"}
cuerdas [ "Inglés"] = { "Aplicación", "ventana"}
language = "Inglés"
print (cadenas [idioma] [1]) – nickb

+2

Te perderás en las teclas numéricas si lo haces de esta manera. Algún día verá 'language [1824]' y no sabrá qué cadena es 1824, y también su archivo de traducción no será muy legible. Mejor haz lo que Luiz sugirió: utiliza las cadenas inglesas "predeterminadas" como teclas, de esta manera, siempre sabrás lo que estás traduciendo. –

+0

Es común usar nombres de estilo enum para las entradas de idioma. Por ejemplo: 'English = {ACCOUNT_CREATION_ERROR_PASSWORD_CAPITALS =" Necesita al menos 3 letras en mayúscula ".}'. Aunque no es agradable a los ojos, tiene sentido lógico y evita errores como "Hello world" que no coinciden con "Hello World". – Deco

0

Lo resolví casi de la misma manera que en la respuesta de lhf para bib.lua, un proyecto mío, utilizando un módulo que define una tabla de cadenas. Pensé en compartirlo, para que puedas ver un código que realmente usa algo similar.

Es en babero/trans.lua.

Algunas cosas que puedan añadirse en mi enfoque son:

  1. Verificando la traducción en uso es completa, por ejemplo, todas las cadenas de la referencia lenguaje se definen en el idioma en uso. O mejor aún, incluso compruebe que se definan todas las cadenas del programa.

  2. Un mecanismo metatabla en los diferentes no son de referencia idiomas para imprimir una advertencia , y regresar la etiqueta lenguaje referencia si no está disponible en el idioma en uso.

Esas cosas a un lado, me sentí bastante cómodo con eso. Las únicas dificultades son si los trozos de cadenas no coinciden debido a las diferencias en la estructura del lenguaje. Me pregunto cómo resolver esto.

+0

Hola jpjacobs, ¿cómo utilizas el siguiente archivo? https://github.com/jpjacobs/bib/blob/master/bib-0.1/bib/trans.lua – nickb

+0

Se está 'requiriendo' [aquí] (https://github.com/jpjacobs/bib/blob /master/bib-0.1/bib/config.lua#L20). Luego, simplemente selecciona un idioma usando 'cadenas = bib.trans.strings [en]'. Luego, cada vez que necesite una cadena, créela en 'trans.lua', y use' cadenas.el_clave_usted_cadena_para_sus_cadenas' en su lugar. – jpjacobs