[gimp] Add i18n support for python spyrogimp plugin



commit f6e414575628189a51582f34284bd4356b659f85
Author: Elad Shahar <dawn ever gmail com>
Date:   Fri Feb 1 00:05:45 2019 +0200

    Add i18n support for python spyrogimp plugin

 plug-ins/pygimp/plug-ins/spyro_plus.py | 178 ++++++++++++++++++---------------
 po-python/POTFILES.in                  |   1 +
 2 files changed, 96 insertions(+), 83 deletions(-)
---
diff --git a/plug-ins/pygimp/plug-ins/spyro_plus.py b/plug-ins/pygimp/plug-ins/spyro_plus.py
index e9da063872..e6cd464ec5 100644
--- a/plug-ins/pygimp/plug-ins/spyro_plus.py
+++ b/plug-ins/pygimp/plug-ins/spyro_plus.py
@@ -24,18 +24,28 @@ import gobject
 import gtk
 
 from math import pi, sin, cos, atan, atan2, fmod, radians
+import gettext
 import fractions
 import time
 
+
+# i18n
+t = gettext.translation("gimp20-python", gimp.locale_directory, fallback=True)
+_ = t.ugettext
+
+def N_(message):
+    return message
+
+
 pdb = gimp.pdb
 
 two_pi, half_pi = 2 * pi, pi / 2
-layer_name = "Spyro Layer"
+layer_name = _("Spyro Layer")
 
 # "Enums"
 GEAR_NOTATION, TOY_KIT_NOTATION = range(2)       # Pattern notations
 
-# Mapping of pattern notation to the corresponding tab in the patttern notation notebook.
+# Mapping of pattern notation to the corresponding tab in the pattern notation notebook.
 pattern_notation_page = {}
 
 ring_teeth = [96, 144, 105, 150]
@@ -76,7 +86,7 @@ class Shape:
 
 
 class CircleShape(Shape):
-    name = "Circle"
+    name = _("Circle")
 
     def get_center_of_moving_gear(self, oangle, dist=None):
         """
@@ -112,7 +122,7 @@ class SidedShape(CanRotateShape, Shape):
 
 
 class PolygonShape(SidedShape):
-    name = "Polygon-Star"
+    name = _("Polygon-Star")
 
     def get_shape_factor(self, oangle):
         oangle_mod = fmod(oangle + self.cp.shape_rotation_radians, self.angle_of_each_side)
@@ -128,7 +138,7 @@ class PolygonShape(SidedShape):
 
 class SineShape(SidedShape):
     # Sine wave on a circle ring.
-    name = "Sine"
+    name = _("Sine")
 
     def get_shape_factor(self, oangle):
         oangle_mod = fmod(oangle + self.cp.shape_rotation_radians, self.angle_of_each_side)
@@ -138,7 +148,7 @@ class SineShape(SidedShape):
 
 class BumpShape(SidedShape):
     # Semi-circles, based on a polygon
-    name = "Bumps"
+    name = _("Bumps")
 
     def get_shape_factor(self, oangle):
         oangle_mod = fmod(oangle + self.cp.shape_rotation_radians, self.angle_of_each_side)
@@ -243,7 +253,7 @@ class AbstractShapeFromParts(Shape):
 
 
 class RackShape(CanRotateShape, AbstractShapeFromParts):
-    name = "Rack"
+    name = _("Rack")
 
     def configure(self, img, pp, cp, drawing_no):
         Shape.configure(self, img, pp, cp, drawing_no)
@@ -287,7 +297,7 @@ class RackShape(CanRotateShape, AbstractShapeFromParts):
 
 
 class FrameShape(AbstractShapeFromParts):
-    name = "Frame"
+    name = _("Frame")
 
     def configure(self, img, pp, cp, drawing_no):
         Shape.configure(self, img, pp, cp, drawing_no)
@@ -376,7 +386,7 @@ class SelectionToPath:
 
 
 class SelectionShape(Shape):
-    name = "Selection"
+    name = _("Selection")
 
     def __init__(self):
         self.path = None
@@ -466,7 +476,7 @@ def get_gradient_samples(num_samples):
 
 
 class PencilTool():
-    name = "Pencil"
+    name = _("Pencil")
     can_color = True
 
     def draw(self, layer, strokes, color=None):
@@ -482,7 +492,7 @@ class PencilTool():
 
 
 class AirBrushTool():
-    name = "AirBrush"
+    name = _("AirBrush")
     can_color = True
 
     def draw(self, layer, strokes, color=None):
@@ -542,12 +552,12 @@ class PreviewTool:
         pdb.gimp_pencil(layer, len(strokes), strokes)
         pdb.gimp_context_pop()
 
-    name = "Preview"
+    name = _("Preview")
     can_color = False
 
 
 class StrokeTool(AbstractStrokeTool):
-    name = "Stroke"
+    name = _("Stroke")
     can_color = True
 
     def prepare_stroke_context(self, color):
@@ -575,10 +585,10 @@ class StrokePaintTool(AbstractStrokeTool):
 
 tools = [
     PreviewTool(),
-    StrokePaintTool("PaintBrush", "gimp-paintbrush"),
+    StrokePaintTool(_("PaintBrush"), "gimp-paintbrush"),
     PencilTool(), AirBrushTool(), StrokeTool(),
-    StrokePaintTool("Ink", 'gimp-ink'),
-    StrokePaintTool("MyPaintBrush", 'gimp-mybrush')
+    StrokePaintTool(_("Ink"), 'gimp-ink'),
+    StrokePaintTool(_("MyPaintBrush"), 'gimp-mybrush')
     # Clone does not work properly when an image is not set.  When that happens, drawing fails, and
     # I am unable to catch the error. This causes the plugin to crash, and subsequent problems with undo.
     # StrokePaintTool("Clone", 'gimp-clone', False)
@@ -807,21 +817,21 @@ class RouletteCurveType(CurveType):
 
 
 class SpyroCurveType(RouletteCurveType):
-    name = "Spyrograph"
+    name = _("Spyrograph")
 
     def get_angle_factor(self, cp):
         return - (cp.fixed_gear_teeth - cp.moving_gear_teeth) / float(cp.moving_gear_teeth)
 
 
 class EpitrochoidCurvetype(RouletteCurveType):
-    name = "Epitrochoid"
+    name = _("Epitrochoid")
 
     def get_angle_factor(self, cp):
         return (cp.fixed_gear_teeth + cp.moving_gear_teeth) / float(cp.moving_gear_teeth)
 
 
 class SineCurveType(CurveType):
-    name = "Sine"
+    name = _("Sine")
 
     def get_angle_factor(self, cp):
         return cp.fixed_gear_teeth / float(cp.moving_gear_teeth)
@@ -841,7 +851,7 @@ class SineCurveType(CurveType):
 
 
 class LissaCurveType:
-    name = "Lissajous"
+    name = _("Lissajous")
 
     def get_angle_factor(self, cp):
         return cp.fixed_gear_teeth / float(cp.moving_gear_teeth)
@@ -1085,23 +1095,23 @@ class SpyroWindow(gtk.Window):
 
             # Curve type
             row = 0
-            label_in_table("Curve Type", table, row,
-                           "An Epitrochoid pattern is when the moving gear is on the outside of the fixed 
gear.")
+            label_in_table(_("Curve Type"), table, row,
+                           _("An Epitrochoid pattern is when the moving gear is on the outside of the fixed 
gear."))
             self.curve_type_combo = set_combo_in_table([ct.name for ct in curve_types], table, row,
                                                        self.curve_type_changed)
 
             row += 1
-            label_in_table("Tool", table, row,
-                           "The tool with which to draw the pattern."
-                           "The Preview tool just draws quickly.")
+            label_in_table(_("Tool"), table, row,
+                           _("The tool with which to draw the pattern."
+                             "The Preview tool just draws quickly."))
             self.tool_combo = set_combo_in_table([tool.name for tool in tools], table, row,
                                                  self.tool_combo_changed)
 
-            self.long_gradient_checkbox = gtk.CheckButton("Long Gradient")
+            self.long_gradient_checkbox = gtk.CheckButton(_("Long Gradient"))
             self.long_gradient_checkbox.set_tooltip_text(
-                "When unchecked, the current tool settings will be used. "
-                "When checked, will use a long gradient to match the length of the pattern, "
-                "based on current gradient and repeat mode from the gradient tool settings."
+                _("When unchecked, the current tool settings will be used. "
+                  "When checked, will use a long gradient to match the length of the pattern, "
+                  "based on current gradient and repeat mode from the gradient tool settings.")
             )
             self.long_gradient_checkbox.set_border_width(0)
             table.attach(self.long_gradient_checkbox, 2, 3, row, row + 1, xoptions=0, yoptions=0)
@@ -1119,11 +1129,11 @@ class SpyroWindow(gtk.Window):
             hbox = gtk.HBox(spacing=5)
             hbox.set_border_width(5)
 
-            label = gtk.Label("Specify pattern using one of the following tabs:")
-            label.set_tooltip_text(
+            label = gtk.Label(_("Specify pattern using one of the following tabs:"))
+            label.set_tooltip_text(_(
                 "The pattern is specified only by the active tab. Toy Kit is similar to Gears, "
                 "but it uses gears and hole numbers which are found in toy kits. "
-                "If you follow the instructions from the toy kit manuals, results should be similar.")
+                "If you follow the instructions from the toy kit manuals, results should be similar."))
             hbox.pack_start(label)
             label.show()
 
@@ -1144,27 +1154,27 @@ class SpyroWindow(gtk.Window):
 
             # Teeth
             row = 0
-            fixed_gear_tooltip = (
+            fixed_gear_tooltip = _(
                 "Number of teeth of fixed gear. The size of the fixed gear is "
                 "proportional to the number of teeth."
             )
-            label_in_table("Fixed Gear Teeth", gear_table, row, fixed_gear_tooltip)
+            label_in_table(_("Fixed Gear Teeth"), gear_table, row, fixed_gear_tooltip)
             self.outer_teeth_adj = gtk.Adjustment(self.p.outer_teeth, 10, 180, 1)
             hscale_in_table(self.outer_teeth_adj, gear_table, row, self.outer_teeth_changed)
 
             row += 1
-            moving_gear_tooltip = (
+            moving_gear_tooltip = _(
                 "Number of teeth of moving gear. The size of the moving gear is "
                 "proportional to the number of teeth."
             )
-            label_in_table("Moving Gear Teeth", gear_table, row, moving_gear_tooltip)
+            label_in_table(_("Moving Gear Teeth"), gear_table, row, moving_gear_tooltip)
             self.inner_teeth_adj = gtk.Adjustment(self.p.inner_teeth, 2, 100, 1)
             hscale_in_table(self.inner_teeth_adj, gear_table, row, self.inner_teeth_changed)
 
             row += 1
-            label_in_table("Hole percent", gear_table, row,
-                           "How far is the hole from the center of the moving gear. "
-                           "100% means that the hole is at the gear's edge.")
+            label_in_table(_("Hole percent"), gear_table, row,
+                           _("How far is the hole from the center of the moving gear. "
+                             "100% means that the hole is at the gear's edge."))
             self.hole_percent_adj = gtk.Adjustment(self.p.hole_percent, 2.5, 100.0, 0.5)
             self.hole_percent_myscale = hscale_in_table(self.hole_percent_adj, gear_table,
                                                         row, self.hole_percent_changed, digits=1)
@@ -1174,31 +1184,32 @@ class SpyroWindow(gtk.Window):
             kit_table = create_table(3, 3, 5)
 
             row = 0
-            label_in_table("Fixed Gear Teeth", kit_table, row, fixed_gear_tooltip)
+            label_in_table(_("Fixed Gear Teeth"), kit_table, row, fixed_gear_tooltip)
             self.kit_outer_teeth_combo = set_combo_in_table([str(t) for t in ring_teeth], kit_table, row,
                                                             self.kit_outer_teeth_combo_changed)
 
             row += 1
-            label_in_table("Moving Gear Teeth", kit_table, row, moving_gear_tooltip)
+            label_in_table(_("Moving Gear Teeth"), kit_table, row, moving_gear_tooltip)
             self.kit_inner_teeth_combo = set_combo_in_table([str(t) for t in wheel_teeth], kit_table, row,
                                                             self.kit_inner_teeth_combo_changed)
 
             row += 1
-            label_in_table("Hole Number", kit_table, row, "Hole #1 is at the edge of the gear. "
-                           "The maximum hole number is near the center. "
-                           "The maximum hole number is different for each gear.")
+            label_in_table(_("Hole Number"), kit_table, row,
+                           _("Hole #1 is at the edge of the gear. "
+                             "The maximum hole number is near the center. "
+                             "The maximum hole number is different for each gear."))
             self.kit_hole_adj = gtk.Adjustment(self.p.hole_number, 1, self.p.kit_max_hole_number(), 1)
             self.kit_hole_myscale = hscale_in_table(self.kit_hole_adj, kit_table, row, self.kit_hole_changed)
 
             # Add tables as childs of the pattern notebook
 
             pattern_notation_page[TOY_KIT_NOTATION] = self.pattern_notebook.append_page(kit_table)
-            self.pattern_notebook.set_tab_label_text(kit_table, 'Toy Kit')
+            self.pattern_notebook.set_tab_label_text(kit_table, _("Toy Kit"))
             self.pattern_notebook.set_tab_label_packing(kit_table, 0, 0, gtk.PACK_END)
             kit_table.show()
 
             pattern_notation_page[GEAR_NOTATION] = self.pattern_notebook.append_page(gear_table)
-            self.pattern_notebook.set_tab_label_text(gear_table, 'Gears')
+            self.pattern_notebook.set_tab_label_text(gear_table, _("Gears"))
             self.pattern_notebook.set_tab_label_packing(gear_table, 0, 0, gtk.PACK_END)
             gear_table.show()
 
@@ -1210,9 +1221,9 @@ class SpyroWindow(gtk.Window):
             pattern_table = create_table(1, 3, 5)
 
             row = 0
-            label_in_table("Rotation", pattern_table, row,
-                           "Rotation of the pattern, in degrees. "
-                           "The starting position of the moving gear in the fixed gear.")
+            label_in_table(_("Rotation"), pattern_table, row,
+                           _("Rotation of the pattern, in degrees. "
+                             "The starting position of the moving gear in the fixed gear."))
             self.pattern_rotation_adj, myscale = rotation_in_table(
                 self.p.pattern_rotation, pattern_table, row, self.pattern_rotation_changed
             )
@@ -1234,27 +1245,27 @@ class SpyroWindow(gtk.Window):
             table = create_table(4, 2, 10)
 
             row = 0
-            label_in_table("Shape", table, row,
-                           "The shape of the fixed gear to be used inside current selection. "
-                           "Rack is a long round-edged shape provided in the toy kits. "
-                           "Frame hugs the boundaries of the rectangular selection, "
-                           "use hole=100 in Gear notation to touch boundary. "
-                           "Selection will hug boundaries of current selection - try something 
non-rectangular.")
+            label_in_table(_("Shape"), table, row,
+                           _("The shape of the fixed gear to be used inside current selection. "
+                             "Rack is a long round-edged shape provided in the toy kits. "
+                             "Frame hugs the boundaries of the rectangular selection, "
+                             "use hole=100 in Gear notation to touch boundary. "
+                             "Selection will hug boundaries of current selection - try something 
non-rectangular."))
             self.shape_combo = set_combo_in_table([shape.name for shape in shapes], table, row,
                                                   self.shape_combo_changed)
 
             row += 1
-            label_in_table("Sides", table, row, "Number of sides of the shape.")
+            label_in_table(_("Sides"), table, row, _("Number of sides of the shape."))
             self.sides_adj = gtk.Adjustment(self.p.sides, 3, 16, 1)
             self.sides_myscale = hscale_in_table(self.sides_adj, table, row, self.sides_changed)
 
             row += 1
-            label_in_table("Morph", table, row, "Morph fixed gear shape. Only affects some of the shapes.")
+            label_in_table(_("Morph"), table, row, _("Morph fixed gear shape. Only affects some of the 
shapes."))
             self.morph_adj = gtk.Adjustment(self.p.morph, 0.0, 1.0, 0.01)
             self.morph_myscale = hscale_in_table(self.morph_adj, table, row, self.morph_changed, digits=2)
 
             row += 1
-            label_in_table("Rotation", table, row, "Rotation of the fixed gear, in degrees")
+            label_in_table(_("Rotation"), table, row, _("Rotation of the fixed gear, in degrees"))
             self.shape_rotation_adj, self.shape_rotation_myscale = rotation_in_table(
                 self.p.shape_rotation, table, row, self.shape_rotation_changed
             )
@@ -1269,15 +1280,15 @@ class SpyroWindow(gtk.Window):
             table = create_table(2, 2, 10)
 
             row = 0
-            label_in_table("Margin (px)", table, row, "Margin from edge of selection.")
+            label_in_table(_("Margin (px)"), table, row, _("Margin from edge of selection."))
             self.margin_adj = gtk.Adjustment(self.p.margin_pixels, 0, max(img.height, img.width), 1)
             hscale_in_table(self.margin_adj, table, row, self.margin_changed)
 
             row += 1
-            self.equal_w_h_checkbox = gtk.CheckButton("Make width and height equal")
+            self.equal_w_h_checkbox = gtk.CheckButton(_("Make width and height equal"))
             self.equal_w_h_checkbox.set_tooltip_text(
-                "When unchecked, the pattern will fill the current image or selection. "
-                "When checked, the pattern will have same width and height, and will be centered."
+                _("When unchecked, the pattern will fill the current image or selection. "
+                  "When checked, the pattern will have same width and height, and will be centered.")
             )
             self.equal_w_h_checkbox.set_border_width(15)
             table.attach(self.equal_w_h_checkbox, 0, 2, row, row + 1)
@@ -1300,18 +1311,18 @@ class SpyroWindow(gtk.Window):
         def dialog_button_box():
             hbox = gtk.HBox(homogeneous=True, spacing=20)
 
-            add_button_to_box(hbox, "Redraw", self.redraw,
-                              "If you change the settings of a tool, change color, or change the selection, "
-                              "press this to preview how the pattern looks.")
-            add_button_to_box(hbox, "Reset", self.reset_params)
-            add_button_to_box(hbox, "Cancel", self.cancel_window)
-            self.ok_btn = add_button_to_box(hbox, "OK", self.ok_window)
+            add_button_to_box(hbox, _("Redraw"), self.redraw,
+                              _("If you change the settings of a tool, change color, or change the 
selection, "
+                                "press this to preview how the pattern looks."))
+            add_button_to_box(hbox, _("Reset"), self.reset_params)
+            add_button_to_box(hbox, _("Cancel"), self.cancel_window)
+            self.ok_btn = add_button_to_box(hbox, _("OK"), self.ok_window)
 
-            self.keep_separate_layer_checkbox = gtk.CheckButton("Keep\nLayer")
+            self.keep_separate_layer_checkbox = gtk.CheckButton(_("Keep\nLayer"))
             self.keep_separate_layer_checkbox.set_tooltip_text(
-                "If checked, then once OK is pressed, the spyro layer is kept, and the plugin exits quickly. 
"
-                "If unchecked, the spyro layer is deleted, and the pattern is redrawn on the layer that was "
-                "active when the plugin was launched."
+                _("If checked, then once OK is pressed, the spyro layer is kept, and the plugin exits 
quickly. "
+                  "If unchecked, the spyro layer is deleted, and the pattern is redrawn on the layer that 
was "
+                  "active when the plugin was launched.")
             )
             hbox.add(self.keep_separate_layer_checkbox)
             self.keep_separate_layer_checkbox.show()
@@ -1323,7 +1334,7 @@ class SpyroWindow(gtk.Window):
 
             # Create the dialog
             gtk.Window.__init__(self)
-            self.set_title("Spyrogimp")
+            self.set_title(_("Spyrogimp"))
             self.set_default_size(350, -1)
             self.set_border_width(10)
             # self.set_keep_above(True) # keep the window on top
@@ -1332,7 +1343,7 @@ class SpyroWindow(gtk.Window):
             vbox = gtk.VBox(spacing=10, homogeneous=False)
             self.add(vbox)
 
-            box = gimpui.HintBox("Draw spyrographs using current tool settings and selection.")
+            box = gimpui.HintBox(_("Draw spyrographs using current tool settings and selection."))
             vbox.pack_start(box, expand=False)
             box.show()
 
@@ -1345,13 +1356,13 @@ class SpyroWindow(gtk.Window):
             self.main_notebook.set_border_width(5)
 
             pattern_frame = pattern_notation_frame()
-            self.main_notebook.append_page(pattern_frame, gtk.Label("Curve Pattern"))
+            self.main_notebook.append_page(pattern_frame, gtk.Label(_("Curve Pattern")))
             pattern_frame.show()
             fixed_g_page = fixed_gear_page()
-            self.main_notebook.append_page(fixed_g_page, gtk.Label("Fixed Gear"))
+            self.main_notebook.append_page(fixed_g_page, gtk.Label(_("Fixed Gear")))
             fixed_g_page.show()
             size_p = size_page()
-            self.main_notebook.append_page(size_p, gtk.Label("Size"))
+            self.main_notebook.append_page(size_p, gtk.Label(_("Size")))
             size_p.show()
 
             vbox.add(self.main_notebook)
@@ -1528,7 +1539,6 @@ class SpyroWindow(gtk.Window):
             self.hole_percent_myscale.set_sensitive(False)
             self.kit_hole_myscale.set_sensitive(False)
 
-
     def curve_type_changed(self, val):
         self.p.curve_type = val.get_active()
         self.curve_type_side_effects()
@@ -1637,7 +1647,7 @@ class SpyroWindow(gtk.Window):
     # Progress bar of plugin window.
 
     def progress_start(self):
-        self.progress_bar.set_text("Rendering Pattern")
+        self.progress_bar.set_text(_("Rendering Pattern"))
         self.progress_bar.set_fraction(0.0)
         pdb.gimp_displays_flush()
 
@@ -1649,7 +1659,7 @@ class SpyroWindow(gtk.Window):
         self.progress_bar.set_fraction(self.engine.fraction_done())
 
     def progress_unknown(self):
-        self.progress_bar.set_text("Please wait : Rendering Pattern")
+        self.progress_bar.set_text(_("Please wait : Rendering Pattern"))
         self.progress_bar.pulse()
         pdb.gimp_displays_flush()
 
@@ -1758,7 +1768,7 @@ class SpyrogimpPlusPlugin(gimpplugin.plugin):
 
     def query(self):
         plugin_name = "plug_in_spyrogimp"
-        label = "Spyrogimp..."
+        label = N_("Spyrogimp...")
         menu = "<Image>/Filters/Render/"
 
         params = [
@@ -1767,7 +1777,7 @@ class SpyrogimpPlusPlugin(gimpplugin.plugin):
             (PDB_IMAGE, "image", "Input image"),
             (PDB_DRAWABLE, "drawable", "Input drawable"),
             (PDB_INT32, "curve_type",
-            "The curve type { Spyrograph (0), Epitrochoid (1), Sine (2), Lissajous(3) }"),
+             "The curve type { Spyrograph (0), Epitrochoid (1), Sine (2), Lissajous(3) }"),
             (PDB_INT32, "shape", "Shape of fixed gear"),
             (PDB_INT32, "sides", "Number of sides of fixed gear (3 or greater). Only used by some shapes."),
             (PDB_FLOAT, "morph", "Morph shape of fixed gear, between 0 and 1. Only used by some shapes."),
@@ -1785,9 +1795,11 @@ class SpyrogimpPlusPlugin(gimpplugin.plugin):
              "Only applicable to some of the tools.")
         ]
 
+        gimp.domain_register("gimp20-python", gimp.locale_directory)
+
         gimp.install_procedure(
             plugin_name,
-            "Draw spyrographs using current tool settings and selection.",
+            N_("Draw spyrographs using current tool settings and selection."),
             "Uses current tool settings to draw Spyrograph patterns. "
             "The size and location of the pattern is based on the current selection.",
             "Elad Shahar",
diff --git a/po-python/POTFILES.in b/po-python/POTFILES.in
index c6cd45e625..a6dcefa165 100644
--- a/po-python/POTFILES.in
+++ b/po-python/POTFILES.in
@@ -16,3 +16,4 @@ plug-ins/pygimp/plug-ins/palette-to-gradient.py
 plug-ins/pygimp/plug-ins/py-slice.py
 plug-ins/pygimp/plug-ins/python-console.py
 plug-ins/pygimp/plug-ins/shadow_bevel.py
+plug-ins/pygimp/plug-ins/spyro_plus.py


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]