#!/usr/bin/env python3 import gettext import locale from operator import add as op_add from operator import mul, sub, truediv from typing import Any, Callable from menu import Menu, MenuItem, MenuUI from user_input import read_number, read_nonzero_number # mypy and pylint don't work well with gettext.install lang, _enc = locale.getlocale() lang = lang or 'en' _ = gettext.translation('python_misc', localedir='locale', languages=[lang, lang.split('_')[0], 'en'], fallback=True).gettext def make_binop(binary_op: Callable[[Any, Any], Any], name: str, nonzero_second=False) -> Callable[[int], None]: def _op(__): first = read_number(_('Enter the first operand: ')) second_prompt = _('Enter the second operand: ') if nonzero_second: second = read_nonzero_number(second_prompt) else: second = read_number(second_prompt) print(_('The result is {0}.').format(binary_op(first, second))) _op.__name__ = name return _op if __name__ == '__main__': items = [MenuItem(_('Add'), make_binop(op_add, 'add')), MenuItem(_('Subtract'), make_binop(sub, 'subtract')), MenuItem(_('Multiply'), make_binop(mul, 'multiply')), MenuItem(_('Divide'), make_binop(truediv, 'divide', True))] menu = MenuUI(Menu(_('Calculator'), items[:2])) menu2 = MenuUI(Menu(_('Calculator 2'), items[2:])) menu.add_submenu('Calculator 2', menu2) menu.loop() print(_('Good bye!'))