有由两个部分组成的:
- 从 .po文件解压缩
msgid
和相应的msgstr
值。
- 将
msgid
和msgstr
插入到SQLite 数据库的表中。
对于第1部分,我建议使用babel
模块。你可以用
pip install babel
安装使用babel.messages.pofile.read_po()
函数读取.po
文件。这将返回一个目录上,您可以遍历所有从文件解析的消息:
from babel.messages.pofile import read_po
with open('ru.po') as po_file:
cat = read_po(po_file)
for message in cat:
if message.id:
print '{!r} -> {!r}'.format(message.id, message.string)
对于第2部分:
import sqlite3
conn = sqlite3.connect('catalog.db')
cursor = conn.cursor()
result = cursor.execute('CREATE TABLE ru (msgid TEXT, msgstr TEXT)')
# bulk insert the messages
messages = [(msg.id, msg.string) for msg in cat if msg.id]
result = cursor.executemany('INSERT INTO ru (msgid, msgstr) VALUES (?, ?)', messages)
assert(result.rowcount == len(messages))
conn.commit()
result = cursor.execute("SELECT * from ru where msgid = '11 inches/sec.'")
msgid, msgstr = result.fetchone()
# .encode('utf8') can be removed for Python 3
print '"{}" translates to "{}"'.format(msgid, msgstr.encode('utf8'))
msgid = 'A Samba password is required to export printer drivers'
result = cursor.execute("SELECT * from ru where msgid = ?", (msgid,))
msgid, msgstr = result.fetchone()
print '"{}" translates to "{}"'.format(msgid, msgstr.encode('utf8'))
输出
"11 inches/sec." translates to "11 дюймов/с"
"A Samba password is required to export printer drivers" translates to "Для экспорта драйверов принтера требуется пароль Samba"
您可能会注意到有很多msgid
s空msgstr
s。如果你不想让他们,然后修改
messages = [(msg.id, msg.string) for msg in cat if msg.id]
到
messages = [(msg.id, msg.string) for msg in cat if msg.id and msg.string]
我想这可能是过于广泛,计算器一个问题。请查看python sqlite教程(例如http://zetcode.com/db/sqlitepythontutorial/)并询问您可能遇到的任何具体问题。 – lsowen 2015-03-19 12:31:24
您想要将整个文件存储在数据库中或保存一个链接/路径吗? – Holloway 2015-03-19 12:32:32
你的'.po'文件没有固有的结构,它还包含空白行和元数据。我可以猜测你想在数据库的表中存储“msgid”和“msgstr”作为列,但你需要更清晰地表达你的需求。 – mhawke 2015-03-19 12:36:34