2011-01-08 44 views
20

¿Alguien sabe de una biblioteca Java que me permita analizar archivos .PO? Simplemente quiero crear un Mapa de IDs y Valores para poder cargarlos en una base de datos.¿Hay una biblioteca Java para analizar los archivos PO gettext?

+0

¿Qué es exactamente lo que necesita ¿que hacer? –

+0

Curioso, ¿Qué es un archivo PO? – Nishant

+3

un archivo PO es un archivo de recursos generado por GNU gettext –

Respuesta

10

Según Java gettext utilities Manual que puede convertir el archivo PO a una clase ResourceBundle usando el programa msgfmt --java2 y leerlo usando java.util.ResourceBundle o gnu.gettext.GettextResource - supongo que es una forma más eficiente. Gettext-commons hacer exactamente lo mismo que incluye la creación de procesos intermedios para llamar msgfmt porque se posiciona como siguiente:

Gettext Commons es una biblioteca Java que hace uso de GNUutilidades gettext.

Si aún desea exactamente una biblioteca Java, la única forma que veo es escribir su propia biblioteca para analizar este formato, es decir, reescribir el código fuente msgfmt del lenguaje C al Java. Pero no estoy seguro de que sea más rápido que crear el proceso + ejecutar el programa C.

+2

También intento lo mismo, ¿podría decirme cómo puedo usar exactamente 'msgfmt' en mi proyecto java para convertir po a ResourceBundle. Parece un comando. –

4

gettext-commons es el único que encontré mientras hacía algunas investigaciones hace algún tiempo.

+0

No pude encontrar el código en ese proyecto que realmente lee los archivos PO. ¿Tuviste? –

+1

Gettext-commons llama al msgfmt como un paso intermedio, por lo que no puede evitar una creación de proceso. Ver esta figura http://xnap-commons.sourceforge.net/gettext-commons/gettext-structure.png – aponomarenko

9

He buscado en Internet y no he podido encontrar una biblioteca existente, tampoco. Si usa Scala, es bastante fácil escribir un analizador, gracias a su función de combinador de analizadores.

Llame PoParser.parsePo("po file content"). El resultado es una lista de Translation.

que han hecho de este código en una biblioteca (puede ser utilizado por cualquier lenguaje de JVM, como Java, por supuesto!): https://github.com/ngocdaothanh/scaposer

import scala.util.parsing.combinator.JavaTokenParsers 

trait Translation 

case class SingularTranslation(
    msgctxto: Option[String], 
    msgid: String, 
    msgstr: String) extends Translation 

case class PluralTranslation(
    msgctxto: Option[String], 
    msgid:  String, 
    msgidPlural: String, 
    msgstrNs: Map[Int, String]) extends Translation 

// http://www.gnu.org/software/hello/manual/gettext/PO-Files.html 
object PoParser extends JavaTokenParsers { 
    // Removes the first and last quote (") character of strings 
    // and concats them. 
    private def unquoted(quoteds: List[String]): String = 
    quoteds.foldLeft("") { (acc, quoted) => 
     acc + quoted.substring(1, quoted.length - 1) 
    } 

    // Scala regex is single line by default 
    private def comment = rep(regex("^#.*".r)) 

    private def msgctxt = "msgctxt" ~ rep(stringLiteral) ^^ { 
    case _ ~ quoteds => unquoted(quoteds) 
    } 

    private def msgid = "msgid" ~ rep(stringLiteral) ^^ { 
    case _ ~ quoteds => unquoted(quoteds) 
    } 

    private def msgidPlural = "msgid_plural" ~ rep(stringLiteral) ^^ { 
    case _ ~ quoteds => unquoted(quoteds) 
    } 

    private def msgstr = "msgstr" ~ rep(stringLiteral) ^^ { 
    case _ ~ quoteds => unquoted(quoteds) 
    } 

    private def msgstrN = "msgstr[" ~ wholeNumber ~ "]" ~ rep(stringLiteral) ^^ { 
    case _ ~ number ~ _ ~ quoteds => (number.toInt, unquoted(quoteds)) 
    } 

    private def singular = 
    (opt(comment) ~ opt(msgctxt) ~ 
    opt(comment) ~ msgid ~ 
    opt(comment) ~ msgstr ~ opt(comment)) ^^ { 
    case _ ~ ctxto ~ _ ~ id ~ _ ~ s ~ _ => 
     SingularTranslation(ctxto, id, s) 
    } 

    private def plural = 
    (opt(comment) ~ opt(msgctxt) ~ 
    opt(comment) ~ msgid ~ 
    opt(comment) ~ msgidPlural ~ 
    opt(comment) ~ rep(msgstrN) ~ opt(comment)) ^^ { 
    case _ ~ ctxto ~ _ ~ id ~ _ ~ idp ~ _ ~ tuple2s ~ _ => 
     PluralTranslation(ctxto, id, idp, tuple2s.toMap) 
    } 

    private def exp = rep(singular | plural) 

    def parsePo(po: String): List[Translation] = { 
    val parseRet = parseAll(exp, po) 
    if (parseRet.successful) parseRet.get else Nil 
    } 
} 
+0

Genial, +1 para usar Scala –

2

El tennera project on github contiene un analizador basado en antlr para GNU Gettext PO /MACETA. Creo que Redhat lo usa para un software de traducción basado en la web.

2

.MO analizador (no Java, pero Scala), analiza en Mapa: http://scalamagic.blogspot.com/2013/03/simple-gettext-parser.html, fuente: http://pastebin.com/csWx5Sbb

+0

¡Bienvenido a Stackoverflow! En general, nos gustan las respuestas en el sitio para poder mantenernos firmes: los enlaces son geniales, pero si ese enlace se rompe alguna vez, la respuesta debería tener suficiente información para seguir siendo útil. Considere editar su respuesta para incluir más detalles. Consulte [Preguntas frecuentes] (http://www.stackoverflow.com/faq) para obtener más información. – slm

Cuestiones relacionadas