add chinese support

This commit is contained in:
lizhi-rocky
2010-08-04 13:29:48 +08:00
parent fb7d3283c2
commit 4ad1c428e0
8 changed files with 277 additions and 62 deletions

View File

@@ -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)

View File

@@ -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()

View File

@@ -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):

View File

@@ -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'''

View File

@@ -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"

View File

@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<install>
<serial-number>123456789012</serial-number>
<serial-number>123456789</serial-number>
<partitions unit='sectors'>
<partition device='sda1' start='63' id='83' size='195318207'/>
<partition device='sda2' start='195318270' id='82' size='3903795'/>
@@ -26,7 +26,7 @@
<mount-point device='sdb4' directory='/' file-system='ext3' format='yes'/>
<mount-point device='md0' directory='' file-system='' format='no'/>
</mount-points>
<network domain='' secondary_dns='' ip='' hostname='lizhi' mask='' primary_dns='' configuration='dynamic' gateway=''/>
<network domain='' secondary_dns='' ip='172.16.0.108' hostname='lizhi' mask='' primary_dns='' configuration='static' gateway=''/>
<groups>
<group name='development' install='yes'>
<description>
@@ -85,7 +85,7 @@
<package name='trac' install='no'/>
</optional>
</group>
<group name='office' install='no'>
<group name='office' install='yes'>
<description>
办公类包括 OpenOffice.org 等办公软件。
办公类都是必选软件包,当选择安装该类后,必选包是默认安装的。
@@ -94,18 +94,18 @@
<package name='openoffice'/>
</mandatory>
</group>
<group name='kde' install='no'>
<group name='kde' install='yes'>
<description>
KDE是一种著名的自由图形工作环境,整个系统采用Qt程序库
KDE桌面类都是可选软件包可以自由选择安装。
</description>
<optional selection='all'>
<package name='kde-i18n-zh_CN' install='no'/>
<package name='kde-i18n-zh_CN' install='yes'/>
<package name='kdeaccessibility' install='no'/>
<package name='kdeaddons' install='no'/>
<package name='kdeadmin' install='no'/>
<package name='kdeartwork' install='no'/>
<package name='kdebase' install='no'/>
<package name='kdebase' install='yes'/>
<package name='kdebindings' install='no'/>
<package name='kdeedu' install='no'/>
<package name='kdegames' install='no'/>
@@ -121,7 +121,7 @@
<package name='kdewebdev' install='no'/>
</optional>
</group>
<group name='gui' install='no'>
<group name='gui' install='yes'>
<description>
图形类包括 X11 相关的各种程序。
图形类软件包分为必选包和可选包,当选择安装该类后,必选包是默认安装的,可选包可以自由选择安装。
@@ -185,7 +185,7 @@
<package name='xkeyboard-config'/>
<package name='x11-fonts-chinese'/>
</mandatory>
<optional selection='manual'>
<optional selection='all'>
<package name='arts' install='no'/>
<package name='atk' install='no'/>
<package name='cairo' install='no'/>
@@ -222,23 +222,23 @@
<package name='xosview' install='no'/>
</optional>
</group>
<group name='network_tools' install='no'>
<group name='network_tools' install='yes'>
<description>
网络工具类包括 tcpdump 等网络工具。
网络工具类都是可选软件包,可以自由选择安装。
</description>
<optional selection='manual'>
<optional selection='all'>
<package name='libpcap' install='no'/>
<package name='tcpdump' install='no'/>
<package name='wireshark' install='no'/>
</optional>
</group>
<group name='vm' install='no'>
<group name='vm' install='yes'>
<description>
通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
虚拟机类都是可选软件包,可以自由选择安装
</description>
<optional selection='manual'>
<optional selection='all'>
<package name='qemu-kvm' install='no'/>
<package name='bridge-utils' install='yes'/>
<package name='uml-utilities' install='yes'/>
@@ -335,13 +335,13 @@
<package name='which'/>
<package name='zlib'/>
</mandatory>
<optional selection='manual'>
<package name='adjtimex' install='no'/>
<optional selection='all'>
<package name='adjtimex' install='yes'/>
<package name='at' install='no'/>
<package name='audit' install='no'/>
<package name='bc' install='no'/>
<package name='beecrypt' install='no'/>
<package name='cdrtools' install='no'/>
<package name='cdrtools' install='yes'/>
<package name='cpufrequtils' install='no'/>
<package name='dialog' install='no'/>
<package name='dosfstools' install='no'/>
@@ -378,15 +378,15 @@
<package name='texi2html' install='no'/>
<package name='wget' install='no'/>
<package name='xfsprogs' install='no'/>
<package name='zip' install='no'/>
<package name='zip' install='yes'/>
</optional>
</group>
<group name='network_service' install='no'>
<group name='network_service' install='yes'>
<description>
网络服务类包括各种网络服务包。
网络服务类都是可选软件包,可以自由选择安装。
</description>
<optional selection='manual'>
<optional selection='all'>
<package name='apache' install='no'/>
<package name='apr' install='no'/>
<package name='bind' install='no'/>
@@ -420,7 +420,7 @@
<package name='webfs' install='no'/>
</optional>
</group>
<group name='internet' install='no'>
<group name='internet' install='yes'>
<description>
因特网类包括万维网浏览器 Firefox 等。
因特网类软件包都是必选包,当选择安装该类后,必选包是默认安装的。
@@ -430,17 +430,17 @@
<package name='dbus-glib-1'/>
<package name='firefox'/>
</mandatory>
<optional selection='manual'>
<optional selection='all'>
<package name='amsn' install='no'/>
<package name='thunderbird' install='no'/>
</optional>
</group>
<group name='multi-media' install='no'>
<group name='multi-media' install='yes'>
<description>
多媒体类包括各种媒体库。
多媒体类都是可选软件包,可以自由选择安装。
</description>
<optional selection='manual'>
<optional selection='all'>
<package name='alsa-lib' install='no'/>
<package name='alsa-oss' install='no'/>
<package name='alsa-utils' install='no'/>
@@ -460,9 +460,9 @@
</group>
</groups>
<services>
<service start='disable' package='netkit-rsh' script='inetd' name='rsh' number='S310'/>
<service start='no' package='netkit-rsh' script='inetd' name='rsh' number='S310'/>
<service start='yes' package='openssh' script='sshd' name='ssh' number='S205'/>
<service start='disable' package='proftpd' script='proftpd' name='ftpd' number='S280'/>
<service start='disable' package='netkit-telnetd' script='inetd' name='telnet' number='S310'/>
<service start='no' package='proftpd' script='proftpd' name='ftpd' number='S280'/>
<service start='no' package='netkit-telnetd' script='inetd' name='telnet' number='S310'/>
</services>
</install>

View File

@@ -15,7 +15,7 @@
<ref name='top_window'/>
</zeroOrMore>
<zeroOrMore>
<ref name="message"/>
<ref name="text"/>
</zeroOrMore>
<oneOrMore>
<ref name="sequence"/>
@@ -235,8 +235,8 @@ on special cases -->
</element>
</define>
<define name="message">
<element name="message">
<define name="text">
<element name="text">
<optional>
<attribute name="key"/>
</optional>

View File

@@ -99,7 +99,7 @@ row 4 | |
|____________________________________________________________|
-->
<widget type='Frame' name='serial_no'>
<widget type='Frame' name='serial number'>
<grid_management rows='1' columns='1'>
<configure row='0' weight='1'/>
<configure column='0' weight='1'/>
@@ -161,7 +161,7 @@ row 4 | |
<widget type='Frame'>
<grid_location row='0' column='0' sticky='WS' pady='10'/>
<widget type='Label'>
<widget_attribute text='device:'/>
<widget_attribute text='device'/>
<grid_location row='0' column='0' />
</widget>
<widget type='Listbox'>
@@ -405,7 +405,7 @@ row 4 | |
|________________________________________________________________________|
-->
<widget type='Frame' name='software-group'>
<widget type='Frame' name='software group'>
<grid_management rows='4' columns='1'>
<configure row='1' weight='1'/>
<configure row='3' weight='1'/>
@@ -607,59 +607,229 @@ row 4 | |
</widget>
</top_window>
<message key='#Copyright'>
<text key='#Copyright'>
<English>Copyright 2001-2010 Linx Technology Co., Ltd.</English>
<Chinese>北京凝思科技有限公司 版权所有</Chinese>
</message>
</text>
<message key='#first-step'>
<text key='#first-step'>
<English>You have already been in the first step.</English>
<Chinese>您已到达第一步。</Chinese>
</message>
</text>
<message key='#last-step'>
<text key='#last-step'>
<English>You have already been in the last step.</English>
<Chinese>您已到达最后一步。</Chinese>
</message>
</text>
<message key='#NCM'>
<text key='#NCM'>
<English>Network Configuration Management:</English>
<Chinese>网络配置方式</Chinese>
</message>
</text>
<message key='#os-name'>
<text key='#os-name'>
<English>Rocky 4.2</English>
<Chinese>磐石 4.2</Chinese>
</message>
</text>
<message key='#Welcome'>
<text key='#Welcome'>
<English>Welcome to use
Linx Rocky Secure Operating System v4.2</English>
<Chinese>欢迎使用
凝思磐石安全操作系统 v4.2</Chinese>
</message>
</text>
<message>
<text>
<English>Cancel</English>
<Chinese>取消</Chinese>
</text>
<text>
<English>Copyright</English>
<Chinese>版权</Chinese>
</message>
</text>
<message>
<text>
<English>delete</English>
<Chinese>删除</Chinese>
</text>
<text>
<English>dependency</English>
<Chinese>软件依赖</Chinese>
</text>
<text>
<English>Device</English>
<Chinese>设备</Chinese>
</text>
<text>
<English>Directory</English>
<Chinese>目录</Chinese>
</text>
<text>
<English>Domain name</English>
<Chinese>域名</Chinese>
</text>
<text>
<English>dynamic</English>
<Chinese>动态</Chinese>
</text>
<text>
<English>edit</English>
<Chinese>编辑</Chinese>
</text>
<text>
<English>Filesystem</English>
<Chinese>文件系统</Chinese>
</text>
<text>
<English>Format</English>
<Chinese>格式化</Chinese>
</text>
<text>
<English>Gateway</English>
<Chinese>网关</Chinese>
</text>
<text>
<English>host name</English>
<Chinese>主机名</Chinese>
</message>
</text>
<message>
<text>
<English>install sequence</English>
<Chinese>安装顺序</Chinese>
</message>
</text>
<text>
<English>IP</English>
<Chinese>IP</Chinese>
</text>
<text>
<English>Linx</English>
<Chinese>凝思</Chinese>
</text>
<text>
<English>Mandatory</English>
<Chinese>必选</Chinese>
</text>
<text>
<English>mount</English>
<Chinese>挂载硬盘</Chinese>
</text>
<text>
<English>new</English>
<Chinese>新建</Chinese>
</text>
<text>
<English>Not-Format</English>
<Chinese>不格式化</Chinese>
</text>
<text>
<English>network</English>
<Chinese>网络</Chinese>
</text>
<text>
<English>next</English>
<Chinese>下一步</Chinese>
</text>
<text>
<English>OK</English>
<Chinese>确定</Chinese>
</text>
<text>
<English>Optional</English>
<Chinese>可选</Chinese>
</text>
<text>
<English>previous</English>
<Chinese>上一步</Chinese>
</text>
<text>
<English>Primary DNS</English>
<Chinese>首选DNS</Chinese>
</text>
<text>
<English>quit</English>
<Chinese>退出</Chinese>
</text>
<text>
<English>reset</English>
<Chinese>重置</Chinese>
</text>
<text>
<English>Secondary DNS</English>
<Chinese>备用DNS</Chinese>
</text>
<text>
<English>Select all</English>
<Chinese>全选</Chinese>
</text>
<text>
<English>serial number</English>
<Chinese>序列号</Chinese>
</text>
<text>
<English>service</English>
<Chinese>服务</Chinese>
</text>
<text>
<English>Size</English>
<Chinese>大小</Chinese>
</text>
<text>
<English>software group</English>
<Chinese>软件组</Chinese>
</text>
<text>
<English>Subnet mask</English>
<Chinese>子网掩码</Chinese>
</text>
<text>
<English>static</English>
<Chinese>静态</Chinese>
</text>
<text>
<English>welcome</English>
<Chinese>欢迎</Chinese>
</text>
<sequence name='main'>
<widget name='welcome'/>
<widget name='serial_no'/>
<widget name='serial number'/>
<widget name='mount'/>
<widget name='network'/>
<widget name='software-group'/>
<widget name='software group'/>
<widget name='dependency'/>
<widget name='service'/>
</sequence>