Frage

Kennt jemand eine Java-Bibliothek, die mir lassen analysieren .PO Dateien? Ich möchte einfach eine Karte von IDs und Werte schaffen, damit ich sie in eine Datenbank geladen werden kann.

War es hilfreich?

Lösung

Nach Java gettext Handbuch können Sie PO konvertieren Datei in eine Resource-Klasse msgfmt --java2 Programm und lesen sie es java.util.ResourceBundle oder gnu.gettext.GettextResource mit - ich nehme an, ein so effizient wie möglich zu sein. Gettext-commons genau das gleiche zu tun, einschließlich Zwischenprozess Schöpfung Anruf msgfmt weil es positioniert ist, wie folgt:

Gettext Commons ist Java-Bibliothek, dass Verwendung macht der GNU gettext Utilities .

Wenn Sie noch genau eine Java-Bibliothek wollen, dann der einzige Weg, ich sehe, ist die eigene Bibliothek für das Parsen dieses Format heißt Rewrite msgfmt Quellcode von C nach Java-Sprache zu schreiben. Aber ich bin nicht sicher, es wird schneller sein als Prozess + Lauf C-Programm erstellen.

Andere Tipps

suchte ich im Internet und konnte eine vorhandene Bibliothek nicht gefunden, auch nicht. Wenn Sie Scala verwenden, ist es ganz einfach, einen Parser selbst, dank seiner Parser combinator Funktion zu schreiben.

Anruf PoParser.parsePo("po file content"). Das Ergebnis ist eine Liste von Translation.

Ich habe diesen Code in eine Bibliothek gemacht (kann durch jede JVM Sprache verwendet werden, einschließlich Java, natürlich!): 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 die einzige ist, die ich gefunden habe, während einige der Forschung einige Zeit zurück.

Das tennera Projekt auf Github enthält einen ANTLR-basierten Parser für GNU Gettext PO / POT. Ich denke, es von Redhat für eine webbasierte Übersetzungssoftware verwendet wird.

Ich habe einige Java-Klassen gefunden zu lesen und zu schreiben po-Dateien: https://launchpad.net/po-parser

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top