Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReinier Heeres <reinier@heeres.eu>2007-09-24 07:24:09 (GMT)
committer Reinier Heeres <reinier@heeres.eu>2007-09-24 07:24:09 (GMT)
commitc5517f796f43ff7dfaaaf31acff36ab8f953967a (patch)
tree9d4df56a7e51e67af3dc7f5cec57498672cde45f
parent3491db3b24d9542f0c214b434729b753bd0565a4 (diff)
eqnparserhelp.py included, basic i18n support
-rw-r--r--MANIFEST4
-rw-r--r--calculate.py36
-rw-r--r--eqnparser.py118
-rw-r--r--eqnparserhelp.py67
-rw-r--r--layout.py11
-rw-r--r--po/POTFILES.in6
-rw-r--r--po/calculate.pot242
-rw-r--r--po/en.po239
-rw-r--r--po/es.po251
-rw-r--r--po/nl.po238
10 files changed, 1134 insertions, 78 deletions
diff --git a/MANIFEST b/MANIFEST
index 5d716a5..f423067 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -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)
diff --git a/layout.py b/layout.py
index 909d1a3..cf0186c 100644
--- a/layout.py
+++ b/layout.py
@@ -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"
+