Revision: 53955
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53955
Author:   mont29
Date:     2013-01-21 12:01:47 +0000 (Mon, 21 Jan 2013)
Log Message:
-----------
Print warnings when invalid py dict/key/value is found in translations data (do 
not error here, this is not critical and can be ignored/skiped, and it would 
break translations for other addons as well).

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

Modified: trunk/blender/source/blender/python/intern/bpy_app_translations.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_app_translations.c   
2013-01-21 11:38:15 UTC (rev 53954)
+++ trunk/blender/source/blender/python/intern/bpy_app_translations.c   
2013-01-21 12:01:47 UTC (rev 53955)
@@ -134,7 +134,7 @@
 
 static void _build_translations_cache(PyObject *py_messages, const char 
*locale)
 {
-       PyObject *uuid_dict;
+       PyObject *uuid, *uuid_dict;
        Py_ssize_t pos = 0;
        char *language = NULL, *language_country = NULL, *language_variant = 
NULL;
 
@@ -147,7 +147,7 @@
        _translations_cache = BLI_ghash_new(_ghashutil_keyhash, 
_ghashutil_keycmp, __func__);
 
        /* Iterate over all py dicts. */
-       while (PyDict_Next(py_messages, &pos, NULL, &uuid_dict)) {
+       while (PyDict_Next(py_messages, &pos, &uuid, &uuid_dict)) {
                PyObject *lang_dict;
 
 #if 0
@@ -155,51 +155,85 @@
                printf("\n");
 #endif
 
-               if (!PyDict_Check(uuid_dict))
-                       continue;
-
                /* Try to get first complete locale, then language+country, 
then language+variant, then only language */
                lang_dict = PyDict_GetItemString(uuid_dict, locale);
-               if (!lang_dict && language_country)
+               if (!lang_dict && language_country) {
                        lang_dict = PyDict_GetItemString(uuid_dict, 
language_country);
-               if (!lang_dict && language_variant)
+                       locale = language_country;
+               }
+               if (!lang_dict && language_variant) {
                        lang_dict = PyDict_GetItemString(uuid_dict, 
language_variant);
-               if (!lang_dict && language)
+                       locale = language_variant;
+               }
+               if (!lang_dict && language) {
                        lang_dict = PyDict_GetItemString(uuid_dict, language);
+                       locale = language;
+               }
 
-               if (lang_dict && PyDict_Check(lang_dict)) {
+               if (lang_dict) {
                        PyObject *pykey, *trans;
                        Py_ssize_t ppos = 0;
 
+                       if (!PyDict_Check(lang_dict)) {
+                               printf("WARNING! In translations' dict of \"");
+                               PyObject_Print(uuid, stdout, Py_PRINT_RAW);
+                               printf("\":\n");
+                               printf("    Each language key must have a 
dictionary as value, \"%s\" is not valid, skipping: ",
+                                      locale);
+                               PyObject_Print(lang_dict, stdout, Py_PRINT_RAW);
+                               printf("\n");
+                               continue;
+                       }
+
                        /* Iterate over all translations of the found language 
dict, and populate our ghash cache. */
                        while (PyDict_Next(lang_dict, &ppos, &pykey, &trans)) {
                                GHashKey *key;
-                               PyObject *tmp;
                                const char *msgctxt = NULL, *msgid = NULL;
+                               bool invalid_key = false;
 
-                               if ((PyTuple_CheckExact(pykey) == false) ||
-                                   (PyTuple_GET_SIZE(pykey) != 2) ||
-                                   (PyUnicode_Check(trans) == false))
-                               {
-                                       /* TODO, we should error here */
-                                       continue;
+                               if ((PyTuple_CheckExact(pykey) == false) || 
(PyTuple_GET_SIZE(pykey) != 2)) {
+                                       invalid_key = true;
                                }
+                               else {
+                                       PyObject *tmp = PyTuple_GET_ITEM(pykey, 
0);
+                                       if (tmp == Py_None) {
+                                               msgctxt = 
BLF_I18NCONTEXT_DEFAULT;
+                                       }
+                                       else if (PyUnicode_Check(tmp)) {
+                                               msgctxt = 
_PyUnicode_AsString(tmp);
+                                       }
+                                       else {
+                                               invalid_key = true;
+                                       }
 
-                               tmp = PyTuple_GET_ITEM(pykey, 0);
-                               if (tmp == Py_None) {
-                                       msgctxt = BLF_I18NCONTEXT_DEFAULT;
+                                       tmp = PyTuple_GET_ITEM(pykey, 1);
+                                       if (PyUnicode_Check(tmp)) {
+                                               msgid = 
_PyUnicode_AsString(tmp);
+                                       }
+                                       else {
+                                               invalid_key = true;
+                                       }
                                }
-                               else if (PyUnicode_Check(tmp)) {
-                                       msgctxt = _PyUnicode_AsString(tmp);
-                               }
-                               tmp = PyTuple_GET_ITEM(pykey, 1);
-                               if (PyUnicode_Check(tmp)) {
-                                       msgid = _PyUnicode_AsString(tmp);
-                               }
 
-                               if (!msgid) {
+                               if (invalid_key) {
+                                       printf("WARNING! In translations' dict 
of \"");
+                                       PyObject_Print(uuid, stdout, 
Py_PRINT_RAW);
+                                       printf("\", %s language:\n", locale);
+                                       printf("    Keys must be tuples of 
(msgctxt [string or None], msgid [string]), "
+                                              "this one is not valid, 
skipping: ");
+                                       PyObject_Print(pykey, stdout, 
Py_PRINT_RAW);
+                                       printf("\n");
                                        continue;
                                }
+                               if (PyUnicode_Check(trans) == false) {
+                                       printf("WARNING! In translations' dict 
of \"");
+                                       PyObject_Print(uuid, stdout, 
Py_PRINT_RAW);
+                                       printf("\":\n");
+                                       printf("    Values must be strings, 
this one is not valid, skipping: ");
+                                       PyObject_Print(trans, stdout, 
Py_PRINT_RAW);
+                                       printf("\n");
+                                       continue;
+                               }
 
                                key = _ghashutil_keyalloc(msgctxt, msgid);
 
@@ -287,7 +321,7 @@
        if (PyDict_Contains(self->py_messages, module_name)) {
                PyErr_Format(PyExc_ValueError,
                             "bpy.app.translations.register: translations 
message cache already contains some data for "
-                            "addon '%s'", (const char 
*)PyUnicode_1BYTE_DATA(module_name));
+                            "addon '%s'", (const char 
*)_PyUnicode_AsString(module_name));
                return NULL;
        }
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to