ICU syntax: Cursillo acelerado

Esta libraría analiza y compila las traducciones creadas en la syntaxis ICU. Aunque la sintaxis ICU es un proyecto independiente este es un cursillo acelerado de porqué es interesante y como usar sus principales funcionalidades

¿Porqué usar la sintaxis ICU?

ICU son las siglas de International Components for Unicode. Aunque su popularidad comenzó con C/C++ y Java, es en el ecosistema javascript donde se ha convertido en el standard de facto para internacionalización, aunque también es popular en Python y PHP

Internacionalizar aplicaciones es mucho más que mapear una claves a la traducción apropiada en un diccionario. Aplicaciones internacionalizadas debidamente deben gestional todos los aspectos de la traducción, incluyendo la forma en que fechas y tiempos se formatean, que delimitadores se usan en los números para separar los millares o los decimales, formateo de divisas y soportar lenguages con géneros.

Incluso algo tan aparentemente sencillo como los plurales puede resultar muy complejo en algunos idiomas. El inglés, español y alemán tiene solo un singular y un plural pero algunos idiomas eslavos tienen tres, y otros como el árabe tienen 6 dependiendo del número de elementos. A veces el número a partir del cual se cambia de una forma del plural a la siguiente varía dependiendo de la variante regional.
El ingles no tiene muchas palabras con dos géneros, pero el francés y el español sí, y los adjetivos de esos sustantivos deben respetar su género. Formatear 123456789 en inglés americano resultará en 123,456,789 pero en inglés de la India será 12,34,56,789.
Formateando divisas el símbolo $ va antes de la cantidad pero el € va después.

La sintaxis ICU abstrae toda esta complejidad de los desarrolladores y da a los verdaderos traductores profesionales un meta-lenguage suficientemente expresivo para gestional todas las sutilezas por su cuenta

Interpolaciones

Las entradas ICU soportan interpolar valores, que serán adecuadamente saneados, por lo que pasar undefined not se interpolará como "undefined".

Entrada Entrada Salida
Your favorite color is {chosen}
Your favorite color is orange

Plurales

La segunda funcionalidad más usada en cualquier aplicación es la pluralización. La sintaxis ICU proporciona la utilidad plural para definir traducciones para los plurales desde los más sencillos a los más complejos, todo sin salir de la sintaxis en sí misma.

Cada posibilidad de pluralización se precede de un calificador numérico. Las opciones posible son:
  • zero
  • one (singular)
  • two (dual)
  • few (paucal)
  • many (También usado para fracciones)
  • other (plural genérico. El usado en idiomas con solo una forma de plural)
Veámoslo con unos ejemplos:
Entrada Valores Salida
Your have {numCats, plural, one {one cat} other {# cats}}
Your have 0 cats
Your have {numCats, plural, 
  =0 {no cats at all} 
  =1 {one single cat} 
  =2 {a couple cats} 
  =3 {a trio of cats} 
  =12 {a dozen cats} 
  other {exactly # cats}}
Your have no cats at all
Mary {guestCount, plural, offset:1 
  =0 {does not give a party.} 
  =1 {invites {guest} to her party.} 
  =2 {invites {guest} and one other person to her party.} 
  other {invites {guest} and # other people to her party.}}
Mary does not give a party.

Algunos idiomas como el inglés solamente utilizan one y other pero otros idiomas serán capaces de seleccionar siempre el plural más adecuando. El límite particular que divide few y many es altamente cultural.

Puedes también especificar traducciones para cantidades específicas usando =N. Cuando un número específico es especificad de esta manera tomará precedencia sobre el comportamiento por defecto de los plurales en ese idioma.
Por ejemplo, en inglés puedes usar =2 o =12 para usar diferentes traducciones específicamente para un par y una docena de elementos en lugar de usar el plural genérico.

Por último, los plurales puedes utilizar la almoadilla para imprimir como número el valor usado para seleccionar el plural y opcionalmente la utilidad puede recibir un offset que se restará del valor antes de reemplazar la almoadilla.

Select

La utilidad select se usa para elegir entre varias posibles traducciones en base al valor de un argumento.
Aunque tener muchos usos el más común es para tener traducciones dependientes del género.

Entrada Valores Salida
Your {childGender, select, male {son} female {daughter} other {child}} has won an award
Your son has won an award

Fechas

Esta utilidad se utiliza para formatear fechas de acuerdo a las reglas del idioma para los formatos por defecto o los formatos personalizados que añadiste al inicializar la librería.
Los formatos disponibles por defecto son:
  • short: La representación más abreviada (numérica)
  • medium: Representación textual abreviada
  • long: Representación textual extendida
  • full: La representación más completa
Entrada Valores Salida
Your next holidays start on {holidayStart, date, full}
Your next holidays start on sábado, 17 de mayo de 2025

Horas

Idéntico a la utilidad para fechas pero para foratear únicamente la parte temporal de un objecto Date.

Entrada Valores Salida
Your doctor's appointment is today at {appointment, time, short}
Your doctor's appointment is today at 11:10

Números

Formatea un número de acuerdo a las reglas del idioma seleccionado.

Entrada Valores Salida
Your account balance is {num, number}
Your account balance is 0

También hay una funcionalidad avanzada llamada Number Skeletons que te permite personalizar hasta el extremo cómo quieres que los números se formateen.

Entrada Valores Salida
Your account balance is {num, number, ::currency/EUR}
Your account balance is 0,00 €
Your account balance is {num, number, ::currency/EUR sign-always}
Your account balance is +0,00 €
Game progress {num, number, ::percent}
Game progress 0 %
Game progress {num, number, ::percent .00}
Game progress 0,00 %
Game progress {num, number, ::percent .00 scale/100}
Game progress 0,00 %
Your destination is {num, number, ::unit/meter} away
Your destination is 0 m away
Your destination is {num, number, ::unit/meter unit-width-full-name} away
Your destination is 0 metros away
Are you sure you want to bid {num, number, ::K} over asking?
Are you sure you want to bid 5 mil over asking?
Are you sure you want to bid {num, number, ::KK} over asking?
Are you sure you want to bid 5 mil over asking?
The chances of winning the lottery are 1 in {num, number, ::scientific/*ee}?
The chances of winning the lottery are 1 in 1,235E8

Las posibilidades de los number skeleton son ilimitadas.