Internacionalización y localización: usando arrays
Usar arrays
es apenas un poco mejor que usar
variables. Al menos no se ocupa mucho de la tabla de símbolos del intérprete y
difícilmente se pueda crear un conflicto de nombres. Se puede incluir una
instrucción global con el nombre del único array de traducciones
en cada función que vaya a emitir una cadena localizada, en lugar de tener que
mencionar cada posible variable de traducción individualmente. Es más lento
que usar las variables directamente y su expansión dentro de cadenas
encerradas en comillas dobles o cadenas `heredoc´ va a requerir encerrar la
expresión entre llaves para evitar la ambig�edad de que el intérprete no pueda
determinar dónde termina la expresión:
echo "debe usarse así: ${textos['aceptar']}, y no: $textos['aceptar']";
Una ventaja que tiene el usar arrays es organizar los strings en distintos
niveles de anidamiento, como se puede ver en el ejemplo, donde se ha armado
una lista desplegable a partir de un array de traducciones que es a su vez un
único elemento dentro del array $textos. Es esta posibilidad de
organización lo que lo hace más atractivo. Nótese incluso el uso de la función
asort()
para asegurarse que la lista desplegable esté siempre ordenada
alfabéticamente, según el texto traducido y no según el orden original de la
lista. Esto es imprescindible en listas largas, pues es muy molesto, por
ejemplo, en una lista de paises, encontrar, por ejemplo: Somalía, Africa del
Sur, España, Sudán que se corresponde al orden alfabético en inglés: Somalia,
South Africa, Spain, Sudan, etc..
Un array, sin embargo, es la mejor manera de almacenar los textos y, como se puede ver en los archivos de traducción, el formato es fácil de interpretar por parte de un traductor, incluso los arrays anidados le proveen un poco de contexto al traductor para saber que todos los textos en ese grupo están relacionados.
Usar una función para acceder a las traducciones puede salvar dos de los
defectos de usar arrays. Una función tiene visibilidad global por lo que puede
llamarse desde cualquier lugar, dentro o fuera de una función, sin tener que
usar la instrucción global. Por otra parte, una función puede
salvar el problema de que no se muestre nada si falta una traducción.
Un ejemplo de tal función se muestra a continuación:
function traducir($texto) {
global $textos;
if (array_key_exists($texto,$textos)) return $textos[$texto];
else return $texto;
}
Si el texto cuya clave se indica no existe, al menos se muestra la clave en sí.
Viene de: Internacionalización y Localización: usando variables
Continúa en: Internacionalización y localización: usando gettext()