updates to rna message extractor, write utf8 files and use a set rather than a dict
[blender.git] / po / update_msg.py
1 # $Id$
2 # ***** BEGIN GPL LICENSE BLOCK *****
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software Foundation,
16 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 #
18 # ***** END GPL LICENSE BLOCK *****
19
20 # <pep8 compliant>
21
22 # Write out messages.txt from blender
23
24 # Execite:
25 #   blender --background --python po/update_msg.py
26
27 import os
28
29 CURRENT_DIR = os.path.dirname(__file__)
30 SOURCE_DIR = os.path.normpath(os.path.abspath(os.path.join(CURRENT_DIR, "..")))
31
32 FILE_NAME_MESSAGES = os.path.join(CURRENT_DIR, "messages.txt")
33
34
35 def dump_messages_rna(messages):
36     import bpy
37     # -------------------------------------------------------------------------
38     # Function definitions
39
40     def walkProperties(properties):
41         import bpy
42         for prop in properties:
43             messages.add(prop.name)
44             messages.add(prop.description)
45
46             if isinstance(prop, bpy.types.EnumProperty):
47                 for item in prop.enum_items:
48                     messages.add(item.name)
49                     messages.add(item.description)
50
51     def walkRNA(bl_rna):
52         if bl_rna.name and bl_rna.name != bl_rna.identifier:
53             messages.add(bl_rna.name)
54
55         if bl_rna.description:
56             messages.add(bl_rna.description)
57
58         walkProperties(bl_rna.properties)
59
60     def walkClass(cls):
61         walkRNA(cls.bl_rna)
62
63     def walk_keymap_hierarchy(hier):
64         for lvl in hier:
65             messages.add(lvl[0])
66
67             if lvl[3]:
68                 walk_keymap_hierarchy(lvl[3])
69
70     # -------------------------------------------------------------------------
71     # Dump Messages
72
73     for cls in type(bpy.context).__base__.__subclasses__():
74         walkClass(cls)
75
76     for cls in bpy.types.Space.__subclasses__():
77         walkClass(cls)
78
79     for cls in bpy.types.Operator.__subclasses__():
80         walkClass(cls)
81
82     from bl_ui.space_userpref_keymap import KM_HIERARCHY
83
84     walk_keymap_hierarchy(KM_HIERARCHY)
85     
86
87     ## XXX. what is this supposed to do, we wrote the file already???
88     #_walkClass(bpy.types.SpaceDopeSheetEditor)
89
90
91 def dump_messages():
92     messages = {""}
93
94     dump_messages_rna(messages)
95
96     messages.remove("")
97
98     message_file = open(FILE_NAME_MESSAGES, 'w', encoding="utf8")
99     message_file.writelines("\n".join(sorted(messages)))
100     message_file.close()
101
102     print("Written %d messages to: %r" % (len(messages), FILE_NAME_MESSAGES))
103
104 def main():
105
106     try:
107         import bpy
108     except ImportError:
109         print("This script must run from inside blender")
110         return
111
112     dump_messages()
113
114
115 if __name__ == "__main__":
116     print("\n\n *** Running %r *** \n" % __file__)
117     main()