tutorial - ¿Hay una biblioteca Java para analizar los archivos PO gettext?
sistema de libreria en java (6)
¿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.
Busqué en Internet y tampoco pude encontrar una biblioteca existente. Si usa Scala, es bastante fácil escribir un analizador, gracias a su función de combinador de analizadores.
Llamar a PoParser.parsePo("po file content")
. El resultado es una lista de Translation
.
He hecho este código en una biblioteca (¡puede ser utilizado por cualquier lenguaje JVM, incluido 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
}
}
De acuerdo con el manual de Java gettext utilities 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 la forma más eficiente. Gettext-commons hace exactamente lo mismo, incluida la creación de procesos intermedios para llamar a msgfmt porque está posicionado de la siguiente manera:
Gettext Commons es una biblioteca de Java que hace uso de las utilidades gettext de GNU.
Si todavía quiere 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.
El proyecto tennera en github contiene un analizador basado en ANTLR para GNU Gettext PO / POT. Creo que Redhat lo utiliza para un software de traducción basado en la web.
El analizador .MO (no Java, pero Scala), analiza 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
gettext-commons es el único que encontré mientras investigaba hace un tiempo.