Есть ли библиотека Java для анализа файлов GetText PO? [закрыто
Вопрос
Кто-нибудь знает о библиотеке Java, которая позволит мне разбирать файлы .po? Я просто хочу создать карту IDS и значений, поэтому я могу загрузить их в базу данных.
Решение
Согласно с Руководство по эксплуатации Java GetText Вы можете преобразовать файл PO в класс ResourceBundle, используя msgfmt --java2
Программа и прочитайте его, используя java.util.resourcebundle или gnu.gettext.gettextresource - полагаю, что это будет наиболее эффективным способом. GetText-Commons. Сделайте именно то же самое, включая промежуточное создание процесса, чтобы позвонить MSGFMT, потому что он располагается следующим:
GetText Commons - это библиотека Java, которая делает использование GNU Утилиты GetText..
Если вы все еще хотите именно в библиотеке Java, то единственный способ, которым я вижу, - это написать собственную библиотеку для анализа этого формата, т. Е. Переписать исходный код Msgfmt из C до Java. Но я не уверен, что это будет быстрее, чем создание процесса + запустить C программа.
Другие советы
Я искал в интернете и не смог найти существующую библиотеку. Если вы используете SCALA, довольно легко написать парсер самостоятельно благодаря своей функции комбинатора парсера.
Вызов 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 / COD. Я думаю, что он используется 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.