From 4ad1c428e072dd20cb0b47e565fe4b48a92068f9 Mon Sep 17 00:00:00 2001 From: lizhi-rocky Date: Wed, 4 Aug 2010 13:29:48 +0800 Subject: [PATCH] add chinese support --- python/ri_dep.py | 5 +- python/ri_tk.py | 37 ++++++-- python/ri_tk_cmd.py | 2 +- python/ri_widget.py | 17 ++++ python/test.py | 6 +- xml/install.xml | 50 +++++----- xml/interface_ng.xml | 6 +- xml/interface_t.xml | 216 ++++++++++++++++++++++++++++++++++++++----- 8 files changed, 277 insertions(+), 62 deletions(-) diff --git a/python/ri_dep.py b/python/ri_dep.py index b657cda..828f9c0 100644 --- a/python/ri_dep.py +++ b/python/ri_dep.py @@ -66,7 +66,10 @@ def get_extra_depending(): for g in ri_data.Group.dict.values(): if g.install != 'no': l.extend([ p for p in g.mandatory ]) - l.extend([ p[0] for p in g.optional if p[1] == 'yes' ]) + if g.selection == 'manual': + l.extend([ p[0] for p in g.optional if p[1] == 'yes' ]) + else: + l.extend([ p[0] for p in g.optional ]) set1 = set(l) set2 = set(set1) diff --git a/python/ri_tk.py b/python/ri_tk.py index d0d2f30..ae39110 100644 --- a/python/ri_tk.py +++ b/python/ri_tk.py @@ -8,6 +8,8 @@ import ri_cmd import ri_widget var_dict={} +# language should be all lower case letters +language='english' def init(base_w): ''' base_w - base widget instance ''' @@ -17,7 +19,9 @@ def init(base_w): # grid management for root_window root_window.columnconfigure(0, weight=1) root_window.rowconfigure(0, weight=1) + root_window.geometry("%sx%s+0+0" %(root_window.winfo_screenwidth(),root_window.winfo_screenheight())) + root_window.title(translate_text('Linx')) # bind WM_DELETE_WINDOW root_window.protocol("WM_DELETE_WINDOW", root_window.quit) @@ -28,6 +32,12 @@ def quit(): ''' exit root window ''' root_window.quit() +def set_step_info(s): + ''' set some information in base widget ''' + # set step name which will be shown on base widget column 1 row 0 + title = translate_text(s) + var_dict['main.step_name'].set(title) + def create_widget(w): ''' w - widget instance ''' @@ -35,8 +45,7 @@ def create_widget(w): # set step name if 'name' in dir(w): - # set step name which will be shown on base widget column 1 row 0 - var_dict['main.step_name'].set(w.name) + set_step_info(w.name) import os.path @@ -44,6 +53,14 @@ class MyImage: ''' MyImage - a dummy class to hold Image variable ''' count = 0 +def translate_text(txt): + ''' multi-language support, translate t if needed ''' + key = txt.lower() + if key in ri_widget.Text.dict.keys() and (txt[0] == '#' or language != 'english'): + return getattr(ri_widget.Text.dict[key], language) + else: + return txt + def modify_attributes(attr_dict): ''' modify values in attr_dict to suit Tk usage ''' for a in attr_dict.keys(): @@ -59,7 +76,9 @@ def modify_attributes(attr_dict): attr_dict[a] = getattr(sys.modules["ri_cmd"], attr_dict[a]) elif a == "textvariable" or a == "listvariable" or a == 'variable': attr_dict[a] = var_dict[attr_dict[a]] - + elif a == "text": + attr_dict[a] = translate_text(attr_dict[a]) + def create_widget_sub(w, p_win): ''' w - widget instance @@ -143,7 +162,7 @@ def create_message_box(w): ''' display MessageBox w - MessageBox instance''' disp = getattr(tkMessageBox, "show%s" %(w.tp)) - disp(w.title, w.message) + disp(translate_text(w.title), translate_text(w.message)) def create_top_window(w): ''' display TopWindow @@ -243,7 +262,9 @@ class SoftwarePackageWindow(): win.columnconfigure(0, weight=1) win.rowconfigure(1, weight=1) win.rowconfigure(4, weight=1) - Tkinter.Label(win, text='Mandatory').grid(column=0, row=0) + + text_mdt = translate_text('Mandatory') + Tkinter.Label(win, text=text_mdt).grid(column=0, row=0) cnv1 = Tkinter.Canvas(win) hs1 = Tkinter.Scrollbar(win, orient='horizontal') hs1.configure(command=cnv1.xview) @@ -265,9 +286,11 @@ class SoftwarePackageWindow(): for i in range(len(self.group.mandatory)): Tkinter.Label(fr1, text=self.group.mandatory[i]).grid(column=i%5, row=i/5, sticky='NWES') - Tkinter.Label(win, text='Optional').grid(column=0, row=3) + text_opt = translate_text('Optional') + Tkinter.Label(win, text=text_opt).grid(column=0, row=3) self.selection = Tkinter.StringVar(value=self.group.selection) - chk_sa = Tkinter.Checkbutton(win, text='Select all', command=self.select_all, variable=self.selection, onvalue='all', offvalue='manual') + text_sal = translate_text('Select all') + chk_sa = Tkinter.Checkbutton(win, text=text_sal, command=self.select_all, variable=self.selection, onvalue='all', offvalue='manual') chk_sa.grid(column=1, row=3) if self.group.selection == 'all': chk_sa.select() diff --git a/python/ri_tk_cmd.py b/python/ri_tk_cmd.py index 709f371..95f47cb 100644 --- a/python/ri_tk_cmd.py +++ b/python/ri_tk_cmd.py @@ -197,7 +197,7 @@ def dependency_list_init(): ri_dep.resolve_recursive_depending() ri_dep.construct_depended() dep_dict = ri_dep.get_extra_depending() - l = [ k.ljust(15) + ': ' + ' '.join(dep_dict[k]) for k in dep_dict.keys()] + l = [ k.ljust(20) + ': ' + ' '.join(dep_dict[k]) for k in dep_dict.keys()] display.var_dict['dependency.list'].set(value=tuple(l)) def service_construct(w): diff --git a/python/ri_widget.py b/python/ri_widget.py index 0e8604d..c3988f1 100644 --- a/python/ri_widget.py +++ b/python/ri_widget.py @@ -169,6 +169,22 @@ class Sequence: Sequence.current_sequence.current_step += 1 return Sequence.current_sequence.steps[Sequence.current_sequence.current_step] +class Text: + ''' implement text in interface.xml ''' + dict={} + + def __init__(self, xml_node): + for n in xml_node.childNodes: + if n.nodeType == n.ELEMENT_NODE: + if n.nodeName == 'English': self.english = n.firstChild.data + elif n.nodeName == 'Chinese': self.chinese = n.firstChild.data + + if 'key' in xml_node.attributes.keys(): + self.key = xml_node.attributes['key'].value + else: + self.key = self.english + Text.dict[self.key.lower()] = self + def construct(xml_root): ''' construct Widget's static members''' for n in xml_root.childNodes: @@ -177,6 +193,7 @@ def construct(xml_root): elif n.nodeName == "message_box": MessageBox(n) elif n.nodeName == "top_window": TopWindow(n) elif n.nodeName == "sequence": Sequence(n) + elif n.nodeName == "text": Text(n) def init_display(bw): ''' base widget name''' diff --git a/python/test.py b/python/test.py index d7e4d5a..5e2c6f5 100644 --- a/python/test.py +++ b/python/test.py @@ -10,10 +10,10 @@ from xml.dom import minidom import os.path def print_usages(): - print 'Usages: %s [-b|--begin step_name] [interface_xml_file] [install_xml_file]' %sys.argv[0] + print 'Usages: %s [-b|--begin step_name] [-l|--language language] [interface_xml_file] [install_xml_file]' %sys.argv[0] try: - opts, args = getopt.getopt(sys.argv[1:], "b:", ["begin=",]) + opts, args = getopt.getopt(sys.argv[1:], "b:l:", ["begin=","language="]) except getopt.GetoptError: print_usages() sys.exit(1) @@ -22,6 +22,8 @@ begin_step=None for opt, arg in opts: if opt in ('-b', '--begin'): begin_step = arg + elif opt in ('-l', '--language'): + ri_tk.language = arg.lower() if len(args) == 0: itf_xml = "../xml/interface_t.xml" diff --git a/xml/install.xml b/xml/install.xml index 6d3f0b3..91ce72b 100644 --- a/xml/install.xml +++ b/xml/install.xml @@ -1,6 +1,6 @@ - 123456789012 + 123456789 @@ -26,7 +26,7 @@ - + @@ -85,7 +85,7 @@ - + 办公类包括 OpenOffice.org 等办公软件。 办公类都是必选软件包,当选择安装该类后,必选包是默认安装的。 @@ -94,18 +94,18 @@ - + KDE是一种著名的自由图形工作环境,整个系统采用Qt程序库 KDE桌面类都是可选软件包,可以自由选择安装。 - + - + @@ -121,7 +121,7 @@ - + 图形类包括 X11 相关的各种程序。 图形类软件包分为必选包和可选包,当选择安装该类后,必选包是默认安装的,可选包可以自由选择安装。 @@ -185,7 +185,7 @@ - + @@ -222,23 +222,23 @@ - + 网络工具类包括 tcpdump 等网络工具。 网络工具类都是可选软件包,可以自由选择安装。 - + - + 通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统 虚拟机类都是可选软件包,可以自由选择安装 - + @@ -335,13 +335,13 @@ - - + + - + @@ -378,15 +378,15 @@ - + - + 网络服务类包括各种网络服务包。 网络服务类都是可选软件包,可以自由选择安装。 - + @@ -420,7 +420,7 @@ - + 因特网类包括万维网浏览器 Firefox 等。 因特网类软件包都是必选包,当选择安装该类后,必选包是默认安装的。 @@ -430,17 +430,17 @@ - + - + 多媒体类包括各种媒体库。 多媒体类都是可选软件包,可以自由选择安装。 - + @@ -460,9 +460,9 @@ - + - - + + diff --git a/xml/interface_ng.xml b/xml/interface_ng.xml index 1158a15..92d27f4 100644 --- a/xml/interface_ng.xml +++ b/xml/interface_ng.xml @@ -15,7 +15,7 @@ - + @@ -235,8 +235,8 @@ on special cases --> - - + + diff --git a/xml/interface_t.xml b/xml/interface_t.xml index c0b0337..d6719c5 100644 --- a/xml/interface_t.xml +++ b/xml/interface_t.xml @@ -99,7 +99,7 @@ row 4 | | |____________________________________________________________| --> - + @@ -161,7 +161,7 @@ row 4 | | - + @@ -405,7 +405,7 @@ row 4 | | |________________________________________________________________________| --> - + @@ -607,59 +607,229 @@ row 4 | | - + Copyright 2001-2010 Linx Technology Co., Ltd. 北京凝思科技有限公司 版权所有 - + - + You have already been in the first step. 您已到达第一步。 - + - + You have already been in the last step. 您已到达最后一步。 - + - + Network Configuration Management: 网络配置方式 - + - + Rocky 4.2 磐石 4.2 - + - + Welcome to use Linx Rocky Secure Operating System v4.2 欢迎使用 凝思磐石安全操作系统 v4.2 - + - + + Cancel + 取消 + + + Copyright 版权 - + - + + delete + 删除 + + + + dependency + 软件依赖 + + + + Device + 设备 + + + + Directory + 目录 + + + + Domain name + 域名 + + + + dynamic + 动态 + + + + edit + 编辑 + + + + Filesystem + 文件系统 + + + + Format + 格式化 + + + + Gateway + 网关 + + + host name 主机名 - + - + install sequence 安装顺序 - + + + IP + IP + + + + Linx + 凝思 + + + + Mandatory + 必选 + + + + mount + 挂载硬盘 + + + + new + 新建 + + + + Not-Format + 不格式化 + + + + network + 网络 + + + + next + 下一步 + + + + OK + 确定 + + + + Optional + 可选 + + + + previous + 上一步 + + + + Primary DNS + 首选DNS + + + + quit + 退出 + + + + reset + 重置 + + + + Secondary DNS + 备用DNS + + + + Select all + 全选 + + + + serial number + 序列号 + + + + service + 服务 + + + + Size + 大小 + + + + software group + 软件组 + + + + Subnet mask + 子网掩码 + + + + static + 静态 + + + + welcome + 欢迎 + + - + - +