2011-01-08 9 views

Antwort

10

Nach Java gettext utilities Manual können Sie PO-Datei in eine Resource-Klasse msgfmt --java2 Programm konvertieren 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 tun genau das gleiche einschließlich Zwischenprozess Schaffung msgfmt zu nennen, weil es wie folgt positioniert:

Gettext Commons ist Java-Bibliothek, die von GNU gettext bedienen.

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

+2

ich auch das gleiche versuchen, könnten Sie bitte sagen, wie genau ich 'msgfmt' in meinem Java-Projekt verwenden kann, um po zu konvertieren zu ResourceBundle.Es sieht wie ein Befehl aus. –

4

gettext-commons ist der einzige, den ich während einiger Forschung einige Zeit zurück gefunden habe.

+0

Ich konnte den Code in diesem Projekt nicht finden, der tatsächlich PO-Dateien liest. Hast du? –

+1

Gettext-commons ruft die msgfmt als Zwischenschritt auf, sodass Sie die Erstellung eines Prozesses nicht vermeiden können. Siehe diese Abbildung http://xnap-commons.sourceforge.net/gettext-commons/gettext-structure.png – aponomarenko

9

Ich suchte im Internet und konnte auch keine vorhandene Bibliothek finden. Wenn Sie Scala verwenden, ist es sehr einfach, einen Parser selbst zu schreiben, dank seiner Parser-Kombinator-Funktion.

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

Ich habe diesen Code in eine Bibliothek gemacht (kann durch jede JVM Sprachen, darunter Java, natürlich verwendet werden!): 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

Großartig, +1 für die Verwendung von Scala –

2

Die tennera project on github enthält eine ANTLR-basierten Parser für GNU Gettext PO /TOPF. Ich denke, es wird von Redhat für eine webbasierte Übersetzungssoftware verwendet.

2

.MO Parser (nicht Java, aber Scala), parst in Karte: http://scalamagic.blogspot.com/2013/03/simple-gettext-parser.html, Quelle: http://pastebin.com/csWx5Sbb

+0

Willkommen bei Stackoverflow! Im Allgemeinen mögen wir Antworten auf der Website, um alleine stehen zu können - Links sind großartig, aber wenn dieser Link jemals bricht, sollte die Antwort genügend Informationen haben, um immer noch hilfreich zu sein. Bitte bedenken Sie, dass Sie Ihre Antwort bearbeiten müssen, um mehr Details zu erhalten. Weitere Informationen finden Sie in der [FAQ] (http://www.stackoverflow.com/faq). – slm