¿Hay una biblioteca Java para analizar archivos gettext PO? [cerrado]
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.
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