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
+ 欢迎
+
+
-
+
-
+