Los puntos más importantes para los sistemas de procesamiento de texto en múltiples idiomas son (1) dispositivo unificado para múltiples lenguas, y (2) ajustabilidad y extensibilidad de prestaciones suministradas por el sistema. En estas instrucciones le explicaremos cómo se solucionan estos puntos en el sistema denominado MULE (MULtilingual Enhancement to GNU Emacs). MULE es un procesador de texto en pantalla que puede ser empleado en diferentes sistemas (UNIX, DOS, Windows y OS/2 en muchas plataformas). El mismo suministra a los usuarios con un ambiente flexible de procesamiento de texto en múltiples idiomas que cubre no sólo la edición sencilla de textos sino también la lectura/escritura de correo Internet y noticias, búsqueda en las páginas Web, etc. Todas estas prestaciones están controladas por un dispositivo unificado y son completamente ajustables y extensibles por parte del usuario.
Con el remarcable progreso de la tecnología de computadores, nosotros tenemos los conocimientos suficientes sobre computación como para manipular no sólo inglés sino también muchos otros idiomas. Muchos países ya han desarrollado formas de manipular sus idiomas nacionales en computadores. La mayoría de ellas están basadas en dispositivos locales que no causan problema en relación al ambiente de cada computador limitándose a su propio lugar. Pero, como Internet conecta todo el mundo más estrechamente, la necesidad de comunicaciones más eficientes ente diferentes lugares/naciones/idiomas, aumenta y ahora nos enfrentamos a la dificultad de manipular múltiples idiomas conjuntamente. Esto se debe a que cada sistema local ha sido desarrollado independientemente sin tener en cuenta otros sistemas locales.
Para solucionar el problema de la manipulación de múltiples idiomas, nosotros hemos adoptado MULE, un procesador de texto sencillo en múltiples idiomas basado en GNU Emacs. GNU Emacs es uno de los procesadores de texto más famosos y más ampliamente empleados en el mundo de UNIX. La función más característica de Emacs es que está equipado con el intérprete Emacs Lisp, y la mayoría de las funciones son implementadas en Emacs Lisp, lo cual significa que es posible mejorar GNU Emacs sólo modificando o agregando programas Emacs Lisp. Emacs puede ser empleado no sólo para el trabajo de edición de casi cualquier tipo de procesamiento de texto incluyendo lectura/escritura de correo Internet y noticias, búsqueda en páginas Web, referencia manual, búsqueda en el diccionario en línea, etc. Todo ésto es realizado por los programas Emacs Lisp y por ello son completamente programables.
MULE hereda todas estas funciones y puede utilizarlas en un ambiente de múltiples idiomas. Por ejemplo, los usuarios de MULE pueden intercambiar cartas y leer las páginas Web en cualquier idioma, siempre que esos idiomas estén apoyados por MULE.
En el diseño de MULE nosotros hemos conservado en mente los dos puntos siguientes:
El punto más difícil y más importante al mismo tiempo para el procesamiento de texto en múltiples idiomas es ofrecer un dispositivo unificado para manipulación de muchos idiomas sin perder la conveniencia lograda a través de la localización de cada idioma. Los trabajos de procesamiento de texto en diferentes idiomas puede diferir entre sí en muchos aspectos: cuál es el conjunto de caracteres empleados, cómo se presentará el texto en la pantalla, cómo se ingresará el texto por medio del teclado y qué sistema de codificación se empleará en los archivos. El procesamiento de múltiples idiomas requiere un dispositivo unificado que cubra estas diferencias.
Otos puntos importantes son la ajustabilidad y extensibilidad, esto es, la facilidad para programar o aumentar las funciones. Es casi imposible diseñar y suministrar previamente todas las funciones necesarias para todos los idiomas apoyados. El número de idiomas apoyados puede cambiar en el futuro. En los países en vías de desarrollo, inclusive el ambiente estándar para los idiomas nacionales puede cambiar. Cualquier sistema sin flexibilidad para modificación o aumento de sus funciones pasará a la obsolesencia rápidamente, o será demasiado difícil agregar nuevos idiomas.
Por lo tanto, aunque encontremos que una nueva función es necesaria para algún idioma, no la agregaremos inmediatamente. Al principio, examinaremos si hay posibilidades de que otros idiomas necesiten de una función similar, qué parte de la función debe ser generalizada para todos los idiomas y qué parte de la función podrá ser modificada. Después de decidir sobre estos puntos, diseñamos la función más versátil.
El procesamiento de texto es una tarea compleja. Por lo menos contiene el ingreso de texto, almacenamiento, realmacenamiento, y presentación en pantalla. Cuando decimos que MULE apoya cierto idioma ello significa que MULE puede como mínimo hacer lo siguiente:
Aquí empleamos la palabra "estándar" no sólo para el "estándar oficial" sino también para el "estándar de hecho". Sobretodo, mientras procesamos un texto, tenemos que tratar los caracteres, palabras y líneas obedeciendo las reglas de ortografía estándar de cada idioma. Todas estas funciones están controladas por un dispositivo unificado para manipulación de conjuntos de caracteres, sistemas de codificación, métodos de ingreso y rutinas de presentación en pantalla.
Las siguientes secciones están organizadas de la siguiente manera:
Un conjunto de caracteres es un grupo de caracteres empleados conjuntamente por idiomas regionales (ej.: texto en inglés, texto en japonés). Aunque un sólo conjunto de caracteres para todos los idiomas es el sueño más acariciado de un desarrollador de sistemas, no existe tal maravilla en el momento actual. ISO 10646 (o Unicode), no sirve en el momento, especialmente debido a los caracteres chinos y su manipulación inconsistente de la unificación CJK. Por este motivo hemos decidido emplear múltiples conjuntos de caracteres en MULE.
La mayoría de los conjuntos de caracteres en MULE tienen una correspondencia de uno a uno con los conjuntos de caracteres registrados en ISO (ej.: ISO 8859-1, JIS X0208). Aunque cada conjunto de caracteres ISO está identificado por su tamaño y tipo (cómo son contenidos muchos caracteres), y caracter final, (código de un byte para distinguir conjuntos de caracteres del mismo tamaño y tipo), MULE identifica cada conjunto de caracteres por medio de un número de identificación único llamado "charset-id" (identificación de conjunto de caracteres). Así, definir en MULE un conjunto de caracteres es asociar un "charset-id" único al conjunto ISO de caracteres e informar a MULE de los diferentes parámetros del conjunto de caracteres. Estos parámetros, que son empleados para trabajo de procesamiento de texto, contienen el ancho de presentación en pantalla, dirección y sentido de la escritura, etc. La Tabla 1 muestra ejemplos de conjuntos de caracteres.
| Conjunto de caracteres ISO | parámetros empleados en MULE | ||||||
| nombre | tamaño - tipo | "final-char" (caracter final) | "charset-id" | bytes | ancho | sentido | |
| ASCII | 94 | 'B' | 0 | 1 | 1 | left-to-right | |
| ISO8859-1 | (Latin1) | 96 | 'A' | 129 | 2 | 1 | left-to-right |
| ISO8859-8 | (Hebrew) | 96 | 'H' | 136 | 2 | 1 | right-to-left |
| TIS620 | 96 | 'T' | 133 | 2 | 1 | left-to-right | |
| GB2312 | 94 X 94 | 'A' | 145 | 3 | 1 | left-to-right | |
| JISX0208 | 94 X 94 | 'B' | 146 | 3 | 1 | left-to-right | |
| CNS11643-1 | 94 X 94 | 'G' | 149 | 4 | 1 | left-to-right | |
| CNS11643-3 | 94 X 94 | 'I' | 246 | 4 | 1 | left-to-right | |
También es posible definir un conjunto de caracteres que no está registrado en ISO. En este caso, MULE emplea un caracter final reservado para uso privado por parte de ISO. Si el conjunto de caracteres originalmente no se adecúa al requisito técnico de ISO 2022, deberá ser reorganizado por medio de la división del mismo en conjuntos pequeños de caracteres, o cambiando los puntos del código de caracter y adecuarlo a los requisitos técnicos. El ejemplo típico en este caso es el conjunto de caracteres vietnamita, los detalles del cual están descritos en la próxima sección.
La forma más sencilla y común de mantener un texto en la memoria del computador es representar cada caracter por un conjunto de elementos de longitud fija (uno a cuatro bytes). Sin embargo, considerando los textos en múltiples idiomas el empleo de uno o dos bytes para cada caracter es aparentemente insuficiente para cubrir los caracteres de los alfabetos de todo el mundo. El empleo del elemento de cuarto bytes debería ser suficiente pero es un desperdicio de memoria para texto en inglés solamente. De aquí que, en lugar de emplear representación de longitud fija, hemos adoptado el sistema de múltiples bytes de longitud variable (de aquí en adelante abreviado sistema multi-byte), para representar caracteres en el acumulador de MULE tanto para un eficiente uso de memoria como para extensibilidad. (Esta idea se origina en la breve nota de Stallman).
Con el sistema multi-byte, cada caracter es representado por uno o dos bytes de códigos líderes para el "charset-id" y para el siguiente, o dos bytes para el código de caracter. La única excepción son los caracteres ASCII, que son representados tal cual, y el "charset-id" es 0. La Tabla 2 muestra una definición más formal de la representación interna de caracteres de MULE.
CHARACTER := ASCII_CHAR | MULTIBYTE_CHAR
MULTIBYTE_CHAR := PRIMARY_CHAR_1 | PRIMARY_CHAR_2
| SECONDARY_CHAR_1 | SECONDARY_CHAR_2
PRIMARY_CHAR_1 := LEADING_CODE_PRI C1
PRIMARY_CHAR_2 := LEADING_CODE_PRI C1 C2
SECONDARY_CHAR_1 := LEADING_CODE_SEC LEADING_CODE_EXT C1
SECONDARY_CHAR_2 := LEADING_CODE_SEC LEADING_CODE_EXT C1 C2
ASCII_CHAR := 0 | 1 | ... | 127
LEADING_CODE_PRI := 129 | 130 | ... | 153
LEADING_CODE_SEC := 154 | 155 | 156 | 157
C1, C2, LEADING_CODE_EXT := 160 | 161 | ... | 255
En la tabla, PRIMARY-CHAR y SECONDARY-CHAR difieren solamente en la memoria requerida por caracter y en el trabajo de procesamiento de texto no hay diferencia entre ellos. "Charset-id" está representado por un sólo LEADING-CODE-PRI (en este caso, "charset-id" proviene de 129 a 154), o una secuencia de LEADING-CODE-SEC y LEADING-CODE-EXT (en este caso, "charset-id" es más de 160). Un sólo byte de conjunto de caracteres puede contener 96 caracteres como máximo y está representado por dos o tres secuencias de bytes, un byte doble de conjunto de caracteres puede contener un máximo de 9,216 (96 x 96) caracteres y está representado por una secuencia de tres o cuatro bytes. Nosotros hemos seleccionado conjuntos de caracteres frecuentemente usados y los hemos definidos como PRIMARY (primarios). Todos los conjuntos de caracteres agregados por los usuarios son definidos como SECONDARY (secundarios). Por ejemplo, en las series de conjuntos de caracteres chinos (taiwaneses) CNS11643 los dos primeros planos son PRIMARY pero los planos restantes son SECONDARY (Ver Tabla 1). La Figura 1 muestre el uso de un área de código de un byte.
| 0x00--0x7f | character code of ASCII_CHAR |
| 0x80--0x99 | LEADING_CODE_PRI |
| 0x9a--0x9f | LEADING_CODE_SEC |
| 0xa0--0xff | 1st and 2nd charactercodes of MULTIBYTE_CHAR or LEADING_CODE_EXT |
Un sistema de codificación o mecanismo de codificación, es la forma de codificar un texto. Nosotros empleamos muchos sistemas de codificación en los computadores. Diferentes países emplean diferentes sistemas de codificación. Por lo tanto MULE realiza la conversión de código automáticamente a partir de varias representaciones de formato de texto en forma de múltiples bytes internos. MULE interactúa con el mundo exterior leyendo/escribiendo archivos, comunicándose con otros procesos, comunicándose vía red, aceptando datos provenientes de un terminal o enviando datos hacia un terminal.
Para hacer que la conversión de códigos sea ajustable y extensible, nosotros hemos evitado equipar MULE con rutinas de conversión de códigos inalterables. En lugar de ello, hemos confeccionado un modelo genérico de sistema de codificación con varios parámetros a ser ingresados. Afortunadamente, la mayoría de los sistemas de codificación empleados en la actualidad en el mundo se adecúan al marco de ISO 2022. Por lo tanto, hemos categorizado el sistema de codificación en tipo ISO-2022 y no ISO-2022. Para el primer tipo creamos el intérprete genérico ISO 2022. Para el segundo tipo, diseñamos un lenguaje sencillo de programación el CCL (Lenguaje de Conversión de Código), y creamos un intérprete de CCL.
Cuando los usuarios especifican un sistema de codificación para procesamiento (ej.: lectura de un archivo, o envío de correspondencia), MULE llama automáticamente al intérprete ISO 2022 o al intérprete CCL de acuerdo al sistema de codificación especificado.
Aunque el ISO 2022 permite muchísimas variaciones para codificar el mismo texto, sólo unas pocas de ellas son realmente empleadas. Así, para especificar una codificación, el pequeño número de parámetros listado en la Tabla 3 es suficiente. Por ejemplo las variaciones de EUC (Código UNIX Extendido) de chino, japonés y coreano y toda la serie ISO-8859 (número 1 a 10), difiere sólo en las designaciones iniciales de los parámetros y en las designaciones reservadas. Los otros ejemplos son la serie de 7 bit ISO-2022 tales como ISO-2022-JP, ISO-2022-JP-2, ISO-2022-KR, e ISO-2022-CN. Todas emplean un ambiente de 7 bits. Las mismas difieren sólo en las designaciones reservadas y en el bloqueo de mayúsculas. Las dos primeras no emplean el bloqueo de mayúsculas, mientras que las restantes sí lo emplean.
| parámetro | valor | significado |
| designaciones iniciales | lista de "charset-id" | Designación inicial del conjunto de caracteres para cada registro gráfico. |
| designaciones reservadas | lista de "charset-id" | Designación exclusiva de codificación de conjunto de caracteres para cada registro gráfico. |
| ambiente de 7 bit | correcto / falso | Empleo sólo de los 7 bit inferiores o empleo de codificación completa de 8 bit. |
| bloqueo de mayúsculas | correcto / falso | Empleo de la función de bloqueo de mayúsculas o no. |
| mayúsculas | correcto / falso | Empleo de la función de mayúsculas o no. |
| Indicación de sentido | correcto / falso | Empleo de una secuencia de escape de ISO-6429 para indicar el sentido de la escritura en la codificación. |
La Tabla 4 muestra cuán fácilmente podemos definir un sistema de codificación tipo ISO-2022 en MULE. Después de definir el sistema de codificación, el mismo puede ser especificado para cualquier situación dónde sea necesaria la conversión de códigos. Por ejemplo, después de la definición de la Tabla 4, los usuarios puede leer/escribir archivos GB y llamar al terminal GB caracteres chinos e intercambiar correspondencia en GB.
*euc-china* ;; Nombre del sistema de codificación
2 ;; Tipo "2" significa tipo ISO-2022
?C ;; Caracter mnemónico del sistema de codificación
t ;; Tipo detección automática fin de línea
;; (CR, CRLF, LF)
(list lc-ascii lc-cn ;; G0 es para ASCII, G1 es para chino GB2312
nil nil ;; G2 y G3 no son usados nunca.
Los ejemplos del sistema de codificación no ISO-2022 son Ruso KOI-8 y vietnamita VISCII. Aunque KOI-8 cumple con los requisitos estándar de ISO-2022, los puntos de código de los caracteres son diferentes de los de ISO 8859-5 (alfabeto latino/ cirílico), que es el conjunto de caracteres por falta de los caracteres cirílicos en MULE.
VISCII emplea códigos completos de 8 bits para los 134 caracteres vietnamitas específicos que no cumplen con los requisitos técnicos de ISO-2022. Por ello, en MULE, el conjunto de caracteres vietnamitas está dividido en dos, letras minúsculas y letras mayúsculas, y cada uno de ellos es asignado a "charset-id".
Como el intérprete genérico "charset-id" no puede ser empleado para descodificar y codificar estos conjuntos de caracteres, nosotros equipamos MULE con programas CCL que efectúan la conversión. CCL es un lenguaje sencillo pero potente para programación adecuado para escribir algoritmos de conversión de códigos, lo cual significa que teóricamente MULE puede manipular cualquier sistema de codificación por medio de el programa CCL apropiado. La Tabla 5 muestra la fuente de programa CCL para codificar KOI-8.
(define-ccl-program ccl-write-koi8
'(1
((read r0)
(loop (if (r0 != 140) (write-read-repeat r0)
((read r0) (r0 -= 160)
(write-read-repeat r0
[ 32 179 32 32 32 32 32 32 32 32 32 32 32 32 32 32
225 226 247 231 228 229 246 250 233 234 235 236 237 238 239 240
242 243 244 245 230 232 227 254 251 253 255 249 248 252 224 241
193 194 215 199 196 197 214 218 201 202 203 204 205 206 207 208
210 211 212 213 198 200 195 222 219 221 223 217 216 220 192 209
32 163 32 32 32 32 32 32 32 32 32 32 32 32 32 32])
)))))
"CCL program to write KOI8.")
Nosotros hemos investigado los métodos de ingreso existentes para caracteres de múltiples idiomas y los hemos clasificado en los siguientes tipos.
Por ejemplo, en el método de ingreso del japonés se ingresa por el teclado una secuencia de Hiragana (alfabeto fonético japonés) y luego la secuencia es convertida por algún programa de conversión en una mezcla apropiada de Kanji (caracter chino) y Hiragana. Existen varios programas de conversión tales como Wnn, Canna, SJ3, (estos son para japonés solamente), y cWnn para chino, que pueden ser empleados en MULE. Estos emplean generalmente un enorme diccionario y conocimientos de gramática de cada idioma para generar la secuencia adecuada de caracteres.
En MULE, los métodos de ingreso de los primeros tres tipos son realizados por un sistema de traducción de ingreso por teclado llamado Quail. A Quail se le asignó un conjunto de reglas de traducción (denominadas "Quail package") de cada vez, y traduce de acuerdo a las mismas el ingreso por teclado del usuario. Cada regla de traducción consiste de una secuencia de teclas y del texto correspondiente traducido. Una regla puede tener múltiples candidatos de texto traducido, en cuyo caso se les indica a los usuarios que seleccione uno interactivamente.
Es muy sencillo programar un paquete Quail de acuerdo a las necesidades del usuario. Los mismos pueden agregar nuevas reglas de traducción o modificar las existentes. Gracias a los módulos del paquete Quail, el agregar nuevas reglas para un nuevo idioma es también fácil. Ello puede ser realizado confeccionando un nuevo paquete con un nombre apropiado y definiendo cualquier número de reglas de traducción en el paquete. La Tabla 6 muestra el método para confeccionar un paquete Quail que simula el bloqueo de mayúsculas (ej.: todas las letras en minúscula son traducidas en letras mayúsculas).
;; Primero defina un nuevo paquete Quail.
(quail-define-package "caps-lock"
"Caps-Lock" nil "Simulate Caps-Lock")
;; Luego, defina las reglas de traducción del paquete.
(quail-defrule "a" "A")
...
Los métodos de ingreso para el último tipo son realizadas como un sistema denominado Tamago. Al principio el mismo traduce los ingresos por teclado en algunos códigos fonéticos (Hiragana en japonés y PinYin en chino), y los envía a un programa de conversión externo a través de la red. Es posible emplear el sistema Quail en la primera etapa. Sin embargo Tamago fue desarrollado independientemente de Quail y posee su propio sistema para generar estos códigos fonéticos por el momento. Como las conversiones no pueden ser completamente automatizadas, el usuario debe seleccionar interactivamente otras conversiones. Por el momento, Tamago puede ser empleado como servidor de conversión Wnn y cWnn.
El procesamiento de texto es mucho más que el ingreso de caracteres. Para facilitar el procesamiento de texto, MULE suministra varias herramientas. Como ejemplos de las mismas hay categorías de caracteres y un poderoso compilador de expresiones normales que permite la búsqueda rápida de estas expresiones.
Mientras se procesa texto es conveniente agrupar algunos de los caracteres y emplear el grupo en comandos de edición. Por ejemplo, un usuario puede desear buscar algún caracter cirílico, pero no desea especificar todos los caracteres cirílicos y combinarlos con operadores OR. Para este fin, el GNU Emacs original, asigna un código de sintaxis de caracter a cada caracter. Sin embargo, la sintaxis de caracter presenta algunas limitaciones. Cada carácter debe tener una sintaxis como máximo y los usuarios no pueden definir una nueva sintaxis.
MULE ofrece un método adicional para agrupar caracteres denominado categorización de caracteres. Los usuarios pueden definir una nueva categoría de caracter y asignar a un caracter tantas categorías como desee. El trabajo de edición incluye a menudo procesamiento palabra por palabra, pero diferentes idiomas pueden tener diferentes definiciones de palabra. Con MULE, los usuarios pueden definir una palabra en base a estas categorías de caracteres, que realiza los comandos de edición programables.
| 'b' | Caracteres arábigos |
| 'c' | Caracteres chinos de 2 bytes |
| 'g' | Caracteres griegos |
| 'h' | Caracteres coreanos de 2 bytes |
| 'j' | Caracteres japoneses Katakana de 1 byte |
| 'k' | Caracteres romanos para japonés de 1 byte |
| 'r' | Caracteres latinos |
| 'l' | Caracteres hebraicos |
| 'w' | Caracteres cirílicos |
| Caracteres chinos |
Para indicar en pantalla texto en múltiples idiomas es necesario considerar dos casos: Empleo de MULE en algún terminal (o emulador terminal tal como "xterm", "kterm", "cxterm", etc.), y empleo de MULE en un sistema de ventanas.
En el primer caso, MULE envía el texto correctamente codificado a los terminales y deja la tarea de la presentación en pantalla del texto en múltiples idiomas a los terminales. La conversión de códigos es efectuada de acuerdo a un sistema de codificación especificado para salida terminal. Por ejemplo, si el usuario emplea MULE en un "exterm", no hay forma de indicar en pantalla ningún otro texto que no sea inglés y chino.
Cuando MULE está en un sistema de ventana, efectúa la presentación en pantalla del texto en múltiples idiomas. En MULE, cada conjunto de caracteres es asignado al tipo (font) correspondiente. La confección de mapas de todos los conjuntos de caracteres en los tipos correspondientes son llamados conjuntos "fontset" y es la base de la indicación en pantalla de cada caracter. MULE puede emplear diferentes "fontset" en diferentes contextos. Por ejemplo, mientras se lee una correspondencia, aparece indicada el área del tema en negrita, en cuyo caso el "fontset" del conjunto de tipos en negrita son empleados sólo para el área indicadora del tema.
En ventana X, Los códigos de caracteres internos de MULE usualmente concuerdan con los puntos de código correspondientes al tipo. Por ejemplo, el conjunto de caracteres japoneses JISX0208 puede ser correctamente indicado en pantalla por el tipo en el cual los puntos de código de caracter cumplen con JISX0208. Pero, aunque la adecuación no se cumpla para cierta combinación de conjuntos de caracteres y un tipo, nosotros podemos convertir puntos de código interno en un tipo por medio del programa CCL descrito en la sección anterior. Por ejemplo el conjunto de caracteres de MULE para el alfabeto cirílico está basado en ISO 8859-5, por medio del cual el usuario puede tener sólo el tipo KOI-8. Aun en tal caso, todo lo que hay que hacer es cambiar el mapa de "fontset" para que el tipo KOI-8 sea empleado para el conjunto de caracteres cirílicos, y asociar un programa CCL apropiado al conjunto de caracteres cirílicos (ver Tabla 8).
Cuando el usuario agrega apoyo para un nuevo idioma, puede simplemente agregar mapa entre el nuevo conjunto de caracteres para el idioma y un tipo apropiado a los "fontsets" existentes.
;; Cambie el mapa de tipo en DEFAULT-FONTSET.
(set-fontset-font default-fontset lc-crl "HERE_COMES_KOI8_FONT_NAME")
(define-ccl-program ccl-x-koi8
'(0
((r1 -= 160)
(r1 = r1
[ 32 179 32 32 32 32 32 32 32 32 32 32 32 32 32 32
225 226 247 231 228 229 246 250 233 234 235 236 237 238 239 240
242 243 244 245 230 232 227 254 251 253 255 249 248 252 224 241
193 194 215 199 196 197 214 218 201 202 203 204 205 206 207 208
210 211 212 213 198 200 195 222 219 221 223 217 216 220 192 209
32 163 32 32 32 32 32 32 32 32 32 32 32 32 32 32])))
"CCL program to convert chars of lc-crl (ISO8859-5) to KOI8 font.")
;; Enlace el programa CCL al conjunto de caracteres cirílicos LC-CRL.
(x-set-ccl lc-crl ccl-x-koi8)
Nosotros hemos descrito el procesador de texto para múltiples idiomas MULE resaltando su ajustabilidad y extensibilidad. MULE está equipado con el intérprete Emacs Lisp que hace que el sistema sea abierto. Sencillos programas Emacs Lisp puede realizar toda la programación de adecuación al uso.
MULE fue lanzado en 1993. Desde ese momento, las personas en todo el mundo han contribuído en gran medida para apoyar sus propios idiomas. Ahora puede manipular la mayoría de los idiomas europeos (incluyendo ruso y griego), e idiomas de Asia Oriental (chino, japonés, coreano) además de tailandés, vietnamita, hebreo, arábigo, turco, y otros. Nosotros estamos trabajando duro para apoyar los idiomas de India (Devanagali).
Además del apoyo a nuevos idiomas, también existen muchas aplicaciones contribuídas que funcionan en MULE, tales como las herramientas para buscar palabras en el diccionario en línea, el codificador MIME y el descodificador. La existencia de estas herramientas prueba que MULE puede ser un banco de trabajo/ambiente para múltiples idiomas, no un mero editor.
Nosotros estamos integrando en este momento MULE en GNU Emacs original en cooperación con Free Software Foundation, la organización que distribuye GNU Emacs. El lanzamiento futuro de GNU Emacs contendrá las funciones para múltiples idiomas de MULE.
MULE es distribuído gratis bajo los términos de GNU GENERAL PUBLIC LICENSE. MULE Versión 2.3 está disponible a través de ftp anónimos en los siguientes sitios y en otros muchos.