最近在做对Zenoss的汉化工作,在汉化菜单的时候发现很多菜单的内容都是放在 souce\trunk\zenoss\Products\ZenModel\migrate\menus.py文件中,可是不管怎么改这个文件都不生效,后来终于在zenoss的开发文档中发现了奥秘
Adding a new menu item is fairly straightforward. Because menu items are persistent objects, modifications must
happen in a migrate script (or be included as XML in a ZenPack). The method ZenMenuable.buildMenus()accepts
a dictionary of menus, each of which is a list of dictionaries representing the attributes of menu items. Instructions
on writing migrate scripts can be found elsewhere in this guide
最后经总结汉化菜单的步骤如下:
1 确保menus.py文件中对应的字段的格式是_t('key')
2 确保zenoss.po中有对应的汉化
3 确保menus.py的MenuRelations类的version变量的值是当前zenoss的版本 例如4.2.4
4 确保menus.py在zenoss\Products\ZenModel\migrate\__init__.py中被导入
5 执行 zenmigrate --dont-commit,确保输出了INFO:zen.migrate:Installing MenuRelations (4.2.4)
6 执行zenmigrate
由于menus.py中有很多的菜单都没有采用_t(“key”)的格式,如果一个去添加会很麻烦,下面的脚本可以利用已有的menus.py生成一个新的文件,该文件所有的description都符合_t("key") 的格式,以及生成一个esult.txt,该文件包含了所有未在po文件中存在的空实现
__author__ = 'Eric.sunah' #列出所有没有以_t开头的菜单,并且生成新的文件,新文件中所有的菜单都符合_t('key')格式 def i18NAllMenu(menusFile,newMenusFile): menus = open(menusFile) newmenus=open(newMenusFile,"w") DESC = 'description' no_i18N_key=[] for line in menus: if line.strip().find('\'description') != -1: #'description': 'Set Systems...', new_line = line[len(DESC):] if new_line.find('_t') != -1: newmenus.write(line) else: new_key=new_line.strip()[16:-2] #print(new_key) no_i18N_key.append(new_key) newmenus.write(" 'description': _t('"+new_key+"'),"+"\n") else: newmenus.write(line) print(len(no_i18N_key)) print(no_i18N_key) return no_i18N_key #列出所有没有以_t开头的菜单,并且没有在zenoss.po中定义的key def noI18NKeyInPO(i18Keys,poFile): f=open(poFile, encoding='utf-8') poKeys=[] for line in f: #msgid "Add to Graphs..." #msgstr "添加到图表..." if(line.strip().startswith('msgid')): poKeys.append(line[7:-2]) #print(poKeys) nokeyi18n=[] resultfile=open('D:\soucecode\CorePython\zenoss\esult.txt','w') for no_i18key in i18Keys: if no_i18key not in poKeys: poKeys.append(no_i18key) nokeyi18n.append(no_i18key) #print(no_i18key) resultfile.write("msgid \""+no_i18key+"\""+"\n") resultfile.write("msgstr \"\"") resultfile.write("\n") resultfile.write("\n") print(nokeyi18n) print(len(nokeyi18n)) if __name__ == "__main__": no_i18N_key=i18NAllMenu('D:\soucecode\CorePython\zenoss\menus.py','D:\soucecode\CorePython\zenoss\ewmenus.py') noI18NKeyInPO(no_i18N_key,'D:\soucecode\CorePython\zenoss\zenoss.po');