K's Diary


このページは、たわいのない日々のウワゴトを綴るページです。
なんてツマラナソウナページなんだ(笑)

一応、内容毎にタイトルの色を変えています。
緑色はlinuxに関する話題、 黄色はコンピュータゲームに関する話題、 水色はその他の話題になっています。
なお、スタイルシートに対応していないブラウザでは、 色は変わりませんのであしからず。


過去の日記

全てのトピックを表示


'09/10/6

■ pygtkとGtkBuilderとgettext つづき

とりあえず、こんな対処をしてみた。

# -*-encoding: utf-8 -*-

from config import *

import gettext
gettext.install(PACKAGE, LOCALEDIR)

import pygtk
pygtk.require("2.0")
import gtk
import gobject

import xml.parsers.expat

class BuilderTranslationParser:
    def __init__(self):
        self.parser = xml.parsers.expat.ParserCreate()
        self.parser.XmlDeclHandler = self.xml_decl
        self.parser.StartElementHandler = self.start_element
        self.parser.EndElementHandler = self.end_element
        self.parser.CharacterDataHandler = self.character_data

        self.translating = False
        self.translation_text = ""
        self.context = ""

    def parse(self, file):
        self.parser.ParseFile(file)
        return self.context

    def put_through_tag(self, context):
        pos = context.find(">")
        if pos >= 0:
            self.context += context[:pos + 1]
        else:
            self.context += context

    def xml_decl(self, version, encoding, standalone):
        self.put_through_tag(self.parser.GetInputContext())

    def start_element(self, name, attrs):
        self.put_through_tag(self.parser.GetInputContext())

        if name == "property" and "translatable" in attrs and attrs["translatable"] == "yes":
            self.translation_text = ""
            self.translating = True

    def end_element(self, name):
        if name == "property" and self.translating:
            print("translation_text = \"%s\"." % self.translation_text)
            self.context += _(self.translation_text)
            self.translation_text = ""
            self.translating = False

        self.put_through_tag(self.parser.GetInputContext())

    def character_data(self, data):
        if self.translating:
            self.translation_text += data
        else:
            self.context += data

class MyApp:
    def __init__(self):
        self.builder = gtk.Builder()
        self.builder.set_translation_domain(PACKAGE)
        #self.builder.add_from_file(PKGDATADIR + "/gettext01.glade")
        parser = BuilderTranslationParser()
        file = open(PKGDATADIR + "/gettext01.glade", "r")
        context = parser.parse(file)
        file.close()
        self.builder.add_from_string(context)

        self.window = self.builder.get_object("window1")
        self.window.connect("destroy", gtk.main_quit)
        self.window.show()

if __name__ == "__main__":
    app = MyApp()
    print(_("button"))
    gtk.main()

■ pygtkとGtkBuilderとgettext つづきのつづき

XMLパーサのCharacterDataHandlerに渡されるテキストデータは、特殊文字が&xxx;から元に戻されているので、変換し直してやらないとラベルに「<」などの文字が含まれているとちゃんと動かないな。
まぁ、適当に直して使ってください(笑)