2008-09-11 21 views
10

Hace un tiempo leía el artículo del W3C sobre 'Re-using Strings in Scripted Content', que contiene algunos consejos útiles sobre internacionalización, pero que me parece contradictorio con el principio DRY (No repetir) de eliminar el código repetitivo.No se repita frente a Internacionalización

Para tomar su ejemplo, podríamos tener algo de código como este ...

print "The printer is "; 
if (printer.working) { 
    print "on.\n"; 
} else { 
    print "off.\n"; 
} 

print "The stapler is "; 
if (stapler.working) { 
    print "on.\n"; 
} else { 
    print "off.\n"; 
} 

Mi instinto sería eliminar la repetición más o menos de la siguiente manera ...

report-state(printer, "printer"); 
report-state(stapler, "stapler"); 

function report-state(name, object) { 
    print "The "+name+" is "; 
    if (object.working) { 
     print "on\n"; 
    } else { 
     print "off\n"; 
    } 
} 

... pero hacerlo causaría una dificultad en el código si necesitáramos localizarlo en español porque la palabra para 'on' es aparentemente diferente en esos dos casos.

Entonces, supongo que mi pregunta es, ¿cómo se han acercado otros desarrolladores a equilibrar el principio DRY con la internacionalización de su código?

Parte de mí quiere argumentar que la internacionalización es una de esas situaciones de programación extrema "you arent gonna need it". Por otro lado, sin embargo, se supone que refactorizar con el principio DRY equilibra esto al facilitar la implementación de la funcionalidad como se requiere, no más difícil que aquí.

Respuesta

16

Intentaré mantener oraciones completas en el recurso de idioma. Como dijiste, podrías necesitar diferentes palabras en diferentes contextos. Pero un problema mayor es que el orden de las oraciones puede ser diferente en diferentes idiomas. Entonces, construir cadenas de palabras puede causar problemas.

tienda sólo

The printer is on 
The printer is off 
The stapler is on 
The stapler is off 

en el recurso de idioma para cada idioma. La repetición aquí es menos un dolor de cabeza de mantenimiento que tratar de averiguar dónde aparecerán todas las palabras sueltas en su aplicación.

+0

mediante el uso de [i18next] (http://i18next.com/pages/doc_features.html#nesting) 'funcionalidad de anidación intento de reutilizar un glosario s, por ejemplo: 'The $ t (printer) is on'so tengo el término printer en un solo lugar. – jamuhl

0

Sugeriría usar un CMS en lugar de una codificación física en sus valores textuales para cubrir la localización.

2

Estoy de acuerdo con Mendelt Siebenga cuando dice que debe mantener oraciones enteras o frases en los archivos de recursos de su idioma. Las diferencias en gramática siempre le impedirán realizar reemplazos de una sola palabra en todos los idiomas. Esto aún conducirá a un código menos repetitivo que el primer ejemplo, ya que solo necesita verificar el tipo de objeto y su estado, y luego imprimir el mensaje apropiado del recurso de idioma.

1

Supongo que depende del nivel de calidad del idioma que pretenda alcanzar.

Al intentar minimizar la repetición de código que trata con estas cadenas de idioma real, simplemente se expone a una capa de lógica completamente diferente en las sintaxis y estructuras de diferentes idiomas. Habría una gran cantidad de trabajo involucrado en la producción de código que aún conserva la estructura original del lenguaje mientras se minimiza la repetición.

Tendría que decidir cuál era un enfoque más adecuado para un problema en particular; Código que se repite a sí mismo, o código que intenta ser un Jack of All Trades y acomodar innumerables reglas de lenguaje (sin duda una pesadilla de mantenimiento).

Por supuesto, puede alcanzar un término medio y minimizar la repetición de código, pero renunciar a la elocuencia gramatical satisfactoria.Tomemos el ejemplo de Ultima Online: cuando se localizó, una cadena que decía "Una pila de 329 monedas de oro" se convirtió en algo así como "Una pila de monedas de oro: 329". No es genial, pero es una solución bastante razonable que se presta fácilmente a la localización.

2

Intentamos no crear cadenas de mensajes mediante la manipulación del programa porque el loc. el equipo no puede verlos.

Loc. equipo realmente prefiere mensajes separados pero casi duplicados. Sin embargo, aceptarán mensajes parametrizados.

P. ej., "El% (dispositivo)% es% (on_o_off)%".

Los parámetros pueden averiarse, pero al menos es más obvio para el equipo loc cuando funcionará y cuando no funcionará.

6

100% de acuerdo con Mendelt.

No es solo un problema de mantenimiento, sino también lingüístico. En todos los idiomas latinos, el género, el número y el caso del tema afectan a otros elementos. Ejemplo para rumana

The printer is on: Imprimanta este pornită // feminine 
    The printer is off: Imprimanta este oprită 
    The stapler is on: Perforatorul este pornit // masculine 
    The stapler is off: Perforatorul este oprit 

También ver http://www.mihai-nita.net/article.php?artID=20060430a

Cuestiones relacionadas