Desesperante historia con expresiones regulares y sustitición

Miguel Angel Garcia magmax9 en yahoo.es
Lun Ene 17 07:42:06 CET 2005


No estoy muy seguro, pero creo que gettext ya tiene herramientas para
ello. Vamos, que no te va a hacer falta programar ni una línea en
python :(

Al traducir un código fuente, hay algún programa que te obtiene el
fichero .po, que es algo parecido a lo que tú quieres. Se traduce, se
"compila" y ya tienes tu programa traducido.

Nunca he trabajado con gettext, aunque le tengo ganas. Si te vale,
avísame ;)


El lun, 17-01-2005 a las 00:55 +0100, Pablo Ruiz Múzquiz escribió:
> Hola a todos,
> 
> He aquí un aparente sencillo problema de "search & replace" que se sale de 
> madre en cuanto aparecen las tildes y otros caracteres "extraños".
> 
> La situación es la siguiente (el código va después):
> 
> - Tenemos un fichero java con un buen montón de setText("algo") en español.
> - Tenemos un fichero llamado diccionario.txt en donde cada línea tiene la 
> forma "textoenespañol;textoenportugués"
> - Queremos el fichero en java con los setText("algo") en portugués.
> 
> La aproximación inicial de leer todas las líneas, realizar find sobre cada una 
> de ellas y buscar ocurrencias del "textoenespañol" para sustituir por 
> "textoenportugués" no es buena porque el find es muy ingenuo. Sustituirá 
> cualquier texto, incluso sin estar dentro de un setText(). Además, si hacemos 
> varias pasadas, items del diccionario como "ABC;ABCD" seguirán dando positivo 
> y acabaremos con "ABCDDDD" al poco rato.
> 
> Así pues, nos vamos a las expresiones regulares. 
> 
> Ahora bien, el diccionario sólo lista los textos puros "Seleccionar;Escolher". 
> Sin embargo, en el código java podríamos encontrarlos como:
> setText("* Seleccionar:")
> setText("Seleccionar :")
> setText("seleccionar")
> setText("seleccionar >>")
> 
> Así que generamos una expresión regular como la siguiente
> '\"[ ]*\*?[ ]*' + k + '(\:?|\>*)\"'
> 
> donde la variable k es el texto en español de cada línea del diccionario. En 
> todo momento trabajamos sin importarnos las mayúsculas o minúsculas.
> 
> El código (extracto) de traductor.java
> --------------
> 
> for k,v in adict.items():
>  p = re.compile('\"[ ]*\*?[ ]*' + funcion(k) + '(\:?|\>*)\"', re.L|re.I)
>  match = p.search(string.lower(aline),re.L|re.I)
>              
>  if (match!=None): #la expr reg aparece.
>   print "!",
>   aline=re.sub(k,v,aline) #sustituimos
>   print('Linea modificada: '+k+'por'+v) #indicamos el hecho
> 
> return aline
> ----------------
> 
> donde función "escapa" algunos caracteres sensibles en el contexto de 
> expresiones regulares. (":", ";", "*", "\", " ", etc)
> 
> 
> El contenido de fichero.java podría ser algo así:
> -----------------
> this.addTab("Datos Generales (CAB)", tabCABAir());
> this.addTab("Datos Comerciales (AGMT)", tabAGMTAir());
> this.addTab("facturación y Cobros (ACCT)", tabACCTAir());
> jLabelCustomerName1.setText("Razón social:");
> jLabelAddress2.setText("* Dirección:");
> jLabelNumber1.setText("* Número:");
> jLabelPostCode1.setText("* Código");
> jLabelTown1.setText("* población:");
> jButtonNextCAB.setText("Siguiente >>");
> jLabelAddress4.setText("* Observaciones:");
> jLabelAddress4.setText("* postal:");
> ------------------
> 
> Y, por último, el contenido de diccionario.txt
> ------------------
> Datos Generales (CAB);Informação General (CAB)
> Punto de Entrega (LOS);Ponto de Entrega (LOS)
> Datos Comerciales (AGMT);Informação Comercial (AGMT)
> Facturación y Cobros (ACCT);Facturação e Cobranças (ACCT)
> Condiciones Comerciales (LOG);Logística  (LOG)
> Siguiente;Seguinte
> Razón Social;Customer Name
> Número;No
> Código;Code
> Población;Town
> Observaciones;comments
> Postal:post
> -------------------
> 
> Si ejecutamos el programa sobre fichero.java y diccionario.txt obtengo algo 
> como:
> 
> ! Linea modificada: Datos Generales (CAB) por Informação General General (CAB)
> ! Linea modificada: Datos Comerciales (AGMT) por Informação Comercial (AGMT)
> ! Linea modificada: Observaciones por comments
> ! Linea modificada: Postal por post
> 
> ¡Sólo tres! Además, si miro el fichero.java resultante veo que, en realidad 
> sólo ha modificado Observaciones ya que sucesivas pasadas me arrojan:
> 
> ! Linea modificada: Datos Generales (CAB) por  Informação General (CAB)
> ! Linea modificada: Datos Comerciales (AGMT) por  Informação Comercial (AGMT)
> ! Linea modificada: Postal por post
> 
> De lo que se deduce:
> a) Sólo entiende bien los textos sin tilde en español a pesar de indicarle que 
> se fije en el locale.
> b) Tiene en cuenta las mayúsculas y minúsculas cuando va a sustituir a pesar 
> de que le indico que no se así (ej: Postal)
> 
> ¿Alguna pista?
> 
> Muchísimas gracias,
> 
> Pablo Ruiz Múzquiz
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es




Más información sobre la lista de distribución Python-es