Locales now available! langs: russian, english

This commit is contained in:
anwinged 2012-05-12 10:05:11 +00:00
parent 24a669217f
commit 047d24fb9c
3 changed files with 156 additions and 79 deletions

167
forms.py
View File

@ -6,8 +6,13 @@ import wx.grid
import wx.propgrid as wxpg import wx.propgrid as wxpg
import wx.lib.plot as wxplot import wx.lib.plot as wxplot
import wx.lib.agw.aui as aui import wx.lib.agw.aui as aui
import gettext
import json
import os
# import wx.aui as aui # import wx.aui as aui
_ = gettext.gettext
ID_NEW = wx.NewId() ID_NEW = wx.NewId()
ID_SAVE = wx.NewId() ID_SAVE = wx.NewId()
ID_OPEN = wx.NewId() ID_OPEN = wx.NewId()
@ -29,6 +34,9 @@ ID_ADD_PLOT = wx.NewId()
ID_ADD_CURVES = wx.NewId() ID_ADD_CURVES = wx.NewId()
ID_ADD_MARKERS = wx.NewId() ID_ADD_MARKERS = wx.NewId()
ID_ENGLISH_LANG = wx.NewId()
ID_RUSSIAN_LANG = wx.NewId()
ID_ABOUT = wx.NewId() ID_ABOUT = wx.NewId()
ID_EXPORT_CSV = wx.NewId() ID_EXPORT_CSV = wx.NewId()
@ -75,6 +83,20 @@ class MainFrame(wx.Frame):
def __init__(self, parent): def __init__(self, parent):
wx.Frame.__init__ (self, parent, title = 'Opal', size = wx.Size(873,594)) wx.Frame.__init__ (self, parent, title = 'Opal', size = wx.Size(873,594))
self.settings = {}
self.LoadSettings()
lang = self.settings['locale']
if not lang:
locale = wx.Locale(wx.LANGUAGE_DEFAULT)
lang = locale.GetCanonicalName()
self.settings['locale'] = lang
Lang = gettext.translation('opal', './locale', languages=[lang], fallback=True)
Lang.install(unicode=True)
global _
_ = Lang.ugettext
self.gettext = Lang.ugettext
self.auimgr = aui.AuiManager() self.auimgr = aui.AuiManager()
self.auimgr.SetManagedWindow(self) self.auimgr.SetManagedWindow(self)
self.auimgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_SASH_SIZE, 3) self.auimgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_SASH_SIZE, 3)
@ -89,7 +111,7 @@ class MainFrame(wx.Frame):
# self.m_specs.SetMinSize(wx.Size(200,-1)) # self.m_specs.SetMinSize(wx.Size(200,-1))
self.auimgr.AddPane(self.m_specs, self.auimgr.AddPane(self.m_specs,
aui.AuiPaneInfo().Name("m_specs").Caption("Templates"). aui.AuiPaneInfo().Name("m_specs").Caption(_("Templates")).
Left().Layer(1).CloseButton(False)) Left().Layer(1).CloseButton(False))
# Пользовательские модели # Пользовательские модели
@ -97,15 +119,15 @@ class MainFrame(wx.Frame):
self.m_user_models = TreeListCtrl(self, size = (200, -1), self.m_user_models = TreeListCtrl(self, size = (200, -1),
style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT
| wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_ROW_LINES | wx.TR_MULTIPLE) | wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_ROW_LINES | wx.TR_MULTIPLE)
self.m_user_models.AddColumn("Model name") self.m_user_models.AddColumn(_("Model name"))
self.m_user_models.AddColumn("Status") self.m_user_models.AddColumn(_("Status"))
self.m_user_models.AddColumn("Progress") self.m_user_models.AddColumn(_("Progress"))
self.m_user_models.AddColumn("Comment") self.m_user_models.AddColumn(_("Comment"))
self.m_user_models.SetMainColumn(0) self.m_user_models.SetMainColumn(0)
self.m_user_models.SetImageList(self.ilist) self.m_user_models.SetImageList(self.ilist)
self.auimgr.AddPane(self.m_user_models, self.auimgr.AddPane(self.m_user_models,
aui.AuiPaneInfo().Name("m_user_models").Caption("Models"). aui.AuiPaneInfo().Name("m_user_models").Caption(_("Models")).
CenterPane().Position(1)) CenterPane().Position(1))
# Параметры модели # Параметры модели
@ -113,7 +135,7 @@ class MainFrame(wx.Frame):
self.m_params = PropertyCtrl(self, size = (-1, 300)) self.m_params = PropertyCtrl(self, size = (-1, 300))
self.auimgr.AddPane(self.m_params, self.auimgr.AddPane(self.m_params,
aui.AuiPaneInfo().Name("m_params").Caption("Parameters").CloseButton(False). aui.AuiPaneInfo().Name("m_params").Caption(_("Parameters")).CloseButton(False).
CenterPane().Bottom().Position(2)) CenterPane().Bottom().Position(2))
# Быстрые результаты # Быстрые результаты
@ -121,7 +143,7 @@ class MainFrame(wx.Frame):
self.m_quick_result = PropertyCtrl(self, size = (200, -1)) self.m_quick_result = PropertyCtrl(self, size = (200, -1))
self.auimgr.AddPane(self.m_quick_result, self.auimgr.AddPane(self.m_quick_result,
aui.AuiPaneInfo().Name("m_quick_result").Caption("Quick results").CloseButton(False). aui.AuiPaneInfo().Name("m_quick_result").Caption(_("Quick results")).CloseButton(False).
Right().Position(1).Layer(1)) Right().Position(1).Layer(1))
# Графики # Графики
@ -131,7 +153,7 @@ class MainFrame(wx.Frame):
self.m_plots.SetImageList(self.ilist) self.m_plots.SetImageList(self.ilist)
self.auimgr.AddPane(self.m_plots, self.auimgr.AddPane(self.m_plots,
aui.AuiPaneInfo().Name("m_plots").Caption("Plots").CloseButton(False). aui.AuiPaneInfo().Name("m_plots").Caption(_("Plots")).CloseButton(False).
Right().Position(2).Layer(1)) Right().Position(2).Layer(1))
# Меню, панель инструментов и панель статуса # Меню, панель инструментов и панель статуса
@ -145,6 +167,11 @@ class MainFrame(wx.Frame):
self.BuildToolBar() self.BuildToolBar()
layout = self.settings['layout']
if layout:
self.auimgr.LoadPerspective(layout, False)
print 'layout loaded'
self.auimgr.Update() self.auimgr.Update()
def LoadIcons(self): def LoadIcons(self):
@ -168,62 +195,74 @@ class MainFrame(wx.Frame):
menubar = wx.MenuBar() menubar = wx.MenuBar()
menu = wx.Menu() menu = wx.Menu()
menu.Append(ID_NEW, "&New\tCtrl+N") menu.Append(ID_NEW, _("&New\tCtrl+N"))
menu.Append(ID_OPEN, "&Open\tCtrl+O") menu.Append(ID_OPEN, _("&Open\tCtrl+O"))
menu.Append(ID_SAVE, "&Save\tCtrl+S") menu.Append(ID_SAVE, _("&Save\tCtrl+S"))
menubar.Append(menu, '&Project') menubar.Append(menu, _('&Project'))
menu = wx.Menu() menu = wx.Menu()
menu.Append(ID_ADD_MODEL_ROOT, 'Add model to root') menu.Append(ID_ADD_MODEL_ROOT, _('Add model to root'))
menu.Append(ID_ADD_MODEL_SELECTED, 'Append model to selected') menu.Append(ID_ADD_MODEL_SELECTED, _('Append model to selected'))
menu.AppendSeparator() menu.AppendSeparator()
menu.Append(ID_DUPLICATE_MODEL, "&Duplicate\tCtrl+D") menu.Append(ID_DUPLICATE_MODEL, _("&Duplicate\tCtrl+D"))
menu.Append(ID_DUPLICATE_TREE, "&Duplicate with subitems\tCtrl+Shift+D") menu.Append(ID_DUPLICATE_TREE, _("&Duplicate with subitems\tCtrl+Shift+D"))
menu.Append(ID_DELETE_MODEL, 'Delete\tCtrl+E') menu.Append(ID_DELETE_MODEL, _('Delete\tCtrl+E'))
menu.AppendSeparator() menu.AppendSeparator()
menu.Append(ID_TEST, "&Test\tCtrl+T") menu.Append(ID_TEST, _("&Test\tCtrl+T"))
menubar.Append(menu, '&Model') menubar.Append(menu, _('&Model'))
menu = wx.Menu() menu = wx.Menu()
menu.Append(ID_PROCESS_MODEL, 'Process\tF5') menu.Append(ID_PROCESS_MODEL, _('Process\tF5'))
menu.Append(ID_STOP_MODEL, 'Stop\tF6') menu.Append(ID_STOP_MODEL, _('Stop\tF6'))
#menu.AppendSeparator() #menu.AppendSeparator()
menubar.Append(menu, '&Run') menubar.Append(menu, _('&Run'))
menu = wx.Menu() menu = wx.Menu()
menu.Append(ID_SHOW_RESULT, 'Show report\tF7') menu.Append(ID_SHOW_RESULT, _('Show report\tF7'))
menu.AppendSeparator() menu.AppendSeparator()
menu.Append(ID_SHOW_PLOT, 'Show plot\tF8') menu.Append(ID_SHOW_PLOT, _('Show plot\tF8'))
menu.Append(ID_ADD_PLOT, 'Add plot') menu.Append(ID_ADD_PLOT, _('Add plot'))
#menu.Append(ID_ADD_LINE, 'Add line') #menu.Append(ID_ADD_LINE, _('Add line'))
menubar.Append(menu, '&Result') menubar.Append(menu, _('&Result'))
menu = wx.Menu() menu = wx.Menu()
menu.Append(ID_ABOUT, "&About\tF1") submenu = wx.Menu()
menubar.Append(menu, '&Help') submenu.Append(ID_ENGLISH_LANG, _('English'))
submenu.Append(ID_RUSSIAN_LANG, _('Russian'))
menu.AppendSubMenu(submenu, _('Language'))
menu.AppendSeparator()
# menu.Append(ID_SHOW_PLOT, _('Layout'))
# menu.Append(ID_ADD_PLOT, _('Options'))
#menu.Append(ID_ADD_LINE, _('Add line'))
menubar.Append(menu, _('&Settings'))
menu = wx.Menu()
menu.Append(ID_ABOUT, _("&About\tF1"))
menubar.Append(menu, _('&Help'))
return menubar return menubar
def BuildContextMenu(self): def BuildContextMenu(self):
menu = wx.Menu() menu = wx.Menu()
menu.Append(ID_ADD_MODEL_ROOT, 'Add model to root') menu.Append(ID_ADD_MODEL_ROOT, _('Add model to root'))
menu.Append(ID_ADD_MODEL_SELECTED, 'Add model to selected') menu.Append(ID_ADD_MODEL_SELECTED, _('Add model to selected'))
self.m_specs.Bind(wx.EVT_CONTEXT_MENU, self.m_specs.Bind(wx.EVT_CONTEXT_MENU,
lambda x: self.m_specs.PopupMenu(menu)) lambda x: self.m_specs.PopupMenu(menu))
menu1 = wx.Menu() menu1 = wx.Menu()
menu1.Append(ID_ADD_PLOT, 'Add plot') menu1.Append(ID_ADD_PLOT, _('Add plot'))
menu1.AppendSeparator() menu1.AppendSeparator()
menu1.Append(ID_ADD_CURVES, 'Add curves') menu1.Append(ID_ADD_CURVES, _('Add curves'))
menu1.Append(ID_ADD_MARKERS, 'Add markers') menu1.Append(ID_ADD_MARKERS, _('Add markers'))
self.m_plots.Bind(wx.EVT_CONTEXT_MENU, self.m_plots.Bind(wx.EVT_CONTEXT_MENU,
lambda x: self.m_plots.PopupMenu(menu1)) lambda x: self.m_plots.PopupMenu(menu1))
menu2 = wx.Menu() menu2 = wx.Menu()
menu2.Append(ID_SHOW_RESULT, 'Show report') menu2.Append(ID_SHOW_RESULT, _('Show report'))
menu2.AppendSeparator() menu2.AppendSeparator()
menu2.Append(ID_ADD_CURVES, 'Add curves') menu2.Append(ID_ADD_CURVES, _('Add curves'))
menu2.Append(ID_ADD_MARKERS, 'Add markers') menu2.Append(ID_ADD_MARKERS, _('Add markers'))
self.m_user_models.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.m_user_models.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK,
lambda x: self.m_user_models.PopupMenu(menu2)) lambda x: self.m_user_models.PopupMenu(menu2))
@ -233,34 +272,52 @@ class MainFrame(wx.Frame):
tb1.SetToolBitmapSize(wx.Size(16, 16)) tb1.SetToolBitmapSize(wx.Size(16, 16))
tb1.AddSimpleTool(ID_ADD_MODEL_SELECTED, "model-new", wx.Bitmap('share/model-add.png'), tb1.AddSimpleTool(ID_ADD_MODEL_SELECTED, "model-new", wx.Bitmap('share/model-add.png'),
'Add specification to selected model') _('Add specification to selected model'))
tb1.AddSimpleTool(ID_DUPLICATE_MODEL, "model-dup", wx.Bitmap('share/model-dup.png'), tb1.AddSimpleTool(ID_DUPLICATE_MODEL, "model-dup", wx.Bitmap('share/model-dup.png'),
'Duplicate selected model') _('Duplicate selected model'))
tb1.AddSimpleTool(ID_DUPLICATE_TREE, "model-dup-tree", wx.Bitmap('share/model-dup-tree.png'), tb1.AddSimpleTool(ID_DUPLICATE_TREE, "model-dup-tree", wx.Bitmap('share/model-dup-tree.png'),
'Duplicate selected model and all submodels') _('Duplicate selected model and all submodels'))
tb1.AddSimpleTool(ID_DELETE_MODEL, "model-del", wx.Bitmap('share/model-delete.png'), tb1.AddSimpleTool(ID_DELETE_MODEL, "model-del", wx.Bitmap('share/model-delete.png'),
'Delete selected model') _('Delete selected model'))
tb1.AddSeparator() tb1.AddSeparator()
tb1.AddSimpleTool(ID_PROCESS_MODEL, "model-go", wx.Bitmap('share/model-go.png'), tb1.AddSimpleTool(ID_PROCESS_MODEL, "model-go", wx.Bitmap('share/model-go.png'),
'Start processing of selected models') _('Start processing of selected models'))
tb1.AddSimpleTool(ID_STOP_MODEL, "model-stop", wx.Bitmap('share/model-cancel.png'), tb1.AddSimpleTool(ID_STOP_MODEL, "model-stop", wx.Bitmap('share/model-cancel.png'),
'Stop processing of selected models') _('Stop processing of selected models'))
tb1.AddSeparator() tb1.AddSeparator()
tb1.AddSimpleTool(ID_SHOW_PLOT, "plot-quick", wx.Bitmap('share/plot-line.png'), tb1.AddSimpleTool(ID_SHOW_PLOT, "plot-quick", wx.Bitmap('share/plot-line.png'),
'Show quick plot for selected model') _('Show quick plot for selected model'))
tb1.AddSimpleTool(ID_SHOW_RESULT, "report-show", wx.Bitmap('share/report-show.png'), tb1.AddSimpleTool(ID_SHOW_RESULT, "report-show", wx.Bitmap('share/report-show.png'),
'Show result data and table for selected model') _('Show result data and table for selected model'))
tb1.AddSeparator() tb1.AddSeparator()
tb1.AddSimpleTool(ID_ABOUT, "app-about", wx.Bitmap('share/app-about.png'), tb1.AddSimpleTool(ID_ABOUT, "app-about", wx.Bitmap('share/app-about.png'),
'Show infomation about application') _('Show infomation about application'))
tb1.Realize() tb1.Realize()
self.auimgr.AddPane(tb1, aui.AuiPaneInfo().Name("tb1").Caption("Toolbar"). self.auimgr.AddPane(tb1, aui.AuiPaneInfo().Name("tb1").Caption(_("Toolbar")).
ToolbarPane().Left().Floatable(False).Movable(False).Gripper(False)) ToolbarPane().Left().Floatable(False).Movable(False).Gripper(False))
def SaveSettings(self):
self.settings['layout'] = self.auimgr.SavePerspective()
with open('settings.conf', 'w') as f:
json.dump(self.settings, f, indent = 2)
def LoadSettings(self):
default = {
'workers': 2,
'conf': 'tasks.conf',
'locale': None,
'layout': None,
}
self.settings = default
if os.path.exists('settings.conf'):
with open('settings.conf', 'r') as f:
self.settings.update(json.load(f))
class SelectModelDialog(wx.Dialog): class SelectModelDialog(wx.Dialog):
def __init__(self, parent): def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1, 'Select model') wx.Dialog.__init__(self, parent, -1, _('Select model'))
sizer = wx.BoxSizer(wx.VERTICAL) sizer = wx.BoxSizer(wx.VERTICAL)
self.mlist = wx.ListCtrl(self, style = wx.LC_ICON | wx.LC_SINGLE_SEL) self.mlist = wx.ListCtrl(self, style = wx.LC_ICON | wx.LC_SINGLE_SEL)
@ -301,9 +358,9 @@ class ResultFrame(wx.Frame):
menubar = wx.MenuBar() menubar = wx.MenuBar()
menu = wx.Menu() menu = wx.Menu()
menu.Append(ID_EXPORT_CSV, 'CSV\tCtrl+E') menu.Append(ID_EXPORT_CSV, _('CSV\tCtrl+E'))
#menu.Append(wx.NewId(), 'TeX') #menu.Append(wx.NewId(), 'TeX')
menubar.Append(menu, 'Export to') menubar.Append(menu, _('Export to'))
return menubar return menubar
@ -331,7 +388,7 @@ class LineSelectDialog(wx.Dialog):
class SizeSelector(wx.Dialog): class SizeSelector(wx.Dialog):
def __init__(self, parent): def __init__(self, parent):
wx.Dialog.__init__(self, parent, -1, 'Image size', size = (200, 100)) wx.Dialog.__init__(self, parent, -1, _('Image size'), size = (200, 100))
bSizer = wx.BoxSizer(wx.HORIZONTAL) bSizer = wx.BoxSizer(wx.HORIZONTAL)
@ -387,8 +444,8 @@ class PlotFrame(wx.Frame):
menubar = wx.MenuBar() menubar = wx.MenuBar()
menu = wx.Menu() menu = wx.Menu()
menu.Append(ID_SAVE_PLOT, 'Save to file\tCtrl+S') menu.Append(ID_SAVE_PLOT, _('Save to file\tCtrl+S'))
menubar.Append(menu, 'Plot') menubar.Append(menu, _('Plot'))
self.SetMenuBar(menubar) self.SetMenuBar(menubar)
self.plot.canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnZoom) self.plot.canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnZoom)
@ -419,7 +476,7 @@ class PlotFrame(wx.Frame):
class AboutDialog(wx.Dialog): class AboutDialog(wx.Dialog):
def __init__(self, parent): def __init__(self, parent):
wx.Dialog.__init__(self, parent, title = 'About Opal', size = (300, 330)) wx.Dialog.__init__(self, parent, title = _('About Opal'), size = (300, 330))
title = 'Opal System' title = 'Opal System'
version = 'Aurora version' version = 'Aurora version'

Binary file not shown.

68
opal.py
View File

@ -27,6 +27,9 @@ import json
import zlib import zlib
from pprint import pprint from pprint import pprint
import gettext
_ = gettext.gettext
# состояния модели, унаследованные от состояния задачи # состояния модели, унаследованные от состояния задачи
MODEL_READY = server.JOB_READY MODEL_READY = server.JOB_READY
MODEL_RUNNING = server.JOB_RUNNING MODEL_RUNNING = server.JOB_RUNNING
@ -133,10 +136,15 @@ class MainFrame(forms.MainFrame):
def __init__(self): def __init__(self):
forms.MainFrame.__init__(self, None) forms.MainFrame.__init__(self, None)
global _
_ = self.gettext
self.model = None self.model = None
self.name_id = 1 self.name_id = 1
s = server.LocalServer() conf = self.settings['conf']
workers = int(self.settings['workers'])
s = server.LocalServer(conf=conf, workers=workers)
s.LoadModels() s.LoadModels()
self.models = s.GetModels() self.models = s.GetModels()
s.Start() s.Start()
@ -200,6 +208,11 @@ class MainFrame(forms.MainFrame):
self.Bind(wx.EVT_MENU, self.OnAddMarkers, self.Bind(wx.EVT_MENU, self.OnAddMarkers,
id = forms.ID_ADD_MARKERS) id = forms.ID_ADD_MARKERS)
self.Bind(wx.EVT_MENU, lambda x: self.ChangeLocale('en_EN'),
id = forms.ID_ENGLISH_LANG)
self.Bind(wx.EVT_MENU, lambda x: self.ChangeLocale('ru_RU'),
id = forms.ID_RUSSIAN_LANG)
self.Bind(wx.EVT_MENU, self.OnAbout, self.Bind(wx.EVT_MENU, self.OnAbout,
id = forms.ID_ABOUT) id = forms.ID_ABOUT)
@ -224,8 +237,13 @@ class MainFrame(forms.MainFrame):
# Функции приложения и обработки сервера # Функции приложения и обработки сервера
def ChangeLocale(self, locale):
self.settings['locale'] = locale
wx.MessageBox(_('Locale changed. Restart application to apply settings'), _('Information'))
def OnClose(self, event): def OnClose(self, event):
self.server.Stop() self.server.Stop()
self.SaveSettings()
self.Destroy() self.Destroy()
def OnAbout(self, event): def OnAbout(self, event):
@ -272,7 +290,7 @@ class MainFrame(forms.MainFrame):
data.state = state data.state = state
self.SetModelState(item, data.state) self.SetModelState(item, data.state)
p = 'Unknown' if percent < 0 else '{:%}'.format(percent) p = _('Unknown') if percent < 0 else '{:%}'.format(percent)
um.SetItemText(item, p, 2) um.SetItemText(item, p, 2)
um.SetItemText(item, comment, 3) um.SetItemText(item, comment, 3)
@ -355,7 +373,7 @@ class MainFrame(forms.MainFrame):
# Создаем корневой элемент для окна с графиками # Создаем корневой элемент для окна с графиками
self.m_plots.AddRoot('root') self.m_plots.AddRoot('root')
self.SetStatusText('Model "{}" selected'.format(model.GetTitle()), 0) self.SetStatusText(_('Model "{}" selected').format(model.GetTitle()), 0)
return True # Project(model) return True # Project(model)
@ -412,7 +430,7 @@ class MainFrame(forms.MainFrame):
selector = wx.FileDialog( selector = wx.FileDialog(
self, self,
'Select file to load project', _('Select file to load project'),
'', '',
'', '',
'Opal files (*.opl)|*.opl|Text files (*.txt)|*.txt', 'Opal files (*.opl)|*.opl|Text files (*.txt)|*.txt',
@ -451,7 +469,7 @@ class MainFrame(forms.MainFrame):
self.m_plots.ExpandAll() self.m_plots.ExpandAll()
except Exception, e: except Exception, e:
wx.MessageBox("Can't load saved file", 'Error', wx.ICON_ERROR | wx.OK) wx.MessageBox(_("Can't load saved file"), _('Error'), wx.ICON_ERROR | wx.OK)
print 'Oops', type(e), e print 'Oops', type(e), e
finally: finally:
wx.EndBusyCursor() wx.EndBusyCursor()
@ -513,7 +531,7 @@ class MainFrame(forms.MainFrame):
selector = wx.FileDialog( selector = wx.FileDialog(
self, self,
'Select file to save project', _('Select file to save project'),
'', '',
self.model.GetTitle() + ' project', self.model.GetTitle() + ' project',
'Opal files (*.opl)|*.opl|Text files (*.txt)|*.txt', 'Opal files (*.opl)|*.opl|Text files (*.txt)|*.txt',
@ -548,7 +566,7 @@ class MainFrame(forms.MainFrame):
f.write(dump) f.write(dump)
except Exception as e: except Exception as e:
wx.MessageBox("Can't save the project", 'Error', wx.ICON_ERROR | wx.OK) wx.MessageBox(_("Can't save the project"), _('Error'), wx.ICON_ERROR | wx.OK)
print e print e
finally: finally:
wx.EndBusyCursor() wx.EndBusyCursor()
@ -589,23 +607,23 @@ class MainFrame(forms.MainFrame):
def SetModelState(self, item, state): def SetModelState(self, item, state):
if state == MODEL_READY: if state == MODEL_READY:
icon = self.icons.mready icon = self.icons.mready
text = 'Ready' text = _('Ready')
elif state == MODEL_RUNNING: elif state == MODEL_RUNNING:
icon = self.icons.mrun icon = self.icons.mrun
text = 'Running' text = _('Running')
elif state == MODEL_COMPLETED: elif state == MODEL_COMPLETED:
icon = self.icons.mcomplete icon = self.icons.mcomplete
text = 'Completed' text = _('Completed')
elif state == MODEL_STOPPED: elif state == MODEL_STOPPED:
icon = self.icons.mstopped icon = self.icons.mstopped
text = 'Stopped' text = _('Stopped')
else: else:
icon = self.icons.mnoexec icon = self.icons.mnoexec
text = 'No executable' text = _('No executable')
self.m_user_models.SetItemImage(item, icon) self.m_user_models.SetItemImage(item, icon)
self.m_user_models.SetItemText(item, text, 1) self.m_user_models.SetItemText(item, text, 1)
@ -673,7 +691,7 @@ class MainFrame(forms.MainFrame):
um.Expand(item) um.Expand(item)
um.SelectItem(child) um.SelectItem(child)
else: else:
wx.MessageBox('It\'s impossible to append model', 'Error') wx.MessageBox(_("It's impossible to append model"), _('Error'))
# Реакция на выбор модели # Реакция на выбор модели
@ -743,7 +761,7 @@ class MainFrame(forms.MainFrame):
data.state = MODEL_READY data.state = MODEL_READY
self.SetModelState(item, data.state) self.SetModelState(item, data.state)
child, _ = um.GetFirstChild(item) child, _null = um.GetFirstChild(item)
while child.IsOk(): while child.IsOk():
Walk(child) Walk(child)
child = um.GetNextSibling(child) child = um.GetNextSibling(child)
@ -768,21 +786,21 @@ class MainFrame(forms.MainFrame):
def GetSelectedItem(self, source): def GetSelectedItem(self, source):
item = source.GetSelection() item = source.GetSelection()
if not item.IsOk(): if not item.IsOk():
raise ItemError('Invalid item') raise ItemError(_('Invalid item'))
return item return item
def GetSelectedData(self, source): def GetSelectedData(self, source):
item = self.GetSelectedItem(source) item = self.GetSelectedItem(source)
data = source.GetPyData(item) data = source.GetPyData(item)
if not data: if not data:
raise ItemError('Empty data') raise ItemError(_('Empty data'))
return data return data
def GetSelectedItemData(self, source): def GetSelectedItemData(self, source):
item = self.GetSelectedItem(source) item = self.GetSelectedItem(source)
data = source.GetPyData(item) data = source.GetPyData(item)
if not data: if not data:
raise ItemError('Empty data') raise ItemError(_('Empty data'))
return (item, data) return (item, data)
# Дублирование модели # Дублирование модели
@ -862,7 +880,7 @@ class MainFrame(forms.MainFrame):
def OnShowResult(self, event): def OnShowResult(self, event):
item, data = self.GetSelectedItemData(self.m_user_models) item, data = self.GetSelectedItemData(self.m_user_models)
title = self.m_user_models.GetItemText(item) title = self.m_user_models.GetItemText(item)
title = 'Result for model "{}"'.format(title) title = _('Result for model "{}"').format(title)
rframe = ResultFrame(self, title, data.res) rframe = ResultFrame(self, title, data.res)
rframe.Show() rframe.Show()
@ -870,7 +888,7 @@ class MainFrame(forms.MainFrame):
def OnAddPlot(self, event): def OnAddPlot(self, event):
root = self.m_plots.GetRootItem() root = self.m_plots.GetRootItem()
child = self.m_plots.AppendItem(root, 'New plot') child = self.m_plots.AppendItem(root, _('New plot'))
self.m_plots.SetPyData(child, 'plot') self.m_plots.SetPyData(child, 'plot')
self.m_plots.SetItemImage(child, self.icons.porg) self.m_plots.SetItemImage(child, self.icons.porg)
self.m_plots.SelectItem(child) self.m_plots.SelectItem(child)
@ -916,11 +934,11 @@ class MainFrame(forms.MainFrame):
data = um.GetPyData(item) data = um.GetPyData(item)
title = um.GetItemText(item) title = um.GetItemText(item)
msg = 'Line(s) for "{}" ({}/{})'.format(title, index, count) msg = _('Line(s) for "{}" ({}/{})').format(title, index, count)
if not data.res: if not data.res:
wx.MessageBox( wx.MessageBox(
'There is no any result data for model!', _('There is no any result data for model!'),
msg, wx.OK | wx.ICON_EXCLAMATION) msg, wx.OK | wx.ICON_EXCLAMATION)
else: else:
f = CreateLineSelectDialog(self, msg, data) f = CreateLineSelectDialog(self, msg, data)
@ -963,7 +981,7 @@ class MainFrame(forms.MainFrame):
def ShowPlot(self, lines, plot_title = ''): def ShowPlot(self, lines, plot_title = ''):
if lines: if lines:
p = PlotFrame(self, 'Plot', lines) p = PlotFrame(self, _('Plot'), lines)
wx.FutureCall(20, p.Show) wx.FutureCall(20, p.Show)
# p.Show() # p.Show()
@ -1076,7 +1094,8 @@ class ResultFrame(forms.ResultFrame):
if not self.result or not self.result.table: if not self.result or not self.result.table:
return return
text_file = wx.FileSelector('Save table to CSV', text_file = wx.FileSelector(
_('Save table to CSV'),
default_filename = 'table.csv', default_filename = 'table.csv',
wildcard = 'PNG files (*.csv)|*.csv|Text files (*.txt)|*.txt', wildcard = 'PNG files (*.csv)|*.csv|Text files (*.txt)|*.txt',
flags = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) flags = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
@ -1177,7 +1196,8 @@ class PlotFrame(forms.PlotFrame):
self.plot.Draw(graph) self.plot.Draw(graph)
def OnSaveImage(self, event): def OnSaveImage(self, event):
img_file = wx.FileSelector('Save plot', img_file = wx.FileSelector(
_('Save plot'),
default_filename = 'plot.png', default_filename = 'plot.png',
default_extension = 'png', default_extension = 'png',
wildcard = 'PNG files (*.png)|*.png', wildcard = 'PNG files (*.png)|*.png',