i18n: wrote small instruction for translators
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 28 Sep 2011 08:13:06 +0000 (08:13 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 28 Sep 2011 08:13:06 +0000 (08:13 +0000)
- Added po/README.txt file with translation instructions
- If update_po and update_mo scripts now allows to provide list
  of languages which should be handled only, i.e.

./update_mo.py ru

- Removed obsolete file from POTFILES.in

po/POTFILES.in
po/README.txt [new file with mode: 0644]
po/update_mo.py
po/update_po.py

index 4c791dd93695b15eb2712ef7855e4bf6494b41cf..30c1d91b572e5512ce92e3ff82bd230d7ee61ee6 100644 (file)
@@ -1,6 +1,5 @@
 release/scripts/modules/rna_prop_ui.py
 
-release/scripts/startup/bl_operators/animsys_update.py
 release/scripts/startup/bl_operators/object.py
 release/scripts/startup/bl_operators/object_align.py
 release/scripts/startup/bl_operators/object_quick_effects.py
diff --git a/po/README.txt b/po/README.txt
new file mode 100644 (file)
index 0000000..ba7b51b
--- /dev/null
@@ -0,0 +1,61 @@
+Blender translation HOWTO
+=========================
+
+I'll try briefly explain how translation works and how to update translation files.
+
+1. How it works
+---------------
+
+This folder contains source files for translation system. This source files have
+got .po extension and they've got pretty simple syntax:
+
+msgid "some message id"
+msgstr "translation for this message"
+
+This means when string "some message id" is used as operator name, tooltip, menu
+and so it'll be displayed on the screen as "translation for this message".
+Pretty simple.
+
+This source files are pre-compiled into ../relese/dbin/.blender/locale/<language>/LC_MESSAGES/blender.mo,
+so they aren't getting compiled every time Blender is compiling to same some time and prevent
+failure on systems which doesn't have needed tools for compiling .po files.
+
+2. How to update translations
+-----------------------------
+
+It's also pretty simple. If you can find string you want to translate in <language>.po
+file as msgid, just write correct msgstr string for it. If msgid is marked as fuzzy,
+i.e.
+
+#, fuzzy
+msgid "some message id"
+msgstr "translation for this message"
+
+it means translation used to exist for this message, but message was changed, so translation
+also have to be updated (it's easier to make new translation based on previos translation).
+When translation was updated, remove line with '#, fuzzy' and it'll work.
+
+If there's no message in .po file you want to translate, probably .po file should be updated.
+Use the following steps for this:
+- With newly compiled blender run `blender --background --python update_msg.py` to update
+  messages.txt file (this file contains strings collected automatically from RNA system and
+  python UI scripts)
+- Run update_pot.py script which will update blender.pot file. This file contains all
+  strings which should be transated.
+- Run update_po.py script to merge all .po files with blender.pot (so all .po files
+  will contain all msgid-s declared in blender.pot) or update_po.py <language> to
+  update only needed .po file(s) to save time when you're busy with translation.
+  But before ocmmit all .po files better be updated.
+
+When you've finished with translation, you should re-compile .po file into .mo file.
+It's also pretty simple: just run update_mo.py script to recompile all languages or
+just update_mo.py <language> to re-compile only needed language(s).
+
+NOTE: msgfmt, msgmerge and xgettext tools should be available in your PATH.
+
+This steps to update template, translation files and compile them can be made in "batch" mode
+using GNUMakefile:
+
+make -f GNUMakefile translations
+
+NOTE: Blender has to be compiled using GNUMakefile first.
index 51591af8a0e22236b6b1828029cefd6ddaf241e8..fc70891de8f1cf1ff55c4e7c8e82957a86614d2f 100755 (executable)
@@ -25,6 +25,7 @@
 
 import subprocess
 import os
+import sys
 
 CURRENT_DIR = os.path.dirname(__file__)
 SOURCE_DIR = os.path.normpath(os.path.abspath(os.path.join(CURRENT_DIR, "..")))
@@ -33,21 +34,33 @@ LOCALE_DIR = os.path.join(SOURCE_DIR, "release", "bin", ".blender", "locale")
 DOMAIN = "blender"
 
 
+def process_po(po):
+    lang = os.path.basename(po)[:-3]
+
+    # show stats
+    cmd = ("msgfmt",
+        "--statistics",
+        os.path.join(CURRENT_DIR, "%s.po" % lang),
+        "-o",
+        os.path.join(LOCALE_DIR, lang, "LC_MESSAGES", "%s.mo" % DOMAIN),
+        )
+
+    print(" ".join(cmd))
+    process = subprocess.Popen(cmd)
+    process.wait()
+
+
 def main():
-    for po in os.listdir(CURRENT_DIR):
-        if po.endswith(".po"):
-            lang = po[:-3]
-            # show stats
-            cmd = ("msgfmt",
-                "--statistics",
-                os.path.join(CURRENT_DIR, "%s.po" % lang),
-                "-o",
-                os.path.join(LOCALE_DIR, lang, "LC_MESSAGES", "%s.mo" % DOMAIN),
-                )
-
-            print(" ".join(cmd))
-            process = subprocess.Popen(cmd)
-            process.wait()
+    if len(sys.argv) > 1:
+        for lang in sys.argv[1:]:
+            po = os.path.join(CURRENT_DIR, lang + '.po')
+
+            if os.path.exists(po):
+                process_po(po)
+    else:
+        for po in os.listdir(CURRENT_DIR):
+            if po.endswith(".po"):
+                process_po(po)
 
 if __name__ == "__main__":
     print("\n\n *** Running %r *** \n" % __file__)
index bbdf722490852d8bfc3938727bf8ef582404f464..45738363966c36dbea366ec9de6f8a9a9dfe5951 100755 (executable)
 
 import subprocess
 import os
+import sys
 
 CURRENT_DIR = os.path.dirname(__file__)
 DOMAIN = "blender"
 
 
+def process_po(po):
+    lang = os.path.basename(po)[:-3]
+
+    # update po file
+    cmd = ("msgmerge",
+           "--update",
+           "--lang=%s" % lang,
+           os.path.join(CURRENT_DIR, "%s.po" % lang),
+           os.path.join(CURRENT_DIR, "%s.pot" % DOMAIN),
+           )
+
+    print(" ".join(cmd))
+    process = subprocess.Popen(cmd)
+    process.wait()
+
+
 def main():
-    for po in os.listdir(CURRENT_DIR):
-        if po.endswith(".po"):
-            lang = po[:-3]
-
-            # update po file
-            cmd = ("msgmerge",
-                   "--update",
-                   "--lang=%s" % lang,
-                   os.path.join(CURRENT_DIR, "%s.po" % lang),
-                   os.path.join(CURRENT_DIR, "%s.pot" % DOMAIN),
-                   )
-
-            print(" ".join(cmd))
-            process = subprocess.Popen(cmd)
-            process.wait()
+    if len(sys.argv) > 1:
+        for lang in sys.argv[1:]:
+            po = os.path.join(CURRENT_DIR, lang + '.po')
+
+            if os.path.exists(po):
+                process_po(po)
+    else:
+        for po in os.listdir(CURRENT_DIR):
+            if po.endswith(".po"):
+                process_po(po)
 
 
 if __name__ == "__main__":