[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53930] trunk/blender: Python i18n API.

Bastien Montagne montagne29 at wanadoo.fr
Sun Jan 20 18:29:07 CET 2013


Revision: 53930
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53930
Author:   mont29
Date:     2013-01-20 17:29:07 +0000 (Sun, 20 Jan 2013)
Log Message:
-----------
Python i18n API. Many thanks to Campbell and Brecht for the reviews and suggestions!

This commit adds:
* A new bpy.app.translations module giving some info about locales/translation stuff (current active locale, all locales currently known by blender, all translation contexts currently defined, etc.).

* The ability for addons to feature translations, using the (un)register functions of above module.

* Also cleans up "translate py string when storing into RNA prop" by removing "PROP_TRANSLATE" string's subtype, and adding a PROP_STRING_PY_TRANSLATE flag instead (this way it is no more exposed to python...).

Addon translations work with py dictionaries: each addon features a dict {lang: {(context, message): translation, ...}, ...}, which is registered when the addon is enabled (and unregistered when disabled). 

Then, when a key (context, message) is not found in regular mo catalog, a cache dict for current locale is built from all registered addon translations, and key is searched in it.

Note: currently addons writers have to do all the work by hand, will add something (probably extend "edit translation" addon) to automate messages extraction from addons soon(ish)! To get a look to expected behavior from addons, have a look at render_copy_settings/__init__.py and render_copy_settings/translations.py (rather stupid example currently, but...). Once we have a complete process, I'll also update relevant wiki pages.

Modified Paths:
--------------
    trunk/blender/intern/locale/boost_locale_wrapper.cpp
    trunk/blender/intern/locale/boost_locale_wrapper.h
    trunk/blender/source/blender/blenfont/BLF_translation.h
    trunk/blender/source/blender/blenfont/CMakeLists.txt
    trunk/blender/source/blender/blenfont/SConscript
    trunk/blender/source/blender/blenfont/intern/blf_lang.c
    trunk/blender/source/blender/blenfont/intern/blf_translation.c
    trunk/blender/source/blender/makesrna/RNA_define.h
    trunk/blender/source/blender/makesrna/RNA_types.h
    trunk/blender/source/blender/makesrna/intern/makesrna.c
    trunk/blender/source/blender/makesrna/intern/rna_define.c
    trunk/blender/source/blender/makesrna/intern/rna_rna.c
    trunk/blender/source/blender/makesrna/intern/rna_ui.c
    trunk/blender/source/blender/makesrna/intern/rna_ui_api.c
    trunk/blender/source/blender/makesrna/intern/rna_wm.c
    trunk/blender/source/blender/python/BPY_extern.h
    trunk/blender/source/blender/python/intern/CMakeLists.txt
    trunk/blender/source/blender/python/intern/bpy_app.c
    trunk/blender/source/blender/python/intern/bpy_app_build_options.c
    trunk/blender/source/blender/python/intern/bpy_props.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Added Paths:
-----------
    trunk/blender/source/blender/python/intern/bpy_app_translations.c
    trunk/blender/source/blender/python/intern/bpy_app_translations.h

Modified: trunk/blender/intern/locale/boost_locale_wrapper.cpp
===================================================================
--- trunk/blender/intern/locale/boost_locale_wrapper.cpp	2013-01-20 17:25:46 UTC (rev 53929)
+++ trunk/blender/intern/locale/boost_locale_wrapper.cpp	2013-01-20 17:29:07 UTC (rev 53930)
@@ -33,6 +33,7 @@
 
 static std::string messages_path;
 static std::string default_domain;
+static std::string locale_str;
 
 void bl_locale_init(const char *_messages_path, const char *_default_domain)
 {
@@ -52,6 +53,7 @@
 void bl_locale_set(const char *locale)
 {
 	boost::locale::generator gen;
+	std::locale _locale;
 	// Specify location of dictionaries.
 	gen.add_messages_path(messages_path);
 	gen.add_messages_domain(default_domain);
@@ -59,7 +61,8 @@
 
 	try {
 		if (locale && locale[0]) {
-			std::locale::global(gen(locale));
+			_locale = gen(locale);
+			std::locale::global(_locale);
 		}
 		else {
 #ifdef __APPLE__
@@ -85,9 +88,11 @@
 			if (locale_osx == "")
 				fprintf(stderr, "Locale set: failed to read AppleLocale read from defaults\n");
 
-			std::locale::global(gen(locale_osx.c_str()));
+			_locale = gen(locale_osx.c_str());
+			std::locale::global(_locale);
 #else
-			std::locale::global(gen(""));
+			_locale = gen("");
+			std::locale::global(_locale);
 #endif
 		}
 		// Note: boost always uses "C" LC_NUMERIC by default!
@@ -95,8 +100,24 @@
 	catch(std::exception const &e) {
 		std::cout << "bl_locale_set(" << locale << "): " << e.what() << " \n";
 	}
+
+	/* Generate the locale string (useful to know which locale we are actually using in case of "default" one). */
+#define LOCALE_INFO std::use_facet<boost::locale::info>(_locale)
+
+	locale_str = LOCALE_INFO.language();
+	if (LOCALE_INFO.country() != "") {
+		locale_str += "_" + LOCALE_INFO.country();
+	}
+	if (LOCALE_INFO.variant() != "") {
+		locale_str += "@" + LOCALE_INFO.variant();
+	}
 }
 
+const char *bl_locale_get(void)
+{
+	return locale_str.c_str();
+}
+
 const char *bl_locale_pgettext(const char *msgctxt, const char *msgid)
 {
 	// Note: We cannot use short stuff like boost::locale::gettext, because those return
@@ -115,5 +136,4 @@
 //		std::cout << "bl_locale_pgettext(" << msgctxt << ", " << msgid << "): " << e.what() << " \n";
 		return msgid;
 	}
-}
-
+}
\ No newline at end of file

Modified: trunk/blender/intern/locale/boost_locale_wrapper.h
===================================================================
--- trunk/blender/intern/locale/boost_locale_wrapper.h	2013-01-20 17:25:46 UTC (rev 53929)
+++ trunk/blender/intern/locale/boost_locale_wrapper.h	2013-01-20 17:29:07 UTC (rev 53930)
@@ -40,7 +40,8 @@
 
 void bl_locale_init(const char *messages_path, const char *default_domain);
 void bl_locale_set(const char *locale);
-const char* bl_locale_pgettext(const char *msgctxt, const char *msgid);
+const char *bl_locale_get(void);
+const char *bl_locale_pgettext(const char *msgctxt, const char *msgid);
 
 #ifdef __cplusplus
 }

Modified: trunk/blender/source/blender/blenfont/BLF_translation.h
===================================================================
--- trunk/blender/source/blender/blenfont/BLF_translation.h	2013-01-20 17:25:46 UTC (rev 53929)
+++ trunk/blender/source/blender/blenfont/BLF_translation.h	2013-01-20 17:29:07 UTC (rev 53930)
@@ -51,6 +51,13 @@
 /* Get the current locale (short code, e.g. es_ES). */
 const char *BLF_lang_get(void);
 
+/* Get locale's elements (if relevant pointer is not NULL and element actually exists, e.g. if there is no variant,
+ * *variant and *language_variant will always be NULL).
+ * Non-null elements are always MEM_mallocN'ed, it's the caller's responsibility to free them. 
+ */
+void BLF_locale_explode(const char *locale, char **language, char **country, char **variant,
+                        char **language_country, char **language_variant);
+
 /* Get EnumPropertyItem's for translations menu. */
 struct EnumPropertyItem *BLF_RNA_lang_enum_properties(void);
 
@@ -143,4 +150,54 @@
 #define BLF_I18NCONTEXT_ID_MOVIECLIP            "MovieClip"
 #define BLF_I18NCONTEXT_ID_MASK                 "Mask"
 
-#endif /* __BLF_TRANSLATION_H__ */
+/* Helper for bpy.app.i18n object... */
+typedef struct
+{
+	const char *c_id;
+	const char *py_id;
+	const char *value;
+} BLF_i18n_contexts_descriptor;
+
+#define BLF_I18NCONTEXTS_ITEM(ctxt_id, py_id) {#ctxt_id, py_id, ctxt_id}
+
+#define BLF_I18NCONTEXTS_DESC {                                                                                         \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_DEFAULT, "default"),                                                         \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_OPERATOR_DEFAULT, "operator_default"),                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_ACTION, "id_action"),                                                     \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_ARMATURE, "id_armature"),                                                 \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_BRUSH, "id_brush"),                                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_CAMERA, "id_camera"),                                                     \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_CURVE, "id_curve"),                                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_GPENCIL, "id_gpencil"),                                                   \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_GROUP, "id_group"),                                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_ID, "id_id"),                                                             \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_IMAGE, "id_image"),                                                       \
+	/*BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_IPO, "id_ipo"),*/                                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SHAPEKEY, "id_shapekey"),                                                 \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_LAMP, "id_lamp"),                                                         \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_LIBRARY, "id_library"),                                                   \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_LATTICE, "id_lattice"),                                                   \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_MATERIAL, "id_material"),                                                 \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_METABALL, "id_metaball"),                                                 \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_MESH, "id_mesh"),                                                         \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_NODETREE, "id_nodetree"),                                                 \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_OBJECT, "id_object"),                                                     \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_PARTICLESETTINGS, "id_particlesettings"),                                 \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SCENE, "id_scene"),                                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SCREEN, "id_screen"),                                                     \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SEQUENCE, "id_sequence"),                                                 \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SPEAKER, "id_speaker"),                                                   \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_SOUND, "id_sound"),                                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_TEXTURE, "id_texture"),                                                   \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_TEXT, "id_text"),                                                         \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_VFONT, "id_vfont"),                                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_WORLD, "id_world"),                                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_WINDOWMANAGER, "id_windowmanager"),                                       \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_MOVIECLIP, "id_movieclip"),                                               \
+	BLF_I18NCONTEXTS_ITEM(BLF_I18NCONTEXT_ID_MASK, "id_mask"),                                                         \
+	{NULL, NULL, NULL}                                                                                                 \
+}
+
+//#undef _BLF_I18NCONTEXTS_ITEM
+
+#endif /* __BLF_TRANSLATION_H__ */
\ No newline at end of file

Modified: trunk/blender/source/blender/blenfont/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/blenfont/CMakeLists.txt	2013-01-20 17:25:46 UTC (rev 53929)
+++ trunk/blender/source/blender/blenfont/CMakeLists.txt	2013-01-20 17:29:07 UTC (rev 53930)
@@ -29,6 +29,7 @@
 	../editors/include
 	../makesdna
 	../makesrna
+	../python
 	../imbuf
 	../../../intern/guardedalloc
 	../../../intern/locale

Modified: trunk/blender/source/blender/blenfont/SConscript
===================================================================
--- trunk/blender/source/blender/blenfont/SConscript	2013-01-20 17:25:46 UTC (rev 53929)
+++ trunk/blender/source/blender/blenfont/SConscript	2013-01-20 17:29:07 UTC (rev 53930)
@@ -31,7 +31,7 @@
 sources = env.Glob('intern/*.c')
 
 incs = '. intern  #/intern/guardedalloc #/intern/locale ../blenkernel ../blenlib ../blenloader'
-incs += ' ../makesdna ../makesrna ../imbuf ../editors/include'
+incs += ' ../makesdna ../makesrna ../python ../imbuf ../editors/include'
 incs += ' #/extern/glew/include'
 incs += ' ' + env['BF_FREETYPE_INC']
 

Modified: trunk/blender/source/blender/blenfont/intern/blf_lang.c
===================================================================
--- trunk/blender/source/blender/blenfont/intern/blf_lang.c	2013-01-20 17:25:46 UTC (rev 53929)
+++ trunk/blender/source/blender/blenfont/intern/blf_lang.c	2013-01-20 17:29:07 UTC (rev 53930)
@@ -60,7 +60,7 @@
 static int num_locales_menu = 0;
 
 #define ULANGUAGE ((U.language >= 0 && U.language < num_locales) ? U.language : 0)
-#define LOCALE(_id) (locales ? locales[_id] : "")

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list