Pregunta

¿Alguien sabe de una biblioteca de Java que me va a permitir analizar archivos .po? Simplemente quiero crear un mapa de las identificaciones y valores para que pueda cargarlos en una base de datos.

¿Fue útil?

Solución

De acuerdo con Java gettext utilidades Manual puede convertir PO archivo 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 a msgfmt llamada porque se posiciona como sigue:

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

Si todavía quiere exactamente una biblioteca de Java entonces la única forma que veo es escribir su propia biblioteca para analizar este formato es decir reescritura msgfmt código fuente de C a lenguaje Java. Pero no estoy seguro de que será más rápido + programa de proceso de ejecución de C de crear.

Otros consejos

He buscado en la Internet y no pudo encontrar una biblioteca existente, tampoco. Si utiliza Scala, es bastante fácil escribir un analizador de ti mismo, gracias a su función de analizador combinador.

PoParser.parsePo("po file content")

Llamar. El resultado es una lista de Translation.

Me 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
  }
}

gettext-commons es el único que he encontrado mientras se hace un poco de investigación algún tiempo atrás.

El proyecto href="https://github.com/zanata/tennera" tennera en github contiene un analizador basado en antlr para GNU Gettext PO / POT. Creo que es utilizado por Red Hat por un software de traducción basado en la web.

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

He encontrado algunas clases de Java para leer y escribir archivos po: https://launchpad.net/po-parser

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top