with strip_tags remove ent_quotes ejemplo php internationalization locale

php - remove - strip_tags wordpress



Consideraciones de diseño para la internacionalización (11)

  • Mis menús y varias listas en la aplicación se ordenan alfabéticamente para cada idioma para facilitar la lectura.

las listas deben ordenarse, los menús no deberían. Tenga en cuenta que un usuario dado puede querer usar su aplicación en más de un idioma, pero debería encontrarlo en el mismo lugar.

lo mismo con atajos, si tiene alguno: no los traduzca .

Además, recuerde que la internacionalización y la traducción son dos cosas muy diferentes, adminístrelas por separado.

He leído el artículo de Joel sobre Unicode y siento que tengo al menos una comprensión básica de la internacionalización desde la perspectiva del conjunto de caracteres. Además de leer esta pregunta , también hice algunas de mis investigaciones sobre la internacionalización en lo que respecta a consideraciones de diseño, pero no puedo evitar sospechar que hay mucho más por ahí que simplemente no sé o no sé No sé para preguntar.

Algunas de las cosas que he aprendido:

  • Algunos idiomas se leen de derecha a izquierda en lugar de izquierda a derecha.
  • El calendario, las fechas, las horas, la moneda y los números se muestran de forma diferente de un idioma a otro.
  • El diseño debe ser lo suficientemente flexible para acomodar mucho más texto porque algunos lenguajes son mucho más detallados que otros.
  • No tome los iconos o colores por sentado cuando se trata de su significado semántico ya que esto puede variar de una cultura a otra.
  • La nomenclatura geográfica varía de un idioma a otro.

Donde estoy:

  • Mi diseño es lo suficientemente flexible como para acomodar mucho más texto.
  • Traduzco automáticamente cada cadena, incluidos los mensajes de error y los diálogos de ayuda.
  • Todavía no he llegado a un punto en el que haya necesitado mostrar unidades de tiempo, moneda o números, pero estaré allí en breve y tendré que desarrollar una solución.
  • Estoy usando el conjunto de caracteres UTF-8 en todos los ámbitos.
  • Mis menús y varias listas en la aplicación se ordenan alfabéticamente para cada idioma para facilitar la lectura.
  • Tengo un analizador de etiquetas que extrae las etiquetas filtrando palabras de detención. La lista de palabras de detención es específica del idioma y se puede intercambiar.

Sobre lo que me gustaría saber más:

  • Estoy desarrollando una aplicación web PHP descargable, por lo que cualquier consejo específico con respecto a PHP sería muy apreciado. Desarrollé mi propio framework y no estoy interesado en usar otros frameworks en este momento.
  • Sé muy poco sobre los idiomas no occidentales. ¿Hay consideraciones específicas que deben tenerse en cuenta que no he mencionado anteriormente? Además, ¿cómo manejan las funciones de clasificación de arreglos de PHP los caracteres no occidentales?
  • ¿Hay algún problema específico que hayas experimentado en la práctica? Estoy buscando en términos de la GUI y el código de la aplicación en sí.
  • ¿Algún consejo específico para trabajar con pantallas de fecha y hora? ¿Hay un desglose según la región o el idioma?
  • He visto muchos proyectos y sitios que permiten a sus comunidades proporcionar traducciones para sus aplicaciones y contenido. ¿Recomiendas esto y cuáles son algunas buenas estrategias para garantizar que tengas una buena traducción?
  • Esta pregunta es básicamente el alcance de lo que sé sobre internacionalización. ¿Qué no sé que no sé si debería investigar más?

Editar : agregué la recompensa porque me gustaría tener más ejemplos del mundo real de la experiencia.


Cuando trabajamos en los asuntos i18n / l10n de Dreamfall y Age of Conan, nos topamos con algunos problemas que vale la pena tener en cuenta. Algunas de ellas las resolvimos, otras se resolvieron para nosotros y otras las solucionamos. Algunos nunca lo resolvimos ...

  • Asegúrate de que todas tus herramientas y todo tu código sean compatibles con todos los conjuntos de caracteres que quieras usar, y verifica dos veces esa suposición dos veces durante el transcurso del proyecto y un par de veces más para estar seguro.

  • Asegúrese de utilizar una fuente que admita todos los idiomas que desee utilizar. La mayoría de las fuentes que dicen ser unicode son solo unicode en el sentido de que los caracteres que tiene están en el punto de código correcto. No significa que tenga caracteres utilizables para todos los puntos de código.

  • El ajuste de texto no solo se realiza en espacios, ya que algunos idiomas no usan el espacio para separar palabras (el chino viene a la mente). Asegúrese de que las rutinas de ajuste de texto manejen el texto sin ningún espacio.

  • Manejar el plural correctamente es complicado en los casos fáciles, y condenadamente difícil en los casos difíciles. Asegúrese de saber lo suficiente sobre los idiomas que utilizará para poder escribir código para manejar correctamente el problema en plural. Tenga en cuenta que el inglés (y los demás idiomas "occidentales" se encuentran entre los más fáciles).

  • Nunca rompa oraciones y construya cadenas con ellas para ajustarse a una variable, ya que la variable puede colocarse en otra parte de la oración en un idioma diferente. Use marcadores de posición.

  • Tenga en cuenta que para algunos idiomas, el valor del marcador de posición puede cambiar la forma de escribir la oración. Gramática es difícil. Asegúrese de tener un plan para enfrentarlo. (Específicamente, asegúrese de tener una forma de clasificar los valores que usa en los marcadores de posición de acuerdo con el sexo, la hora, etc.).


Me gustaría hacer los siguientes comentarios: estos son algunos de los lineamientos de la compañía donde los productos de la clase 1 se traducen en 31 lugares diferentes. Seguir estas pautas nos ha dado (nuestro equipo de desarrollo en lugar de toda la compañía) la mayor productividad en la traducción.

  • No intente reutilizar fragmentos de mensajes de error. Por ejemplo, no piense que debido a que tiene los dos errores "You selected the wrong menu item" y "That menu item is not yet available" , puede extraer "menu item" en un elemento separado y usarlo en ambos lugares . Todos los mensajes deben ser independientes ya que sus traducciones pueden cambiar según el contexto.

  • Use un traductor profesional que conozca la tecnología. Si te acercas a un servicio como BabelFish, obtendrás todo lo que mereces. Por ejemplo, "Microsoft Windows" es "Microsoft Windows" todo el planeta, no se convierte en "Microsoft Fenster" en Alemania.

  • Intente no incrustar variables dentro de sus mensajes (como "The %1 has failed" donde %1 cambia dinámicamente) ya que las posiciones y, de hecho, el género pueden cambiar: "La table est rubbish" vs. "L''Homme est drunk" , o "The red table" frente a "La table rouge" . Es mejor usar un nombre genérico con parámetros agregados: "The item has failed [%1]" .

  • Solo traduzca las cosas que se espera que el usuario vea. Los mensajes de registro en un archivo de registro (que solo usará) deben estar en inglés (o en su idioma nativo), no traducidos a swahili que de todos modos no podría leer.

  • Los menús deben ordenarse por funcionalidad, no por orden de clasificación.

  • Las unidades traducibles deben almacenarse fuera del código y cargarse en tiempo de ejecución. Esto hace que la traducción sea una cuestión de simplemente enviar el archivo externo, sin tratar de calzar los cambios en el medio del código. También hace que sea más fácil agregar otros idiomas en el futuro.

Es suficiente por ahora. Es mejor detenerse antes de que todos se duerman :-)


Mi primera respuesta en , así que perdón si se dijo algo estúpido.

De acuerdo con mi experiencia:

  • PHP : gettext ha sido extremadamente útil;
  • idiomas no occidentales : UTF-8 en todas partes (código, DB) y hasta ahora estamos bien;
  • ¿Hay algún problema específico que hayas experimentado en la práctica? Romper párrafos largos para i18n en oraciones diferentes puede ser menos costoso de traducir, si la cadena se repite más de una vez en el sitio, solo necesitas traducirla una vez. Pero, tenga cuidado, si fragmenta demasiado el texto, los traductores perderán contexto;
  • He visto muchos proyectos y sitios que permiten a sus comunidades proporcionar traducciones para sus aplicaciones y contenido. ¿Recomiendas esto y cuáles son algunas buenas estrategias para garantizar que tengas una buena traducción? Si tiene una gran cantidad de voluntarios, puede hacerlo, pero dependiendo de la cantidad de texto que tenga, es posible que realmente necesite una tonelada de voluntarios. Siempre asegúrese también de que haya alguien en quien confíe que sea el líder de un proyecto de lenguaje para que sea el corrector de pruebas que controle la precisión de la traducción.

No tengo mucho que agregar a las excelentes respuestas hasta ahora, pero aquí hay algunas cosas que considerar y verificar.

  • No hagas suposiciones. Esta es la regla de atrapar todos. Es fácil asumir cosas que son específicas de una región o idioma y es difícil darse cuenta de estas suposiciones.
  • Tenga mucho cuidado con las comparaciones de cuerdas. Hay algunos idiomas, como el turco, que tienen letras que son similares a otras visualmente pero que son diferentes.
  • Use pseudo traducción como prueba de humo. Si lee las cadenas traducidas desde un archivo de recursos, cree una versión pseudo traducida del archivo que todavía le resulte comprensible pero que acentúe la capacidad y la capacidad de cada cadena traducible en la aplicación. Por ejemplo, rellene una cadena como "Cancelar" con algo así como "¡CancelarXXXX!" para que sea tan amplio como su asignación para cadenas traducidas. Luego puede probar para verificar que cada cuerda se muestre completamente. Crédito adicional por quedarse en el personaje más complejo que probablemente se represente para verificar que se muestre correctamente en todos los lugares.
  • No hagas suposiciones sobre los diseños de teclado. "ASDW" puede ser un gran conjunto de control de teclas direccionales para teclados QWERTY, pero la codificación dura hace que sea desagradable, si no imposible, de usar para personas con otros diseños de teclado.
  • Pruebe varios ajustes de fecha, luego pruébelos nuevamente. He visto problemas debido a algo tan pequeño como un formato diferente para "AM / PM" en entornos regionales. El dd / mm / aaaa vs. dd / mm / aaaa también aparece mucho, pero cada ajuste aquí puede importar.
  • Pruebe varios formatos de número, luego pruébelos nuevamente. No quiere depender de separadores decimales o de miles, por ejemplo.
  • Pruebe con y sin un usuario conectado al servidor. Esto puede ser más específico de Windows, pero es muy fácil configurar un componente en el servidor configurado de manera que use la configuración regional del usuario conectado mientras el usuario está conectado y una configuración regional predeterminada cuando el usuario no está conectado. Esto puede causar un comportamiento extraño e intermitente.
  • Prueba con varias configuraciones regionales y de idioma. Como ejemplo, Windows no solo tiene configuraciones regionales y de idioma, sino que IE tiene su propia configuración de idioma. El comportamiento de un cliente de IE con nosotros en primer lugar puede no ser siempre el mismo que con en-nz primero, por ejemplo.
  • Asegúrese de que su traductor comprenda el negocio y los idiomas, luego verifique con otra persona. Tenga mucho cuidado cada vez que use terminología específica de la aplicación. Si su programa utiliza palabras específicas para significar algo especial en la aplicación, asegúrese de que se traduzcan de manera similar en cada instancia, incluso en el texto de ayuda. Si tiene objetivos de idioma específicos, incluso puede llegar a traducir dichas palabras antes de tiempo y asegurarse de que no se traduzcan mal en los idiomas de destino. Esto es más una cuestión de investigación de productos, pero puede hacer una diferencia en las palabras que se utilizan en la interfaz, y es más fácil para todos si esas palabras están en su lugar desde el principio. También quiere evitar modismos que no se traducen bien.

De acuerdo, tenía más para decir de lo que pensaba ...


Nuestro juego Gemsweeper ha sido traducido a 8 idiomas diferentes. Algunas cosas que aprendí durante ese proceso:

  • Si al traductor se le dan oraciones simples para traducir, asegúrese de que sepa sobre el contexto en que se usa cada oración. De lo contrario, podría proporcionar una posible traducción, pero no la que usted quiso decir. Herramientas como Babelfish traducen sin entender el contexto, por lo que el resultado suele ser tan malo. Solo intenta traducir cualquier texto no trivial de inglés a alemán y viceversa, y verás a qué me refiero.

  • Las oraciones que deben traducirse no se deben dividir en partes diferentes por el mismo motivo. Esto se debe a que necesita mantener el contexto (vea el punto anterior) y porque algunos idiomas pueden tener las variables al principio o al final de la oración. Use marcadores de posición en lugar de dividir la oración. Por ejemplo, en lugar de

"Este es el paso" de nuestro tutorial de 15 pasos "

Escribe algo como:

"Este es el paso% 1 de nuestro tutorial de 15 pasos"

y reemplaza el marcador de posición programáticamente.

  • No espere que el traductor sea divertido o creativo. Por lo general, no está lo suficientemente motivado como para hacerlo a menos que nombre los pasajes de texto en particular y le pague extra. Por ejemplo, si tiene chistes y palabras en los recursos de su idioma, dígale al traductor en una nota lateral que no trate de traducirlos, sino que los deje de lado o los reemplace con una oración más sombría. De lo contrario, es probable que el traductor traduzca el chiste palabra por palabra, lo que generalmente resulta en un completo sinsentido. En nuestro caso, tuvimos un traductor y un escritor de broma para la traducción más crítica (en inglés).

  • Intente encontrar un traductor cuyo primer idioma es el idioma al que va a traducir su software, y no al revés. De lo contrario, es probable que escriba un texto que podría ser correcto, pero suena extraño o pasado de moda para los hablantes nativos. Además, debería vivir en el país al que se dirige con su traducción. Por ejemplo, un chico de habla alemana de Suiza no sería una buena opción para una traducción al alemán.

  • Si es posible, haga que uno de sus usuarios públicos de prueba beta que entienda la traducción en particular verifique los activos traducidos y el software completo. Hemos tenido algunas traducciones muy buenas y muy malas, dependiendo de la persona que lo haya proporcionado. Según algunos de nuestros usuarios, la traducción sueca fue un galimatías total, pero ya era demasiado tarde para hacer algo al respecto.

  • Tenga en cuenta que, por cada versión actualizada con características nuevas, deberá traducir los elementos de sus idiomas. Esto puede crear algunos gastos generales serios.

  • Tenga en cuenta que los usuarios finales esperarán que el soporte técnico hable su idioma si se traduce su software. Una vez más, Babelfish probablemente no lo haga.

Editar - Algunos puntos más

  • Haga que el cambio entre localizaciones sea lo más fácil posible. En Gemsweeper, tenemos una tecla de acceso directo para cambiar entre diferentes idiomas. Hace las pruebas mucho más fáciles.

  • Si vas a utilizar fuentes exóticas, asegúrate de que incluyan caracteres especiales. Las fuentes que elegimos para Gemsweeper estaban bien para el texto en inglés, pero tuvimos que agregar bastantes caracteres a mano que solo existen en alemán, francés, portugués, sueco, ...

  • No codifique su propio marco de localización. Probablemente estés mucho mejor con un framework de código abierto como Gettext . Gettext admite funciones como variables dentro de oraciones o pluralización y es sólida como una roca. Los recursos localizados se compilan, por lo que nadie puede manipularlos. Además, puede usar herramientas como Poedit para traducir sus archivos / verificar la traducción de otra persona y asegurarse de que todas las cadenas estén traducidas correctamente y estén actualizadas en caso de que cambie el código fuente subyacente. Intenté tanto rodar el mío como el uso de Gettext y debo decir que Gettext más PoEdit fueron muy superiores.

Ediciones: incluso más puntos

  • Comprenda que las diferentes culturas tienen diferentes estilos de formatos de número y fecha. Los esquemas de numeración no solo son diferentes por cultura, sino también por propósito dentro de esa cultura. En EN-US, puede formatear un número ''-1234''; ''-1,234'' o (1,234) dependiendo de cuál sea el propósito del número. Comprende que otras culturas hacen lo mismo.

  • Sepa de dónde obtiene su información de globalización. Por ejemplo, Windows tiene configuraciones para CurrentCulture, UICulture e InvariantCulture. Comprenda qué significa cada uno y cómo interactúa con su sistema (no son tan obvios como podría pensar).

  • Si vas a hacer traducciones al este de Asia, realmente haz tu tarea. Los idiomas del este de Asia tienen bastantes diferencias con los idiomas aquí. Además de tener múltiples alfabetos que se usan simultáneamente, pueden usar diferentes sistemas de diseño (de arriba hacia abajo) o basados ​​en grillas. También los números en los idiomas del este de Asia pueden ser muy diferentes. En Estados Unidos, solo cambia los sistemas por condiciones limitadas (por ejemplo, 1 versus 1), hay consideraciones numéricas adicionales además de solo coma y punto.


PHP representa las cadenas internamente como byte-streams, y asume iso-8859-1, para los casos donde importa la codificación. En su mayor parte, puedes usar UTF-8 por todas partes y estarás bien. Una sorpresa, si su sitio recibe información de sus usuarios, es que nunca puede estar 100% seguro de que están enviando contenido con la codificación adecuada. Es posible que desee usar mb_detect_encoding para verificar la entrada, o use un campo oculto con caracteres "exóticos" para verificar.

Tenga en cuenta que todas las funciones relacionadas con cadenas en PHP, que funcionan en base a caracteres, asumen ese carácter = byte. Eso significa que generalmente no puede confiar en las funciones de cadena. Echa un vistazo a esta página para más detalles.

Otro buen recurso para PHP, es la trampa de Nick Nettleton .

Un tema que está muy relacionado con los conjuntos / codificaciones, es la collation . Necesita sus intercalaciones para que coincida con el idioma / cultura con la que está trabajando. Al menos en MySql (probablemente en otros RDBMS también), puede especificar la intercalación en diferentes niveles, como por base de datos, por tabla, por columna e incluso en la consulta misma.


Sí, este es un tema masivo . Hacer las cosas bien es mucho trabajo.

En mi programa utilizo una clave entera para cada fragmento de texto y lo busco en un archivo según sea necesario según el idioma. No hay cadenas literales en ninguna parte del código, solo claves. Los defino con una "enumeración" en C ++, así que no estoy realmente escribiendo números. Escribí una utilidad para sincronizar los diversos archivos de idioma cuando agrego más enumeraciones y los traductores completan los espacios en blanco.

Cada tecla también tiene una información sobre herramientas asociada, una imagen, un atajo de teclado, etc.

En cuanto a tiempos y fechas ... una vez más, esto es mucho más complejo de lo que piensas, ¿pero PHP no maneja esto por ti? (No sé, soy un chico de C ++ ...)


Una cosa que aprendí de la manera más difícil: si tiene que traducir varios archivos, incluya una etiqueta adicional en el nombre, para que luego pueda buscar en su carpeta completa esa etiqueta.

por ejemplo, en lugar de nombrar un archivo ''sample-database.txt'' name, la versión en inglés ''sample-database-loc-en.txt'', la versión italiana ''sample-database-loc-it.txt


Una cosa sobre los números: en inglés, según entiendo, solo usas un singular con 1 y plural con 2 o más. Me gusta: "Tienes 1 mensaje"; "2 mensajes"; "3 ... mensajes". En ruso, estas cosas se vuelven más complicadas. Usas singular para 1, 21, 31, 41 ... 101, 121 (entonces, para todo lo que termina en 1 excepto cuando termina con 11). Luego usa el genitivo singular para 2, 3, 4; 22, 23, 24; 32, 33, 34 ... 102, 103, 104; 122, 123, 124. Y en todos los demás casos usas el caso genitivo plural .

No es realmente difícil de implementar. Lo que es difícil, sin embargo, es implementar algo que sepa cómo tratar con cualquier idioma desconocido a priori con todas sus rarezas :-)

Y eso son solo números :-)


  • Las reglas de intercalación / clasificación pueden diferir enormemente entre idiomas: ä está ordenada de forma diferente en alemán que en sueco. Por lo tanto, la clasificación debe ser específica de la cultura.
  • La mayúscula / minúscula puede contener sorpresas: el carácter alemán "sharp S" ß no tiene una versión en mayúscula, y se transforma en "SS", o se mantiene en minúscula si la exactitud es importante. El turco tiene una minúscula sin puntos iy una mayúscula con puntos I.
  • Para aplicaciones web multilingües, piense cuidadosamente sobre cómo decidir qué versión mostrar y cómo trabajar en la URL. El usuario siempre debe poder elegir el idioma de forma manual y desea que los motores de búsqueda encuentren versiones de idiomas diferentes bajo diferentes URL.
  • Algunos idiomas de Asia oriental (a saber, japonés y chino, tal vez otros) no tienen espacios entre las palabras
  • Los japoneses (quizás otros también) tienen versiones separadas ("ancho completo") de dígitos árabes y espacio, e incluso dos versiones de algunos de sus propios caracteres (ancho medio y ancho completo katakana).