diff options
author | Reinier Heeres <reinier@heeres.eu> | 2007-09-24 07:24:09 (GMT) |
---|---|---|
committer | Reinier Heeres <reinier@heeres.eu> | 2007-09-24 07:24:09 (GMT) |
commit | c5517f796f43ff7dfaaaf31acff36ab8f953967a (patch) | |
tree | 9d4df56a7e51e67af3dc7f5cec57498672cde45f | |
parent | 3491db3b24d9542f0c214b434729b753bd0565a4 (diff) |
eqnparserhelp.py included, basic i18n support
-rw-r--r-- | MANIFEST | 4 | ||||
-rw-r--r-- | calculate.py | 36 | ||||
-rw-r--r-- | eqnparser.py | 118 | ||||
-rw-r--r-- | eqnparserhelp.py | 67 | ||||
-rw-r--r-- | layout.py | 11 | ||||
-rw-r--r-- | po/POTFILES.in | 6 | ||||
-rw-r--r-- | po/calculate.pot | 242 | ||||
-rw-r--r-- | po/en.po | 239 | ||||
-rw-r--r-- | po/es.po | 251 | ||||
-rw-r--r-- | po/nl.po | 238 |
10 files changed, 1134 insertions, 78 deletions
@@ -6,6 +6,10 @@ mathlib.py plotlib.py svgimage.py toolbars.py +po/calculate.pot +po/en.po +po/es.po +po/nl.po sharedstate/__init__.py sharedstate/shareddict.py sharedstate/sharedobject.py diff --git a/calculate.py b/calculate.py index cb59388..36848bf 100644 --- a/calculate.py +++ b/calculate.py @@ -75,7 +75,7 @@ class Equation: str = str.rstrip("\r\n") l = str.split(';') if len(l) != 5: - _logger.error('Equation.parse() string invalid (%s)', str) + _logger.error(_('Equation.parse() string invalid (%s)'), str) return False if l[2].startswith("<svg>"): @@ -167,7 +167,7 @@ class Calculate(activity.Activity): self.showing_error = False self.show_vars = False - self.set_title("Calculate") + self.set_title(_("Calculate")) self.connect("key_press_event", self.keypress_cb) self.connect("destroy", self.cleanup_cb) self.color = sugar.profile.get_color() @@ -185,7 +185,7 @@ class Calculate(activity.Activity): self.presence = presenceservice.get_instance() self.owner = self.presence.get_owner() self.owner_id = str(self.owner._properties["nick"]) - _logger.debug('Owner_id: %s', self.owner_id) + _logger.debug(_('Owner_id: %s'), self.owner_id) options = { 'receive_message': self.receive_message, @@ -201,7 +201,7 @@ class Calculate(activity.Activity): 'type': 'python'}, iv = []) - _logger.info('Available functions:') + _logger.info(_('Available functions:')) for f in self.parser.get_function_names(): _logger.info('\t%s', f) @@ -212,7 +212,7 @@ class Calculate(activity.Activity): return True def cleanup_cb(self, arg): - _logger.debug('Cleaning up...') + _logger.debug(_('Cleaning up...')) def equation_pressed_cb(self, eqn): """Callback for when an equation box is clicked""" @@ -320,7 +320,7 @@ class Calculate(activity.Activity): s = self.text_entry.get_text() label = self.label_entry.get_text() - _logger.debug('process(): parsing \'%s\', label: \'%s\'', s, label) + _logger.debug(_('process(): parsing \'%s\', label: \'%s\''), s, label) res = self.parser.parse(s) if type(res) == types.StringType and res.find('</svg>') > -1: res = SVGImage(data=res) @@ -345,7 +345,7 @@ class Calculate(activity.Activity): return res is not None def refresh_bar(self): - _logger.debug('Refreshing right bar...') + _logger.debug(_('Refreshing right bar...')) self.refresh_last_eq() if self.layout.varbut.selected == 0: self.refresh_history() @@ -479,7 +479,7 @@ class Calculate(activity.Activity): def write_file(self, file_path): """Write journal entries, Calculate Journal Version (cjv) 1.0""" - _logger.info('Writing to journal (%s)', file_path) + _logger.info(_('Writing to journal (%s)'), file_path) f = open(file_path, 'w') f.write("cjv 1.0\n") @@ -499,23 +499,23 @@ class Calculate(activity.Activity): def read_file(self, file_path): """Read journal entries, version 1.0""" - _logger.info('Reading from journal (%s)', file_path) + _logger.info(_('Reading from journal (%s)'), file_path) f = open(file_path, 'r') str = f.readline().rstrip("\r\n") # chomp l = str.split() if len(l) != 2: - _logger.error('Unable to determine version') + _logger.error(_('Unable to determine version')) return False version = l[1] if len(version) > 1 and version[0:2] == "1.": - _logger.info('Reading journal entry (version %s)', version) + _logger.info(_('Reading journal entry (version %s)'), version) str = f.readline().rstrip("\r\n") l = str.split(';') if len(l) != 4: - _logger.error('State line invalid (%s)', str) + _logger.error(_('State line invalid (%s)'), str) return False self.text_entry.set_text(l[0]) @@ -532,7 +532,7 @@ class Calculate(activity.Activity): return True else: - _logger.error('Unable to read journal entry, unknown version (%s)', version) + _logger.error(_('Unable to read journal entry, unknown version (%s)'), version) return False ########################################## @@ -585,7 +585,7 @@ class Calculate(activity.Activity): if end_ofs - start_ofs <= 0: return False partial_name = str[start_ofs:end_ofs] - _logger.debug('tab-completing %s...', partial_name) + _logger.debug(_('tab-completing %s...'), partial_name) # Lookup matching variables vars = self.parser.get_var_names(start=partial_name) @@ -666,7 +666,7 @@ class Calculate(activity.Activity): key = 'asterisk' else: key = 'None' - _logger.debug('Key: %s (%r)', key, event.keyval) + _logger.debug(_('Key: %s (%r, %r)'), key, event.keyval, event.hardware_keycode) if (event.state & gtk.gdk.CONTROL_MASK) and self.CTRL_KEYMAP.has_key(key): f = self.CTRL_KEYMAP[key] @@ -717,7 +717,7 @@ class Calculate(activity.Activity): (start, end) = sel text = self.text_entry.get_text() elif len(sel) != 0: - _logger.error('button_pressed(): len(sel) != 0 or 2') + _logger.error(_('button_pressed(): len(sel) != 0 or 2')) return False if type == self.TYPE_FUNCTION: @@ -763,7 +763,7 @@ class Calculate(activity.Activity): self.text_entry.set_position(pos + len(str)) else: - _logger.error('button_pressed(): invalid type') + _logger.error(_('button_pressed(): invalid type')) def receive_message(self, msg, val): if msg == "add_eq": @@ -779,7 +779,7 @@ class Calculate(activity.Activity): tmp = [] self.clear_equations() for eq_str in val: - _logger.info('receive_message: %s', str(eq_str)) + _logger.info(_('receive_message: %s'), str(eq_str)) self.add_equation(Equation(str=str(eq_str))) self.refresh_bar() diff --git a/eqnparser.py b/eqnparser.py index e15ffa9..72e20c2 100644 --- a/eqnparser.py +++ b/eqnparser.py @@ -25,6 +25,8 @@ from mathlib import MathLib from plotlib import PlotLib from eqnparserhelp import EqnParserHelp +from gettext import gettext as _ + class Equation: def __init__(self, eqn): self.equation = eqn @@ -48,7 +50,7 @@ class ParserState: self.error_range = (0, 0) def state_string(self): - return 'level: %d, ofs %d' % (self.level, self.ofs) + return _('level: %d, ofs %d') % (self.level, self.ofs) def more(self): return self.error_code == self.OK and self.ofs < self.strlen @@ -84,7 +86,7 @@ class ParserState: self.result_type = t return True elif self.result_type != t: - _logger.debug('Type error!') + _logger.debug(_('Type error')) return False else: return True @@ -94,17 +96,17 @@ class ParserState: if msg is not None: self.error_msg = msg if range is not None: - _logger.debug('Setting range: %r', range) + _logger.debug(_('Setting range: %r'), range) self.error_range = range else: - _logger.debug('Setting offset: %d', self.ofs) + _logger.debug(_('Setting offset: %d'), self.ofs) self.error_range = (self.ofs, self.ofs + 1) def set_error_range(self, r): self.error_range = r def format_error(self): - msg = "Error at %d" % (self.error_range[0]) + msg = _("Error at %d") % (self.error_range[0]) if self.error_msg is not None and len(self.error_msg) > 0: msg += ": %s" % (self.error_msg) return msg @@ -214,6 +216,7 @@ class EqnParser: self.register_operator('&', self.OP_DIADIC, 0, lambda x: x[0] and x[1]) self.register_operator('|', self.OP_DIADIC, 0, lambda x: x[0] or x[1]) + self.register_operator('!', self.OP_PRE, 0, lambda x: not x[0]) self.register_operator('=', self.OP_DIADIC, 0, lambda x: x[0] == x[1]) self.register_operator('!=', self.OP_DIADIC, 0, lambda x: x[0] != x[1]) @@ -223,9 +226,9 @@ class EqnParser: self.register_operator('<<', self.OP_DIADIC, 0, lambda x: self.ml.shift_left(x[0], x[1])) self.register_operator('>>', self.OP_DIADIC, 0, lambda x: self.ml.shift_right(x[0], x[1])) - self.register_operator('%', self.OP_DIADIC, 0, lambda x: self.ml.mod(x[0], x[1])) + self.register_operator('%', self.OP_DIADIC, 2, lambda x: self.ml.mod(x[0], x[1])) - self.set_var('help', 'Use help(test) to get help about \'test\', help(index) for available topics', parse=False) + self.set_var('help', _('help_var'), parse=False) def register_function(self, name, f, opts): self.functions[name] = (f, opts) @@ -296,7 +299,7 @@ class EqnParser: else: return self.variables[name] else: - _logger.debug('variable %s not defined', name) + _logger.debug(_('variable %s not defined'), name) ps.set_type(self.TYPE_SYMBOLIC) return None @@ -326,14 +329,14 @@ class EqnParser: def eval_func(self, func, args, level): if func not in self.functions: - _logger.error('Function \'%s\' not defined', func) - self.ps.set_error(ParserState.PARSE_ERROR, msg='Function \'%s\' not defined' % (func)) + _logger.error(_('Function \'%s\' not defined'), func) + self.ps.set_error(ParserState.PARSE_ERROR, msg=_('Function \'%s\' not defined') % (func)) return None (f, opts) = self.functions[func] if len(args) != opts['nargs']: - _logger.error('Invalid number of arguments (%d instead of %d)', len(args), opts['nargs']) - self.ps.set_error(ParserState.PARSE_ERROR, msg='function takes %d args' % (opts['nargs'])) + _logger.error(_('Invalid number of arguments (%d instead of %d)'), len(args), opts['nargs']) + self.ps.set_error(ParserState.PARSE_ERROR, msg=_('function takes %d args') % (opts['nargs'])) return None if 'parse_options' in opts and opts['parse_options'] == False: @@ -343,8 +346,8 @@ class EqnParser: for i in range(len(args)): pargs.append(self.parse(args[i], reset=False)) if pargs[i] is None: - _logger.error('Unable to parse argument %d: \'%s\'', i, args[i]) - self.ps.set_error(ParserState.PARSE_ERROR, msg='Unable to parse argument %d: \'%s\'' % (i, args[i])) + _logger.error(_('Unable to parse argument %d: \'%s\''), i, args[i]) + self.ps.set_error(ParserState.PARSE_ERROR, msg=_('Unable to parse argument %d: \'%s\'') % (i, args[i])) return None try: @@ -353,9 +356,9 @@ class EqnParser: # Maybe we should map exceptions to more obvious error messages except Exception, inst: res = None - self.ps.set_error(ParserState.PARSE_ERROR, msg="Function error: %s" % (str(inst))) + self.ps.set_error(ParserState.PARSE_ERROR, msg=_("Function error: %s") % (str(inst))) - _logger.debug('Function \'%s\' returned %s', func, self.ml.format_number(res)) + _logger.debug(_('Function \'%s\' returned %s'), func, self.ml.format_number(res)) return res def parse_number(self, ps): @@ -379,7 +382,7 @@ class EqnParser: while ps.more() and ps.char in self.DIGITS: ps.next() - _logger.debug('parse_number(): %d - %d: %s', startofs, ps.ofs, ps.str[startofs:ps.ofs]) + _logger.debug(_('parse_number(): %d - %d: %s'), startofs, ps.ofs, ps.str[startofs:ps.ofs]) n = self.ml.parse_number(ps.str[startofs:ps.ofs]) return n @@ -403,12 +406,12 @@ class EqnParser: op2 = self.valid_operator(ps.str[startofs:ps.ofs], left_val) if op2 is not None: op = op2 - elif op2 is None and op is not None: + elif op is not None: ps.prev() break if op is not None: - _logger.debug('parse_operator(): %d - %d: %s', startofs, ps.ofs, ps.str[startofs:ps.ofs]) + _logger.debug(_('parse_operator(): %d - %d: %s'), startofs, ps.ofs, ps.str[startofs:ps.ofs]) return op else: return self.INVALID_OP @@ -428,7 +431,7 @@ class EqnParser: if pcount == 0 and (ps.ofs - startofs) > 0: args.append(ps.str[startofs:ps.ofs]) ps.next() - _logger.debug('parse_func_args(): %d - %d: %r', startofs, ps.ofs, args) + _logger.debug(_('parse_func_args(): %d - %d: %r'), startofs, ps.ofs, args) return args def parse_var_func(self, ps): @@ -442,7 +445,7 @@ class EqnParser: # handle function if ps.char == '(': ps.next() - _logger.debug('parse_var_func(): function %d - %d: %s', startofs, ps.ofs, name) + _logger.debug(_('parse_var_func(): function %d - %d: %s'), startofs, ps.ofs, name) args = self.parse_func_args(ps) ret = self.eval_func(name, args, ps.level) if ret is None: @@ -451,23 +454,23 @@ class EqnParser: # handle var else: - _logger.debug('parse_var_func(): variable %d - %d: %s', startofs, ps.ofs, name) + _logger.debug(_('parse_var_func(): variable %d - %d: %s'), startofs, ps.ofs, name) res = self.lookup_var(name, ps) if res is None: - ps.set_error(ParserState.PARSE_ERROR, msg="Variable '%s' undefined" % (name), range=(startofs, ps.ofs)) + ps.set_error(ParserState.PARSE_ERROR, msg=_("Variable '%s' undefined") % (name), range=(startofs, ps.ofs)) return res def _parse(self, ps, presedence=None): if presedence is None: ps.inc_level() - _logger.debug('_parse(): %s, presedence: %r', ps.state_string(), presedence) + _logger.debug(_('_parse(): %s, presedence: %r'), ps.state_string(), presedence) op = None left_val = None right_val = None while ps.more(): -# _logger.debug('Looking at \'%c\', ofs %d in \'%s\'', ps.char, ps.ofs, ps.str) +# _logger.debug(_('Looking at \'%c\', ofs %d in \'%s\''), ps.char, ps.ofs, ps.str) # Skip spaces if ps.char in self.SPACE_CHARS: @@ -484,43 +487,43 @@ class EqnParser: elif ps.char == ')': if presedence is not None: if left_val is None: - _logger.error('Parse error (right parenthesis)') - ps.set_error(ParserState.PARSE_ERROR, msg="Right parenthesis unexpected") + _logger.error(_('Parse error (right parenthesis)')) + ps.set_error(ParserState.PARSE_ERROR, msg=_("Right parenthesis unexpected")) return None else: - _logger.debug('returning %s', self.ml.format_number(left_val)) + _logger.debug(_('returning %s'), self.ml.format_number(left_val)) return left_val if ps.level > 0: ps.next() ps.dec_level() if left_val is None: - _logger.error('Parse error (right parenthesis, no left_val)') - ps.set_error(ParserState.PARSE_ERROR, msg="Right parenthesis unexpected") + _logger.error(_('Parse error (right parenthesis, no left_val)')) + ps.set_error(ParserState.PARSE_ERROR, msg=_("Right parenthesis unexpected")) return None else: - _logger.debug('returning %s', self.ml.format_number(left_val)) + _logger.debug(_('returning %s'), self.ml.format_number(left_val)) return left_val else: - _logger.error('Parse error (right parenthesis, no level to close)') - ps.set_error(ParserState.PARSE_ERROR, msg="Right parenthesis unexpected") + _logger.error_(('Parse error (right parenthesis, no level to close)')) + ps.set_error(ParserState.PARSE_ERROR, msg=_("Right parenthesis unexpected")) return None # Parse number elif ps.char in '0123456789.': if right_val is not None or left_val is not None: - _logger.error('Number not expected!') - ps.set_error(ParserState.PARSE_ERROR, msg="Number not expected") + _logger.error(_('Number not expected')) + ps.set_error(ParserState.PARSE_ERROR, msg=_("Number not expected")) return None - if op is not None and otype == self.OP_PRE: - left_val = of([self.parse_number(ps)]) - op = None - else: - left_val = self.parse_number(ps) + left_val = self.parse_number(ps) # Parse operator elif ps.char in self.OP_START_CHARS: + if op is not None: + ps.set_error(ParserState.PARSE_ERROR, msg=_("Operator not expected")) + return None + startofs = ps.ofs op = self.parse_operator(ps, left_val) (opstr, otype, opres, of) = op @@ -529,7 +532,7 @@ class EqnParser: if otype == self.OP_DIADIC: if presedence is not None and opres <= presedence: ps.set_ofs(startofs) - _logger.debug('returning %s (by presedence, %d)', self.ml.format_number(left_val), ps.ofs) + _logger.debug(_('returning %s (by presedence, %d)'), self.ml.format_number(left_val), ps.ofs) return left_val else: right_val = self._parse(ps, presedence=opres) @@ -537,39 +540,50 @@ class EqnParser: return None res = of([left_val, right_val]) - _logger.debug('OP: %s, %s ==> %s', self.ml.format_number(left_val), self.ml.format_number(right_val), self.ml.format_number(res)) + _logger.debug(_('OP: %s, %s ==> %s'), self.ml.format_number(left_val), self.ml.format_number(right_val), self.ml.format_number(res)) left_val = res right_val = None - op = None # Operator that goes after value elif otype == self.OP_POST: - left_val = of([left_val]) + res = of([left_val]) + _logger.debug(_('OP POST: %s ==> %s'), self.ml.format_number(left_val), self.ml.format_number(res)) + left_val = res op = None # Operator that goes before value elif otype == self.OP_PRE: - pass + right_val = self._parse(ps, presedence=opres) + if right_val is None: + return None + left_val = of([right_val]) + _logger.debug(_('OP PRE: %s ==> %s'), self.ml.format_number(right_val), self.ml.format_number(left_val)) + op = None elif otype == self.OP_INVALID: - _logger.debug('Invalid operator') - ps.set_error(ParserState.PARSE_ERROR, msg="Invalid operator", range=(startofs, ps.ofs)) + _logger.debug(_('Invalid operator')) + ps.set_error(ParserState.PARSE_ERROR, msg=_("Invalid operator"), range=(startofs, ps.ofs)) return None # Parse variable or function else: + if left_val is not None: + _logger.debug(_('Operator expected')) + ps.set_error(ParserState.PARSE_ERROR, msg=_("Operator expected")) + return None + left_val = self.parse_var_func(ps) if not ps.more() and ps.level > 0: - _logger.debug('Parse error: \')\' expected') - ps.set_error(ParserState.PARSE_ERROR, msg="Right parenthesis unexpected") + _logger.debug(_('Parse error: \')\' expected')) + ps.set_error(ParserState.PARSE_ERROR, msg=_("Right parenthesis unexpected")) return None elif op is None and left_val is not None: - _logger.debug('returning %s', self.ml.format_number(left_val)) + _logger.debug(_('returning %s'), self.ml.format_number(left_val)) return left_val else: - _logger.error('_parse(): returning None') + _logger.error(_('_parse(): returning None')) # Should be set somewhere already # ps.set_error(ParserState.PARSE_ERROR) return None @@ -582,7 +596,7 @@ class EqnParser: def parse(self, eqn, reset=True): """Construct ParserState object and call _parse""" - _logger.debug('parse(): %s', eqn) + _logger.debug(_('parse(): %s'), eqn) self.reset_variable_level(0) if reset: diff --git a/eqnparserhelp.py b/eqnparserhelp.py new file mode 100644 index 0000000..0e36127 --- /dev/null +++ b/eqnparserhelp.py @@ -0,0 +1,67 @@ +# eqnparserhelp.py, help functions for the equation parser by +# Reinier Heeres <reinier@heeres.eu> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# Change log: +# 2007-09-16: rwh, first version + +import types + +from gettext import gettext as _ + +class Callable: + def __init__(self, f): + self.__call__ = f + +# Just an example implementation; should be fixed for internationalization +class EqnParserHelp(): + + DICT = { + "acos": "help_acos", + "asin": "help_asin", + "exp": "help_exp", + "functions": "help_functions", + "operators": "help_operators", + "plot": "help_plot", + "sqrt": "help_sqrt", + "test": "help_test", + "variables": "help_variables", + } + + def __init__(self): + return + + def help(about): + if type(about) != types.StringType or len(about) == 0: + return _("help_usage") + + if about == "index": + ret = _("Topics") + ": " + for (key, val) in EqnParserHelp.DICT.iteritems(): + ret += key + " " + return ret + + ret = "" + for (key, val) in EqnParserHelp.DICT.iteritems(): + if about.find(key) != -1: + ret += _(val) + + if ret == "": + ret += _("No help about '%s' available, use help(index) for the index") % (about) + + return ret + + help = Callable(help) @@ -6,11 +6,6 @@ pygtk.require('2.0') import gtk import pango from sugar.activity import activity -try: - from sugar.graphics import font -except: - #Not important, don't do anythig - pass from toolbars import * class CalcLayout: @@ -117,9 +112,9 @@ class CalcLayout: # Right part: container and equation button hc2 = gtk.HBox() - self.minebut = TextToggleToolButton(['All equations', 'My equations'], + self.minebut = TextToggleToolButton([_('All equations'), _('My equations')], lambda x: self._parent.refresh_bar()) - self.varbut = TextToggleToolButton(['Show history ', 'Show variables'], + self.varbut = TextToggleToolButton([_('Show history'), _('Show variables')], lambda x: self._parent.refresh_bar()) hc2.add(self.minebut) hc2.add(self.varbut) @@ -155,7 +150,7 @@ class CalcLayout: self._parent.show_all() def create_button(self, cap, cb, fgcol, bgcol, width): - button = gtk.Button(cap) + button = gtk.Button(_(cap)) self.modify_button_appearance(button, fgcol, bgcol, width) button.connect("clicked", cb) button.connect("key_press_event", self._parent.ignore_key_cb) diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..93659df --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,6 @@ +encoding: UTF-8 +calculate.py +eqnparser.py +eqnparserhelp.py +mathlib.py +plotlib.py diff --git a/po/calculate.pot b/po/calculate.pot new file mode 100644 index 0000000..a735dcd --- /dev/null +++ b/po/calculate.pot @@ -0,0 +1,242 @@ +# POT file for the Calculate activity +# Copyright (C) 2007 +# This file is distributed under the same license as the Calculate package. +# Reinier Heeres <reinier@heeres.eu>, 2007 +# +msgid "" +msgstr "" +"Project-Id-Version: Calculate\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-22 18:20+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: calculate.py:27 calculate.py:170 setup.py:3 +msgid "Calculate" +msgstr "" + +#: calculate.py:204 +msgid "Available functions:" +msgstr "" + +#----------------------------------------- +# The help system uses topic msgid's that should be translated here. +#----------------------------------------- +#: eqnparserhelp.py:33 +msgid "help_acos" +msgstr "" + +#: eqnparserhelp.py:34 +msgid "help_asin" +msgstr "" + +#: eqnparserhelp.py:35 +msgid "help_exp" +msgstr "" + +#: eqnparserhelp.py:36 +msgid "help_functions" +msgstr "" + +#: eqnparserhelp.py:37 +msgid "help_operators" +msgstr "" + +#: eqnparserhelp.py:38 +msgid "help_plot" +msgstr "" + +#: eqnparserhelp.py:39 +msgid "help_sqrt" +msgstr "" + +#: eqnparserhelp.py:40 +msgid "help_test" +msgstr "" + +#: eqnparserhelp.py:41 +msgid "help_variables" +msgstr "" + +#: eqnparserhelp.py:49 +msgid "help_usage" +msgstr "" + +# Text assigned to the 'help' variable +msgid "help_var" +msgstr "" + +#----------------------------------------- +# End of help topics +#----------------------------------------- + +#: eqnparserhelp.py:52 +msgid "Topics: " +msgstr "" + +#: eqnparserhelp.py:63 +#, python-format +msgid "No help about '%s' available, use help(index) for the index" +msgstr "" + +#: eqnparser.py:87 +msgid "Type error" +msgstr "" + +#: eqnparser.py:107 +#, python-format +msgid "Error at %d" +msgstr "" + +#: eqnparser.py:299 +#, python-format +msgid "variable %s not defined" +msgstr "" + +#: eqnparser.py:329 eqnparser.py:330 +#, python-format +msgid "Function '%s' not defined" +msgstr "" + +#: eqnparser.py:335 +#, python-format +msgid "Invalid number of arguments (%d instead of %d)" +msgstr "" + +#: eqnparser.py:336 +#, python-format +msgid "function takes %d args" +msgstr "" + +#: eqnparser.py:346 eqnparser.py:347 +#, python-format +msgid "Unable to parse argument %d: '%s'" +msgstr "" + +#: eqnparser.py:356 +#, python-format +msgid "Function error: %s" +msgstr "" + +#: eqnparser.py:358 +#, python-format +msgid "Function '%s' returned %s" +msgstr "" + +#: eqnparser.py:457 +#, python-format +msgid "Variable '%s' undefined" +msgstr "" + +#: eqnparser.py:487 +msgid "Parse error (right parenthesis)" +msgstr "" + +#: eqnparser.py:488 eqnparser.py:499 eqnparser.py:506 eqnparser.py:566 +msgid "Right parenthesis unexpected" +msgstr "" + +#: eqnparser.py:498 +msgid "Parse error (right parenthesis, no left_val)" +msgstr "" + +#: eqnparser.py:505 +msgid "Parse error (right parenthesis, no level to close)" +msgstr "" + +#: eqnparser.py:513 +msgid "Number not expected" +msgstr "" + +#: eqnparser.py:556 eqnparser.py:557 +msgid "Invalid operator" +msgstr "" + +#: eqnparser.py:565 +msgid "Parse error: ')' expected" +msgstr "" + +#: eqnparser.py:572 +msgid "_parse(): returning None" +msgstr "" + +#: layout.py:46 +msgid "clear" +msgstr "" + +#: layout.py:55 +msgid "enter" +msgstr "" + +#: layout.py:62 +msgid "Edit" +msgstr "" + +#: layout.py:63 +msgid "Algebra" +msgstr "" + +#: layout.py:64 +msgid "Trigonometry" +msgstr "" + +#: layout.py:65 +msgid "Boolean" +msgstr "" + +#: layout.py:66 +msgid "Constants" +msgstr "" + +#: layout.py:67 +msgid "Format" +msgstr "" + +#: layout.py:88 +msgid "Label:" +msgstr "" + +#: layout.py:120 +msgid "All equations" +msgstr "" + +#: layout.py:120 +msgid "My equations" +msgstr "" + +#: layout.py:122 +msgid "Show history" +msgstr "" + +#: layout.py:122 +msgid "Show variables" +msgstr "" + +#: mathlib.py:86 +msgid "Error" +msgstr "" + +#: mathlib.py:92 +msgid "Error: unsupported type" +msgstr "" + +#: plotlib.py:134 +msgid "Unable to parse range" +msgstr "" + +#: toolbars.py:57 +msgid "Copy" +msgstr "" + +#: toolbars.py:60 +msgid "Paste" +msgstr "" + +#: toolbars.py:63 +msgid "Cut" +msgstr "" + diff --git a/po/en.po b/po/en.po new file mode 100644 index 0000000..0a06019 --- /dev/null +++ b/po/en.po @@ -0,0 +1,239 @@ +# POT file for the Calculate activity +# Copyright (C) 2007 +# This file is distributed under the same license as the Calculate package. +# Reinier Heeres <reinier@heeres.eu>, 2007 +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-22 18:20+0200\n" +"PO-Revision-Date: 2007-09-23 11:46+0200\n" +"Last-Translator: Reinier Heeres <reinier@heeres.eu>\n" +"Language-Team: English\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: calculate.py:27 calculate.py:170 setup.py:3 +msgid "Calculate" +msgstr "Calculate" + +#: calculate.py:204 +msgid "Available functions:" +msgstr "Available functions:" + +# ----------------------------------------- +# The help system uses topic msgid's that should be translated here. +# ----------------------------------------- +#: eqnparserhelp.py:33 +msgid "help_acos" +msgstr "acos(x), return arc cosine of x. Defined for -1 <= x <= 1" + +#: eqnparserhelp.py:34 +msgid "help_asin" +msgstr "asin(x), return arc sine of x. Defined for -1 <= x <= 1" + +#: eqnparserhelp.py:35 +msgid "help_exp" +msgstr "exp(x), return e^x, example: exp(1)" + +#: eqnparserhelp.py:36 +msgid "help_functions" +msgstr "show available functions" + +#: eqnparserhelp.py:37 +msgid "help_operators" +msgstr "show available operators" + +#: eqnparserhelp.py:38 +msgid "help_plot" +msgstr "plot(expression,range), plot a function. Example: plot(x^3,x=-2..2)" + +#: eqnparserhelp.py:39 +msgid "help_sqrt" +msgstr "sqrt(x), return square root of x. Defined for x >= 0" + +#: eqnparserhelp.py:40 +msgid "help_test" +msgstr "test is just an example help topic! See help(index)" + +#: eqnparserhelp.py:41 +msgid "help_variables" +msgstr "show available variables" + +#: eqnparserhelp.py:49 +msgid "help_usage" +msgstr "Use help(test) for help about 'test', or help(index) for the index" + +# Text assigned to the 'help' variable +msgid "help_var" +msgstr "Use help(test) for help about 'test', or help(index) for the index" + +# ----------------------------------------- +# End of help topics +# ----------------------------------------- + +#: eqnparserhelp.py:52 +msgid "Topics" +msgstr "Topics" + +#: eqnparserhelp.py:63 +#, python-format +msgid "No help about '%s' available, use help(index) for the index" +msgstr "No help about '%s' available, use help(index) for the index" + +#: eqnparser.py:87 +msgid "Type error" +msgstr "Type error" + +#: eqnparser.py:107 +#, python-format +msgid "Error at %d" +msgstr "Error at %d" + +#: eqnparser.py:299 +#, python-format +msgid "variable %s not defined" +msgstr "variable %s not defined" + +#: eqnparser.py:329 eqnparser.py:330 +#, python-format +msgid "Function '%s' not defined" +msgstr "Function '%s' not defined" + +#: eqnparser.py:335 +#, python-format +msgid "Invalid number of arguments (%d instead of %d)" +msgstr "Invalid number of arguments (%d instead of %d)" + +#: eqnparser.py:336 +#, python-format +msgid "function takes %d args" +msgstr "function takes %d args" + +#: eqnparser.py:346 eqnparser.py:347 +#, python-format +msgid "Unable to parse argument %d: '%s'" +msgstr "Unable to parse argument %d: '%s'" + +#: eqnparser.py:356 +#, python-format +msgid "Function error: %s" +msgstr "Function error: %s" + +#: eqnparser.py:358 +#, python-format +msgid "Function '%s' returned %s" +msgstr "Function '%s' returned %s" + +#: eqnparser.py:457 +#, python-format +msgid "Variable '%s' undefined" +msgstr "Variable '%s' undefined" + +#: eqnparser.py:487 +msgid "Parse error (right parenthesis)" +msgstr "Parse error (right parenthesis)" + +#: eqnparser.py:488 eqnparser.py:499 eqnparser.py:506 eqnparser.py:566 +msgid "Right parenthesis unexpected" +msgstr "Right parenthesis unexpected" + +#: eqnparser.py:498 +msgid "Parse error (right parenthesis, no left_val)" +msgstr "Parse error (right parenthesis, no left_val)" + +#: eqnparser.py:505 +msgid "Parse error (right parenthesis, no level to close)" +msgstr "Parse error (right parenthesis, no level to close)" + +#: eqnparser.py:513 +msgid "Number not expected" +msgstr "Number not expected" + +#: eqnparser.py:556 eqnparser.py:557 +msgid "Invalid operator" +msgstr "Invalid operator" + +#: eqnparser.py:565 +msgid "Parse error: ')' expected" +msgstr "Parse error: ')' expected" + +#: layout.py:46 +msgid "clear" +msgstr "clear" + +#: layout.py:55 +msgid "enter" +msgstr "enter" + +#: layout.py:62 +msgid "Edit" +msgstr "Edit" + +#: layout.py:63 +msgid "Algebra" +msgstr "Algebra" + +#: layout.py:64 +msgid "Trigonometry" +msgstr "Trigonometry" + +#: layout.py:65 +msgid "Boolean" +msgstr "Boolean" + +#: layout.py:66 +msgid "Constants" +msgstr "Constants" + +#: layout.py:67 +msgid "Format" +msgstr "Format" + +#: layout.py:88 +msgid "Label:" +msgstr "Label:" + +#: layout.py:120 +msgid "All equations" +msgstr "All equations" + +#: layout.py:120 +msgid "My equations" +msgstr "My equations" + +#: layout.py:122 +msgid "Show history" +msgstr "Show history" + +#: layout.py:122 +msgid "Show variables" +msgstr "Show variables" + +#: mathlib.py:86 +msgid "Error" +msgstr "Error" + +#: mathlib.py:92 +msgid "Error: unsupported type" +msgstr "Error: unsupported type" + +#: plotlib.py:134 +msgid "Unable to parse range" +msgstr "Unable to parse range" + +#: toolbars.py:57 +msgid "Copy" +msgstr "Copy" + +#: toolbars.py:60 +msgid "Paste" +msgstr "Paste" + +#: toolbars.py:63 +msgid "Cut" +msgstr "Cut" + diff --git a/po/es.po b/po/es.po new file mode 100644 index 0000000..2095dba --- /dev/null +++ b/po/es.po @@ -0,0 +1,251 @@ +# POT file for the Calculate activity +# Copyright (C) 2007 +# This file is distributed under the same license as the Calculate package. +# Reinier Heeres <reinier@heeres.eu>, 2007 +# Translations by Rafael Enrique Ortiz Guerrero + +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-22 18:20+0200\n" +"PO-Revision-Date: 2007-09-23 18:10-0300\n" +"Last-Translator: Xavier Alvarez <xavi.alvarez@gmail.com>\n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: calculate.py:27 calculate.py:170 setup.py:3 +msgid "Calculate" +msgstr "Calculadora" + +#: calculate.py:204 +msgid "Available functions:" +msgstr "Funciones disponibles:" + +# Need a bit more 'context' on the workings of the help system... +# ----------------------------------------- +# The help system uses topic msgid's that should be translated here. +# ----------------------------------------- +#, fuzzy +#: eqnparserhelp.py:33 +msgid "help_acos" +msgstr "Ayuda_acos" + +#, fuzzy +#: eqnparserhelp.py:34 +msgid "help_asin" +msgstr "Ayuda_asin" + +#, fuzzy +#: eqnparserhelp.py:35 +msgid "help_exp" +msgstr "Ayuda_exp" + +#, fuzzy +#: eqnparserhelp.py:36 +msgid "help_functions" +msgstr "Ayuda_funciones" + +#, fuzzy +#: eqnparserhelp.py:37 +msgid "help_operators" +msgstr "Ayuda_operadores" + +#, fuzzy +#: eqnparserhelp.py:38 +msgid "help_plot" +msgstr "Ayuda_plot" + +#, fuzzy +#: eqnparserhelp.py:39 +msgid "help_sqrt" +msgstr "Ayuda_sqrt" + +#, fuzzy +#: eqnparserhelp.py:40 +msgid "help_test" +msgstr "Ayuda_test" + +#, fuzzy +#: eqnparserhelp.py:41 +msgid "help_variables" +msgstr "Ayuda_variables" + +#, fuzzy +#: eqnparserhelp.py:49 +msgid "help_usage" +msgstr "Ayuda_uso" + +#, fuzzy +# Text assigned to the 'help' variable +msgid "help_var" +msgstr "Ayuda_var" + +# ----------------------------------------- +# End of help topics +# ----------------------------------------- +#: eqnparserhelp.py:52 +msgid "Topics" +msgstr "Temas" + +# should the command 'help(index)' be translated? +#: eqnparserhelp.py:63 +#, python-format +#, fuzzy +msgid "No help about '%s' available, use help(index) for the index" +msgstr "No hay ayuda disponible sobre '%s', use ayuda(indice) para el índice" + +#: eqnparser.py:87 +msgid "Type error" +msgstr "Error de tipo" + +#: eqnparser.py:107 +#, python-format +msgid "Error at %d" +msgstr "Error en %d" + +#: eqnparser.py:299 +#, python-format +msgid "variable '%s' not defined" +msgstr "la variable '%s' no definida" + +#: eqnparser.py:329 eqnparser.py:330 +#, python-format +msgid "Function '%s' not defined" +msgstr "La función '%s' no definida" + +#: eqnparser.py:335 +#, python-format +msgid "Invalid number of arguments (%d instead of %d)" +msgstr "Cantidad de argumentos incorrecta (%d en vez de %d)" + +#: eqnparser.py:336 +#, python-format +msgid "function takes %d args" +msgstr "la función usa %d argumentos" + +#: eqnparser.py:346 eqnparser.py:347 +#, python-format +msgid "Unable to parse argument %d: '%s'" +msgstr "Imposible de procesar el argumento %d: '%s'" + +#: eqnparser.py:356 +#, python-format +msgid "Function error: %s" +msgstr "Error de función: %s" + +#: eqnparser.py:358 +#, python-format +msgid "Function '%s' returned %s" +msgstr "La función '%s' retornó %s" + +#: eqnparser.py:487 +msgid "Parse error (right parenthesis)" +msgstr "Error de procesamiento (paréntesis derecho)" + +#: eqnparser.py:488 eqnparser.py:499 eqnparser.py:506 eqnparser.py:566 +msgid "Right parenthesis unexpected" +msgstr "No se esperaba un paréntesis derecho" + +# Should 'left_val' be considered translateable? +#, fuzzy +#: eqnparser.py:498 +msgid "Parse error (right parenthesis, no left_val)" +msgstr "Error de procesamiento (paréntesis derecho, sin valor_izquierdo)" + +#: eqnparser.py:505 +msgid "Parse error (right parenthesis, no level to close)" +msgstr "Error de procesamiento (paréntesis derecho, ningún nivel para cerrar)" + +#: eqnparser.py:513 +msgid "Number not expected" +msgstr "Número no esperado" + +#: eqnparser.py:556 eqnparser.py:557 +msgid "Invalid operator" +msgstr "Operador no válido" + +#: eqnparser.py:565 +msgid "Parse error: ')' expected" +msgstr "Error de procesamiento: ')' esperado" + +#: layout.py:46 +msgid "clear" +msgstr "borrar" + +#, fuzzy +#: layout.py:55 +msgid "enter" +msgstr "enter" + +#: layout.py:62 +msgid "Edit" +msgstr "Editar" + +#: layout.py:63 +msgid "Algebra" +msgstr "Algebra" + +#: layout.py:64 +msgid "Trigonometry" +msgstr "Trigonometría" + +#, fuzzy +#: layout.py:65 +msgid "Boolean" +msgstr "Lógico" + +#: layout.py:66 +msgid "Constants" +msgstr "Constantes" + +#: layout.py:67 +msgid "Format" +msgstr "Formato" + +#: layout.py:88 +msgid "Label:" +msgstr "Etiqueta:" + +#: layout.py:120 +msgid "All equations" +msgstr "Todas las ecuaciones" + +#: layout.py:120 +msgid "My equations" +msgstr "Mis ecuaciones" + +#: layout.py:122 +msgid "Show history" +msgstr "Mostrar historia" + +#: layout.py:122 +msgid "Show variables" +msgstr "Mostrar variables" + +#: mathlib.py:86 +msgid "Error" +msgstr "Error" + +#: mathlib.py:92 +msgid "Error: unsupported type" +msgstr "Error: tipo no soportado" + +#: plotlib.py:134 +msgid "Unable to parse range" +msgstr "Incapaz de procesar rango" + +#: toolbars.py:57 +msgid "Copy" +msgstr "Copiar" + +#: toolbars.py:60 +msgid "Paste" +msgstr "Pegar" + +#: toolbars.py:63 +msgid "Cut" +msgstr "Cortar" diff --git a/po/nl.po b/po/nl.po new file mode 100644 index 0000000..f845444 --- /dev/null +++ b/po/nl.po @@ -0,0 +1,238 @@ +# POT file for the Calculate activity +# Copyright (C) 2007 +# This file is distributed under the same license as the Calculate package. +# Reinier Heeres <reinier@heeres.eu>, 2007 +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-22 18:20+0200\n" +"PO-Revision-Date: 2007-09-23 12:16+0200\n" +"Last-Translator: Reinier Heeres <reinier@heeres.eu>\n" +"Language-Team: English\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: calculate.py:27 calculate.py:170 setup.py:3 +msgid "Calculate" +msgstr "Rekenmachine" + +#: calculate.py:204 +msgid "Available functions:" +msgstr "Beschikbare functies:" + +# ----------------------------------------- +# The help system uses topic msgid's that should be translated here. +# ----------------------------------------- +#: eqnparserhelp.py:33 +msgid "help_acos" +msgstr "acos(x), bepaal de hoek waarvan de cosinus x is. Geldig voor -1 <= x < 1" + +#: eqnparserhelp.py:34 +msgid "help_asin" +msgstr "asin(x), bepaal de hoek waarvan de sinus x is. Geldig voor -1 <= x < 1" + +#: eqnparserhelp.py:35 +msgid "help_exp" +msgstr "exp(x), geef e tot de macht x terug" + +#: eqnparserhelp.py:36 +msgid "help_functions" +msgstr "Toon beschikbare functies" + +#: eqnparserhelp.py:37 +msgid "help_operators" +msgstr "Toon beschikbare operators" + +#: eqnparserhelp.py:38 +msgid "help_plot" +msgstr "plot(f,domein), plot functie f over het gegeven domein. Voorbeeld: plot(x^3,x=-2..2)" + +#: eqnparserhelp.py:39 +msgid "help_sqrt" +msgstr "sqrt(x), geef de wortel van x terug" + +#: eqnparserhelp.py:40 +msgid "help_test" +msgstr "test is een voorbeeld help onderwerp, gebruik help(index) voor de index" + +#: eqnparserhelp.py:41 +msgid "help_variables" +msgstr "Toon beschikbare variables" + +#: eqnparserhelp.py:49 +msgid "help_usage" +msgstr "help(test) voor help over test, help(index) voor de index" + +# Text assigned to the 'help' variable +msgid "help_var" +msgstr "help(test) voor help over test, help(index) voor de index" + +# ----------------------------------------- +# End of help topics +# ----------------------------------------- +#: eqnparserhelp.py:52 +msgid "Topics" +msgstr "Onderwerpen" + +#: eqnparserhelp.py:63 +#, python-format +msgid "No help about '%s' available, use help(index) for the index" +msgstr "Geen help over '%s' beschikbaar, gebruik help(index) voor de index" + +#: eqnparser.py:87 +msgid "Type error" +msgstr "Type fout" + +#: eqnparser.py:107 +#, python-format +msgid "Error at %d" +msgstr "Fout op %d" + +#: eqnparser.py:299 +#, python-format +msgid "variable %s not defined" +msgstr "variabele %s niet gedefinieerd" + +#: eqnparser.py:329 eqnparser.py:330 +#, python-format +msgid "Function '%s' not defined" +msgstr "Functie '%s' niet gedefinieerd" + +#: eqnparser.py:335 +#, python-format +msgid "Invalid number of arguments (%d instead of %d)" +msgstr "Onjuist aantal argumenten (%d in plaats van %d)" + +#: eqnparser.py:336 +#, python-format +msgid "function takes %d args" +msgstr "Functie verwacht %d argumenten" + +#: eqnparser.py:346 eqnparser.py:347 +#, python-format +msgid "Unable to parse argument %d: '%s'" +msgstr "Kan argument %d niet verwerken: '%s'" + +#: eqnparser.py:356 +#, python-format +msgid "Function error: %s" +msgstr "Functie fout: %s" + +#: eqnparser.py:358 +#, python-format +msgid "Function '%s' returned %s" +msgstr "Functie '%s' returned %s" + +#: eqnparser.py:457 +#, python-format +msgid "Variable '%s' undefined" +msgstr "Variabele '%s' niet gedefinieerd" + +#: eqnparser.py:487 +msgid "Parse error (right parenthesis)" +msgstr "Verwerkingsfout (rechter haakje)" + +#: eqnparser.py:488 eqnparser.py:499 eqnparser.py:506 eqnparser.py:566 +msgid "Right parenthesis unexpected" +msgstr "Rechter haakje onverwacht" + +#: eqnparser.py:498 +msgid "Parse error (right parenthesis, no left_val)" +msgstr "Verwerkingsfout (rechter haakje, geen left_val)" + +#: eqnparser.py:505 +msgid "Parse error (right parenthesis, no level to close)" +msgstr "Verwerkingsfout (rechter haakje, geen level af te sluiten)" + +#: eqnparser.py:513 +msgid "Number not expected" +msgstr "Getal niet verwacht" + +#: eqnparser.py:556 eqnparser.py:557 +msgid "Invalid operator" +msgstr "Ongeldige operator" + +#: eqnparser.py:565 +msgid "Parse error: ')' expected" +msgstr "Verwerkingsfout: ')' verwacht" + +#: layout.py:46 +msgid "clear" +msgstr "leeg" + +#: layout.py:55 +msgid "enter" +msgstr "verwerk" + +#: layout.py:62 +msgid "Edit" +msgstr "Bewerk" + +#: layout.py:63 +msgid "Algebra" +msgstr "Algebra" + +#: layout.py:64 +msgid "Trigonometry" +msgstr "Trigonometrie" + +#: layout.py:65 +msgid "Boolean" +msgstr "Boolean" + +#: layout.py:66 +msgid "Constants" +msgstr "Constanten" + +#: layout.py:67 +msgid "Format" +msgstr "Opmaak" + +#: layout.py:88 +msgid "Label:" +msgstr "Naam:" + +#: layout.py:120 +msgid "All equations" +msgstr "Alle vergelijkingen" + +#: layout.py:120 +msgid "My equations" +msgstr "Mijn vergelijkingen" + +#: layout.py:122 +msgid "Show history" +msgstr "Toon geschiedenis" + +#: layout.py:122 +msgid "Show variables" +msgstr "Toon variabelen" + +#: mathlib.py:86 +msgid "Error" +msgstr "Fout" + +#: mathlib.py:92 +msgid "Error: unsupported type" +msgstr "Fout: type niet ondersteund" + +#: plotlib.py:134 +msgid "Unable to parse range" +msgstr "Kan domein niet verwerken" + +#: toolbars.py:57 +msgid "Copy" +msgstr "Kopieer" + +#: toolbars.py:60 +msgid "Paste" +msgstr "Plak" + +#: toolbars.py:63 +msgid "Cut" +msgstr "Knip" + |