2011-01-08 74 views

Trả lời

10

Theo Java gettext utilities Manual bạn có thể chuyển đổi tệp PO thành lớp ResourceBundle bằng cách sử dụng chương trình msgfmt --java2 và đọc nó bằng cách sử dụng java.util.ResourceBundle hoặc gnu.gettext.GettextResource - Tôi cho rằng đó là cách hiệu quả nhất. Gettext-commons thực hiện chính xác bao gồm cả cùng tạo quá trình trung gian để gọi msgfmt bởi vì nó được bố trí như sau:

gettext Commons là thư viện Java làm cho sử dụng của GNU tiện ích gettext.

Nếu bạn vẫn muốn chính xác thư viện Java thì cách duy nhất tôi thấy là viết thư viện của riêng bạn để phân tích định dạng này tức là viết lại mã nguồn msgfmt từ C sang ngôn ngữ Java. Nhưng tôi không chắc nó sẽ nhanh hơn quá trình tạo chương trình chạy + C.

+2

Tôi cũng cố gắng như vậy, bạn có thể vui lòng cho biết chính xác tôi có thể sử dụng 'msgfmt' trong dự án java của tôi để chuyển đổi po hay không để ResourceBundle.It trông giống như lệnh. –

4

gettext-commons là trang duy nhất tôi tìm thấy khi thực hiện một số nghiên cứu một thời gian.

+0

Tôi không thể tìm thấy mã trong dự án thực sự đọc tệp PO. Bạn đã? –

+1

Gettext-commons gọi msgfmt là bước trung gian, vì vậy bạn không thể tránh tạo ra quá trình. Xem hình này http://xnap-commons.sourceforge.net/gettext-commons/gettext-structure.png – aponomarenko

9

Tôi đã tìm kiếm trên Internet và cũng không thể tìm thấy thư viện hiện có. Nếu bạn sử dụng Scala, thật dễ dàng để tự viết một trình phân tích cú pháp, nhờ tính năng kết hợp trình phân tích cú pháp của nó.

Gọi PoParser.parsePo("po file content"). Kết quả là một danh sách của Translation.

Tôi đã thực hiện mã này vào một thư viện (có thể được sử dụng bởi bất kỳ ngôn ngữ JVM, bao gồm Java, tất nhiên!): 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

Tuyệt vời, +1 để sử dụng Scala –

2

Các tennera project on github chứa một phân tích cú pháp ANTLR-based cho GNU gettext PO /NỒI. Tôi nghĩ rằng nó được sử dụng bởi Redhat cho một phần mềm dịch thuật dựa trên web.

2

.MO phân tích cú pháp (không Java, nhưng Scala), phân tích vào bản đồ: http://scalamagic.blogspot.com/2013/03/simple-gettext-parser.html, nguồn: http://pastebin.com/csWx5Sbb

+0

Chào mừng bạn đến với Stackoverflow! Nói chung, chúng tôi thích câu trả lời trên trang web để có thể tự đứng vững - Liên kết rất tuyệt, nhưng nếu liên kết đó phá vỡ câu trả lời thì phải có đủ thông tin để vẫn hữu ích. Vui lòng xem xét chỉnh sửa câu trả lời của bạn để bao gồm thêm chi tiết. Xem [FAQ] (http://www.stackoverflow.com/faq) để biết thêm thông tin. – slm

Các vấn đề liên quan