diff --git a/bundler/bundler.py b/bundler/bundler.py index 1e2a849..53cd292 100644 --- a/bundler/bundler.py +++ b/bundler/bundler.py @@ -454,6 +454,30 @@ def copy_icon_themes(self): cmd = "gtk-update-icon-cache -f " + path + " 2>/dev/null" os.popen(cmd) + def copy_translations(self): + translations = self.project.get_translations() + prefix = self.project.get_prefix() + for program in translations: + source = self.project.evaluate_path(program.source) + + + def name_filter(filename): + path, fname = os.path.split(filename) + name, ext = os.path.splitext(fname) + if name != program.name: + return False + elif ext not in (".mo", ".po"): + return False + else: + return True + + for root, trees, files in os.walk(source): + for file in filter(name_filter, files): + path = os.path.join(root, file) + self.copy_path(Path("${prefix}" + path[len(prefix):], + program.dest)) + + def run(self): # Remove the temp location forcefully. path = self.project.evaluate_path(self.bundle_path) @@ -497,6 +521,9 @@ def run(self): # Data for path in self.project.get_data(): self.copy_path(path) + + # Translaations + self.copy_translations() # Frameworks frameworks = self.project.get_frameworks() diff --git a/bundler/project.py b/bundler/project.py index 6a7b7e8..7c83079 100644 --- a/bundler/project.py +++ b/bundler/project.py @@ -151,6 +151,26 @@ def from_node(cls, node): return binary from_node = classmethod(from_node) +class Translation(Path): + def __init__(self, name, sourcepath, destpath): + Path.__init__(self, sourcepath, destpath) + self.name = name + + def from_node(cls, node): + source = utils.node_get_string(node) + dest = node.getAttribute("dest") + if len(dest) == 0: + dest = None + name = node.getAttribute("name") + if len(name) == 0: + raise "The tag 'translations' must have a 'name' property" + + return Translation(name, source, dest) + from_node = classmethod(from_node) + + + + class Data(Path): pass @@ -309,6 +329,13 @@ def get_frameworks(self): frameworks.append(Framework.from_node(node)) return frameworks + def get_translations(self): + translations = [] + nodes = utils.node_get_elements_by_tag_name(self.root, "translations") + for node in nodes: + translations.append(Translation.from_node(node)) + return translations + def get_main_binary(self): node = utils.node_get_element_by_tag_name(self.root, "main-binary") if not node: diff --git a/bundler/project_test.py b/bundler/project_test.py index 1db0d27..4c3d583 100644 --- a/bundler/project_test.py +++ b/bundler/project_test.py @@ -165,4 +165,14 @@ def test_o_get_data(self): "${bundle}/Contents/Resources/etc/gtk-2.0/gtkrc", "Data[2] Destination %s" % data[2].dest) + def test_p_get_translations(self): + trans = self.goodproject.get_translations() + self.failUnlessEqual(len(trans), 1, + "Wrong number of translations %d" % len(trans)) + self.failUnlessEqual(trans[0].name, "foo", + "Bad translation name %s" % trans[0].name) + self.failUnlessEqual(trans[0].source, "${prefix}/share/locale", + "Bad translation source %s" % trans[0].source) + + diff --git a/examples/gtk-demo.bundle b/examples/gtk-demo.bundle index 99d15d3..549914a 100644 --- a/examples/gtk-demo.bundle +++ b/examples/gtk-demo.bundle @@ -61,6 +61,19 @@ ${prefix}/lib/gtk-2.0/${pkg:gtk+-2.0:gtk_binary_version}/loaders/*.so + + + ${prefix}/share/locale + + + + ${prefix}/share/locale + + +