Есть ли библиотека Java для анализа файлов gettext PO? [закрытый]

кто-нибудь знает библиотеку Java, которая позволит мне анализировать .Файлы по? Я просто хочу создать карту идентификаторов и значений, чтобы загрузить их в базу данных.

6 ответов


по данным Java gettext utilities руководство вы можете конвертировать файл PO в класс ResourceBundle с помощью msgfmt --java2 program и прочитайте его с помощью java.утиль.ResourceBundle или gnu.gettext версии.GettextResource-я полагаю, это самый эффективный способ. Gettext-commons сделайте то же самое, включая создание промежуточного процесса для вызова msgfmt, потому что он расположен следующим образом:

gettext Commons-Это библиотека Java, которая использует в GNU утилиты gettext версии.

Если вы все еще хотите точно библиотеку Java, то единственный способ, который я вижу, это написать свою собственную библиотеку для разбора этого формата, т. е. переписать исходный код msgfmt с языка C на язык Java. Но я не уверен, что это будет быстрее, чем создать процесс + запустить программу с.


Я искал в интернете и не мог найти существующую библиотеку. Если вы используете Scala, довольно легко написать парсер самостоятельно, благодаря его функции parser combinator.

вызов PoParser.parsePo("po file content"). Результатом является список Translation.

Я сделал этот код в библиотеку (может использоваться любыми языками JVM, включая Java, конечно!): 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 это единственный, который я нашел, делая некоторые исследования некоторое время назад.


на проект tennera на GitHub содержит анализатор на основе ANTLR для GNU Gettext PO / POT. Я думаю, что он используется Redhat для веб-программного обеспечения для перевода.


.MO parser (не Java, а Scala), анализирует карту:http://scalamagic.blogspot.com/2013/03/simple-gettext-parser.html, Источник:http://pastebin.com/csWx5Sbb


Я нашел некоторые классы java для чтения и записи файлов po:https://launchpad.net/po-parser