pybik-2.1/0000775000175000017500000000000012556245305012651 5ustar barccbarcc00000000000000pybik-2.1/tools/0000775000175000017500000000000012556245305014011 5ustar barccbarcc00000000000000pybik-2.1/tools/check-po.py0000775000175000017500000003061612556223565016071 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2015 B. Clausius # # 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 3 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, see . import sys, os import unicodedata import polib try: from checkpo_override import version except ImportError: version = 0 if version > 0: from checkpo_override import overrides override_filename = os.path.dirname(__file__)+'/checkpo_override.py' override_defaults = dict(rpat=None, extrachars='', transchars=()) def overrides_to_internal(): if version == 0: if os.path.exists(override_filename): raise Exception('{!r} exists, but version is 0'.format(override_filename)) return [] if version == 3: def to_key(item): return item['lang'], item['msgid'], item['msgstr'] def to_val(item): def getitem(key): try: return item[key] except KeyError: return override_defaults[key] return item['opat'], getitem('rpat'), getitem('extrachars'), getitem('transchars'), 'unused' return {to_key(item):to_val(item) for item in overrides} raise Exception('unknown version {} in {!r}'.format(version, override_filename)) overrides = overrides_to_internal() def write_overrides(overrides): from io import StringIO from pprint import pprint, pformat def overrides_sort(val): lang, linenum, msgid, msgstr, *unused = val if isinstance(linenum, int): assert type(lang) is str, val assert type(linenum) is int, val return lang, '', linenum, msgstr else: assert type(lang) is str, val assert type(linenum) is str, val return lang, linenum, 0, msgstr overrides_gen = ((l,n,mi,ms,op,rp,ec,rc) for (l,mi,ms),(op,rp,ec,rc,n) in overrides.items()) overrides_ = sorted(overrides_gen, key=overrides_sort) out = StringIO() def piprint(prefix, msg, out): msg = pformat(msg, indent=1, width=100) msg = ('\n'+' '*(len(prefix)+7)).join(msg.splitlines()) print(' ' + prefix + '=' + msg + ',', file=out) print('version = 3', file=out) print('overrides = [', file=out) for l,n,mi,ms,op,rp,ec,rc in overrides_: print('dict( lang={!r}, linenum={},'.format(l, n), file=out) vals = zip(('msgid ','msgstr','opat','rpat','extrachars','transchars'), (mi, ms, op, rp, ec, rc)) vals = ((n,v) for n,v in vals if n not in override_defaults or override_defaults[n] != v) for name, val in vals: piprint(name, val, out) print(' ),', file=out) print(']', file=out) print(file=out) out = out.getvalue() with open(override_filename, 'wt', encoding='utf-8') as overridefile: overridefile.write(out) extra_chars = "-,;'/" trans_chars = ('…...',':.',':;','"«','"»') extra_chars_lang = {'ast': "¡", 'bn': '/', 'es': '¡´', 'fr': '\xa0’', 'gl': '\u0303', 'he': '\u05be\u05f3\u200f', 'ja': '\u30fc\u3001', 'km': '\xa0\u200b', 'lo': '\u0ec6', 'ru': '—', 'uk': '’—', 'uz': '‘ʻ’', 'zh_CN': '\uff0c\uff1b', 'zh_TW': '\uff0c\uff1b',} trans_chars_lang = {'bn': ('.\u0964',), 'cs': ('×x',), 'de': ('"„', '"“'), 'fr': ('×x',), 'gl': ('×x',), 'he': ('"„', '"“'), 'it': ('–-', '×x'), 'ja': ('!\uff01',), 'km': ('.\u17d4',), 'ms': ('–-', '×x'), 'pl': ('×x',), 'ru': ('–—',), 'uk': ('–—',), 'zh_CN': (':\uff1a', '!\uff01', '.\u3002', ':\uff0c', '"“', '"”'), 'zh_TW': (':\uff1a', '.\u3002', ), } extra_ucats_lang = {'bn': ('Lo', 'Mc', 'Mn'), 'he': ('Lo',), 'ja': ('Lo',), 'km': ('Lo', 'Mc', 'Mn'), 'lo' : ('Lo', 'Mn'), 'te': ('Lo', 'Mc', 'Mn'), 'th': ('Lo', 'Mn'), 'zh_CN': ('Lo',), 'zh_TW': ('Lo',), } #TODO: special checks for msgids like data/applications/pybik.desktop.in.h:4 class MsgidError (Exception): def __str__(self): return 'pot: {} in {!r}'.format(*self.args) class MsgError (Exception): def __str__(self): return '{}: {} in {!r}'.format(*self.args) def ischar(lang, c): return unicodedata.category(c) in ['Ll', 'Lu'] or c in extra_chars def ischarsp(lang, c, extrachars): if c == ' ': return True if c in extrachars: return True if ischar(lang, c): return True return unicodedata.category(c) in extra_ucats_lang.get(lang, ()) or c in extra_chars_lang.get(lang, '') def extract_pattern(lang, msgid): def ep_gen(): maybebrace = False nbraces = 0 bracestr = '' atstart = True spaces = '' link = '' digits = '' c = None imsgid = iter(msgid) for c in imsgid: if maybebrace: maybebrace = False if c == '{': yield '{{' elif c == '}': yield '{}' else: nbraces = 1 bracestr = '{' + c continue elif nbraces: if c == '\n': raise MsgidError('newline inside {}', msgid) if c == '{': nbraces += 1 if c == '}': nbraces -= 1 bracestr += c if not nbraces: yield bracestr bracestr = '' continue elif link: if c == '\n': raise MsgidError('newline inside <>', msgid) link += c if c == '>': yield link link = '' continue elif digits: if c in '0123456789': digits += c continue yield digits digits = '' elif spaces: if c == ' ': spaces += c continue elif atstart and c == '*': spaces += c continue elif c == '\n': atstart = True spaces += c continue else: if atstart: yield spaces atstart = False spaces = '' if c == '\n': atstart = True spaces = c continue if c == ' ': spaces = c continue elif c == '{': maybebrace = True elif c == '<': link = c elif c in '0123456789': digits = c elif not ischar(lang, c): yield c atstart = False if maybebrace: raise MsgidError('unclosed { at end', msgid) elif nbraces: raise MsgidError('unclosed { at end', msgid) elif link: raise MsgidError('unclosed < at end', msgid) elif digits: yield digits elif spaces: yield spaces return tuple(ep_gen()) def startswith_pattern(lang, string, pattern, replacechars): if string.startswith(pattern): return pattern for co, *cr in replacechars: cr = ''.join(cr) if co == pattern and string.startswith(cr): return cr for co, *cr in trans_chars_lang.get(lang, ()): cr = ''.join(cr) if co == pattern and string.startswith(cr): return cr for co, *cr in trans_chars: cr = ''.join(cr) if co == pattern and string.startswith(cr): return cr return None def match_pattern(lang, entry, patterns, msgstr): msgrest = msgstr assert type(msgrest) is str, type(msgrest) opatterns, rpatterns, extrachars, replacechars, linenum = overrides.get( (lang, entry.msgid, msgstr), (patterns, None, '', (), 'standard')) if opatterns != patterns: print('{}:error: pattern {} changed to {}'.format(entry.linenum, opatterns, patterns)) opatterns = patterns if linenum == 'unused': if (rpatterns is None or opatterns == rpatterns) and not extrachars and replacechars == (): del overrides[(lang, entry.msgid, msgstr)] else: overrides[(lang, entry.msgid, msgstr)] = opatterns, rpatterns, extrachars, replacechars, entry.linenum else: assert linenum == 'standard' or linenum == entry.linenum, (linenum, entry.linenum) if rpatterns is not None: patterns = rpatterns for i, pattern in enumerate(patterns): while msgrest: rpattern = startswith_pattern(lang, msgrest, pattern, replacechars) if rpattern is not None: msgrest = msgrest[len(rpattern):] break else: c = msgrest[0] if not ischarsp(lang, c, extrachars): overrides[(lang, entry.msgid, msgstr)] = opatterns, rpatterns, extrachars, replacechars, entry.linenum print('{}:error: found {!r} ({} {}) while searching for pattern[{}] of {!r}'.format( entry.linenum, c, hex(ord(c)), unicodedata.category(c), i, patterns)) break msgrest = msgrest[1:] else: rpattern = startswith_pattern(lang, msgrest, pattern, replacechars) if rpattern is None: overrides[(lang, entry.msgid, msgstr)] = opatterns, rpatterns, extrachars, replacechars, entry.linenum print('{}:error: pattern[{}] {!r} not found'.format(entry.linenum, i, pattern)) while msgrest: c = msgrest[0] if not ischarsp(lang, c, extrachars): overrides[(lang, entry.msgid, msgstr)] = opatterns, rpatterns, extrachars, replacechars, entry.linenum print('{}:error: found {!r} ({} {}) while searching for end'.format( entry.linenum, c, hex(ord(c)), unicodedata.category(c))) break msgrest = msgrest[1:] def check_postring(lang, entry): if not entry.translated(): return pattern = extract_pattern(lang, entry.msgid) if entry.msgid_plural: pattern_plural = extract_pattern(lang, entry.msgid_plural) if pattern != pattern_plural: raise MsgError(lang, 'msgid != msgid_plural', entry.msgid) if entry.msgstr: raise MsgError(lang, 'msgstr not empty for plural', entry.msgstr) for msgstr in entry.msgstr_plural.values(): match_pattern(lang, entry, pattern, msgstr) else: if entry.msgstr_plural: raise MsgError(lang, 'msgstr_plural not empty for singular', entry.msgstr_plural) match_pattern(lang, entry, pattern, entry.msgstr) def usage(): prog = os.path.basename(__file__) print('usage:') print(' ', prog, '-h') print(' ', prog) print(' print errors about:', override_filename) print(' ', prog, '-u') print(' write/update', override_filename) def main(): args = sys.argv[1:] update = False for arg in args: if arg == '-h': usage() return if arg == '-u': update = True else: print('unknown argument:', arg) usage() return try: for filename in sorted(os.listdir('po')): if filename.endswith('.po'): print('processing', filename) for entry in polib.pofile(os.path.join('po', filename)): check_postring(os.path.splitext(filename)[0], entry) except PipeError as e: print(e) return if update: write_overrides(overrides) if __name__ == '__main__': main() pybik-2.1/tools/check-reproducible.py0000775000175000017500000001366612556223565020140 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2015 B. Clausius # # 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 3 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, see . import sys, os sys.path.insert(0, '.') from glob import glob from subprocess import call, Popen, PIPE from difflib import unified_diff import pickle import pickletools from pprint import pformat from io import BytesIO, StringIO from pybiklib.config import MODELS_DIR from pybiklib.model import Model pformat_kwargs = {'compact': False} try: pformat_kwargs['width'] = os.environ['COLUMNS'] except KeyError: pass def pager(lines): process = Popen('less', stdin=PIPE, universal_newlines=True) try: process.stdin.writelines(lines) except BrokenPipeError: pass else: process.stdin.close() finally: process.wait() def bindiff(bytes1, bytes2): for i, (a, b) in enumerate(zip(bytes1, bytes2)): if a != b: print(' first difference in byte', i+1) break def pickle_disassembly(bytes): lines = [] strio = StringIO() pickletools.dis(bytes, out=strio, annotate=1) lines += strio.getvalue().splitlines(keepends=True) #for opcode, arg, pos in pickletools.genops(bytes): # lines.append('{2:4}: {0.name} arg:{1!r}\n'.format(opcode, arg, pos)) # lines.append(' {0.doc}\n'.format(opcode)) return lines def show_diff(filename1, filename2, bytes1, bytes2): len1 = len(bytes1) len2 = len(bytes2) if len1 != len2: print(' file contents have different length:', len1, len2) if bytes1 != bytes2: print(' file contents are different') bindiff(bytes1, bytes2) buffer1 = BytesIO(bytes1) data1 = pickle.load(buffer1) text1 = pformat(data1, **pformat_kwargs) dlen1 = buffer1.tell() vlen1 = len1 - dlen1 vectors1 = Model.read_vectors(buffer1) if vlen1 else [] buffer2 = BytesIO(bytes2) data2 = pickle.load(buffer2) text2 = pformat(data2, **pformat_kwargs) dlen2 = buffer2.tell() vlen2 = len2 - dlen2 vectors2 = Model.read_vectors(buffer2) if vlen2 else [] lines = [] if dlen1 != dlen2: print(' data parts have different length:', dlen1, dlen2) if bytes1[:dlen1] != bytes2[:dlen2]: print(' data parts are different') bindiff(bytes1[:dlen1], bytes2[:dlen2]) dis1 = pickle_disassembly(bytes1[:dlen1]) dis2 = pickle_disassembly(bytes2[:dlen2]) lines += unified_diff(dis1, dis2, filename1, filename2, 'pickle disassembly') if text1 != text2: print(' data parts have different content') lines += unified_diff(text1.splitlines(), text2.splitlines(), filename1, filename2, 'data') if vlen1 != vlen2: print(' vector parts have different length:', vlen1, vlen2) if bytes1[dlen1:] != bytes2[dlen2:]: print(' vector parts are different') bindiff(bytes1[dlen1:], bytes2[dlen2:]) vectors1 = [str(v)+'\n' for v in vectors1] vectors2 = [str(v)+'\n' for v in vectors2] lines += unified_diff(vectors1, vectors2, filename1, filename2, 'vectors') if lines: pager(lines) def build_models(args): call('./setup.py build_models -i --reproducible'.split() + args) def compare_models(dirname1, dirname2): assert os.path.exists(dirname1) assert os.path.exists(dirname2) filenames1 = os.listdir(dirname1) filenames2 = os.listdir(dirname2) print('comparing', dirname1, 'and', dirname2) for filename in sorted(set(filenames1 + filenames2)): if filename not in filenames1: print(' ', filename, 'not in', dirname1) elif filename not in filenames2: print(' ', filename, 'not in', dirname2) else: fn1 = os.path.join(dirname1, filename) fn2 = os.path.join(dirname2, filename) with open(fn1, 'rb') as f1, open(fn2, 'rb') as f2: s1 = f1.read() s2 = f2.read() if s1 != s2: print(' ', filename) show_diff(fn1, fn2, s1, s2) def main(): args = sys.argv[1:] if not args: print('usage:', os.path.basename(sys.argv[0]), 'n [buildargs]') print('build models n times and check whether they are the same') return count = int(args[0]) args = args[1:] prevdirname = None i = -1 for i, dirname in enumerate(sorted(glob(MODELS_DIR + '-*'))): curdirname = MODELS_DIR + '-{:04}'.format(i + 1) if curdirname != dirname and not os.path.exists(curdirname): os.rename(dirname, curdirname) else: curdirname = dirname if prevdirname is not None: compare_models(prevdirname, curdirname) prevdirname = curdirname if os.path.exists(MODELS_DIR) and prevdirname is not None: compare_models(prevdirname, MODELS_DIR) i += 1 for unused_i in range(i, i + count): if os.path.exists(MODELS_DIR): i += 1 prevdirname = MODELS_DIR + '-{:04}'.format(i) os.rename(MODELS_DIR, prevdirname) build_models(args) if not os.path.exists(MODELS_DIR): print('build failed') break if prevdirname is not None: compare_models(prevdirname, MODELS_DIR) if __name__ == '__main__': main() pybik-2.1/tools/format-translators.py0000775000175000017500000000450512515123203020217 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2013, 2015 B. Clausius # # 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 3 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, see . import sys, os sys.path.insert(0, '.') from ast import literal_eval import polib # to force an import error, po_isempty ignore it if polib is not installed from buildlib.utils import po_isempty def pprint_tranlators(translation_authors): print('[') for unused_template, langname, langcode, persons in translation_authors: filename = 'po/%s.po' % langcode if not os.path.exists(filename): print('not found:', filename, file=sys.stderr) continue if po_isempty(filename, verbose=False): print('empty:', filename, file=sys.stderr) continue print(' ({!r}, {!r}, ['.format(langname, langcode)) for person in persons: #XXX: Blacklist hack if person[1] == 'https://launchpad.net/~barcc' and langcode not in ['de', 'en_GB']: continue print(' {!r},'.format(person)) print(' ]),') print(']') def main(): data = sys.stdin.read() if not data.strip(): print('\nError: empty input, require output from "bc-lp-project-translators --py LPPROJECT"', file=sys.stderr) return try: tranlators = literal_eval(data) except (SyntaxError, ValueError): print('\nError: invalid syntax in input, require output from "bc-lp-project-translators --py LPPROJECT"') return try: pprint_tranlators(tranlators) except (ValueError, TypeError): print('\nError: malformed input, require output from "bc-lp-project-translators --py LPPROJECT"') raise if __name__ == '__main__': main() pybik-2.1/tools/conv_plugin_for_translation.py0000775000175000017500000000705712556244554022213 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2011-2015 B. Clausius # # 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 3 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, see . import sys, os, re sys.path.insert(0, os.getcwd()) from pybiklib import model model.Model.load_index() from pybiklib import pluginlib pluginlib._ = lambda v: '_({!r})'.format(v) pluginlib.ngettext = lambda s,p,n: 'ngettext({!r}, {!r}, {})'.format(s,p,n).replace('{','{{').replace('}','}}') try: from send_tracebacks import send_dbus_message except ImportError: send_dbus_message = lambda *args: print(*args) def convert(source_filename, target_filename): plugin = pluginlib.PluginFileLoader(source_filename) source_filename = os.path.abspath(source_filename) with open(target_filename, 'wt', encoding='utf-8') as target: translation_comment = None dstlineno = 0 srclineno = 0 for paragraph in plugin.body: path, pathitems, srclineno, translation_comment = paragraph['Path'] if translation_comment is not None: if ':' in translation_comment: translation_key, translation_comment = translation_comment.strip('#').strip().split(':', 1) if translation_key: translation_comment = '# ' + translation_comment.strip() else: translation_comment = None send_dbus_message('Warning', 'Empty translation key', source_filename, srclineno) else: translation_key = translation_comment.strip('#').strip().split() if translation_key: translation_key = translation_key[0] else: translation_comment = None send_dbus_message('Warning', 'Empty translation key', source_filename, srclineno) if ' ' in translation_key: send_dbus_message('Warning', 'Translation key contains whitespace', source_filename, srclineno) if pathitems is not None: values = [] for unused, v in pathitems: if v: if translation_comment and translation_key in re.split(r'\W+', v): values.append(translation_comment) values.append(v) while dstlineno < srclineno: target.write('\n') dstlineno += 1 for v in values: target.write(v) target.write('\n') dstlineno += 1 translation_comment = None else: translation_comment = None continue def main(): if len(sys.argv) != 2: print('usage: {} scriptfile'.format(os.path.basename(sys.argv[0]))) return 1 filename = sys.argv[1] convert(filename, filename+'.py') if __name__ == '__main__': sys.exit(main()) pybik-2.1/tools/uni2img.py0000775000175000017500000000372012556223565015746 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2013, 2015 B. Clausius # # 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 3 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, see . import os import unicodedata symbols = [ # list fonts: convert -list font ('ATOM SYMBOL', 'FreeSerif', 256, '+0-16'), ('BEAMED EIGHTH NOTES', 'FreeSerif', 256, '+0+5'), ('BLACK SMILING FACE', 'DejaVu-Sans-Oblique', 256, '-1+5'), ('PEACE SYMBOL', 'DejaVu-Sans-Oblique', 300, '-2+5'), ('SHAMROCK', 'DejaVu-Sans-Oblique', 300, '-1+5'), ('SKULL AND CROSSBONES','DejaVu-Sans-Oblique', 300, '-1+5'), ('SNOWFLAKE', 'FreeSerif', 320, '+0+14'), ('WHITE SMILING FACE', 'DejaVu-Sans-Oblique', 256, '-1+5'), ('WHITE SUN WITH RAYS', 'FreeMono', 390, '+0+0'), ('YIN YANG', 'DejaVu-Sans-Oblique', 300, '-2+5'), #'ANTICLOCKWISE GAPPED CIRCLE ARROW', #'CLOCKWISE GAPPED CIRCLE ARROW', ] path = 'data/ui/images' def main(): for name, font, size, pos in symbols: c = unicodedata.lookup(name) os.system('convert -size 256x256 null: -alpha transparent -font {} -pointsize {} -gravity center' ' -annotate 0x0{} {} "{}/{}.png"' .format(font, size, pos, c, path, name) .encode('utf-8')) if __name__ == '__main__': main() pybik-2.1/tools/patterncube.py0000664000175000017500000003162312407360042016673 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2014 B. Clausius # # 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 3 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, see . from collections import deque class PatternCubie (list): # value: (index, rotation) def __init__(self, model, position=None): self.model = model self.position = position def gray_conditions(self): for idx in range(self.model.cell_count): for rot in self.model.face_permutations.keys(): pos = self.model.rotated_position[rot][idx] if pos == self.position: yield idx, rot def set_gray(self): self[:] = list(self.gray_conditions()) return self def parse(self, position, condition): self.parse_or_condition(position, condition) assert self.position is not None, (self.position, position, condition) return self def __str__(self): pos = ''.join(self.model.cells_visible_faces[self.position]) vals = [] notconditions = list(self.not_conditions(self)) if len(notconditions) == 1: conditions = notconditions prefix = '!' else: conditions = self prefix = '' grouped = {} for idx, rot in conditions: grouped.setdefault(idx, []).append((idx, rot)) def cond2str(idx, rot): return ''.join(self.model.face_symbolic_to_face_color(face, rot) for face in pos).lower() for idx, conds in grouped.items(): if len(conds) > 1 and set(conds) == set(self.rotated_conditions(idx)): grouped[idx] = '*' + cond2str(*conds[0]) else: grouped[idx] = '|'.join(cond2str(*c) for c in conds) return '{}={}{}'.format(pos.lower(), prefix, '|'.join(grouped.values())) def parse_pattern_condition(self, position, condition, order=True): if order: def innergen(): for pface, cface in zip(position, condition): if '?' != cface != self.model.face_symbolic_to_face_color(pface, rot): break else: yield idx, rot else: def innergen(): cond = condition for pface in position: cface = self.model.face_symbolic_to_face_color(pface, rot) if cface in cond: cond = cond.replace(cface, '', 1) elif '?' in cond: cond = cond.replace('?', '', 1) else: break else: yield idx, rot position = position.upper() condition = condition.upper() for idx in range(self.model.cell_count): for rot in self.model.face_permutations.keys(): pos = self.model.rotated_position[rot][idx] if set(self.model.cells_visible_faces[pos]) == set(position): if self.position is None: self.position = pos else: assert self.position == pos, (self.position, pos) yield from innergen() def not_conditions(self, conditions): for c in self.gray_conditions(): if c not in conditions: yield c def rotated_conditions(self, idx): for rot in self.model.face_permutations.keys(): pos = self.model.rotated_position[rot][idx] if pos == self.position: yield idx, rot def parse_prefix_condition(self, position, condition): if condition.startswith('!'): if condition.startswith('!*'): conditions = [c for c in self.parse_pattern_condition(position, condition[2:], False)] else: conditions = [c for c in self.parse_pattern_condition(position, condition[1:], True)] citer = self.not_conditions(conditions) elif condition.startswith('*'): #TODO: Instead of testing only rotated conditions, test all permutations. # This should not break existing rules, and would allow to match # e.g. dfr and dfl. Could be done by comparing sorted strings after # expanding patterns. #DONE: use this in plugins module citer = self.parse_pattern_condition(position, condition[1:], False) else: citer = self.parse_pattern_condition(position, condition, True) for c in citer: self.union(*c) def parse_or_condition(self, position, condition): for c in condition.split('|'): self.parse_prefix_condition(position, c) def copy(self): cubie = self.__class__(self.model, self.position) cubie.extend(list(self)) return cubie def count(self): return len(self) def union(self, idx, rot): self.append((idx, rot)) def fork(self, condition): assert self.position == condition.position, (self.position, condition.position) assert self accepts, rejects = self.__class__(self.model, self.position), self.__class__(self.model, self.position) for c in self: if c in condition: accepts.append(c) else: rejects.append(c) return accepts or None, rejects or None def identify_rotation_blocks(self, maxis, mslice): return mslice == -1 or mslice == self.model.cell_indices[self.position][maxis] def transform(self, move): assert self axis, slice_, dir_ = move.data pos = self.position newpos = None irs = [] if self.identify_rotation_blocks(axis, slice_): for idx, rot in self: newpos_, rot = self.model.rotate_symbolic(axis, dir_, pos, rot) if newpos is None: newpos = newpos_ else: assert newpos == newpos_ irs.append((idx, rot)) assert newpos is not None cubie = self.__class__(self.model, newpos) cubie.extend(irs) assert cubie return cubie else: return self def check(self): if not self: warn('cubie is empty') if len(self) != len(set(self)): assert False, 'cubie has duplicates' if self == list(self.gray_conditions()): assert False, 'cubie is gray' class PatternCube (dict): # key: position # value: list of (index, rotation) def __init__(self, model): self.model = model # empty list matches everything, cubies added restrict matches # a PatternCube object that never matches is invalid, use None instead def parse(self, conditions): self.parse_and_condition(conditions) return self def parse_and_condition(self, conditions): for pos, cond in conditions: cubie = PatternCubie(self.model).parse(pos, cond) assert cubie self[cubie.position] = cubie def __str__(self): return ' '.join(str(v) for v in self.values()) def __bool__(self): return True def copy(self): cube = self.__class__(self.model) for k, v in self.items(): cube[k] = v.copy() return cube def count(self): cnt = 1 for pos in range(self.model.cell_count): if pos in self: cnt *= self[pos].count() else: cnt *= PatternCubie(self.model, pos).set_gray().count() return cnt def fork(self, condition): accepts = self.copy() rejects = [] for pos, cond in condition.items(): # indices in self but not in condition can be ignored if pos in self: cubie = self[pos] else: cubie = PatternCubie(self.model, pos).set_gray() accept, reject = cubie.fork(cond) if accept: if reject: accepts[pos] = accept reject_ = self.copy() reject_[pos] = reject reject_.check() rejects.append(reject_) # else: accept is full cubie, nothing to do else: if reject: self.check() return None, [self.copy()] else: assert False, 'empty PatternCube not allowed' return accepts, rejects def transform(self, move): cube = self.__class__(self.model) for pos, cubie in list(self.items()): cubie = cubie.transform(move) cube[cubie.position] = cubie return cube def check(self): for pos, cubie in self.items(): assert pos == cubie.position cubie.check() def check_empty_simple(self): for pos1, cubie1 in self.items(): if len(cubie1) == 1: idx1, rot1 = cubie1[0] for pos2, cubie2 in self.items(): if pos1 != pos2: if [idx2 for idx2, rot2 in cubie2 if idx1 == idx2]: cubie2[:] = [(idx2, rot2) for idx2, rot2 in cubie2 if idx1 != idx2] if not cubie2: return True return False def check_empty_full(self): indexlist = [] for cubie in self.values(): indexlist.append(set(idx for idx, rot in cubie)) iters = deque() sample = deque() i = 0 while i < len(indexlist): # new iter for i, must have at least one item iit = iter(indexlist[i]) try: iidx = next(iit) except StopIteration: return True # idx must be unique forceloop = False while forceloop or iidx in sample: try: iidx = next(iit) forceloop = False except StopIteration: # no unique idx, continue with prev iter try: iit = iters.pop() except IndexError: return True sample.pop() i -= 1 forceloop = True iters.append(iit) sample.append(iidx) i += 1 return False def join(self, cube): issubset = True issuperset = True diffs = [] for pos in range(self.model.cell_count): if pos in self: selfv = set(self[pos]) if pos in cube: cubev = set(cube[pos]) issubset = issubset and selfv.issubset(cubev) issuperset = issuperset and selfv.issuperset(cubev) if selfv != cubev: diffs.append(pos) else: issuperset = False diffs.append(pos) else: if pos in cube: issubset = False diffs.append(pos) else: pass if issubset: return cube if issuperset: return self if len(diffs) == 1: res = self.copy() pos = diffs[0] res[pos].clear() res[pos].extend(list(set(self[pos] + cube[pos]))) assert res[pos] return res return None def rotate_colors(self, rot): perm = self.model.rotated_position[rot] cube = PatternCube(self.model) for pos, cubie in self.items(): assert cubie permpos = perm.index(pos) newcubie = PatternCubie(self.model, pos) for cidx, crot in cubie: ridx = perm.index(cidx) rrot = self.model.norm_symbol(rot + crot) newcubie.union(ridx, rrot) assert newcubie cube[pos] = newcubie return cube pybik-2.1/tools/pybikshell.py0000775000175000017500000001415512510300132016516 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2015 B. Clausius # # 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 3 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, see . import sys, os sys.path.insert(0, '.') import cmd from contextlib import suppress from pybiklib import config, cubestate, model from pybiklib.moves import MoveQueue from tools import patterncube def convert(salg): moves = { "": "", "F": "f", "B": "b", "R": "r", "L": "l", "U": "u", "D": "d", "F'": "f-", "B'": "b-", "R'": "r-", "L'": "l-", "U'": "u-", "D'": "d-", "F2": "ff", "B2": "bb", "R2": "rr", "L2": "ll", "U2": "uu", "D2": "dd", "F'2": "ff", "B'2": "bb", "R'2": "rr", "L'2": "ll", "U'2": "uu", "D'2": "dd", "M": "r2-", "E": "u2-", "S": "f2", "M'": "r2", "E'": "u2", "S'": "f2-", "M2": "r2r2", "E2": "u2u2", "S2": "f2f2", "M2'": "r2r2", "E2'": "u2u2", "S2'": "f2f2", "x": "R", "y": "U", "z": "F", "x'": "R-", "y'": "U-", "z'": "F-", "x2": "RR", "y2": "UU", "z2": "FF", "x2'": "RR", "y2'": "UU", "z2'": "FF", } palg = '' for m in salg.split(' '): palg += moves[m.strip('()')] return palg def modelobj_from_string(modelstr): modelstr, mtype, sizes, exp = model.Model.from_string(modelstr) if exp is not None: raise ValueError('with-expression not allowed here') return model.Model(mtype, sizes) class Shell (cmd.Cmd): intro = 'Welcome to the Pybik shell. Type help or ? to list commands.\n' prompt = '> ' history_file = os.path.join(config.USER_CONFIG_DIR, 'shell-history') def __init__(self, **kwargs): super().__init__(**kwargs) model.Model.load_index() self.do_reset() # commands def do_reset(self, arg=None): '''reset to the initial state: reset''' self.model = modelobj_from_string('Cube 3') self.pattern = patterncube.PatternCube(self.model) def do_show(self, arg): '''show the current state: show''' print(self.model) print('pattern:', self.pattern) def do_quit(self, arg): '''exit Pybik shell: quit or Ctrl+D''' return True def do_model(self, arg): '''show or set current model: model [NEWMODEL]''' if arg: self.model = modelobj_from_string(arg) print(self.model) def do_singmaster(self, arg): '''convert singmaster moves to Pybik moves: singmaster NOTATION''' print(convert(arg)) def do_posrot(self, arg): '''parse posrot notation of cube states: posrot NOTATION''' cube = cubestate.CubeState(self.model) if ':' not in arg: arg = 'idx-rot:' + arg cube.parse_block(arg) print('permutation:', [pos for pos, rot in cube._blocksn]) print('rotations: ', ', '.join(rot for pos, rot in cube._blocksn)) pattern = patterncube.PatternCube(self.model) for pos, (idx, rot) in enumerate(cube._blocksr): cubie = patterncube.PatternCubie(self.model, pos) cubie.union(idx, rot) pattern[pos] = cubie print('pattern:', pattern) self.pattern = pattern def do_pattern(self, arg): '''parse patterns notation of cube states: pattern NOTATION''' pattern = patterncube.PatternCube(self.model) pattern.parse([c.split('=') for c in arg.split()]) print('pattern:', pattern) self.pattern = pattern def do_move(self, arg): '''transform the current pattern: moves MOVECODE''' moves = MoveQueue() moves.parse(arg, len(arg), self.model) #print('moves:', moves.format(self.model)[0]) for move in moves.moves: self.pattern = self.pattern.transform(move) print('pattern:', self.pattern) def do_match(self, arg): '''match the current pattern to an other pattern: match PATTERN''' condition = patterncube.PatternCube(self.model) condition.parse([c.split('=') for c in arg.split()]) print('condition:', condition) accept, reject = self.pattern.fork(condition) print('accept:', accept) print('reject:', '\n '.join(str(r) for r in reject)) # ---------------- def onecmd(self, line): cmd, arg, line = self.parseline(line) if not line: return self.emptyline() if cmd is None: return self.default(line) if line == 'EOF': print() return True self.lastcmd = line if cmd == '': return self.default(line) else: try: func = getattr(self, 'do_' + cmd) except AttributeError: return self.default(line) try: return func(arg) except Exception: sys.excepthook(*sys.exc_info()) self.stdout.write('*** Error in: %s\n' % line) return None def preloop(self): with suppress(ImportError, FileNotFoundError): import readline readline.read_history_file(self.history_file) def postloop(self): with suppress(ImportError, OSError): import readline readline.write_history_file(self.history_file) def main(): Shell().cmdloop() if __name__ == '__main__': main() pybik-2.1/tools/create-gl-pxd.py0000775000175000017500000002263112510300110016776 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2015 B. Clausius # # 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 3 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, see . import sys from os.path import basename, join, isfile, isdir import re vendors = 'ARB NV NVX ATI 3DLABS SUN SGI SGIX SGIS INTEL 3DFX IBM MESA GREMEDY OML OES PGI I3D INGR MTX'.split() vendors += 'KHR AMD APPLE EXT HP MESAX SUNX WIN'.split() def parse_lineno(headers): hlines = {} for unused_abspath, relpath, source in headers: glversion = '0.0' lines = [] for lineno, match in enumerate(re.finditer(r'^[^\n]*$', source, re.MULTILINE | re.DOTALL)): posa = match.start() pose = match.end() line = match.group() match = re.match(r'\s*#\s*define\s+GL_VERSION_([0-9_]*).*', line) if match is not None: glversion = match.group(1).replace('_', '.') if glversion in ['1.0', '1.1', '1.2']: glversion = '1.3' lines.append((posa, pose, lineno, glversion)) hlines[relpath] = lines return hlines def find_lineno(lines, pos): for posa, pose, lineno, glversion in lines: assert pos >= posa if pos < pose: return lineno, glversion assert False def convert_symbols_define(headers, code, symbols, hlines): for abspath, relpath, source in headers: yield '\n\n# from {}:\n'.format(abspath) yield "cdef extern from '{}':".format(relpath) for match in re.finditer(r'^\#define[ \t]+(GL_\w+).*?$', source, re.MULTILINE | re.DOTALL): sym = match.group(1) ssym = sym.split('_') if code and re.search(r'\b%s\b' % re.escape(sym), code) is None: continue if sym.upper() != sym or ssym[-1] in vendors: continue unused_lineno, glversion = find_lineno(hlines[relpath], match.start()) if (glversion, sym) not in symbols: symbols.append((glversion, sym)) print('.', end='', file=sys.stderr, flush=True) yield match.expand(r' enum: \1') print(file=sys.stderr) def convert_symbols_typedef(headers, code, symbols, hlines): for abspath, relpath, source in headers: yield '\n\n# from {}:\n'.format(abspath) for match in re.finditer(r'^(typedef(\s+(\w+))*);.*?$', source, re.MULTILINE | re.DOTALL): mg1 = match.group(1) mg1 = mg1.replace('khronos_float_t', 'float') mg1 = mg1.replace('khronos_', '') if not mg1.endswith(('_t', '64')) and not (mg1[-2:].isalpha() and mg1[-2:].isupper()): sym = match.group(3) unused_lineno, glversion = find_lineno(hlines[relpath], match.start()) if (glversion, sym) not in symbols: if code and re.search(r'\b%s\b' % re.escape(sym), code) is None: continue symbols.append((glversion, sym)) print('.', end='', file=sys.stderr, flush=True) yield 'c'+mg1 print(file=sys.stderr) def const_types(types, code): yield '\n\ncdef extern from *:' for type in types.split(): consttype = 'const_{0}_ptr'.format(type) if code and re.search(r'\b%s\b' % re.escape(consttype), code) is None: continue print('.', end='', file=sys.stderr, flush=True) yield ' ctypedef {0}* {1} "const {0}*"'.format(type, consttype) print(file=sys.stderr) def convert_symbols_functions(headers, code, symbols, hlines): for abspath, relpath, source in headers: yield '\n\n# from {} with:\n'.format(abspath) yield "cdef extern from '{}':".format(relpath) for match in re.finditer( r'^(?:GLAPI|GL_APICALL)([\s\w*]*?)(?:GLAPIENTRY|APIENTRY|GL_APIENTRY)([^(]*)\(([^)]*)\);(.*?)$', source, re.MULTILINE | re.DOTALL): mg2s2 = match.group(2).strip()[-2:] if mg2s2.isalpha() and mg2s2.isupper(): continue for mgf in (match.group(1).find, match.group(3).find): if not mgf('64') == mgf('GLsync') == mgf('GLDEBUGPROC') == -1: break else: if match.group(3).strip() == 'void': template = r' cdef\1\2()\4' else: template = r' cdef\1\2(\3)\4' sym = match.group(2).strip() unused_lineno, glversion = find_lineno(hlines[relpath], match.start()) if (glversion, sym) not in symbols: if code and re.search(r'\b%s\b' % re.escape(sym), code) is None: continue symbols.append((glversion, sym)) print('.', end='', file=sys.stderr, flush=True) yield match.expand(template).replace('const ', '').replace('const*', '*') \ .replace(' in,', ' in_,').replace('/*', '#/*') print(file=sys.stderr) def convert_symbols(headers, code, print_symbols=False): yield '\nfrom libc.stddef cimport ptrdiff_t' yield 'from libc.stdint cimport int32_t, intptr_t, int8_t, uint8_t' code = '\n'.join(c for abspath, relpath, c in code) symbols = [] hlines = parse_lineno(headers) yield from convert_symbols_define(headers, code, symbols, hlines) yield from convert_symbols_typedef(headers, code, symbols, hlines) yield from const_types('GLubyte GLboolean GLvoid GLchar GLfloat GLint GLshort ' 'GLbyte GLuint GLushort GLclampf GLsizei GLenum void', code) yield from convert_symbols_functions(headers, code, symbols, hlines) assert len(symbols) == len(set(symbols)) assert len([s for v,s in symbols]) == len(set(s for v,s in symbols)) symbols = sorted(symbols) yield '\n# GL version {} needed\n'.format(symbols[-1][0]) if print_symbols: for glversion, sym in symbols: print('{} {}'.format(glversion, sym)) def read_url(url, filename): import urllib.request text = urllib.request.urlopen(url).read().decode('utf-8') return [(url, filename, text)] def read_files(path, filenames): code = [] for filename in filenames: absfilename = join(path, filename) if isdir(path) else path with open(absfilename, 'rt', encoding='utf-8') as file: code.append((absfilename, filename, file.read())) return code def create_pxd(headers, outfilename, code, **kwargs): with open(outfilename, 'wt', encoding='utf-8') as file: print('# {}'.format(outfilename), file=file) print('# generated with:', *sys.argv, file=file) for token in convert_symbols(headers, code, **kwargs): print(token, file=file) def usage(status): print('usage:\n' '{0} [-h|--help]\n' '{0} [-s] HEADER PXDFILE [FILENAMES]\n' '{0} update PXDFILE\n' 'HEADER is gl, gles2, gles3, a filename or a url.\n' 'If FILENAMES are given, the generated gl.pxd contains only symbols found in the files.' .format(basename(sys.argv[0]))) sys.exit(status) def main(): def parse_options(): args = sys.argv[1:] if not args or args[0] in ['-h', '--help']: usage(0) kwargs = {} if args[0] == '-s': kwargs['print_symbols'] = True args = args[1:] return args, kwargs args, kwargs = parse_options() if len(args) < 2: print('wrong number of arguments') usage(1) pxdfile = args[1] if args[0] == 'update': import shlex args = re.search(r'^# generated with: (.*)$', read_files(pxdfile, [None])[0][-1], re.MULTILINE).group(1) sys.argv[1:] = shlex.split(args)[1:] sys.argv[2] = pxdfile args, unused_kwargs = parse_options() code = read_files('.', args[2:]) includedir = '/usr/include' if args[0] == 'gl': headers = read_files(includedir, ['GL/gl.h', 'GL/glext.h']) create_pxd(headers, pxdfile, code, **kwargs) elif args[0] == 'gles2': headers = read_files(includedir, ['GLES2/gl2.h', 'GLES2/gl2ext.h']) create_pxd(headers, pxdfile, code, **kwargs) elif args[0] == 'gles3': headers = read_files(includedir, ['GLES3/gl3.h']) create_pxd(headers, pxdfile, code, **kwargs) elif isfile(args[0]): headers = read_files(args[0], ['GL/gl.h']) create_pxd(headers, pxdfile, code, **kwargs) elif args[0].startswith('http://') or args[0].startswith('https://'): headers = read_url(args[0], 'GL/gl.h') create_pxd(headers, pxdfile, code, **kwargs) else: print('wrong argument:', args[0]) usage(1) if __name__ == '__main__': main() pybik-2.1/COPYING0000664000175000017500000010451312130247775013711 0ustar barccbarcc00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . pybik-2.1/build_local.sh0000775000175000017500000000014212556223565015462 0ustar barccbarcc00000000000000#!/bin/sh set -e ./setup.py build --inplace --parallel=True "$@" build_doc install_desktop --ask pybik-2.1/PKG-INFO0000664000175000017500000000214612556245305013751 0ustar barccbarcc00000000000000Metadata-Version: 1.1 Name: pybik Version: 2.1 Summary: Rubik's cube game Home-page: https://launchpad.net/pybik/ Author: B. Clausius Author-email: barcc@gmx.de License: GPL-3+ Download-URL: https://launchpad.net/pybik/+download Description: Pybik is a 3D puzzle game about the cube invented by Ernő Rubik. * Different 3D puzzles - up to 10x10x10: cubes, towers, bricks, tetrahedra and prisms * Solvers for some puzzles * Pretty patterns * Editor for move sequences * Changeable colors and images Keywords: rubik cube puzzle game Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: X11 Applications :: Qt Classifier: Intended Audience :: End Users/Desktop Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+) Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Cython Classifier: Topic :: Games/Entertainment :: Puzzle Games pybik-2.1/po/0000775000175000017500000000000012556245305013267 5ustar barccbarcc00000000000000pybik-2.1/po/th.po0000664000175000017500000010371512556245211014245 0ustar barccbarcc00000000000000# Thai translation for pybik # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-24 10:30+0000\n" "Last-Translator: Rockworld \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-25 05:16+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "แก้ปัญหาแล้ว" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "คุณควรจะได้รับสำเนาของ GNU General Public License ที่มาพร้อมกับโปรแกรมนี้ " "ถ้าไม่มี ดูได้ที่ " #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "แสงสว่าง" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "ธรรมดา" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "plain" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "เลื่อน" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "กุญแจ" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "เปิดรูปภาพ" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/lo.po0000664000175000017500000011157212556245211014244 0ustar barccbarcc00000000000000# Lao translation for pybik # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-05 08:27+0000\n" "Last-Translator: Rockworld \n" "Language-Team: Lao \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "ເກີດຂໍ້ຜິດພາດຂະນະກຳລັງອ່ານການຕັ້ງຄ່າ:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "ກົດປຸ່ມ Esc ເພື່ອອອກຈາກໂໝດແກ້ໄຂ" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} ການເຄື່ອນຍ້າຍ" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "ໄດ້ຮັບການແກ້ໄຂ" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "ບໍ່ໄດ້ຮັບການແກ້ໄຂ" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "ຂໍສະແດງຄວາມຍິນດີນຳ, ທ່ານໄດ້ແກ້ໄຂປິດສະນາແລ້ວ!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "ເກມລູກບາດຂອງ Rubik" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "ໂປຣແກຣມນີ້ແມ່ນຊອບແວຟຣີ: ທ່ານສາມາດເຜີຍແຜ່ມັນຊ້ຳແລະ/" "ຫຼືແກ້ໄຂມັນພາຍໃຕ້ຂໍ້ຕົກລົງຂອງໃບອະນຸຍາດສາທາລະນະ GNU ເຊິ່ງຖືກເຜີຍແຜ່ໂດຍ Free Software " "Foundation, ລຸ້ນ 3 ຂອງໃບອະນຸຍາດ, ຫຼື (ໂດຍໂຕເລືອກຂອງທ່ານ) ລຸ້ນໃໝ່ກວ່າ.\n" "\n" "ໂປຣແກຣມນີ້ຖືກເຜີບແຜ່ໂດຍມີວັດຖຸປະສົງວ່າມັນຈະມີປະໂຫຍດ, ແຕ່ບໍ່ມີການຮັບປະກັນໃດໆ; " "ນອກຈາກມີຄວາມໝາຍໃນທາງການຊື້ຂາຍ ຫຼືສຳລັບວັດຖຸປະສົງໂດຍສະເພາະ. ເບິ່ງໃບອະນຸຍາດສາທາລະນະ GNU " "ສຳລັບລາຍງະອຽດເພີ່ມເຕີມ." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "ອ່ານຂໍ້ຄວາມເຕັມຂອງ ໃບອະນຸຍາດສາທາລະນະ GNU<|> ຫຼືເບິ່ງ ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "ທ່ານຄວນໄດ້ຮັບສຳເນົາຂອງໃບອະນຸຍາດສາທາລະນະ GNU ພ້ອມກັບໂປຣແກຣມນີ້. ຫາກບໍ່, ເບິ່ງ ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "ຫາກທ່ານພົບບັນຫາໃດໆໃນ Pybik ຫຼືມີຄຳແນະນຳສຳລັບການປັບປຸງ ກໍ່ກະລຸນາສົ່ງ <{CONTACT_FILEBUG}|" ">ການລາຍງານບັນຫາ<|>. ໃນກໍລະນີສຸດທ້າຍ ທ່ານສາມາດເຮັດເຄື່ອງໝາຍໃຫ້ກັບການລາຍງານບັນຫາເປັນ " "\"ສິ່ງທີ່ຢາກໄດ້\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "ການແປພາສາຖືກຈັດການໂດຍ ກຸ່ມແປພາສາ Launchpad<|>.\n" "\n" "ຫາກທ່ານຕ້ອງການຊ່ວຍແປ Pybik ໃຫ້ເປັນພາສາຂອງທ່ານ ທ່ານສາມາດເຮັດມັນຜ່ານທາງ ສ່ວນຕິດຕໍ່ເວັບ<|>.\n" "\n" "ອ່ານເພີ່ມເຕີມກ່ຽວກັບ \"ການແປພາສາໂດຍໃຊ້ " "Launchpad\"<|> ແລະ \"ເລີ່ມການແປພາສາ\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/sr.po0000664000175000017500000010731012556245211014251 0ustar barccbarcc00000000000000# Serbian translation for pybik # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the pybik package. # Мирослав Николић , 2012, 2013. msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-03-28 23:00+0000\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} потез" msgstr[1] "{current} / {total} потеза" msgstr[2] "{current} / {total} потеза" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "решено" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "није решено" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Питонова коцка" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 #, fuzzy msgid "* Pretty patterns" msgstr "Занимљиви обрасци" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Требали сте да примите примерак Гнуове опште јавне лиценце уз овај програм. " "Ако нисте, погледајте ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Осветљавање" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "обично" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "&Помоћ" #: ../pybiklib/ui/main.py:47 #, fuzzy msgid "&Game" msgstr "&Игра" #: ../pybiklib/ui/main.py:48 #, fuzzy msgid "&Edit" msgstr "&Уређивање" #: ../pybiklib/ui/main.py:49 #, fuzzy msgid "&View" msgstr "П&реглед" #: ../pybiklib/ui/main.py:50 #, fuzzy msgid "&Help" msgstr "&Помоћ" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Идите на следећи знак (или на крај) у низу потеза" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Вратите се један потез уназад" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Покрените унапред кроз низ потеза" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Начините један потез унапред" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Идите на претходни знак (или на крај) у низу потеза" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Забележите овај потез у низ потеза" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Уклоните знак на текућем месту у низу потеза" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "&Помоћ" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Поставке" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Миш" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Четири смера" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Боја:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Датотека слике:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Позадина:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Решавачи" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Горње ивице" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Горњи углови" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Средњи прстен" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Оријентир доње ивице" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Оријентир доњег угла" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Место доњег угла" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Место доње ивице" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Шпигел" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Побољшани шпигел" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Горњи прстен" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Занимљиви обрасци" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Траке" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Унакрсно" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Пржена јаја" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 пржених јаја" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 пржених јаја" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Цик-цак" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "Т време" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Горње ивице" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Горње ивице" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Горње ивице" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Горњи углови" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "Место доњег угла" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "Место доњег угла" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Горњи углови" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Горе" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Доле" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Лево" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Десно" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Спреда" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Отпозади" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Величина:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Десно" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Спреда" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/de.po0000664000175000017500000012117412556245211014221 0ustar barccbarcc00000000000000# German translation for pybik # Copyright (C) 2009-2015 B. Clausius # This file is distributed under the same license as the pybik package. # B. Clausius , 2009-2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-20 18:06+0000\n" "Last-Translator: B. Clausius \n" "Language-Team: German\n" "Language: \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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Beim Lesen der Einstellungen ist ein Fehler aufgetreten:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Drücken Sie die Esc-Taste, um den Edit-Modus zu beenden" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} Zug" msgstr[1] "{current} / {total} Züge" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "gelöst" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "ungelöst" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Glückwunsch, Sie haben das Puzzle gelöst!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Rubiks Zauberwürfelspiel" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "Pybik ist ein 3D-Puzzle mit dem von Ernő Rubik erfundenen Würfel." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Verschiedene 3D-Puzzles - bis 10x10x10:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr " Würfel, Türme, Ziegel, Tetraeder und Prismen" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Lösungen für einige Puzzles" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Muster" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Bearbeitbare Zugabfolgen" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Änderbare Farben und Bilder" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Dieses Programm ist freie Software. Sie können es unter den Bedingungen der " "GNU General Public License, wie von der Free Software Foundation " "veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 " "der Lizenz oder (nach Ihrer Option) jeder späteren Version.\n" "\n" "Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen " "von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die " "implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN " "BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Lesen sie den vollständigen Text der GNU General " "Public License<|> oder siehe ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem " "Programm erhalten haben. Falls nicht, siehe ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Wenn Sie irgendwelche Fehler in Pybik gefunden haben oder einen " "Verbesserungsvorschlag haben, erstellen Sie bitte einen <{CONTACT_FILEBUG}|" ">Fehlerbericht<|>. Im letzteren Fall können Sie den Fehlerbericht als " "„Wishlist“ markieren." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Übersetzungen werden von der Launchpad Übersetzer-Gruppe<|> gemacht.\n" "\n" "Wenn Sie bei der Übersetzung von Pybik helfen wollen, können Sie das über " "die Web-Oberfläche<|> tun.\n" "\n" "Lesen Sie mehr über „Translating " "with Launchpad“<|> und „Starting to translate“<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Drücken Sie eine Taste …" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Beleuchtung" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "einfach" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Das Programm muss neu gestartet werden, damit die Änderungen wirksam werden." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "einfarbig" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "Auswählen …" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Zug" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Taste" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Ein Bild öffnen" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Der Vorgang wird abgebrochen, bitte warten" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Die Maus benutzen zum Würfeldrehen" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Wenn man die Maus über das Puzzle bewegt, zeigt der pfeilförmige Mauszeiger " "die Richtung an, in der sich die Schicht bewegen wird." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "Der linke Maustaste dreht eine einzelne Schicht in Pfeilrichtung." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "Der rechte Maustaste dreht eine einzelne Schicht entgegen der Pfeilrichtung." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Um den ganzen Würfel zu drehen anstelle einer einzelnen Schicht, muss man " "die Strg-Taste halten während man die Maustaste drückt." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Die Tastatur benutzen zum Würfeldrehen" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Der Tastatur-Fokus muss auf dem Würfel sein (um das zu erreichen kann man " "beispielsweise auf Hintergrund klicken). Die Tasten können im " "Einstellungsdialog geändert werden, die Voreinstellung ist:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" "Bewegt die linke, rechte, obere, untere, vordere oder hintere Schicht im " "Uhrzeigersinn." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Bewegt eine Schicht gegen den Uhrzeigersinn." #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Bewegt den ganzen Würfel." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Andere (Maus-)Tasten" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Mausrad – Vergrößern/Verkleinern" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" "Pfeiltasten, Linke Maustaste auf den Hintergrund – Ändert die Blickrichtung " "auf den Würfel." #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" "Bewegt den Tastatur-Fokus zur Bearbeitungsleiste für Zugfolgen. Die Notation " "für die Zugfolgen werden weiter unten beschrieben. Durch das Drücken der " "Eingabetaste werden die Änderungen angewendet." #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "Notation für Zugfolgen" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "Alle Züge werden sofort über dem Würfelbereich angezeigt:" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" "Bewegt die erste, zweite oder dritte Schicht von links im Uhrzeigersinn. " "Erlaubt sind Zahlen von 1 bis zur Anzahl paralleler Schichten. \"l1\" ist " "immer gleich \"l\" und für den klassischen 3×3×3-Würfel is \"l2\" gleich " "\"r2-\" und \"l3\" ist gleich \"r-\"." #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "Ein Leerzeichen trennt Gruppen von Zugfolgen." #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybik Projekt-Webseite" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "Dieses Plugin funktioniert für kein Modell.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "Dieses Plugin funktioniert nur für:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Dieses Puzzle ist nicht lösbar." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "deaktiviert" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "hässlich" #: ../pybiklib/schema.py:154 msgid "low" msgstr "schwach" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "mittel" #: ../pybiklib/schema.py:155 msgid "high" msgstr "stark" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "stärker" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" "Die Einstellungen können nicht in die Datei geschrieben werden: " "{error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Über Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Über" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Übersetzer:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Feedback" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Übersetzen" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Lizenz" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Hilfe" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Spiel" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Bearbeiten" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Ansicht" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Hilfe" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Neu, zufällig" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Ne&u, gelöst" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Beenden" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "Puzzle aus&wählen …" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "Als &Ausgangszustand festlegen" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Rotation zurücksetzen" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Einstellungen …" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Werkzeugleiste" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Statusleiste" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Info …" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Zurückspulen" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Gehe zur vorherigen Markierung (oder dem Anfang) der Zugabfolge" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Zurück" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Einen Schritt zurück" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Stopp" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Abspielen" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Laufe vorwärts durch die Zugabfolge" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Weiter" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Einen Schritt weiter" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Vorspulen" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Gehe zur nächsten Markierung (oder dem Ende) der Zugabfolge" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Markierung einfügen" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Markiere die aktuelle Stelle in der Zugabfolge" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Markierung entfernen" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Markierung an der aktuellen Stelle in der Zugabfolge entfernen" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Bearbeiten-Leiste" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "&Hilfe …" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "Puzzle auswählen" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Einstellungen" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Grafik" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Animationsgeschwindigkeit:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Spiegel-Abstand:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "Qualität:" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" "Schwächeres Antialiasing bedeutet eine bessere Leistung, stärkeres " "Antialiasing bedeutet eine bessere Qualität." #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "Antialiasing:" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Maus" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Vier Richtungen" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Vereinfacht,\n" "die rechte Taste invertiert den Zug" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Tasten" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Hinzufügen" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Entfernen" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Zurücksetzen" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Aussehen" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Farbe:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Bildauswahl:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Gekachelt" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaik" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Hintergrund:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;würfel;puzzle;zauberwürfel;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Herausforderungen" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "Zufälliges Puzzle lösen" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "In einem Zug lösen" msgstr[1] "In {} Zügen lösen" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Lösungen" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "Anfängermethode" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Obere Kanten" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Obere Ecken" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Mittlere Schicht" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Untere Kanten ausrichten" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Untere Ecken ausrichten" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Untere Ecken platzieren" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Untere Kanten platzieren" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Leyan Lo" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Spiegel verbessert" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Obere Schicht" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Muster" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Streifen" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Kreuz und Quer" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Spiegeleier" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Große Spiegeleier" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 Spiegeleier" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "2 Spiegeleier" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Schachbrett" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Kreuz" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zick Zack" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T-Time" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Würfel im Würfel" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Gestreifter Würfel im Würfel" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "Sechs quadratische Quader" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Superflip einfach" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Grüne Mamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Entenfüße" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Plus" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "Minus" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Vulkan" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "Schachbrett (einfach)" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "Schachbrett (schnell)" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "Gemischtes Schachbrett" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "Tipi" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Sammlung" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "Tausche Kanten" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "3 Kanten ⟳, obere Schicht" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "3 Kanten ⟲, obere Schicht" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "3 Kanten, mittlere Schicht" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "4 Kanten, vorne und rechts" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "4 Kanten, vorne und hinten" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "Vertausche 2 Kanten und 2 Ecken, obere Schicht" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "Kanten kippen" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "4 Kanten" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "2 Kanten, obere Schicht" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "Ecken vertauschen" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "2 Ecken, obere Schicht" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "2 Ecken diagonal, obere Schicht" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "3 Ecken ⟳, obere Schicht" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "3 Ecken ⟲, obere Schicht" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "4 Ecken, obere Schicht" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "2 Ecken, Teilsequenz, obere Schicht" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "Ecken drehen" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "1 Ecke ⟳, Teilsequenz, obere Schicht" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "1 Ecke ⟲, Teilsequenz, obere Schicht" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "Zentrum drehen" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×Oben" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "Oben ⟳ und Vorne ⟳" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "Oben ⟳ und Vorne ⟲" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "Tausche Mittelteile, oben und vorne" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "Oben ⟳ und Unten ⟲" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Verschiedenes" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "Hinten ohne Hinten" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "2×Hinten ohne Hinten" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "Zugfolgen-Transformationen" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "Zugfolge invertieren" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "Würfeldrehungen normalisieren" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "Zugfolge normalisieren" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Ziegel" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Ziegel" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Breite:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Höhe:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Tiefe:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Oben" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Unten" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Links" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Rechts" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Vorne" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Hinten" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Turm" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Turm" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Basis:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Würfel" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Würfel" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Größe:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "Hohler Würfel" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "Tetraeder" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "{0}-Tetraeder" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "Dreieck-Prisma" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "{0}×{1} Dreieck-Prisma" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "Dreieck-Prisma (komplex)" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "{0}×{1} Dreieck-Prisma (komplex)" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "Fünfeck-Prisma" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "{0}×{1} Fünfeck-Prisma" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "Vorne rechts" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "Vorne links" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "Fünfeck-Prisma (gestreckt)" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "{0}×{1} Fünfeck-Prisma (gestreckt)" pybik-2.1/po/bs.po0000664000175000017500000011101712556245211014230 0ustar barccbarcc00000000000000# Bosnian translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-03-28 22:58+0000\n" "Last-Translator: Kenan Dervišević \n" "Language-Team: Bosnian \n" "Language: bs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Desila se greška prilikom čitanja postavki:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Pritisnite Esc tipku da zatvorite mod za uređivanje" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} pokret" msgstr[1] "{current} / {total} pokreta" msgstr[2] "{current} / {total} pokreta" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "riješeno" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "nije riješeno" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Čestitamo, riješili ste zagonetku!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "3D Rubikova kocka" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 #, fuzzy msgid "* Pretty patterns" msgstr "Lijepi uzorci" #: ../pybiklib/config.py:78 #, fuzzy msgid "* Editor for move sequences" msgstr "&Izokreni pokrete" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Pročitajte cijeli tekst GNU Opće javne licence<|> " "ili posjetite ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Pritisnite tipku ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Osvjetljenje" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Program je potrebno ponovo pokrenuti da bi promjene počele djelovati." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "obično" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "odaberi ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Pomjeri" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Tipka" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Otvori sliku" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Poništavam operaciju, molim sačekajte" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybik web stranica" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "Ovaj algoritam ne radi ni na jednom modelu.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "Ovaj algoritam radi samo za:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "onemogućeno" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "ružno" #: ../pybiklib/schema.py:154 msgid "low" msgstr "slabo" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "srednji" #: ../pybiklib/schema.py:155 msgid "high" msgstr "jako" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "više" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Postavke ne mogu biti zapisane u datoteku: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "O Pybiku" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "O programu" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Prevodioci:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Povratne informacije" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Prevođenje" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licenca" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "&Pomoć" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Igra" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Uredi" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Prikaz" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Pomoć" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Novo slučajno" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "No&vo riješeno" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Izađi" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "&Odaberi model..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Postavi kao početno stanje" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Resetuj rotaciju" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Opcije..." #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Alatna traka" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Statusna traka" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Info …" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Premotaj" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Idi na prethodnu oznaku (ili na početak) sekvence pokreta" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Prethodna" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Jedan korak unazad" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Stani" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Pokreni" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Prođi kroz sekvencu koraka" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Sljedeća" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Jedan korak unaprijed" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Naprijed" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Pređi na sljedeći dio (ili kraj) sekvence koraka" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Dodaj mjesto" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Označi trenutno mjestu u sekvenci koraka" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Ukloni mjesto" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Ukloni oznaku na trenutnoj lokaciji u sekvenci koraka" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Traka za uređivanje" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "&Pomoć" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Odaberi model" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Postavke" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Grafika" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Brzina animacije:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Udaljenost slike:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Antialiasing" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Miš" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Četiri smjera" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Pojednostavljeno,\n" "desni klik obrće potez" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Tipke" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Dodaj" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Ukloni" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Resetuj" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Izgled" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Boja:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Datoteka slike:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Popločano" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mozaik" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Pozadina:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;kocka;puzzle;slagalica;zagonetka;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Izazovi" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Riješite slučajno odabranu kocku" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Način rješavanja" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Gornje ivice" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Gornji uglovi" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Srednji dio" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Orijentacija donje ivice" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Orijentacija donjeg ugla" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Lokacija donjeg ugla" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Lokacija donje ivice" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Poboljšani Spiegel" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Gornji dio" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Lijepi uzorci" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Trake" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Križanja" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Pržena jaja" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Velika pržena jaja" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 pržena jajeta" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 pržena jajeta" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Šahovska tabla" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Ukrštanje" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Cik-cak" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T-vrijeme" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Kocka u kocki" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Prugasta kocka u kocki" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "Šest kvadratnih kuboida" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Pojednostavljeni superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Zelena Mamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Pačije stopalo" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Biblioteka" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Zamjena ivica" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "Srednji sloj" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Obrtanje ivica" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Gornje ivice" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Zamjena uglova" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "Lokacija donjeg ugla" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "Lokacija donjeg ugla" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Rotiranje uglova" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Rotiranje centra" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×Gore" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 #, fuzzy msgid "Up ⟳ and front ⟳" msgstr "Gore i naprijed" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 #, fuzzy msgid "Up ⟳ and front ⟲" msgstr "Gore i naprijed" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 #, fuzzy msgid "Up ⟳ and down ⟲" msgstr "Gore i dole" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Razno" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 #, fuzzy msgid "Back without back" msgstr "Nazad bez poleđine" #: ../data/plugins/90-library.plugins.py:121 #, fuzzy msgid "2×Back without back" msgstr "2×Nazad bez poleđine" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Izokreni pokrete" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Normaliziraj rotacije kocke" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Cigla" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Cigla" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Širina:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Visina:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Dubina:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Gore" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Dole" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Lijevo" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Desno" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Naprijed" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Nazad" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Kula" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Kula" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Baza:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Kocka" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Kocka" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Veličina:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Kocka" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Desno" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Naprijed" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/fi.po0000664000175000017500000011417712556245211014234 0ustar barccbarcc00000000000000# Finnish translation for pybik # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-21 15:12+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "Language: fi\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" "X-Launchpad-Export-Date: 2015-07-22 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Asetuksia luettaessa tapahtui virhe:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Paina Esc poistuaksesi muokkaustilasta" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} siirto" msgstr[1] "{current} / {total} siirtoa" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "ratkaistu" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "ei ratkaistu" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Onnittelut, ratkaisit pulman!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Rubiikin kuutio -peli" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "Pybik on 3D-pulmapeli, joka perustuu Ernő Rubikin keksimään kuutioon." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Erilaisia 3D-pulmia - aina kokoon 10x10x10 asti:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Ratkaisumenetelmiä joihinkin pulmiin" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Nättejä kuvioita" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Muokkain siirtosarjoja varten" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Vaihdettavia värejä ja kuvia" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Lue koko GNU GPL -lisenssin teksti<|> tai katso " "." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Tämän ohjelman mukana pitäisi tulla kopio GPL-lisenssistä; jos näin ei ole, " "katso lisätietoja sivulta ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Jos kohtaat ongelmia Pybikin käytön suhteen tai sinulla on ideoita, tee " "<{CONTACT_FILEBUG}|>vikailmoitus<|>. Ideaa ehdottaessasi voit merkitä " "vikailmoituksen tyypiksi \"Wishlist\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Käännöksiä hallitsee Launchpadin käännösryhmä<|>.\n" "\n" "Halutessasi voit kääntää Pybikin omalle kielellesi selainkäyttöliittymän kautta<|>.\n" "\n" "Lue seuraavat artikkelit: " "\"Translating with Launchpad\"<|> ja \"Starting to translate\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Paina näppäintä…" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Valaistus" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Yksinkertainen" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Tämä sovellus tulee käynnistää uudelleen, jotta muutokset tulevat voimaan." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "puhdas" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "valitse…" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Siirto" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Näppäin" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Avaa kuva" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Perutaan toimintoa, odota hetki" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Hiiren käyttäminen kuution kääntämiseksi" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Aseta hiiren kursori pulman päälle, jolloin näet kursorin muuttuvan " "nuoleksi. Nuolen suunta osoittaa, mihin suuntaan siivua käännetään." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "Hiiren vasen näppäin kääntää kuution yksittäisen siivun nuolen osoittamaan " "suuntaan." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "Hiiren oikea näppäin kääntää kuution yksittäisen siivun nuolen osoittamaan " "vastakkaiseen suuntaan." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Kääntääksesi koko kuution yksittäisen siivun sijaan, pidä Ctrl pohjassa kun " "napsautat hiiren painiketta." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Näppäimistön käyttäminen kuution kääntämiseksi" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Varmista, että näppäimistön kohdistus on kuutioalueella (voit esimerkiksi " "napsauttaa kuution taustaa). Näppäimiä voi muuttaa asetuksista, oletus on:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" "Siirtää vasenta, oikeaa, ylhäällä, alhaalla, edessä tai takana olevaa siivua " "myötäpäivään." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Siirtää siivua vastapäivään." #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Siirtää koko kuutiota." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Muut näppäimet ja painikkeet" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Hiiren rulla – suurenna tai pienennä" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" "Nuolinäppäimet ja hiiren vasen painike taustan päällä – muuttaa " "katselusuuntaa kuutiota kohti." #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybikin verkkosivusto" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "Tämä liitännäinen ei toimi kaikille malleille.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "Tämä liitännäinen toimii vain seuraaville:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Tämä pulma ei ole ratkaistavissa." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "ei käytössä" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "heikko" #: ../pybiklib/schema.py:154 msgid "low" msgstr "matala" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "keskitaso" #: ../pybiklib/schema.py:155 msgid "high" msgstr "korkea" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "paras" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Asetuksia ei voi kirjoittaa tiedostoon: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Tietoja - Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Tietoja" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Kääntäjät:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Palaute" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Käännä" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Lisenssi" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Ohje" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Peli" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Muokkaa" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Näytä" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Ohje" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Uusi satunnainen" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Uusi &ratkaistu" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Lopeta" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "&Valitse pulma…" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Aseta alkutilaksi" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Palauta oletussuunta" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Asetukset …" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Työkalupalkki" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Tilapal&kki" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "Ti&etoja…" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Kelaa takaisin" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Siirry edelliseen merkkiin (tai alkuun) siirtosarjassa" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Edellinen" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Siirry yksi askel taakse" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Pysäytä" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Toista" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Siirry eteenpäin siirtosarjassa" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Seuraava" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Siirry yksi askel eteen" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Kelaa eteen" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Siirry seuraavaan merkkiin (tai loppuun) siirtosarjassa" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Lisää merkki" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Merkitse nykyinen sijainti siirtosarjassa" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Poista merkki" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Muokkauspalkki" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "&Ohje…" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "Valitse pulma" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Asetukset" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Grafiikka" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Animaationopeus:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Peilausetäisyys:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "Laatu:" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" "Pienempi reunanpehmennys tarjoaa paremman suorityskyvyn, suurempi paremman " "kuvanlaadun." #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "Reunanpehmennys:" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Hiiri" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Neljä suuntaa" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Helpotettu,\n" "oikea painike kääntää siirron" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Näppäimet" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Lisää" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Poista" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Palauta oletusasetus" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Ulkoasu" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Väri:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Kuvatiedosto:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Kaakeloitu" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaiikki" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Tausta:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;puzzle;magic;rubikin;kuutio;pulma;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Haasteet" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "Ratkaise satunnainen pulma" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "Ratkaise {} siirrolla" msgstr[1] "Ratkaise {} siirrolla" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Ratkaisijat" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "Aloittelijan tapa" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Keskimmäinen siivu" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Leyan Lo" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Spiegel, paranneltu" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Nätit kuviot" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Raidat" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Paistetut munat" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Isot paistetut munat" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "Neljä paistettua munaa" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "Kaksi paistettua munaa" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Shakkilauta" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Risti" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Siksak" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T-aika" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Kuutio kuutiossa" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Raidallinen kuutio kuutiossa" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Superflip, helppo" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Vihermamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Ankkajalat" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Plus" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Tulivuori" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Kirjasto" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "Ylös ⟳ ja eteen ⟳" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "Ylös ⟳ ja eteen ⟲" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "Ylös ⟳ ja alas ⟲" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Muut" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "Käänteinen siirtosarja" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Tiili" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-tiili" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Leveys:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Korkeus:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Syvyys:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Ylös" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Alas" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Vasen" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Oikea" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Etuosa" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Takaosa" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Torni" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-torni" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Perusta:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Kuutio" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-kuutio" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Koko:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Kuutio" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "Tetraedri" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "{0}-tetraedri" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Oikea" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Etuosa" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/en_GB.po0000664000175000017500000011736012556245211014605 0ustar barccbarcc00000000000000# English (United Kingdom) translation of pybik # Copyright (C) 2009-2011 B. Clausius # This file is distributed under the same license as the pybik package. # B. Clausius , 2009. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-27 11:48+0000\n" "Last-Translator: James Tait \n" "Language-Team: \n" "Language: \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" "X-Launchpad-Export-Date: 2015-07-28 05:18+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "An error occurred while reading the settings:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Press the Esc key to exit Edit Mode" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} move" msgstr[1] "{current} / {total} moves" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "solved" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "not solved" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Congratulations, you have solved the puzzle!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Rubik's cube game" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Different 3D puzzles - up to 10x10x10:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr " cubes, towers, bricks, tetrahedra and prisms" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Solvers for some puzzles" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Pretty patterns" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Editor for move sequences" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Changeable colours and images" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "This program is free software: you can redistribute it and/or modify it " "under the terms of the GNU General Public Licence as published by the Free " "Software Foundation, either version 3 of the Licence, or (at your option) " "any later version.\n" "\n" "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 Licence for " "more details." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Read the full text of the GNU General Public " "Licence<|> or see ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "You should have received a copy of the GNU General Public Licence along with " "this program. If not, see ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Press a key …" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Lighting" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Simple" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "The program needs to be restarted for the changes to take effect." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "plain" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "select …" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Move" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Key" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Open Image" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Canceling operation, please wait" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Using the mouse to rotate the cube" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Using the keyboard to rotate the cube" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialogue, the default is:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "Moves the left, right, upper, down, front or back slice clockwise." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Moves a slice anticlockwise." #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Moves the whole cube." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Other keys and buttons" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Mouse wheel – Zoom in/out" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "Notation for moves" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" "All moves, however they are made, are displayed progressively above the cube " "area:" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "You can use a space to separate groups of moves." #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybik project website" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "This plugin does not work for any model.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "This plugin only works for:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "This puzzle is not solvable." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "disabled" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "ugly" #: ../pybiklib/schema.py:154 msgid "low" msgstr "low" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "medium" #: ../pybiklib/schema.py:155 msgid "high" msgstr "high" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "higher" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Settings can not be written to file: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "About Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "About" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Translators:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Feedback" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Translate" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licence" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Help" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Game" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Edit" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&View" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Help" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&New Random" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Ne&w Solved" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Quit" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "&Select Puzzle …" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Set as Initial State" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Reset Rotation" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Preferences …" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Toolbar" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Status Bar" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Info …" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Rewind" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Go to the previous mark (or the beginning) of the sequence of moves" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Previous" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Make one step backwards" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Stop" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Play" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Run forward through the sequence of moves" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Next" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Make one step forwards" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Forward" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Go to the next mark (or the end) of the sequence of moves" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Add Mark" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Mark the current place in the sequence of moves" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Remove Mark" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Remove the mark at the current place in the sequence of moves" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Edit Bar" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "&Help …" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "Select Puzzle" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Preferences" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Graphic" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Animation Speed:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Mirror Distance:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "Quality:" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "Antialiasing:" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Mouse" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Four directions" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplified,\n" "right button inverts move" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Keys" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Add" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Remove" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Reset" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Appearance" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Colour:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Image File:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Tiled" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaic" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Background:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;puzzle;magic;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Challenges" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "Solve random puzzle" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "Solve in {} move" msgstr[1] "Solve in {} moves" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Solvers" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "Beginner's method" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Top edges" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Top corners" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Middle slice" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Bottom edge orient" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Bottom corner orient" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Bottom corner place" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Bottom edge place" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Leyan Lo" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Spiegel improved" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Top slice" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Pretty patterns" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Stripes" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Criss-Cross" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Fried Eggs" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Big Fried Eggs" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 Fried Eggs" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "2 Fried Eggs" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Chessboard" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Cross" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T-Time" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Cube in a Cube" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Striped Cube in a Cube" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "Six square cuboids" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Superflip easy" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Green Mamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Duck Feet" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Plus" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "Minus" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Volcano" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "Checkerboard (easy)" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "Checkerboard (fast)" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "Mixed Checkerboard" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "Tipi" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Library" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "Swap edges" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "3 edges ⟳, top layer" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "3 edges ⟲, top layer" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "3 edges, middle layer" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "4 edges, front and right" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "4 edges, front and back" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "Swap 2 edges and 2 corners, top layer" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "Flip edges" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "4 edges" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "2 edges, top layer" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "Swap corners" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "2 corners, top layer" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "2 corners diagonal, top layer" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "3 corners ⟳, top layer" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "3 corners ⟲, top layer" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "4 corners, top layer" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "2 corners, partial sequence, top layer" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "Rotate corners" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "1 corner ⟳, partial sequence, top layer" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "1 corner ⟲, partial sequence, top layer" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "Rotate centre" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×Up" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "Up ⟳ and front ⟳" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "Up ⟳ and front ⟲" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "Swap centre parts, up and front" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "Up ⟳ and down ⟲" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Misc" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "Back without back" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "2×Back without back" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "Move transformations" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "Invert move sequence" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "Normalise cube rotations" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "Normalise move sequence" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Brick" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Brick" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Width:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Height:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Depth:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Up" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Down" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Left" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Right" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Front" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Back" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Tower" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Tower" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Basis:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Cube" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cube" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Size:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "Void Cube" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "Tetrahedron" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "{0}-Tetrahedron" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "Triangular Prism" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "Triangular Prism (complex)" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "Pentagonal Prism" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "Front Right" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "Front Left" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "Pentagonal Prism (stretched)" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/uk.po0000664000175000017500000013511512556245211014250 0ustar barccbarcc00000000000000# Ukrainian translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # # FIRST AUTHOR , 2012. # Yuri Chornoivan , 2012. msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-21 06:19+0000\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2015-07-22 05:15+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Під час спроби читання параметрів сталася помилка:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Натисніть клавішу Esc, щоб вийти з режиму редагування" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} з {total} ходу" msgstr[1] "{current} з {total} ходів" msgstr[2] "{current} з {total} ходів" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "розв’язано" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "не розв’язано" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Вітаємо, ви розв’язали головоломку!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Гра з кубиком Рубіка" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "Pybik — просторова гра з кубиком, винайденим Ерно Рубіком." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Різні просторові головоломки, аж до розміру 10⨯10⨯10:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr " кубики, башточки, цеглинки, тетраедри та призми" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Засоби розв’язування для деяких головоломок" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Чудові візерунки" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Редактор послідовності обертань" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Можливість зміни кольорів та зображень" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Ця програма є вільним програмним забезпеченням. Ви можете поширювати і/або " "змінювати її за умов дотримання GNU General Public License у тій формі, у " "якій її оприлюднено Free Software Foundation; версії 3 цієї ліцензії або " "(якщо бажаєте) будь-якої пізнішої її версії.\n" "\n" "Ця програм поширюється у сподіванні, що вона буде корисною, але її поширення " "НЕ СУПРОВОДЖУЄТЬСЯ ЖОДНИМИ ГАРАНТІЯМИ навіть очевидними гарантіями " "КОМЕРЦІЙНОЇ ЦІННОСТІ або ПРИДАТНОСТІ ДО ПЕВНОЇ МЕТИ. Докладніше про це можна " "дізнатися з GNU General Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Ознайомтеся з повним текстом Загальної громадської " "ліцензії GNU<|> або відвідайте сторінку ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Ви маєте отримати копію GNU General Public License разом з цією програмою. " "Якщо цього не сталося, скористайтеся ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Якщо вами буде виявлено вади у Pybik або у вас виникнуть пропозиції щодо її " "покращення, будь ласка, створіть відповідний <{CONTACT_FILEBUG}|>звіт щодо " "вади<|>. У останньому випадку позначте звіт щодо вади міткою " "«Wishlist» («побажання»)." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Переклади виконуються групою перекладачів Launchpad<|>.\n" "\n" "Якщо ви хочете допомогти перекласти Pybik вашою мовою, скористайтеся " "відповідним інтерфейсом<|>.\n" "\n" "Ознайомтеся з настановами щодо перекладу за допомогою Launchpad<|> та початкових кроків з перекладу<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Натисніть клавішу…" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Підсвічування" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Простий" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Щоб зміни набули чинності, програму слід перезапустити." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "площина" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "вибрати…" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Хід" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Клавіша" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Відкрити зображення" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Скасовуємо дію, зачекайте" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Використання миші для обертання кубика" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Розташуйте вказівник миші над головоломкою, і програма покаже стрілку, яка " "підкаже вам, у якому напрямку буде обернуто шар під вказівником." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "Клацання лівою кнопкою миші обертає один шар кубика у напрямку стрілки." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "Клацання правою кнопкою миші обертає один шар кубика проти напрямку стрілки." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Щоб обернути увесь кубик, а не лише один шар, натисніть клавішу Ctrl і " "клацніть відповідною кнопкою миші." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Користуванн яклавіатурою для обертання кубика" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Переконайтеся, що фокус введення з клавіатури перебуває на області кубика " "(наприклад, клацніть лівою кнопкою миші на тлі області показу кубика). " "Клавіатурне керування можна налаштувати у діалоговому вікні параметрів " "програми. Типовим є таке:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" "Обертання ліворуч, праворуч, вгору, вниз переднього або заднього шару за " "годинниковою стрілкою." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Обертання шару проти годинникової стрілки." #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Обертання усього кубика." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Інші клавіші і кнопки" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Коліщатко миші: збільшення і зменшення масштабу" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" "Клавіші зі стрілками та клацання лівою кнопкою миші на тлі — змінити " "напрямок погляду на кубик." #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" "Пересуває фокус введення з клавіатури на область редактора послідовності " "обертань, розташовану над областю показу кубика. Там ви зможете редагувати " "послідовність обертань за допомогою позначень, описаних нижче. Натисніть " "Enter, коли редагування буде завершено." #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "Позначення ходів" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" "Усі обертання, незалежно від способу виконання, буде показано як " "послідовність над областю показу кубика:" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" "Обертає перший, другий і третій шар зліва за годинниковою стрілкою. " "Дозволені значення чисел від 1до кількість паралельних шарів. «l1» — те " "саме, що і «l», а для класичного кубика 3×3×3 «l2» — те саме, що і «r2-», а " "«l3» — те саме, що і «r-»." #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "Ви можете скористатися пробілом для відокремлення груп обертань." #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Сайт проекту Pybik" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "Цей додаток не працює для жодної з моделей.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "Цей додаток працює лише для таких моделей:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Розв’язати цю головоломку неможливо." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "вимкнено" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "слабке" #: ../pybiklib/schema.py:154 msgid "low" msgstr "низьке" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "середнє" #: ../pybiklib/schema.py:155 msgid "high" msgstr "значне" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "потужне" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Не вдалося записати параметри до файла: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Про Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Про програму" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Перекладачі:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Зворотній зв’язок" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Перекласти" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Ліцензія" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Довідка" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Гра" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "З&міни" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "П&ерегляд" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Довідка" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Новий випадковий" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Н&овий розв’язаний" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "Ви&йти" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "&Вибрати головоломку.…" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "З&робити початковим станом" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "С&кинути обертання" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "П&араметри…" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Панель інструментів" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Смужка &стану" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "Ін&формація…" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Повний назад" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Перейти до попередньої позначки (або до початку) послідовності обертань" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Попередній" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Повернутися на одне обертання назад" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Зупинити" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Пуск" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Запустити послідовність обертань" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Далі" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Виконати наступне обертання" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Вперед" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Перейти до наступної позначки (або кінця) послідовності ходів" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Додати позначку" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Встановити позначку на поточній позиції у послідовності обертань" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Вилучити позначку" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Вилучити позначку з поточного місця у послідовності ходів" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "Панель &редагування" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "&Довідка…" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "Виберіть головоломку" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Параметри" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Графіка" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Швидкість анімації:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Відстань до дзеркала:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "Якість:" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" "Нижчий рівень згладжування забезпечить кращу швидкодію, а вищий — кращу " "якість." #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "Згладжування:" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Миша" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Чотири напрямки" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Спрощена,\n" "права кнопка скасовує хід" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Клавіші" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Додати" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Вилучити" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Скинути" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Вигляд" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Колір:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Файл зображення:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Плиткою" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Мозаїка" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Тло:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;puzzle;magic;рубік;кубик;головоломка;загадка;гра;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Виклики" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "Скласти випадкову головоломку" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "Розв’язати за {} обертання" msgstr[1] "Розв’язати за {} обертання" msgstr[2] "Розв’язати за {} обертань" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Розв’язувачі" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "Метод для початківців" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Верхні краї" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Верхні кути" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Середній шар" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Орієнтація нижнього краю" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Орієнтація нижнього кута" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Місце нижнього кута" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Місце нижнього краю" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Леян Ло" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Метод Шпігеля" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Покращений метод Шпігеля" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Верхній шар" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Чудові візерунки" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Смуги" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Хрест-навхрест" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Яєшня" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Велика оката яєшня" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 очка у яєшні" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "Дві яєшні" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Шахова дошка" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Хрестик" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Зиґзаґ" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "Час-T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Куб у кубі" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Смуговий куб у кубі" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "Шість квадратних кубоїдів" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Супервіддзеркалення" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Просте супервіддзеркалення" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Зелена мамба" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Анаконда" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Качина лапа" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Плюс" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "Мінус" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Вулкан" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "Шахівниця (просто)" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "Шахівниця (швидко)" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "Мішана шахівниця" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "Тіпі" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Бібліотека" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "Поміняти місцями краї" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "3 реберних ⟳, верхній шар" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "3 реберних ⟲, верхній шар" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "3 реберних, середній шар" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "4 реберних, передній і правий" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "4 реберних, передній і задній" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "Поміняти місцями 2 реберних і 2 кутових, верхній шар" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "Поміняти місцями реберні" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "4 реберних" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "2 реберних, верхній шар" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "Поміняти місцями кутові" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "2 кутових, верхній шар" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "2 кутових за діагоналлю, верхній шар" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "3 кутових ⟳, верхній шар" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "3 кутових ⟲, верхній шар" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "4 кутових, верхній шар" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "2 кутових, часткова послідовність, верхній шар" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "Обертання кутових" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "1 кутовий ⟳, часткова послідовність, верхній шар" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "1 кутовий ⟲, часткова послідовність, верхній шар" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "Обертання центрального" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "Подвійний вгору" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "Верхній ⟳ і передній ⟳" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "Верхній ⟳ і передній ⟲" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "Обмін місцями центральних частин, верхньої і передньої" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "Верхній ⟳ і нижній ⟲" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Інше" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "Задній без заднього" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "Подвійний задній без заднього" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "Перетворення обертань" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "Інвертувати послідовність обертань" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "Нормалізувати обертання кубика" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "Нормалізувати послідовність обертань" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Цеглинка" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "Цеглинка-{0}×{1}×{2}" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Ширина:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Висота:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Глибина:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Вгору" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Вниз" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Ліворуч" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Праворуч" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Перед" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Зворот" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Башта" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "Башта-{0}×{1}" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Основа:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Куб" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "Куб-{0}×{0}×{0}" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Розмір:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "Порожній куб" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "Тетраедр" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "{0}-тетраедр" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "Трикутна призма" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "Ктрикутна призма {0}×{1}" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "Трикутна призма (складна)" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "Трикутна призма {0}×{1}" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "П’ятикутна призма" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "П’ятикутна призма {0}×{1}" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "Передній правий" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "Передній лівий" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "П’ятикутна призма (витягнута)" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "П’ятикутна призма (витягнута) {0}×{1}" pybik-2.1/po/pybik.pot0000664000175000017500000010302012556245211015121 0ustar barccbarcc00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: pybik 2.1~alpha1\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/tr.po0000664000175000017500000010430312556245211014251 0ustar barccbarcc00000000000000# Turkish translation for pybik # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-22 21:06+0000\n" "Last-Translator: Muhammet Kara \n" "Language-Team: Turkish \n" "Language: tr\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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Düzenleme Modu'ndan çıkmak için Esc'ye basın" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} hamle" msgstr[1] "{current} / {total} hamle" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "çözüldü" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "çözülmedi" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Tebrikler, yapbozu çözdünüz!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "3B Rubik küpü oyunu" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Bu programla birlikte GNU Genel Kamu Lisansının bir kopyasını almış " "olmalısınız. Almadıysanız, adresine bakınız." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Bir tuşa basın …" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Değişikliklerin etkili olması için programın yeniden başlatılması gerekiyor." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Hamle" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "İşlem iptal ediliyor, lütfen bekleyin" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Tüm küpü hareket ettirir." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Diğer tuşlar ve düğmeler" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Yukarı" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Aşağı" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Sol" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Sağ" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Ön" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Arka" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Sağ" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Ön" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/pt_BR.po0000664000175000017500000010711212556245211014633 0ustar barccbarcc00000000000000# Brazilian Portuguese translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-18 12:25+0000\n" "Last-Translator: Rodrigo Borges Freitas \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Pressione a tecla ESC para sair do Modo edição" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} movimento" msgstr[1] "{current} / {total} movimentos" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "resolvido" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "não resolvido" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Parabéns! Você resolveu o quebra-cabeças!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "Jogo 3D do cubo de Rubik" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 #, fuzzy msgid "* Editor for move sequences" msgstr "&Inverter movimentos" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Leia na íntegra a Licença Pública Geral GNU<|> ou " "visite ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este " "programa. Caso contrário, veja ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Pressione uma tecla ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Iluminação" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 #, fuzzy msgid "The program needs to be restarted for the changes to take effect." msgstr "" "

O programa precisa ser " "reiniciado para que as alterações tenham efeito.

" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "plano" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Mover" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Tecla" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Abrir imagem" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Cancelando a operação, por favor aguarde" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Não foi possível gravar as configurações no arquivo: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Sobre o Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Sobre" #: ../pybiklib/ui/about.py:31 #, fuzzy msgid "Translators:" msgstr "Tradução" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Sugestões" #: ../pybiklib/ui/about.py:33 #, fuzzy msgid "Translate" msgstr "Tradução" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licença" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "A&juda" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Jogo" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Editar" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Visualizar" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "A&juda" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Sair" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "&Selecionar modelo ..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "Definir como estado inicial" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Preferências" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "Barra de ferramen&tas" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Barra de &status" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Informações ..." #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Anterior" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Parar" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Reproduzir" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Próximo" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Avançar" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Adicionar marcador" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Marcar o lugar atual na sequencia de movimentos" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Remover marcador" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Editar barra" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "A&juda" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Selecionar modelo" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Perferências" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Gráfico" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Velocidade da animação:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Anti-serrilhamento" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Mouse" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Quatro direções" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Chaves" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Adicionar" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Remover" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Reiniciar" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Aparência" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Cor:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Arquivo de imagem:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaico" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Plano de fundo:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Desafios" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Margens superiores" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Cantos superiores" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Fatia média" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Fatia superior" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Tabuleiro de xadrez" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Cruz" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zigue-zague" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Cubo em um cubo" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Biblioteca" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Margens superiores" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Margens superiores" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Margens superiores" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Cantos superiores" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Cantos superiores" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Diversos" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Inverter movimentos" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Tijolo" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Largura:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Profundidade:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Aumentar" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Para baixo" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Esquerda" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Direita" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Frente" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Para trás" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Torre" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Base:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Cubo" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Tamanho:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Cubo" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Direita" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Frente" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/fr.po0000664000175000017500000011647012556245211014243 0ustar barccbarcc00000000000000# French translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-21 17:17+0000\n" "Last-Translator: Jean-Marc \n" "Language-Team: French \n" "Language: fr\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" "X-Launchpad-Export-Date: 2015-07-22 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Une erreur s'est produite pendant la lecture des options :\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Appuyez sur la touche Échap pour quitter le mode Édition" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} mouvement" msgstr[1] "{current} / {total} mouvements" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "résolu" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "non résolu" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Félicitations, vous avez résolu le casse-tête !" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Rubik’s cube" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "Pybik est un casse-tête 3D inspiré du cube inventé par Ernő Rubik." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Différents casse-têtes 3D - jusqu'à 10x10x10 :" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Solveurs pour quelques casse-têtes" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Jolis motifs" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Éditeur pour les séquences de déplacement" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Couleurs et images modifiables" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Ce programme est un logiciel libre : vous pouvez le modifier et/ou le " "redistribuer selon les termes de la licence publique générale GNU, telle que " "publiée par la Free Software Foundation, que ce soit la version 3 de la " "licence ou (à votre choix) n'importe quelle version ultérieure.\n" "\n" "Le programme est distribué en espérant qu'il vous soit utile, mais ce SANS " "AUCUNE GARANTIE ; sans même les garanties implicites de VALEUR COMMERCIALE, " "QUALITÉ, ou D'ADAPTATION À UN USAGE PARTICULIER. Voir la licence publique " "générale GNU pour plus de détails." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Veuillez lire le texte intégral de lalicence " "publique générale GNU<|> ou aller sur ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Vous devriez avoir reçu une copie de la « GNU General Public License » avec " "ce programme. Sinon, voir ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Si vous trouvez des bogues dans Pybik ou si vous souhaitez suggérer une " "amélioration, veuillez déposer un <{CONTACT_FILEBUG}|>rapport de bogue<|>. " "Dans le dernier cas, vous pouvez marquer le rapport de bogue comme " "« Wishlist »." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Les traductions sont gérées par le Launchpad translation group<|>.\n" "\n" "Si vous voulez aider à traduire Pybik dans votre langue, vous pouvez le " "faire sur l'interface web<|>.\n" "\n" "Pour en savoir plus, veuillez lire " "\"Translating with Launchpad\"<|> et \"Starting to translate\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Appuyez sur une touche…" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Éclairage" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Simple" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Ce programme a besoin d'être redémarré pour que les changements prennent " "effet" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "uni" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "sélectionner…" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Mouvement" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Clé" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Ouvrir une image" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Arrêt de l'opération, veuillez patienter" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Utilisation de la souris pour faire tourner le cube" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Placez le curseur de la souris sur le casse-tête et vous verrez une flèche " "qui vous donne la direction dans laquelle la tranche située sous le curseur " "de la souris sera tournée." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "Le bouton gauche de la souris tourne une tranche du cube dans le sens de la " "flèche." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "Le bouton droit de la souris tourne une tranche du cube dans le sens inverse " "de la flèche." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Pour faire pivoter le cube entier plutôt qu'une seule tranche, presser la " "touche Ctrl en même temps que le bouton de la souris." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Utilisation du clavier pour faire tourner le cube" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" "Déplace les tranches gauche, droite, supérieure, inférieure, avant et " "arrière dans le sens horaire." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Déplace une tranche dans le sens antihoraire." #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Déplace le cube entier." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Autres touches et boutons" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Molette de la souris - Zoom avant/arrière" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "Notation pour les déplacements" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" "Tous les déplacements, quels qu'ils soient, sont affichés progressivement au-" "dessus de la zone du cube :" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" "Vous pouvez utiliser une espace pour séparer les groupes de déplacements." #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Site web du projet Pybik" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "Ce greffon ne fonctionne pas pour n'importe quel modèle.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "Ce greffon fonctionne seulement pour :\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Ce casse-tête ne peut pas être résolu." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "Désactivé" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "moche" #: ../pybiklib/schema.py:154 msgid "low" msgstr "faible" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "moyen" #: ../pybiklib/schema.py:155 msgid "high" msgstr "élevé" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "maximum" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Impossible d'écrire les paramètres dans le fichier : {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "À propos de Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "À propos" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Traducteurs :" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Avis" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Traduire" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licence" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Aide" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Jeu" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Édition" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Vue" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Aide" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Nouveau aléatoire" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "No&uveau résolu" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Quitter" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "&Sélectionner le modèle…" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Définir comme à l'état initial" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Annuler la rotation" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Préférences…" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Barre d’outils" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Ba&rre d'état" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Info…" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Reculer" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Revenir à la marque précédente (ou au début) de la séquence de mouvements" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Précédent" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Reculer d'une étape" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Arrêter" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Lire" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Avancer dans la séquence de mouvements" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Suivant" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Avancer d'une étape" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "En avant" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" "Avancer à la marque suivante (ou à la fin) de la séquence de mouvements" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Ajouter une marque" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Marquer la position actuelle dans la séquence de mouvements" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Supprimer une marque" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" "Supprimer la marque de la position actuelle dans la séquence de mouvements" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Barre d'édition" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "&Aide…" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Sélectionner le modèle" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Préférences" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Graphique" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Vitesse d'animation :" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Distance du miroir :" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "Qualité :" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "Anti-crénelage :" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Souris" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Quatre directions" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplifié,\n" "le bouton droit inverse les mouvements" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Touches" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Ajouter" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Enlever" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Réinitialiser" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Apparence" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Couleur :" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Fichier image :" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaïque" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Arrière plan :" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;casse-tête;magique;jeu;énigme;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Défis" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Résoudre un cube aléatoire" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "Résolu en {} mouvement" msgstr[1] "Résolu en {} mouvements" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Solveurs" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "La méthode du débutant" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Bords supérieurs" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Coins supérieurs" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Tranche intermédiaire" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Leyan Lo" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Méthode Spiegel améliorée" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2x2x2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Tranche supérieure" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Jolis motifs" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Bandes" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Croisillon" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Œufs au plat" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Grands œufs au plat" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 œufs au plat" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "2 œufs sur le plat" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Échiquier" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Croix" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "Heure du T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Cube dans un cube" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Cube rayé dans un cube" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Superflip facile" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Green Mamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Duck Feet" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Plus" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "Moins" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Volcan" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Bibliothèque" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Bords supérieurs" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Bords supérieurs" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "4 bords" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Échanger les coins" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Pivoter les coins" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Pivoter le centre" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×haut" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Divers" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "Inverser la séquence de déplacements" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Normaliser les rotations du cube" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Brique" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "Brique-{0}×{1}×{2}" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Largeur :" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Hauteur :" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Profondeur :" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Haut" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Bas" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Gauche" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Droite" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Avant" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Arrière" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Tour" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "Tour-{0}×{1}" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Principe de base :" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Cube" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Taille :" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Cube" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "Tétraèdre" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "{0}-Tétraèdre" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "Prisme triangulaire" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Droite" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Avant" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/km.po0000664000175000017500000010364712556245211014245 0ustar barccbarcc00000000000000# Khmer translation for pybik # Copyright (c) 2015 Rosetta Contributors and Canonical Ltd 2015 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2015. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-25 10:44+0000\n" "Last-Translator: Rockworld \n" "Language-Team: Khmer \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-26 05:16+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "អ្នកគួរទទួលបានច្បាប់ចម្លងអាជ្ញាបត្រ GNU General Public ជាមួយនឹងកម្មវិធីនេះ ។ " "បើមិនឃើញ សូមមើលនៅ  ។" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the " "Launchpad " "translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and " "\"Starting to " "translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "​សាមញ្ញ" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "plain" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "​​ផ្លាស់ទី" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "សោ" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Open Image" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/ja.po0000664000175000017500000010436312556245211014224 0ustar barccbarcc00000000000000# Japanese translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2013-06-10 04:36+0000\n" "Last-Translator: epii \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "設定の読込中にエラーが発生しました:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Esc キーを押すと編集モードを終了します" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} ムーブ" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "おめでとうございます、パズルを解くことができました!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "三次元ルービックキューブゲーム" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "キーを押してください…" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "プレイン" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "選択…" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "画像を開く" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "操作を中止しています、しばらくお待ちください" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybik プロジェクトのウェブサイト" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "このアルゴリズムはどのモデルでもうまくいきません。\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "選択…" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "上" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "下" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "左" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "右" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "前" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "後" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "サイズ:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "右" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "前" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/he.po0000664000175000017500000011630212556245211014222 0ustar barccbarcc00000000000000# Hebrew translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-12 14:47+0000\n" "Last-Translator: Yaron \n" "Language-Team: Hebrew \n" "Language: he\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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "אירעה שגיאה בעת קריאת ההגדרות:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "יש ללחוץ על מקש ה־Esc כדי לצאת ממצב העריכה" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / מהלך {total}" msgstr[1] "{current} / {total} מהלכים" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "נפתר" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "לא נפתר" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "ברכות, פתרת את הפאזל!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "משחק הקובייה ההונגרית" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 #, fuzzy msgid "* Pretty patterns" msgstr "תבניות יפות" #: ../pybiklib/config.py:78 #, fuzzy msgid "* Editor for move sequences" msgstr "הי&פוך המהלכים" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "תכנית זו הנה תכנה חופשית; ניתן להפיץ אותה תחת תנאי הרישיון הציבורי הכללי של " "גנו כפי שפורסם על ידי קרן התכנה החופשית, בין אם גרסה 3 של הרישיון או כל גרסה " "עדכנית יותר לבחירתך.\n" "\n" "תכנית זו מופצת בתקווה שתביא תועלת אך אינה כוללת כל סוג של אחריות; אפילו לא " "מרומזת לצורכי מסחר או התאמה לצרכים מסוימים. ניתן לעיין ברישיון הציבורי הכללי " "של גנו לקבלת פרטים נוספים." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "ניתן לקרוא את התוכן המלא של הרישיון הציבורי הכללי " "של גנו<|> להיכנס ל־." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "לתכנית זו אמור היה להיות מצורף עותק של הרישיון הציבורי הכללי של GNU; אם לא " "צורף, ניתן לבקר בכתובת ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "אם מצאת תקלות ב־Pybik או שיש לך הצעות לשיפורים נא לשלוח <{CONTACT_FILEBUG}|" ">דיווח על תקלה<|>. במקרה השני שצוין ניתן לסמן את התקלה בתור " "„משאלה“ (Wishlist)" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "התרגומים מנוהלים באמצעות קבוצת התרגום של לאנצ׳פד<|>.\n" "\n" "אם בא לך לסייע בתרגום Pybik לשפתך ניתן לעשות זאת דרך המנשק המקוון<|>.\n" "\n" "ניתן לקרוא עוד על \"תרגום עם " "לאנצ׳פד\"<|> ועל \"כיצד מתחילים לתרגם\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "נא ללחוץ על מקש כלשהו …" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "תאורה" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "פשוט" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "יש להפעיל את התכנית מחדש כדי שהשינויים יכנסו לתוקף." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "פשוט" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "בחירה …" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "הזזה" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "מקש" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "פתיחת תמונה" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "הפעולה מבוטלת, נא להמתין" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "שימוש בעכבר לסיבוב הקובייה" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "אתר המיזם Pybik" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "האלגוריתם הזה לא עובד עם כל דגם.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "האלגוריתם הזה עובד רק עם:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "מנוטרל" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "מכוער" #: ../pybiklib/schema.py:154 msgid "low" msgstr "נמוך" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "רגיל" #: ../pybiklib/schema.py:155 msgid "high" msgstr "גבוה" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "גבוה יותר" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "לא ניתן לכתוב את ההגדרות לקובץ: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "על אודות Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "על אודות" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "מתרגמים:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "משוב" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "תרגום" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "רישיון" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "ע&זרה" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "מ&שחק" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "ע&ריכה" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&תצוגה" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "ע&זרה" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "אקראי &חדש" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "&פתור חדש" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "י&ציאה" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "&בחירת דגם …" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "ה&גדרה כמצב ההתחלתי" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "איפוס ה&סיבוב" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "ה&עדפות …" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "ס&רגל כלים" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&שורת מצב" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&פרטים …" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "הרצה אחורנית" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "מעבר לנקודת הציון הקודמת (או ההתחלה) של רצף המהלכים" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "אחורה" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "לחזור שלב אחד אחורה" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "עצירה" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "נגינה" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "הרצת רצף המהלכים בסדר כרונולוגי" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "הבא" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "התקדמות לצעד הבא" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "קדימה" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "מעבר לסימון הבא (או הסוף) של רצף המהלכים" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "הוספת סמן" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "סימון המיקום הנוכחי ברצף המהלכים" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "הסרת סמן" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "הסרת סמן מהמיקום הנוכחי ברצף המהלכים" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "סרגל &עריכה" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "ע&זרה" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "בחירת דגם" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "העדפות" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "גרפיקה" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "מהירות ההנפשה:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "מרחק מהמראה:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "החלקת קצוות" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "עכבר" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "ארבעה כיוונים" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "פשוט,\n" "הלחצן הימני הופך את המהלך" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "מקשים" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "הוספה" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "הסרה" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "איפוס" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "מראה" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "צבע:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "קובץ תמונה:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "פרוש" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "פסיפס" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "רקע:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "הונגרית;רוביק;תצרף;פאזל;פזל;קסם;טריק;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "אתגרים" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "פתירת קוביה אקראית" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "פותרים" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "קצוות עליונים" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "פינות עליונות" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "חיתוך באמצע" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "כיוון קצה תחתון" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "כיוון פינה תחתונה" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "מיקום פינה תחתונה" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "מיקום קצה תחתון" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "שפיגל" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "שפיגל משופר" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "חיתוך עליון" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "תבניות יפות" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "רצועות" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "משבצות" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "ביצים מטוגנות" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "ביצים גדולות מטוגנות" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 ביצים מטוגנות" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 ביצים מטוגנות" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "לוח שח" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "צלב" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "זיג זג" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "זמן T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "קובייה בתוך קובייה" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "קוביה מפוספסת בתוך קוביה" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "תיבות בעלות שישה ריבועים" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "סופר היפוך" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "סופר היפוך קל" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "ממבה ירוקה" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "אנקונדה" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "רגלי ברווז" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "ספרייה" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "החלפת קצוות" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "שכבה אמצעית" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "היפוך קצוות" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "קצוות עליונים" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "היפוך פינות" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "מיקום פינה תחתונה" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "מיקום פינה תחתונה" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "סיבוב פינות" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "סיבוב המרכז" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×למעלה" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 #, fuzzy msgid "Up ⟳ and front ⟳" msgstr "למעלה ולחזית" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 #, fuzzy msgid "Up ⟳ and front ⟲" msgstr "למעלה ולחזית" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 #, fuzzy msgid "Up ⟳ and down ⟲" msgstr "למעלה ולמטה" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "שונות" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 #, fuzzy msgid "Back without back" msgstr "גב ללא גב" #: ../data/plugins/90-library.plugins.py:121 #, fuzzy msgid "2×Back without back" msgstr "2×גב ללא גב" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "הי&פוך המהלכים" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "נרמול סיבובי הקוביה" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "לבנה" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-לבנה" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "רוחב:‏" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "גובה:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "עומק:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "למעלה" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "למטה" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "שמאלה" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "ימינה" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "חזית" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "אחורה" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "מגדל" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-מגדל" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "בסיס:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "קוביה" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-קוביה" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "גודל:‏" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "קוביה" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "ימינה" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "חזית" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/az.po0000664000175000017500000010600512556245211014237 0ustar barccbarcc00000000000000# Azerbaijani translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-12 13:52+0000\n" "Last-Translator: Emin Mastizada \n" "Language-Team: Azerbaijani \n" "Language: az\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" "X-Launchpad-Export-Date: 2015-07-22 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Tənzimləmələri oxuyarkən xəta baş verdi:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Düzəltmə Rejimindən çıxmaq üçün Esc düyməsinə basın" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} hərəkət" msgstr[1] "{current} / {total} hərəkət" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "həll edilib" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "həll edilməyib" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Təbrikər, siz tapmacanı həll etdiniz." #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Rubik'in kub oyunu" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" "Pybik Ernő Rubik tərəfindən kəşf edilmiş kub haqqında olan 3D tapmaca " "oyunudur." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Fərqli 3D tapmacalar - 10x10x10-ə qədər:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Bəzi tapmacalar üçün həll edicilər" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Qarışıq qəliblər" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Hərəkət silsilələri üçün dəyişdirici" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Dəyişdirilə bilinən rəng və şəkillər" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Hər hansı bir düyməyə basın …" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "İşıqlandırılır" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Sadə" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Dəyişiklərin uyğunlaşması üçün proqram yenidən başladılmalıdır." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "düz" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "seç …" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Hərəkət" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Açar" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Şəkli aç" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Əməliyyat ləğv olunur, gözləyin" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Kubu döndərmək üçün siçan işlədilir" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Kubu döndərmək üçün klaviatura işlədilir" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Bütün kubu hərəkət etdirir" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Digər açarlar və düymələr" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Siçan təkəri – Yaxınlaşdır/Uzaqlaşdır" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pyibik lahiyyəsinin saytı" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Bu tapmacanın həlli yoxdur." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "söndürülüb" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "çirkin" #: ../pybiklib/schema.py:154 msgid "low" msgstr "zəif" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "orta" #: ../pybiklib/schema.py:155 msgid "high" msgstr "yüksək" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "lap yüksək" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Tənzimləmələr fayla yazıla bilmir: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Pybik Haqqında" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Haqqında" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Tərcüməçilər:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Əks əlaqə" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Tərcümə et" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Lisenziya" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Kömək" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Oyun" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Düzəlt" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Gör" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Kömək" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Yeni Təsadüfi" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Ye&ni Həll Edilmiş" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "Çı&x" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "&Tapmaca Seç …" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Yuxarı" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Aşağı" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Sola" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Sağa" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Ön" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Arxa" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Sağa" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Ön" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/gl.po0000664000175000017500000012142012556245211014225 0ustar barccbarcc00000000000000# Galician translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-22 06:44+0000\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: Galician \n" "Language: gl\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" "X-Launchpad-Export-Date: 2015-07-23 05:23+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Produciuse un erro o ler a configuración:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Prema a tecla Esc para saír do modo de edición" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} movemento" msgstr[1] "{current} / {total} movementos" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "resolto" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "sen resolver" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Parabéns, resolveu o crebacabezas!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Xogo do cubo de Rubik" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "Pybik é un crebacabezas 3D baseado no cubo inventado por Ernő Rubik." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Diferentes crebacabezas 3D - ata 10x10x10:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr " cubos, torres, ladrillos, tetraedros e prismas" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Solucionadores para algúns crebacabezas" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* bastantes modelos" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Editor para secuencias de movementos" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Cores e imaxes cambiábeis" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Este programa é software lbre: vostede pode redistribuílo e/ou modificalo " "baixo os termos da Licenza Pública Xeral GNU, tal e como é publicada pola " "Free Software Foundation, na súa versión 3, ou (á súa elección) segundo unha " "versión posterior.\n" "\n" "Este programa distribúese agardando que sexa útil, mais SEN NINGUNHA " "GARANTÍA, incluso sen a garantía expresa de COMERCIALIZACIÓN ou de " "IDONEIDADE PARA UN PROPÓSITO PARTICULAR. Vexa a Licenza Pública Xeral GNU " "para obter máis detalles." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Lea o texto completo da Licenza Pública Xeral de " "GNU<|> ou olle ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Debeu recibir unha copia da Licenza pública xeral GNU xunto con este " "programa; en caso contrario, olle ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Se atopa algún erro no Pybik ou ten unha suxestión para melloralo, envíe un " "<{CONTACT_FILEBUG}|>informe de erro<|>. Neste último caso se pode marque o " "informe de erro como «Wishlist» (Lista de desexos)." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "As traducións son xestionadas polo Grupo de tradución de Launchpad<|>.\n" "\n" "Se quere axudar na tradución do Pybik o seu idioma pode facelo na interface web<|>.\n" "\n" "Bótelle unha ollada a \"Traducindo " "co Launchpad\"<|> e \"Comezar a traducir\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Prema unha tecla…" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Iluminación" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Simple" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "É necesario reiniciar o programa para que os cambios teñan efecto" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "simple" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "seleccionar..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Mover" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Tecla" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Abrir a imaxe" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Cancelando a operación, agarde un chisco" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Usando o rato para rotar o cubo" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Sitúe o punteiro do rato sobre o crebacabezas e vará unha frecha que indica " "a dirección na que vai ser xirada a a rebanda situada baixo o punteiro." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "O botón esquerdo do rato xira unha soa rebanda do cubo na dirección da " "frecha." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "O botón esquerdo do rato xira unha soa rebanda do cubo na dirección " "contraria a da frecha." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Para xirar o cubo enteiro no canto de unha soa rebanda prema a tecla Ctrl " "xunto co botón do rato." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Usando o teclado para rotar o cubo" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Asegúrese de que o foco do teclado está na zona do cubo (p. ex. premendo no " "fondo do cubo). Pode configurar as teclas no diálogo de preferencias, o " "predeterminado é:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" "Move as rebandas cara a esquerda, dereita, arriba, abaixo, adiante ou atrás " "no sentido das agullas do reloxo." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Mover unha rebanda no sentido contrario das agullas do reloxo" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Mover todo o cubo." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Outras teclas e botóns" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Roda do rato – Achegar/afastar" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" "As teclas de frecha, co botón esquerdo do rato premido sobre o fondo, cambia " "a orientación do cubo." #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" "Despraza o foco do teclado para o editor de secuencias por riba da zona do " "cubo onde pode editar a secuencia de movementos na notación que se describe " "a seguir. Prema Intro cando teña rematado." #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "Notación para os movementos" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" "Todos os movementos, calquera que sexan, amósanse progresivamente baixo a " "área do cubo:" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" "Move a primeira, segunda ou terceira rebanda no sentido das agullas do " "reloxo. Os números permitidos están no rango desde 1 ata o número de lados " "paralelos. «l1» é sempre o mesmo que «l», e para o clásico cubos 3×3×3 «l2» " "é o mesmo que «r2-» e «l3» é o mesmo que «r-»." #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "Pode empregar un espazo para separar grupos de movementos." #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Páxina web do proxecto Pybik" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "Este engadido non funciona en ningún modelo.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "Este engadido só funciona en:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Este crebacabezas non ten solución." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "desactivado" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "pobre" #: ../pybiklib/schema.py:154 msgid "low" msgstr "baixo" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "medio" #: ../pybiklib/schema.py:155 msgid "high" msgstr "alto" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "moi alto" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Non foi posíbel gardar as configuracións no ficheiro: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Sobre o Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Sobre" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Tradutores:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Comentarios" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Tradución" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licenza" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Axuda" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Xogo" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Editar" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Ver" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Axuda" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Novo o chou" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "No&vo resolto" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Saír" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "&Seleccione o crebacabezas ..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Definir como estado inicial" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Restabelecer a rotación" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Preferencias…" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "Barra de &ferramentas" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Barra de &estado" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Información…" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Retroceder" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Ir á marca anterior (ou o principio) da secuencia de movementos" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Anterior" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Dar un paso atrás" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Deter" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Xogar" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Executar cara diante a secuencia de movementos" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Seguinte" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Dar un paso adiante" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Avanzar" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Ir á seguinte marca (ou a fin) da secuencia de movementos" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Engadir marca" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Marcar o lugar actual na secuencia de movementos" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Retirar marca" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Retirar a marca do lugar actual na secuencia de movementos" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "Barra de &edición" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "&Axuda…" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "Seleccione o crebacabezas" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Preferencias" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Gráfico" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Velocidade da animación:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Distancia do espello:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "Calidade:" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" "Un suavizado baixo ten mellor rendemento, un suavizado alto ten maior " "calidade." #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "Suavizado:" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Rato" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Catro direccións" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplificado,\n" "o botón dereito inverte o movemento" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Teclas" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Engadir" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Retirar" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Restabelecer" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Aparencia" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Cor:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Ficheiro de imaxe:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Teselado" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaico" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Fondo:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cubo;crebacabezas;máxico;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Retos" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "Resolver un crebacabezas o chou" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "Resolver en {} movemento" msgstr[1] "Resolver en {} movementos" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Solucionadores" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "Método para principiantes" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Marxes superiores" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Cantos superiores" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Rebanda do medio" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Orientar o bordo inferior" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Orientar o canto inferior" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Situar o canto inferior" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Situar o bordo inferior" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Leyan Lo" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Spiegel mellorado" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Rebanda superior" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Patróns agradábeis" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Raias" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Entrelazado" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Ovos fritidos" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Ovos fritidos grandes" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 ovos fritidos" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "2 ovos fritidos" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Taboleiro de xadrez" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Cruzamento" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zigzag" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "Cruzamento en T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Cubo nun cubo" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Cubo a raias nun cubo" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "Seis paralelepípedos cadrados" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Superflip doado" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Mamba verde" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Pé de pato" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Máis" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "Menos" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Volcán" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "Taboleiro de xadrex (doado)" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "Taboleiro de xadrex (rápido)" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "Taboleiro de xadrex mixto" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "Tipi" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Biblioteca" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "Intercambiar os bordos" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "3 bordos ⟳, capa superior" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "3 bordos ⟲, capa superior" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "3 bordos, capa media" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "4 bordos, adiante e dereita" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "4 bordos, adiante e atrás" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "Intercambiar 2 bordos e 2 cantos, capa superior" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "Inverter bordos" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "4 bordos" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "2 bordos, capa superior" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "Intercambiar os cantos" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "2 cantos, capa superior" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "2 cantos en diagonal, capa superior" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "3 cantos ⟳, capa superior" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "3 cantos ⟲, capa superior" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "4 cantos, capa superior" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "2 cantos, secuencia parcial, capa superior" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "Rotar os cantos" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "1 canto ⟳, secuencia parcial, capa superior" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "1 canto ⟲, secuencia parcial, capa superior" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "Rotar o centro" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×arriba" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "Arriba ⟳ e adiante ⟳" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "Arriba ⟳ e adiante ⟲" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "Intercambiar as partes centrais, arriba e adiante" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "Arriba ⟳ e abaixo ⟲" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Miscelánea" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "Volver sen traseira" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "2xVolver sen traseira" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "Transformacións do movemento" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "Inverter a secuencia do movemento" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "Normalizar as rotacións do cubo" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "Normalizar a secuencia de movementos" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Ladrillo" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-ladrillo" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Largo:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Alto:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Profundidade:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Arriba" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Abaixo" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Esquerda" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Dereita" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Adiante" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Atrás" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Torre" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-torre" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Base:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Cubo" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cubo" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Tamaño:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "Cubo baleiro" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "Tetraedro" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "{0}-Tetraedro" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "Prisma triangular" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "{0}×{1} prisma triangular" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "Prisma triangular (complexo)" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "{0}×{1} prisma triangular (complexo)" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "Prisma pentagonal" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "{0}×{1} prisma pentagonal" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "Dianteiro dereito" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "Dianteiro esquerdo" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "Prisma pentagonal (estirado)" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "{0}×{1} prisma pentagonal (estirado)" pybik-2.1/po/pl.po0000664000175000017500000011367612556245211014254 0ustar barccbarcc00000000000000# Polish translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2013-06-27 12:09+0000\n" "Last-Translator: Michał Rzepiński \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Wystąpił błąd podczas wczytywania ustawień:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Wciśnij Esc by opuścić tryb edycji" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} ruch" msgstr[1] "{current} / {total} ruchy" msgstr[2] "{current} / {total} ruchów" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "rozwiązane" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "nierozwiązane" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Gratulacje, łamigłówka rozwiązana!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "Trójwymiarowe układanie kostki Rubika" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 #, fuzzy msgid "* Editor for move sequences" msgstr "&Odwróć ruchy" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Ten program jest wolnym oprogramowaniem: możesz go redystrybuować i/lub " "modyfikować zgodnie z warunkami GNU General Public License opublikowanej " "przez Free Software Foundation (Fundacja Wolnego Oprogramowania), w wersji 3 " "lub (wedle Twojego uznania) każdej poprzedniej wersji.\n" "\n" "Ten program jest dystrybuowany w nadziei, iż będzie użyteczny, lecz NIE " "POSIADA ŻADNEJ GWARANCJI; nie posiada \"dorozumianej gwarancji przydatności " "do sprzedaży\" (IMPLIED WARRANTY OF MERCHANTABILITY) ani \"dorozumianej " "gwarancji przydatności do określonego celu\" (IMPLIED WARRANTY OF FITNESS " "FOR A PARTICULAR PURPOSE). By poznać szczegóły, zajrzyj do dokumentacji GNU " "General Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Przeczytaj pełny tekst Powszechnej licencji " "publicznej GNU<|> lub zobacz ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Wraz z niniejszym programem dostarczono egzemplarz Powszechnej Licencji " "Publicznej GNU (GNU General Public License); jeśli nie - odwiedź stronę " "." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Jeśli znajdziesz jakiekolwiek błędy w programie Pybik lub masz sugestie " "dotyczące jego usprawnienia zgłoś <{CONTACT_FILEBUG}|>raport o błędach<|>. W " "przypadku sugestii oznacz raport jako \"Wishlist\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Tłumaczenia są zarządzane przez: Launchpad translation group<|>.\n" "\n" "Jeśli chcesz pomóc przetłumaczyć Pybik na Twój język, możesz to zrobić " "poprzez interfejs sieciowy<|>.\n" "\n" "Przeczytaj więcej o \"Translating " "with Launchpad\" (Tłumaczenie z Launchpadem)<|> oraz \"Starting to translate\" (Zaczynanie " "tłumaczenia)<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Wciśnij dowolny klawisz ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Oświetlenie" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Aby wprowadzić zmiany niezbędne jest ponowne uruchomienie programu." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "zwykły" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "wybierz ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Przesuń" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Klucz" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Otwórz obraz" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Anulowanie operacji, proszę czekać" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Strona projektu Pybik" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "Ten algorytm nie działa dla żadnego modelu.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "Ten algorytm działa tylko dla:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "wyłączony" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "brzydki" #: ../pybiklib/schema.py:154 msgid "low" msgstr "niski" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "średni" #: ../pybiklib/schema.py:155 msgid "high" msgstr "wysoki" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "wyższy" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Nie można zapisać ustawień do pliku: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "O programie Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "O programie" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Tłumacze:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Opinia" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Tłumacz" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licencja" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "&Pomoc" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Gra" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Edycja" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Widok" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Pomoc" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Nowa losowa" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "No&wa rozwiązana" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Wyjdź" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "&Wybierz model..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Ustaw jako stan początkowy" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Resetuj obrót" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Preferencje" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Pasek narzędzi" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Pasek stanu" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Informacje..." #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Przewiń do tyłu" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Idź do poprzedniego oznaczenia(lub początku) sekwencji ruchów" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Poprzedni" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Cofnij się o jeden krok" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Zatrzymaj" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Odtwarzaj" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Przewiń sekwencję ruchów do przodu" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Następny" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Zrób jeden krok do przodu" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Dalej" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Idź do następnego oznaczenia (lub końca) w sekwencji ruchów" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Dodaj oznaczenie" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Oznacz aktualne miejsce w sekwencji ruchów" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Usuń oznaczenie" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Usuń oznaczenie z aktualnego miejsca w sekwencji ruchów" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Pasek edycji" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "&Pomoc" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Wybierz model" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Preferencje" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Grafika" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Szybkość animacji:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Wygładzanie" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Mysz" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Cztery kierunki" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Uproszczone,\n" "prawy przycisk odwraca ruch." #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Klawisze" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Dodaj" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Usuń" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Przywróć" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Wygląd" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Kolor:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Plik obrazu:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Kafelki" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mozaika" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Tło:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;kostka;puzzle;łamigłówka;magiczna;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Wyzwania" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Rozwiąż losową kostkę" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Górne krawędzie" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Górne rogi" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Metoda Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Ulepszona metoda Spiegel" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Paski" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Jajka sadzone" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Duże jajka sadzone" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 jajaka sadzone" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 jajaka sadzone" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Szachownica" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zygzak" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Kostka w kostce" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Pasiasta kostka w kostce" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "Sześć sześcianów" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Superflip łatwy" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Zielona mamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Kacza stopa" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Biblioteka" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Zamień krawędzie miejscami" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "Środkowa warstwa" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Odwróć krawędzie" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Górne krawędzie" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Zamień rogi miejscami" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Obróć rogi" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Obróć centrum" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2xDo góry" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Odwróć ruchy" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Normalizuj obrót kostki" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Klocek" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Klocek" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Szerokość:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Wysokość:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Głębokość:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "W górę" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "W dół" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "W lewo" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "W prawo" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Przód" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Tył" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Wieża" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Wieża" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Podstawa" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Kostka" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Kostka" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Rozmiar:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Kostka" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "W prawo" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Przód" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/uz.po0000664000175000017500000011562612556245211014274 0ustar barccbarcc00000000000000# Uzbek translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-12 13:32+0000\n" "Last-Translator: Akmal Xushvaqov \n" "Language-Team: Uzbek \n" "Language: uz\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-22 05:15+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Sozlamalar o‘qilyotganda xato yuz berdi:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "\"Tahrirlash usuli\"dan chiqish uchun \"Esc\" tugmasini bosing." #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} koʻchirish" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "hal qilindi" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "hal qilinmadi" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Tabriklaymiz, siz muammoni hal qildingiz!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Rubik'ning kubik o‘yini" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" "\"Pybik\" - 3D Ernő Rubik tomonidan kashf qilingan kubik haqidagi " "boshqotirma o‘yindir." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* O‘zgacga 3D boshqotirmalar - 10x10x10’ga ko‘paytirilgan:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Ba’zi boshqotirmalar uchun yechimlar" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Ajoyib namunalar" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Harakat davomiyligini tahrirlagich" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* O‘zgartirsa bo‘ladigan ranglar va tasvirlar" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Ushbu dastur erkin va ochiq kodli dastur: siz uni tarqatishingiz yoki \"Free " "Software Foundation\" tomonidan e’lon qilingan \"GNU General Public License" "\" litsenziyasi (3ta versiyasi yoki xohishingiz bo‘yicha so‘nggi " "versiyalari) shartlari ostida o‘zgartirishingiz mumkin.\n" "\n" "Ushbu dastur boshqalarga foydali bo‘ladi degan umidda tekin tarqatiladi, " "ammo SAVDO yoki SHAXSIY MAQSADLARDA FOYDALANISHDA HECH QANDAY KAFOLAY " "BERILMAYDI. Batafsil ma’lumot uchun \"GNU General Public License\" bilan " "tanishib chiqing." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "GNU General Public License<|> matnini to‘liq o‘qing " "yoki ni ko‘ring." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Siz GNU General Public License'ning nusxasini ushbu dastur bilan birga qabul " "qilgan bo‘lishingiz kerak. Agar bunday bo‘lmasa, ushbu saytni ko‘ring: " "." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "\"Pybik\" da birorta nosozlik topsangiz yoki yaxshilash uchun " "tavsiyalaringiz bo‘lsa, marhamat, <{CONTACT_FILEBUG}|>nosizlikni xabar " "berish<|>ni to‘ldiring va jo‘nating. So‘nggi holatda nosozlikni " "\"Xohlaganlar ro‘yxati\" sifatida belgilang." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Tarjimalar Launchpad tarjima guruhi<|> tomonidan nazorat qilinadi.\n" "\n" "Agar \"Pybic\"ni ona tilingizga tarjima qilishga yordam bermoqchi " "bo‘lsangiz, veb interfys<|> " "orqali amalga oshirishingiz mumkin.\n" "\n" "\"Launchpad yordamida tarjima " "qilish\"<|> va " "\"Tarjimani boshlash\"<|> haqida ko‘proq o‘qing." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Tugmani bosing:" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Yoritish" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Oddiy" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "O‘zgarishlar kuchga kirishi uchun dasturni qaytadan ishga tushirish kerak." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "tekis" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "tanlash..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Ko‘chirish" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Tugma" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Rasmni ochish" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Jarayon bekor qilindi, kutib turing" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Kubikni burish uchun sichqonchadan foydalaning" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Sichqoncha ko‘rsatkichini jumboqqa yaqinlashtiring va ko‘rsatkich sichqoncha " "ko‘rsatkichi ostidagi burildigan parcha yo‘nalishi uchun ishora beradi." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "Sichqonchaning chap tugmasi kubikning bitta bo‘lagini ko‘rsatkich yo‘nalishi " "bo‘yicha buradi." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "Sichqonchaning o‘ng tugmasi kubikning bitta bo‘lagini ko‘rsatkich " "yo‘nalishiga teskari buradi." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Bitta bo‘lak o‘rniga butun kubikni burish uchun sichqoncha tugmasi bilan " "birga Ctrl tugmasini bosing." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Kubikni burish uchun klaviaturadan foydalaning" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybik loyihasi sayti" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "Ushbu algoritm birorta ham model uchun ishlamaydi.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "Ushbu algoritm faqat quyidagi uchun ishlaydi:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "o‘chirilgan" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "xunuk" #: ../pybiklib/schema.py:154 msgid "low" msgstr "past" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "o‘rtacha" #: ../pybiklib/schema.py:155 msgid "high" msgstr "yuqori" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "yuqoriroq" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Sozlashlarni faylga yozib bo‘lmaydi: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Pybik haqida" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Haqida" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Tarjimonlar:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Mulohaza" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Tarjima qilish" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Litsenziya" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "&Yordam" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&O‘yin" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Tahrirlash" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Ko‘rinishi" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Yordam" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Yangi tasodifiy" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Ya&ngi bajarilgan" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "Chi&qish" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "Modelni tanla&sh" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "Boshlang‘ich holat sifatida o‘rnati&sh" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "Bu&rishni bekor qilish" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Sozlamalar" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Asboblar paneli" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Holat paneli" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Ma’lumot …" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Orqaga" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Ko‘chirishlar natijalarining oldingi (yoki boshlanishi) belgilanishiga o‘tish" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Oldingi" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Bir qadam orqaga qaytarish" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "To‘xtatish" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "O‘yinni boshlash" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Yurishlar ichiga bir bosqich o‘tish" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Keyingi" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Bir bosqich oldinga o‘tish" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Oldinga" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Yurishlardagi keyingi (yoki oxirgi) belgilashga o‘tish" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Belgilashni qo‘shish" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Yurishlardagi joriy joyni belgilash" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Belgilashni olib tashlash" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Yurishlardagi joriy joyni belgilashni olib tashlash" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Tahrirlash paneli" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "&Yordam" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Modelni tanlang" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Parametrlar" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Grafik" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Animatsiya tezligi:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Oyna uzoqligi:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Sichqoncha" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "To‘rt yo‘nalishda" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Soddalashtirilgan,\n" "o‘ng tugma yurishni orqaga qaytaradi" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Tugmalar" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Qo‘shish" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Olib tashlash" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Bekor qilish" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Ko‘rinishi" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Rangi:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Rasm fayli:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Plitkali" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mozayka" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Orqa fon:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;kubik;boshqotirma;sehrli;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Muammolar" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Tasodifiy kubikni hal qilish" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Yechimlar" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Yuqori chegaralar" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Yuqori burchaklar" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "O‘rtadagi qism" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Pastgi chegara hududi" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Pastgi burchak hududi" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Pastgi burchak joyi" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Pastgi chegara joyi" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Shpigel yaxshilandi" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Yuqori qism" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Ajoyib namunalar" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Yo‘laklar" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Criss-Cross" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Qovurilgan tuxumlar" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Katta qovurilgan tuxumlar" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 ta qovurilgan tuxumlar" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 ta qovurilgan tuxumlar" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Shaxmat" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Plus" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T-Time" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Kubikdagi kubik" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Kubikdagi chiziqchali kubik" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "Olti kvadratli kubikchalar" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Yashil mamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "O‘rdak oyog‘i" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Kutubxona" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Chetlarini almashtirish" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "O‘rta qatlam" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Chetlarini burish" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Yuqori chegaralar" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Yuqori burchaklar" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "Pastgi burchak joyi" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "Pastgi burchak joyi" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Burchaklarini burish" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Markazga burish" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×yuqoriga" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 #, fuzzy msgid "Up ⟳ and front ⟳" msgstr "Yuqoriga va oldinga" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 #, fuzzy msgid "Up ⟳ and front ⟲" msgstr "Yuqoriga va oldinga" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Orqaga qaytarish" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Kubkini burishni me’yorlashtirish" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "G‘isht" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-g‘isht" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Eni:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Bo‘yi:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Chuqurligi:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Yuqoriga" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Pastga" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Chapga" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "O‘ngga" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Oldinga" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Orqaga" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Minora" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-minora" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Asosiy:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Kubik" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-kubik" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Hajmi:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Kubik" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "O‘ngga" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Oldinga" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/el.po0000664000175000017500000012217012556245211014226 0ustar barccbarcc00000000000000# Greek translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-19 11:03+0000\n" "Last-Translator: mara sdr \n" "Language-Team: Greek \n" "Language: el\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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Προέκυψε ένα σφάλμα κατά την ανάγνωση των ρυθμίσεων:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Πατήστε Esc για να φύγετε από τη λειτουργία Επεξεργασίας" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} κίνηση" msgstr[1] "{current} / {total} κινήσεις" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "επιλυμένο" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "μη επιλυμένο" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Συγχαρητήρια, επιλύσατε το γρίφο!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "Τρισδιάστατος κύβος του Ρούμπικ" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 #, fuzzy msgid "* Pretty patterns" msgstr "Όμορφα Μοτίβα" #: ../pybiklib/config.py:78 #, fuzzy msgid "* Editor for move sequences" msgstr "&Αντιστροφή κινήσεων" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Το πρόγραμμα αυτό αποτελεί ελεύθερο λογισμικό: μπορείτε να το αναδιανείμετε " "και/ή να το τροποποιήσετε σύμφωνα με τους όρους της άδειας χρήσης GNU " "General Public License, όπως αυτή έχει δημοσιευτεί από το Free Software " "Foundation, είτε την έκδοση 3, ή (βάσει επιλογής σας) οποιαδήποτε " "μεταγενέστερη.\n" "\n" "Αυτό το πρόγραμμα διανέμεται με την ελπίδα ότι θα αποβεί χρήσιμο, αλλά ΧΩΡΙΣ " "ΚΑΜΙΑ ΕΓΓΥΗΣΗ, ούτε καν την εγγύηση που υπονοείται όσον αφορά την " "ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑ ή την ΚΑΤΑΛΛΗΛΟΤΗΤΑ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Για περισσότερες " "λεπτομέρειες ανατρέξτε στην άδεια χρήσης GNU General Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Διαβάστε το πλήρες κείμενο της άδειας GNU General " "Public License<|> ή επισκεφθείτε το ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Θα πρέπει να έχετε λάβει αντίγραφο της Γενικής Άδειας Δημόσιας Χρήσης GNU " "(GPL) μαζί με το πρόγραμμα. Εάν όχι, επισκεφθείτε το ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Αν βρείτε κάποια σφάλματα (bugs) στο Pybik ή αν έχετε κάποια πρόταση για " "βελτίωση, τότε παρακαλώ υποβάλετε μια <{CONTACT_FILEBUG}|>αναφορά σφάλματος<|" ">. Σε άλλη περίπτωση, μπορείτε να σημειώσετε την αναφορά σφάλματος ως " "\"Wishlist\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Οι μεταφράσεις βρίσκονται υπό τη διαχείριση της μεταφραστικής ομάδας του " "Launchpad<|>.\n" "\n" " Αν θέλετε να βοηθήσετε στη μετάφραση του Pybik, μπορείτε να το κάνετε μέσω " "διαδικτυακής διεπαφής<|>.\n" "\n" "Διαβάστε περισσότερα: " "\"Μεταφράζοντας στο Launchpad\"<|> και \"Ξεκινώντας τη μετάφραση\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Πατήστε κάποιο πλήκτρο ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Φωτισμός" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Το πρόγραμμα χρειάζεται επανεκκίνηση για να ενεργοποιηθούν οι αλλαγές." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "απλό" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "επιλογή ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Κίνηση" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Πλήκτρο" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Άνοιγμα εικόνας" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Ακύρωση ενέργειας, παρακαλώ περιμένετε" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Ιστοσελίδα του Pybik project" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "Αυτός ο αλγόριθμος δε λειτουργεί για οποιοδήποτε μοντέλο.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "Αυτός ο αλγόριθμος λειτουργεί μόνο για:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "απενεργοποιημένο" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "άσχημο" #: ../pybiklib/schema.py:154 msgid "low" msgstr "χαμηλό" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "μέτριο" #: ../pybiklib/schema.py:155 msgid "high" msgstr "υψηλό" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "υψηλότερο" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Αδύνατη η εγγραφή των ρυθμίσεων στο αρχείο: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Σχετικά με το Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Περί" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Μεταφραστές:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Σχόλια" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Μετάφραση" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Άδεια χρήσης" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "Βοή&θεια" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Παιχνίδι" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Επεξεργασία" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "Προ&βολή" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "Βοή&θεια" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Τυχαίο" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Επι&λυμένο" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "Έ&ξοδος" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "Επιλογή &Μοντέλου …" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Ορισμός ως αρχική κατάσταση" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "Επα&ναφορά Περιστροφής" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "Π&ροτιμήσεις …" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "Γραμμή ερ&γαλείων" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Γραμμή &κατάστασης" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "Πληρο&φορίες …" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Πίσω" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Πήγαινε στο προηγούμενο σημάδι (ή την αρχή) της αλληλουχίας κινήσεων" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Προηγούμενο" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Κάνε ένα βήμα πίσω" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Διακοπή" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Αναπαραγωγή" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Προχώρα μπροστά στην αλληλουχία κινήσεων" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Επόμενο" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Κάνε ένα βήμα μπροστά" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Μπροστά" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Πήγαινε στο επόμενο σημάδι (ή στο τέλος) της αλληλουχίας κινήσεων" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Προσθήκη σημαδιού" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Σημάδεψε την τρέχουσα θέση στην αλληλουχία κινήσεων" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Απομάκρυνση σημαδιού" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Απομάκρυνε το σημάδι από την τρέχουσα θέση στην αλληλουχία κινήσεων" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "Μπάρα &Επεξεργασίας" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "Βοή&θεια" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Επιλογή μοντέλου" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Προτιμήσεις" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Γραφικά" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Ταχύτητα animation:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Απόσταση καθρέφτη:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Εξομάλυνση (Antialiasing)" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Ποντίκι" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Τέσσερις διευθύνσεις" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Απλοποιημένο,\n" "το δεξί πλήκτρο αντιστρέφει την κίνηση" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Πλήκτρα" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Προσθήκη" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Αφαίρεση" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Επαναφορά" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Εμφάνιση" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Χρώμα:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Αρχείο εικόνας:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Πλακίδια" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Μωσαϊκό" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Φόντο:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" "ρούμπικ;ρουμπικ;κύβος;κυβος;γρίφος;γριφος;kybos;kivos;kyvos;kubos;kuvos;" "grifos;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Δοκιμασίες" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Επίλυση τυχαίου κύβου" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Λύτες" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Επάνω Ακμές" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Επάνω Γωνίες" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Μεσαίο τμήμα" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Προσανατολισμός Κάτω Ακμής" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Προσανατολισμός Κάτω Γωνίας" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Τοποθέτηση Κάτω Γωνίας" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Τοποθέτηση Κάτω Ακμής" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Leyan Lo" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Βελτιωμένο Spiegel" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Επάνω Πλευρά" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Όμορφα Μοτίβα" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Ρίγες" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Σταυρωτά" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Τηγανητά Αυγά" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Μεγάλα Τηγανητά Αυγά" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 Τηγανητά Αυγά" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 Τηγανητά Αυγά" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Σκακιέρα" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Σταυρός" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Ζιγκ Ζαγκ" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T-Time" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Κύβος μέσα σε Κύβο" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Ριγέ Κύβος μέσα σε Κύβο" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Εύκολο Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Green Mamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Duck Feet" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Βιβλιοθήκη" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Αντιμετάθεση Ακμών" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "Μεσαία Στρώση" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Επάνω Ακμές" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Επάνω Ακμές" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Αντιμετάθεση Γωνιών" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "Τοποθέτηση Κάτω Γωνίας" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "Τοποθέτηση Κάτω Γωνίας" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Περιστροφή γωνιών" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Περιστροφή Κέντρου" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×Πάνω" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 #, fuzzy msgid "Up ⟳ and front ⟳" msgstr "Πάνω και Μπροστά" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 #, fuzzy msgid "Up ⟳ and front ⟲" msgstr "Πάνω και Μπροστά" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 #, fuzzy msgid "Up ⟳ and down ⟲" msgstr "Πάνω και Κάτω" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Διάφορα" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 #, fuzzy msgid "Back without back" msgstr "Back without Back" #: ../data/plugins/90-library.plugins.py:121 #, fuzzy msgid "2×Back without back" msgstr "2×Back without Back" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Αντιστροφή κινήσεων" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Ομαλοποίηση Περιστροφών του Κύβου" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Τούβλο" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "Τούβλο {0}×{1}×{2}" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Πλάτος:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Ύψος:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Βάθος:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Πάνω" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Κάτω" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Αριστερά" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Δεξιά" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Μπροστά" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Πίσω" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Πύργος" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "Πύργος {0}×{1}" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Βάση:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Κύβος" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "Κύβος {0}×{0}×{0}" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Μέγεθος:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Κύβος" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Δεξιά" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Μπροστά" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/es.po0000664000175000017500000011446512556245211014245 0ustar barccbarcc00000000000000# Spanish translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-25 05:04+0000\n" "Last-Translator: José Lou Chang \n" "Language-Team: Spanish \n" "Language: es\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" "X-Launchpad-Export-Date: 2015-07-22 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Ocurrió un error mientras se leían las configuraciones:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Oprima la tecla Esc para salir del modo de edición" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} movimiento" msgstr[1] "{current} / {total} movimientos" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "resuelto" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "sin resolver" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "¡Felicidades, ha resuelto el rompecabezas!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Juego del cubo Rubik´s" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" "Pybik es un juego de rompecabezas en 3D sobre el cubo inventado por Ernő " "Rubik." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Diferentes rompecabezas 3D - hasta de 10x10x10:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Solucionadores de algunos rompecabezas" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Bonitos modelos" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Editor para secuencias de movimientos" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Colores e imágenes cambiables" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Este programa es software libre: puede redistribuirlo o modificarlo bajo los " "términos de la Licencia Pública General de GNU, como la publica la Free " "Software Foundation, ya sea la versión 3 de la Licencia, o (a su elección) " "cualquier versión posterior.\n" "\n" "Este programa se distribuye con la esperanza de que será útil, pero SIN " "NINGUNA GARANTÍA; sin siquiera la garantía implícita de COMERCIABILIDAD o " "IDONEIDAD PARA UN PROPÓSITO EN PARTICULAR. Consulte la Licencia Pública " "General de GNU para más detalles." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Lea el texto completo de la Licencia Pública " "General de GNU<|> o consulte ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Debería haber recibido una copia de la Licencia Pública General GNU junto " "con este programa. De no ser así, visite ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Si encuentra un error en Pybik o quiere hacer una sugerencia, cree un " "<{CONTACT_FILEBUG}|>informe de error<|> (en inglés). Las sugerencias se " "marcarán como «Wishlist»." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "El grupo " "de traducción de Launchpad<|> gestiona las traducciones.\n" "\n" "Si quiere ayudar a traducir Pybik a su idioma natal puede hacerlo mediante " "la interfaz web<|>.\n" "\n" "Lea más sobre traducir con " "Launchpad<|> y cómo empezar<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Oprima una tecla…" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Iluminación" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Simple" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Necesita reiniciar el programa para que los cambios surtan efecto." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "plano" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "seleccionar…" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Mover" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Clave" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Abrir imagen" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Cancelando la operación, espere un momento" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Usar el ratón para rotar el cubo" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "El botón izquierdo del ratón gira un segmento del cubo en la dirección de la " "flecha." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "El botón derecho del ratón hace girar un segmento del cubo en contra de la " "dirección de la flecha." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Usar el teclado para rotar el cubo" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Asegúrese de que el teclado se encuentra enfocado en el área del cubo (por " "ejemplo, haga clic en el fondo del cubo). Las teclas se pueden configurar en " "el diálogo de preferencias, el valor predeterminado es:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Sitio web del proyecto Pybik" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "Este algoritmo no funciona para cualquier modelo.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "Este algoritmo solo funciona para:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "desactivado" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "horrible" #: ../pybiklib/schema.py:154 msgid "low" msgstr "baja" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "media" #: ../pybiklib/schema.py:155 msgid "high" msgstr "alta" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "No se puede guardar la configuración en el archivo: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Acerca de Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Acerca de" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Traductores:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Sugerencias" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Traducir" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licencia" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "Ay&uda" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Partida" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Editar" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Ver" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "Ay&uda" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Salir" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "&Seleccionar modelo…" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Preferencias…" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Barra de herramientas" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Barra de e&stado" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Información…" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Retroceder" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Ir a la marca anterior (o al principio) de la secuencia de movimientos" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Anterior" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Dar un paso hacia atrás" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Detener" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Reproducir" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Siguiente" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Dar un paso hacia adelante" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Avanzar" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Ir a la siguiente marca (o final) de la secuencia de movimientos" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Añadir marca" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Marcar el lugar actual en la secuencia de movimientos" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Quitar marca" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Desmarcar el lugar actual en la secuencia de movimientos" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "Barra de &edición" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "Ay&uda" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Seleccionar modelo" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Preferencias" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Gráfico" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Velocidad de la animación:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Distancia de espejo:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Suavizado" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Ratón" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Cuatro direcciones" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplificado,\n" "el botón derecho invierte el movimiento" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Teclas" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Añadir" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Quitar" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Restablecer" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Apariencia" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Color:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Archivo de imagen:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "En mosaico" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaico" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Fondo:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cubo;rompecabezas;mágico;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Desafíos" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Resolver un cubo aleatorio" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Solucionadores" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Bordes superiores" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Esquinas superiores" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Spiegel mejorado" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Rayas" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Entrecruzado" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Huevos fritos" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Huevos fritos grandes" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 huevos fritos" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 huevos fritos" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Tablero de ajedrez" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Cruzado" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "Hora del T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Cubo en un cubo" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Cubo de rayas en un cubo" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "Ortoedros de seis cuadrados" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Superflip fácil" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Mamba verde" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Pies de pato" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Biblioteca" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Bordes superiores" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "Capa central" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Bordes superiores" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Bordes superiores" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Esquinas superiores" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Girar esquinas" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Girar el centro" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 #, fuzzy msgid "Up ⟳ and front ⟳" msgstr "Arriba y adelante" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 #, fuzzy msgid "Up ⟳ and front ⟲" msgstr "Arriba y adelante" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 #, fuzzy msgid "Up ⟳ and down ⟲" msgstr "Arriba y abajo" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Varios" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Invertir movimientos" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Normalizar giros del cubo" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Ladrillo" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Bloque" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Anchura:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Altura:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Profundidad:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Arriba" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Abajo" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Izquierda" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Derecha" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Anverso" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Reverso" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Torre" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Torre" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Base:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Cubo" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cubo" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Tamaño:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Cubo" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Derecha" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Anverso" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/ast.po0000664000175000017500000011400512556245211014413 0ustar barccbarcc00000000000000# Asturian translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-03-28 22:57+0000\n" "Last-Translator: Xuacu Saturio \n" "Language-Team: Asturian \n" "Language: ast\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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Hebo un error al lleer la configuración:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Calque la tecla Esc pa salir del mou d'edición" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} movimientu" msgstr[1] "{current} / {total} movimientos" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "resueltu" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "ensin resolver" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "¡Norabona, resolvió'l rompecabeces!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "Xuegu del cubu de Rubik 3D" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 #, fuzzy msgid "* Pretty patterns" msgstr "Patrones guapos" #: ../pybiklib/config.py:78 #, fuzzy msgid "* Editor for move sequences" msgstr "&Invertir los movimientos" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Esti programa ye software llibre: pue redistribuílu y/o camudalu baxo los " "términos de la Llicencia Pública Xeneral GNU, tal y como la publica la Free " "Software Foundation, o bien la versión 3 de la llicencia, o (como prefiera) " "cualquier versión posterior.\n" "\n" "Esti programa distribúise esperando que seya útil, pero ENSIN NENGUNA " "GARANTÍA, sin siquiera la garantía implícita de COMERCIALIDÁ o ADAUTACIÖN PA " "UN PROPÓSITU PARTICULAR. Vea la Llicencia Pública Xeneral GNU pa más " "detalles." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Llea'l testu completu de la Llicencia Pública " "Xeneral GNU<|> o vea ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Habría de tener recibío una copia de la Llicencia Pública Xeneral GNU xunto " "con esti programa. Sinón visite ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Se atopa algún fallu en Pybik o tien una suxerencia p'ameyoralu, por favor, " "unvie un <{CONTACT_FILEBUG}|>informe d'error<|>. Si ye una suxerencia, pue " "marcar l'informe d'error como «Wishlist» (Llista de deseos)." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Les traducciones xestionense pol Grupu de traducción de Launchpad<|>.\n" "\n" "Si quier ayudar a traducir Pybik al so idioma pue facelo usando la interfaz web<|>.\n" "\n" "Llea más tocante a \"Traducir con " "Launchpad\"<|> y \"Principiar a traducir\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Calca una tecla…" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Illuminación" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Necesites reaniciar el programa pa que los cambeos surtan efeutu." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "planu" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "seleicionar…" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Mover" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Clave" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Abrir imaxe" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Encaboxando la operación, espera un momentu" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Sitiu web del proyeutu Pybik" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "Esti algoritmu nun funciona pa cualquier modelu.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "Esti algoritmu namái funciona pa:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "desactiváu" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "feu" #: ../pybiklib/schema.py:154 msgid "low" msgstr "baxo" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "mediu" #: ../pybiklib/schema.py:155 msgid "high" msgstr "Altu/a" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "mayor" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Les configuraciones nun puen lleese pal ficheru: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Tocante a Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Tocante a" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Traductores:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Suxerencias" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Traducir" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Llicencia" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "&Ayuda" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Xuegu" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Editar" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Ver" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Ayuda" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Nuevu al debalu" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Nue&vu resueltu" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "Co&lar" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "&Seleicionar modelu..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Definir como estáu inicial" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Reestablecer xiru" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Preferencies…" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "Barra de &ferramientes" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Barra d'&estáu" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Info…" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Rebobinar" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Dir a la marca anterior (o al principiu) de la secuencia de movimientos" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Anterior" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Dar un pasu atrás" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Parar" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Xugar" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Executar p'alantre la secuencia de movimientos" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Siguiente" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Dar un pasu alantre" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Alantre" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Dir a la siguiente marca (o al final) de la secuencia de movimientos" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Amestar marca" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Marcar el llugar actual na secuencia de movimientos" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Desaniciar marca" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Desaniciar la marca del llugar actual na secuencia de movimientos" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Editar barra" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "&Ayuda" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Seleicionar modelu" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Preferencies" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Gráficu" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Velocidá de l'animación:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Distancia d'espeyu:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Antialies" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Mur" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Cuatro direiciones" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Simplificáu,\n" "o botón drechu invierte'l movimientu" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Tecles" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Amestar" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Desaniciar" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Reaniciar" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Aspeutu" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Color:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Ficheru d'imaxe:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "En mosaicu" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaicu" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Fondu:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cubu;rompecabeces;máxicu;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Retos" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Resolver un cubu al debalu" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Solucionadores" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Bordes superiores" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Esquines superiores" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Banda del mediu" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Orientar el borde inferior" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Orientar esquina inferior" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Llugar d'esqina inferior" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Llugar del borde inferior" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Spiegel ameyoráu" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Banda superior" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Patrones guapos" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Rayes" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Entrellazáu" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Güevos fritos" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Güevos fritos grandes" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 güevos fritos" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 güevos fritos" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Tableru d'axedrez" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Cruz" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Ziszás" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "Tiempu-T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Cubu nun cubu" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Cubu a rayes nun cubu" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "Seyes cuboides cuadraos" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Superflip fácil" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Mamba verde" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Pie de coríu" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Biblioteca" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Intercambiar los bordes" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "Capa del mediu" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Voltiar los bordes" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Bordes superiores" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Intercambiar esquines" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "Llugar d'esqina inferior" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "Llugar d'esqina inferior" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Xirar esquines" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Xirar el centru" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×Arriba" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 #, fuzzy msgid "Up ⟳ and front ⟳" msgstr "Arriba y al frente" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 #, fuzzy msgid "Up ⟳ and front ⟲" msgstr "Arriba y al frente" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 #, fuzzy msgid "Up ⟳ and down ⟲" msgstr "Arriba y abaxo" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Otros" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 #, fuzzy msgid "Back without back" msgstr "Atrás ensin retornu" #: ../data/plugins/90-library.plugins.py:121 #, fuzzy msgid "2×Back without back" msgstr "2xAtrás ensin retornu" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Invertir los movimientos" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Normalizar los xiros del cubu" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Lladriyu" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Bloque" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Anchor:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Altor:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Profundidá:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Xubir" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Baxar" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Esquierda" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Drecha" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Frente" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Reversu" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Torre" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Torre" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Base:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Cubu" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cubu" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Tamañu:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Cubu" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Drecha" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Frente" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/ru.po0000664000175000017500000012534412556245211014262 0ustar barccbarcc00000000000000# Russian translation for pybik # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-13 05:33+0000\n" "Last-Translator: ☠Jay ZDLin☠ \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2015-07-22 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Произошла ошибка при чтении настроек:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Нажмите на кнопку Esc для выхода из режима редактирования" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} ход" msgstr[1] "{current} / {total} хода" msgstr[2] "{current} / {total} ходов" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "решено" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "не решено" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Поздравляю, вы решили головоломку!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Кубик Рубика" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "Pybik — 3D-головоломка на основе куба, изобретённого Эрнё Рубиком." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Различные 3D-головоломки — до 10x10x10:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Решения для некоторых головоломок" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Различные модели" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Редактор последовательности ходов" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Изменяемые цвета и изображения" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Это свободное программное обеспечение: его можно распространять и/или " "изменять на условиях GNU General Public License, опубликованной Free " "Software Foundation; либо версии 3 этой лицензии, либо (на ваш выбор) любой " "более поздней версии.\n" "\n" "Программа распространяется в надежде, что она будет полезной, но БЕЗ КАКОЙ " "ЛИБО ГАРАНТИИ, даже без обязательной гарантии КОМЕРЧЕСКОЙ ЦЕННОСТИ ИЛИ " "ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОЙ ЦЕЛИ. Подробности смотрите в тексте GNU General " "Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Прочтите полный текст универсальной общественной " "лицензии GNU <|>, либо перейдите на сайт ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Вместе с этой программой вы должны были получить копию GNU General Public " "License. Если нет, обратитесь к ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Если вы обнаружили ошибку в Pybik или у вас есть предложение по улучшению " "программы, отправьте, пожалуйста <{CONTACT_FILEBUG}|>отчёт об ошибке<|>. В " "последнем случае можете снабдить отчёт об ошибке пометкой \"Wishlist\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Перевод программы ведётся группой переводчиков Launchpad<|>.\n" "\n" "Если вы хотите помочь перевести Pybik на другие языки, вы можете сделать это " "через веб-интерфейс<|>.\n" "\n" "Узнайте больше в разделах помощи «Translating with Launchpad»<|> и «Starting to translate»<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Нажмите клавишу..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Освещение" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Простой" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Для вступления изменений в силу, программу следует перезапустить." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "нет" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "выбрать …" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Перемещение" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Клавиша" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Открыть изображение" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Отмена операции, подождите" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Использование мыши для поворота куба" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Наведите курсор на головоломку; появится стрелка, указывающая направление, в " "котором будет повёрнут выбранный сегмент." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "Левая кнопка мыши поворачивает сегмент куба в направлении, указываемом " "стрелкой." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "Правая кнопка мыши поворачивает сегмент куба в направлении, противоположном " "указываемому стрелкой." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Чтобы повернуть куб целиком, а не отдельный сегмент, нажмите кнопку мыши, " "удерживая клавишу Ctrl." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Использование клавиатуры для поворота куба" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Убедитесь, что куб находится в фокусе клавиатуры (для подтверждения нажмите " "на задний план куба). Комбинации клавиш можно задать в настройках; по " "умолчанию назначены следующие значения:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" "Перемещение влево, вправо, вниз, вверх, вперёд или назад по часовой стрелке." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Перемещение сегмента против часовой стрелки." #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Поворот всего куба." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Другие сочетания клавиш" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Колёсико мыши — Приближение/Удаление" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" "Клавиши-стрелки, Нажатие левой кнопки мыши на заднем плане — Изменение " "ракурса отображения куба." #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Сайт проекта Pybik" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "Данный плагин не поддерживается ни для одной модели.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "Данный плагин работает только для:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Данную головоломку невозможно решить." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "отключено" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "ужасное" #: ../pybiklib/schema.py:154 msgid "low" msgstr "низкое" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "среднее" #: ../pybiklib/schema.py:155 msgid "high" msgstr "высокое" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "максимальное" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Не удалось записать настройки в файл: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Об игре Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "О программе" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Переводчики:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Обратная связь" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Перевод" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Лицензия" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Справка" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Игра" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Правка" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Вид" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Справка" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Новая случайная" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Н&овая собранная" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "В&ыйти" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "&Выбор головоломки …" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Обнулить поворот" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Настройки…" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Панель инструментов" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Строка состояния" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Информация …" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Назад" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Перейти к предыдущей метке (или началу) последовательности вращений" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Предыдущее" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Вернуться на шаг назад" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Стоп" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Воспроизвести" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Воспроизвести последовательность вращений" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Следующее" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Перейти на шаг вперёд" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Вперёд" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Перейти к следующей метке (или концу) последовательности вращений" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Добавить метку" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Пометить текущую позицию в последовательности вращений" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Удалить метку" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Убрать метку из текущей позиции в последовательности вращений" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "П&анель редактирования" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "&Справка …" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "Выбор головоломки" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Настройки" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Графика" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Скорость анимации:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Расстояние зеркала:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Сглаживание" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Мышь" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Четыре направления" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Упрощённая,\n" "правая кнопка обращает поворот" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Клавиши" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Добавить" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Удалить" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Сбросить" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Внешний вид" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Цвет:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Изображение:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Черепица" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Мозаика" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Фон:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "Рубик;кубик;головоломка;магия;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Задачи" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Собрать случайный кубик" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "Решение в {} ход" msgstr[1] "Решение в {} хода" msgstr[2] "Решение в {} ходов" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Решатели" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Верхние кромки" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Верхние углы" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Средний слой" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Ориентация нижней кромки" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Ориентация нижнего угла" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Положение нижнего угла" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Положение нижней кромки" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Леян Ло" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Улушенный Spiegel" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Верхний слой" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Красивые узоры" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Полоски" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Перекресток" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Яичница" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Большая яичница" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 жареных яйца" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 жареных яйца" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Шахматная доска" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Крест" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Зигзаг" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T-форма" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Куб в кубе" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "Шесть квадратных кубоидов" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Зеленая мамба" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Анаконда" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Утиная лапа" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Плюс" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "Минус" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Вулкан" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "Шахматная доска (простая)" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "Смешанная шахматная доска" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Библиотека" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Поменять края" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "Средний слой" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Верхние кромки" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Верхние кромки" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Верхние углы" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "Положение нижнего угла" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "Положение нижнего угла" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Вращать углы" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Вращать центр" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Разное" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Инвертировать ходы" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Нормализовать вращение куба" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Блок" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Блок" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Ширина:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Высота:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Глубина:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Верхняя" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Нижняя" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Левая" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Правая" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Передняя" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Задняя" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Башня" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Башня" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Основание:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Куб" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Куб" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Размер:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Куб" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Правая" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Передняя" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/bg.po0000664000175000017500000012165712556245211014227 0ustar barccbarcc00000000000000# Bulgarian translation for pybik # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2014-02-07 09:44+0000\n" "Last-Translator: Atanas Kovachki \n" "Language-Team: Bulgarian \n" "Language: bg\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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Възникна грешка по време на четенето на настройките:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Натиснете клавиша Esc, за да излезете от режима за редактиране" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} ход" msgstr[1] "{current} / {total} хода" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "решено" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "не e решено" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Поздравления, вие решихте пъзела!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Рубик" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "Триизмерна игра с кубчето на Рубик" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 #, fuzzy msgid "* Pretty patterns" msgstr "Красиви модели" #: ../pybiklib/config.py:78 #, fuzzy msgid "* Editor for move sequences" msgstr "&Обърни движенията" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Това е свободна програма; можете да я разпространявате и/или променяте при " "условията на Общото Право за Обществено Ползване ГНУ публикувано от " "Фондацията за свободни програми; или версия 3 или (по Ваш избор) коя да е по " "късна версия.\n" "\n" "Тази програма се разпространява с надеждата , че ще бъде полезна но БЕЗ " "КАКВАТО И ДА Е ГАРАНЦИЯ ЗА ТОВА, дори без косвена гаранция за ПРИГОДНОСТ ЗА " "ОПРЕДЕЛЕНА ЦЕЛ. Виж условията на Общото Право за Обществено Ползване ГНУ за " "повече подробности." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Прочетете пълния текст на Общото Право на " "Обществено Ползване ГНУ<|>, или посетете уеб сайта ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Би трябвало да сте получили препис от Общото Право за Обществено Ползване " "ГНУ заедно с тази програма. Ако не сте обърнете се към ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Ако намерите грешка в Рубик или имате предложение за подобряване на " "програмата, моля изпратете <{CONTACT_FILEBUG}|>доклад за грешка<|>. В " "последния случай може да маркирате доклада за грешка като «Wishlist»." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Превода на програмата се провежда от групата за превод в Launchpad<|>.\n" "\n" "Ако искате да помогнете при превеждането на Рубик на други езици, можете да " "го направите чрез уеб интерфейса<|" ">.\n" "\n" "Узнайте повече в разделите за помощ «Translating with Launchpad»<|> и «Starting to translate»<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Натиснете клавиша..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Осветление" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Програмата трябва да бъде рестартирана, за да влязат промените в сила." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "обикновено" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "избери ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Придвижване" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Клавиш" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Отвори изображение" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Прекратяване на операцията, моля почакайте" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Уеб сайт на проекта Рубик" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "Този алгоритъм не работи за всички модели.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "Този алгоритъм работи само за:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "деактивирано" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "ужасно" #: ../pybiklib/schema.py:154 msgid "low" msgstr "ниско" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "средно" #: ../pybiklib/schema.py:155 msgid "high" msgstr "високо" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "максимално" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Настройките не могат да бъдат записани във файла: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Относно Рубик" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Относно" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Преводачи:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Връзка" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Превод" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Лиценз" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "&Помощ" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Игра" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Редактиране" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Изглед" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Помощ" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Нова случайна" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Н&ова решена" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Изход" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "&Изберете модел …" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Задай за начално състояние" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Възстанови ротациите" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Настройки…" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Лента с инструменти" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Лента за състоянието" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Информация …" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Превърти назад" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Премини към предишната отметка (или в началото) в последователността на " "ходовете" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Предишен" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Направи една крачка назад" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Спри" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Старт" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Стартирай последователността на ходовете" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Следващ" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Направи една крачка напред" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Превърти напред" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" "Премини към следващата отметка (или в края) в последователността на ходовете" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Добави отметката" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Маркирай сегашното място в последователността на ходовете" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Изтрий отметката" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Изтрий отметката от сегашното място в последователността на ходовете" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Редакционен панел" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "&Помощ" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Изберете модел" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Предпочитания" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Графика" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Скорост на анимацията:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Разстояние на огледалото:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Изглаждане" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Мишка" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Четири направления" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Опростена, \n" "десния бутон връща ход назад" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Клавиши" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Добави" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Премахни" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Възстанови" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Външен вид" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Цвят:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Изображение:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Теракот" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Мозайка" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Фон:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "Рубик;куб;пъзел;магия;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Предизвикателства" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Събери случаен куб" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Решители" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Топ ръбове" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Топ ъгли" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Среден слой" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Долен ръбов ориентир" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Долен ъглов ориентир" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Долно ъглово място" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Долно място на ръба" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Шпигел" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Подобрен шпигел" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Горен слой" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Красиви модели" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Ивици" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Наопаки" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Пържени яйца" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Големи пържени яйца" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 пържени яйца" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 пържени яйца" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Шахматно" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Пресечно" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Зиг заг" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "Т-време" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "С" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Куб в куба" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Раиран куб в куба" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "Шест квадратни кубоиди" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Супер флип" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Лесен супер флип" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Зелена мамба" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Анаконда" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Патешки крачета" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Библиотека" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Разменени ръбове" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "Среден слой" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Обърнати ръбове" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Топ ръбове" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Разменени ъгли" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "Долно ъглово място" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "Долно ъглово място" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Завъртени ъгли" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Завъртян център" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×нагоре" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 #, fuzzy msgid "Up ⟳ and front ⟳" msgstr "Нагоре и напред" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 #, fuzzy msgid "Up ⟳ and front ⟲" msgstr "Нагоре и напред" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 #, fuzzy msgid "Up ⟳ and down ⟲" msgstr "Нагоре и нодолу" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Разно" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 #, fuzzy msgid "Back without back" msgstr "Назад без връщане" #: ../data/plugins/90-library.plugins.py:121 #, fuzzy msgid "2×Back without back" msgstr "2×назад без връщане" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Обърни движенията" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Нормализирай ротациите на куба" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Блок" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Блок" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Ширина:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Височина:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Дълбочина:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Нагоре" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Надолу" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Наляво" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Надясно" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Напред" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Назад" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Кула" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Кула" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Основа:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Куб" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Куб" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Размер:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Куб" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Надясно" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Напред" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/zh_CN.po0000664000175000017500000010625312556245211014633 0ustar barccbarcc00000000000000# Chinese (Simplified) translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2013-06-15 13:51+0000\n" "Last-Translator: Xiaoxing Ye \n" "Language-Team: Chinese (Simplified) \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "在读取设置时发生错误:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "按下Esc键来退出编辑模式" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "第 {current} 步 / 共 {total} 步" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "已解出" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "未解出" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "恭喜,你已经解出了这个难题!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "3D 魔方游戏" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "这是一个免费软件,你可以重打包或者修改它,唯你需遵循自由软件基金会所发布的GNU" "通用公共许可证第三版或以上。\n" "\n" "这个软件打包的目的在于它十分有用,但是不提供任何担保;也没有适销性或针对特定" "用途的保证。详情请参阅GNU通用公共许可证。" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "阅读 GNU 通用公共许可协议<|>的全文或者参阅 。" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "您应该能够随此软件获得一份 GNU 通用公共许可协议的副本。如果没有,请访问 " "。" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "如果你在Pybik中发现任何漏洞或者有什么建议,请提交一份 <{CONTACT_FILEBUG}|>漏" "洞报告<|> 。如果你是想要提交建议,请将这份报告标志为“Wishlist”。" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "按下任意按钮 ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "需要重启程序来使修改生效。" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "纯色" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "选择" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "移动" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "密钥" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "打开图像" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "取消操作中,请稍候。" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybik项目主页" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "这个算法不适用于任何模式。\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "翻译者:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "意见反馈" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "翻译" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "许可协议" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "帮助(&H)" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "游戏(&G)" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "编辑(&E)" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "查看(&V)" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "帮助(&H)" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "新游戏(&N)" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "退出(&Q)" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "选择" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "帮助(&H)" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "砖块" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-砖块" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "宽度:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "上移" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "下移" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "左转" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "右转" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "正面" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "背面" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "塔" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-塔" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "基准:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "立方体" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-立方体" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "大小:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "立方体" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "右转" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "正面" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/ky.po0000664000175000017500000010532212556245211014251 0ustar barccbarcc00000000000000# Kirghiz translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2012-12-14 10:00+0000\n" "Last-Translator: chyngyz \n" "Language-Team: Kirghiz \n" "Language: ky\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Клавишаны басыңыз…" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Жарык" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "тандоо…" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Ташуу" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Клавиша" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Сүрөттү ачуу" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybik долбоорунун веб-сайты" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Pybik жөнүндө" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Программа жөнүндө" #: ../pybiklib/ui/about.py:31 #, fuzzy msgid "Translators:" msgstr "Котормо" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Кербайланыш" #: ../pybiklib/ui/about.py:33 #, fuzzy msgid "Translate" msgstr "Котормо" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Лицензия" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "&Жардам" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Оюн" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Оңдоо" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Көрүнүш" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Жардам" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Жаңы кокустук" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Чыгуу" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "Моделди &тандоо…" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Тегеретүү түшүрүү" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Параметрлер…" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Аспап панели" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Абал сабы" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Инфо…" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Мурунку" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Токтотуу" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Ойнотуу" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Кийинки" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Алга" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Белгини кошуу" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Белгини өчүрүү" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Оңдоо панели" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "&Жардам" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Моделди тандоо" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Параметрлер" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Графика" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Анимациянын ылдамдыгы:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Күзгүнүн аралыгы:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Тегиздөө" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Чычкан" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Клавишалар" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Кошуу" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Өчүрүү" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Түшүрүү" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Түс:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Сүрөт файлы:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Фон:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Туурасы:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Тереңдик:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Өйдө" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Ылдый" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Солго" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Оңго" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Алды" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Арты" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Куб" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Өлчөм:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Куб" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Оңго" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Алды" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/cs.po0000664000175000017500000011424712556245211014241 0ustar barccbarcc00000000000000# Czech translation for pybik # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-03-28 22:58+0000\n" "Last-Translator: Tadeáš Pařík \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Nastala chyba při načítání nastavení:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Stiskněte klávesu Esc pro opuštění editačního módu" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} pohyb" msgstr[1] "{current} / {total} pohyby" msgstr[2] "{current} / {total} pohybů" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "vyřešeno" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "nevyřešeno" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Gratulujeme, vyřešili jste hlavolam!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "3D Rubikova kostka" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 #, fuzzy msgid "* Pretty patterns" msgstr "Hezké vzory" #: ../pybiklib/config.py:78 #, fuzzy msgid "* Editor for move sequences" msgstr "&Otočit pohyby" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Tento program je svobodným softwarem: můžete ho dále šířit a/nebo " "modifikovat za podmínek licence GNU General Public, která je uveřejněna " "Nadací Svobodného Softwaru, ve verzi 3 nebo (podle vašeho uvážení) jakékoli " "pozdější verze.\n" "\n" "Tento program je uveřejněn, jak doufáme, že bude užitečný, avšak BEZ " "JAKÉKOLI ZÁRUKY; bez záruky PRODEJNOSTI nebo VHODNOSTI PRO DANÝ ÚČEL. " "Podívejte se do licence General Public pro více informací." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Přečtěte si plné znění licence GNU General Public<|" "> nebo se podívejte na ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Spolu s tímto programem byste měli obdržet kopii licence GNU General Public " "License. Pokud se tak nestalo, podívejte se na ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Jestliže najdete v programu Pybik nějakou chybu nebo máte nějaký nápad na " "zlepšení, odešlete, prosím, <{CONTACT_FILEBUG}|>chybové hlášení<|>. V druhém " "případě ho označte jako \"Přání\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Překlady jsou spravovány skupinou překladatelů v Launchpadu<|>.\n" "\n" "Jestliže si přejete pomoci s překlady programu Pybik, můžete tak učinit " "skrze webové rozhraní<|>.\n" "\n" "Přečtěte si více o \"Překladech v " "Launchpadu\"<|> a \"Začínáme překládat\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Stiskněte jakoukoli klávesu ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Nasvícení" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Program musí být pro uplatnění změn restartován." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "prostý" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "vybrat ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Pohyb" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Klávesa" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Otevřít obrázek" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Rušení operace, čekejte prosím" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Webové stránky projektu Pybik" #: ../pybiklib/pluginlib.py:302 #, fuzzy msgid "This plugin does not work for any model.\n" msgstr "Tento algoritmus nespolupracuje s žádným modelem.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "Tento algoritmus funguje pouze pro:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "zakázáno" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "ošklivé" #: ../pybiklib/schema.py:154 msgid "low" msgstr "nízké" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "střední" #: ../pybiklib/schema.py:155 msgid "high" msgstr "vysoké" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "nejvyšší" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Nastavení nemůže být zapsáno do souboru: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "O programu Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "O programu" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Překladatelé:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Zpětná vazba" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Přeložit" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licence" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "Nápo&věda" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Hra" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Upravit" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Zobrazit" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "Nápo&věda" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Nová náhodná" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "No&vá vyřešená" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "U&končit" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "Vy&brat model ..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "Nas&tavit jako výchozí stav" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Výchozí otočení" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Nastavení" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "&Panel nástrojů" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "&Stavový řádek" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Informace ..." #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Posunout zpět" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" "Jít na předchozí značku (nebo začátek) v posloupnosti jednotlivých kroků" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Předchozí" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Provést krok zpět" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Zastavit" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Přehrát" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Dopředu přes sekvenci pohybů" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Další" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Provést jeden krok vpřed" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Vpřed" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Jít na další značku (nebo konec) v posloupnosti jednotlivých kroků" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Přidat značku" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Označit stávající místo v posloupnosti jednotlivých kroků" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Odstranit značku" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Odstranit značku pro stávající místo v posloupnosti jednotlivých kroků" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Upravit nabídku" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "Nápo&věda" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "Vybrat model" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Předvolby" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Grafika" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Rychlost animace:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Vzdálenost zrcadla:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "Vyhlazování okrajů" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Myš" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Čtyři směry" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Zjednodušené,\n" "pravé tlačítko pro pohyb v opačném směru." #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Klávesy" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Přidat" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Odebrat" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Obnovit" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Vzhled" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Barva:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Soubor obrázku:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Dlaždice" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mozaika" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Pozadí:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;kostka;hlavolam;kouzelný;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Výzvy" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Vyřešit náhodnou kostku" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Ti, co vyřešili" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Horní hrany" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Horní rohy" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Střední řez" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Orientace spodní hrany" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Orientace spodního rohu" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Umístění spodního rohu" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Umístění spodní hrany" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Vylepšený Spiegel" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Horní řez" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Hezké vzory" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Pruhy" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Křižování" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Smažená vajíčka" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Velká smažená vajíčka" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 smažená vajíčka" #: ../data/plugins/80-pretty-patterns.plugins.py:73 #, fuzzy msgid "2 Fried Eggs" msgstr "4 smažená vajíčka" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Šachovnice" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Kříž" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Cikcak" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T-Time" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Kostka v kostce" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Pruhovaná kostka v kostce" #: ../data/plugins/80-pretty-patterns.plugins.py:129 #, fuzzy msgid "Six square cuboids" msgstr "Kvádr o šesti kostkách" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Jednoduchý superflip" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Zelená mamba" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anakonda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Kachní nohy" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Knihovna" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 #, fuzzy msgid "Swap edges" msgstr "Prohození hran" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 #, fuzzy msgid "3 edges, middle layer" msgstr "Střední vrstva" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 #, fuzzy msgid "Flip edges" msgstr "Otočit hrany" #: ../data/plugins/90-library.plugins.py:44 #, fuzzy msgid "4 edges" msgstr "Horní hrany" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 #, fuzzy msgid "Swap corners" msgstr "Prohození rohů" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 #, fuzzy msgid "2 corners, top layer" msgstr "Umístění spodního rohu" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 #, fuzzy msgid "4 corners, top layer" msgstr "Umístění spodního rohu" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 #, fuzzy msgid "Rotate corners" msgstr "Otočení rohů" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 #, fuzzy msgid "Rotate center" msgstr "Otočení středu" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2x nahoru" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 #, fuzzy msgid "Up ⟳ and front ⟳" msgstr "Nahoru a vpřed" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 #, fuzzy msgid "Up ⟳ and front ⟲" msgstr "Nahoru a vpřed" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 #, fuzzy msgid "Up ⟳ and down ⟲" msgstr "Nahoru a dolů" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Různé" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 #, fuzzy msgid "Back without back" msgstr "Falešný krok zpět" #: ../data/plugins/90-library.plugins.py:121 #, fuzzy msgid "2×Back without back" msgstr "2x Falešný krok zpět" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 #, fuzzy msgid "Invert move sequence" msgstr "&Otočit pohyby" #: ../data/plugins/95-transformations.plugins.py:22 #, fuzzy msgid "Normalize cube rotations" msgstr "Normalizovat otáčení kostky" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Kostka" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Cihla" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Šířka:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Výška:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Hloubka:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Nahoře" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Dole" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Vlevo" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Vpravo" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Zepředu" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Zpět" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Věž" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Věž" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Základ:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Kostka" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Kostka" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Velikost:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Kostka" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Vpravo" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Zepředu" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/te.po0000664000175000017500000010446212556245211014242 0ustar barccbarcc00000000000000# Telugu translation for pybik # Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2014. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2014-02-06 16:36+0000\n" "Last-Translator: Praveen Illa \n" "Language-Team: Telugu \n" "Language: te\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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "సవరణ రీతి నుండి నిష్క్రమించుటకు Esc మీటను నొక్కండి" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "సాధించబడింది" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "సాధించలేదు" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "అభినందనలు, ప్రహేళికను సాధించారు" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "పైబిక్" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "3D రుబిక్స్ క్యూబ్ ఆట" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "ఒక మీటను నొక్కండి ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "మార్పులు వర్తించడానికి కార్యక్రమాన్ని పునఃప్రారంభించాల్సివుంటుంది." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "సాదా" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "ఎంచకోండి ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "ఎంచకోండి ..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "పైకి" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "కిందికి" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/bn.po0000664000175000017500000010572512556245211014234 0ustar barccbarcc00000000000000# Bengali translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2013-06-15 04:31+0000\n" "Last-Translator: Iftekhar Mohammad \n" "Language-Team: Bengali \n" "Language: bn\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" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "সম্পাদনা মোড থেকে প্রস্থান করতে Esc কী টিপুন" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" msgstr[1] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "মীমাংসিত" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "মীমাংসিত নয়" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "অভিনন্দন, আপনি ধাঁধা সমাধান করেছেন!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "ত্রিমাত্রিক Rubik's কিউব খেলা" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "এই প্রোগ্রামটির সাথে আপনি হয়ত GNU সাধারণ পাবলিক লাইসেন্সের একটি অনুলিপি পেয়ে " "থাকবেন। যদি না পান, দেখুন।" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "একটি কী চাপুন..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "প্রোগ্রাম পরিবর্তন কার্যকর করতে পুনরায় আরম্ভ করা প্রয়োজন।" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "সমান" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "নির্বাচন..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "স্থানান্তর" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "কী" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "ছবি খুলুন" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "নিস্ক্রিয় করা হয়েছে" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "নিম্ন" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "মাঝারি / মাধ্যম" #: ../pybiklib/schema.py:155 msgid "high" msgstr "উচ্চ" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "সম্পর্কিত" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "প্রতিক্রিয়া" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "অনুবাদ করুন" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "লাইসেন্স" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "নির্বাচন..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "প্রস্থ:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "উপরে" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "নিচে" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "বাম" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "ডান" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "সামনে" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "পেছনে" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "ঘনক" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "আকার:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "ঘনক" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "ডান" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "সামনে" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/id.po0000664000175000017500000010335412556245211014225 0ustar barccbarcc00000000000000# Indonesian translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2014-02-09 02:18+0000\n" "Last-Translator: Trisno Pamuji \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Tekan tombol ESC untuk keluar Mode Edit" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "terselesaikan" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "tak terselesaikan" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Selamat, anda berhasil menyelesaikan puzzel!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "Game rubik 3D" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "" #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "" #: ../pybiklib/schema.py:154 msgid "low" msgstr "" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "" #: ../pybiklib/schema.py:155 msgid "high" msgstr "" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "" #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/zh_TW.po0000664000175000017500000010552512556245211014666 0ustar barccbarcc00000000000000# Chinese (Traditional) translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2013-06-15 13:53+0000\n" "Last-Translator: Po-Chun Huang \n" "Language-Team: Chinese (Traditional) \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2015-07-21 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "讀取設定時發生錯誤:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "按下 Esc 鍵離開編輯模式" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} 移動" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "已解決" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "未解決" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "恭喜,您已解決難題!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 #, fuzzy msgid "Rubik's cube game" msgstr "3D 魔術方塊遊戲" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "您應能在本程式中取得一份 GNU 通用公共許可證的副本。如果沒有, 請參照 ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "按一個鍵 ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "程式需要重新啟動使變更生效。" #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "素面" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "選擇 ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "移動" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "開啟影像" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "正在取消操作,請稍候" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "" #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "" #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "" #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Pybik 專案網站" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 #, fuzzy msgid "This plugin only works for:\n" msgstr "此演算法僅適用於:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "" #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "停用" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "劣" #: ../pybiklib/schema.py:154 msgid "low" msgstr "低" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "中" #: ../pybiklib/schema.py:155 msgid "high" msgstr "高" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "更高" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "關於 Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "關於" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "翻譯人員:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "意見回饋" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "翻譯" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "許可證" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 #, fuzzy msgid "Help" msgstr "說明 (&H)" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "遊戲 (&G)" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "編輯 (&E)" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "檢視 (&V)" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "說明 (&H)" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "離開 (&Q)" #: ../pybiklib/ui/main.py:57 #, fuzzy msgid "&Select Puzzle …" msgstr "選擇模型 ... (&S)" #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "偏好設定 ... (&P)" #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "工具列 (&T)" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "狀態列 (&S)" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "資訊 ... (&I)" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "上一個" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "停止" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "玩" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "下一個" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "編輯列 (&E)" #: ../pybiklib/ui/main.py:105 #, fuzzy msgid "&Help …" msgstr "說明 (&H)" #: ../pybiklib/ui/model.py:19 #, fuzzy msgid "Select Puzzle" msgstr "選擇模型" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "偏好設定" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "圖形" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "動畫速度:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" #: ../pybiklib/ui/preferences.py:56 #, fuzzy msgid "Antialiasing:" msgstr "反鋸齒" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "滑鼠" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "新增" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "移除" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "重設" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "外觀" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "色彩:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "影像檔案:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "背景:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cube;puzzle;magic;魔術;方塊;立方體;拼圖;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "挑戰" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "解決隨機的立方體" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "" msgstr[1] "" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "之字形" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "磚塊" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "寬度:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "高度:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "深度:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "上面" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "下面" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "左面" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "右面" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "前面" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "後面" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "塔" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "基礎:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "立方體" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "大小:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "立方體" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "右面" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "前面" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/it.po0000664000175000017500000012116212556245211014242 0ustar barccbarcc00000000000000# Italian translation for pybik # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-04-26 08:01+0000\n" "Last-Translator: Claudio Arseni \n" "Language-Team: Italian \n" "Language: it\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" "X-Launchpad-Export-Date: 2015-07-22 05:14+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Si è verificato un errore durante la lettura delle impostazioni:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Premi il tasto Esc per uscire dalla modalità Modifica" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} mossa" msgstr[1] "{current} / {total} mosse" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "risolto" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "non risolto" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Congratulazioni, hai risolto il rompicapo!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Gioco del cubo di Rubik" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "Pybik è un rompicapo in 3D basato sul cubo inventato da Ernő Rubik." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Differenti rompicapo 3D - fino a 10x10x10:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr "" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Risolutori per alcuni rompicapo" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Bei modelli" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Editor sequenze di mosse" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Colori e immagini modificabili" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Questo programma è un software libero; è possibile ridistribuirlo e/o " "modificarlo secondo i termini della licenza GNU General Public License, come " "pubblicata dalla Free Software Foundation; versione 3 della licenza, o (a " "scelta) una versione più recente.\n" "\n" "Questo programma è distribuito nella speranza che possa risultare utile, ma " "SENZA ALCUNA GARANZIA; nemmeno la garanzia implicita di COMMERCIABILITÀ o " "APPLICABILITÀ PER UNO SCOPO PARTICOLARE. Per maggiori dettagli consultare la " "GNU General Public License." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Leggere il testo integrale della GNU General Public " "License<|> o consultare consultare ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Una copia della licenza GNU General Public License dovrebbe essere stata " "fornita con questo programma. In caso contrario consultare ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Se si trova un bug in Pybik o si ha un suggerimento per un miglioramento, è " "possibile inviare un <{CONTACT_FILEBUG}|>bug report<|>. In quest'ultimo caso " "è possibile contrassegnare il bug report come \"Wishlist\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Le traduzioni sono gestite dal gruppo di traduzione su Launchpad<|>.\n" "\n" "Per contribuire alla traduzione di Pybik nella propria lingua utilizzare " "l'interfaccia web<|>.\n" "\n" "Per maggiori dettagli consultare " "\"Translating with Launchpad\"<|> e \"Starting to translate\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Premi un tasto..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Luminosità" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Semplice" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "" "Il programma deve essere riavviato affinché le modifiche abbiano effetto." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "Semplice" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "Seleziona ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Muovi" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Tasto" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Apri immagine" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Annullamento dell'operazione, attendere" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Usare il mouse per ruotare il cubo" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Posizionare il puntatore del mouse sul cubo. Apparirà una freccia che " "mostrerà un suggerimento sulla direzione in cui la striscia sotto il " "puntatore verrà ruotata." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "" "Il pulsante sinistro del mouse ruota una singola striscia del cubo nella " "direzione della freccia." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "" "Il pulsante destro del mouse ruota una singola striscia del cubo nella " "direzione opposta a quella della freccia." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Per ruotare l'intero cubo anziché una singola striscia premere il tasto Ctrl " "insieme al pulsante del mouse." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Usare la tastiera per ruotare il cubo" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Assicurarsi che il focus della tastiera sia nell'area del cubo (per esempio " "facendo clic sullo sfondo del cubo). I tasti possono essere configurati nel " "dialogo delle preferenze. La configurazione predefinita è:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" "Muove le strisce sinistra, destra, superiore, inferiore, anteriore o " "posteriore in senso orario." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Muovi una striscia in senso orario." #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Sposta l'intero cubo." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Altri tasti e pulsanti" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Rotella del mouse - aumenta/diminuisce lo zoom" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" "Tasti freccia, pulsante sinistro del mouse in secondo piano - cambiano la " "vista del cubo" #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" "Sposta il focus della tastiera all'editor delle sequenze sopra l'area del " "cubo dove è possibile modificare le sequenze di mosse nella notazione " "descritta sotto. Premere Invio quando terminato." #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "Notazione per le mosse" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" "Tutte le mosse, quando vengono eseguite, vengono mostrate progressivamente " "sopra l'area del cubo:" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" "Muovi la prima, la seconda e la terza striscia da sinistra in senso orario. " "I numeri consentiti sono nell'intervallo da 1 al conteggio delle strisce " "parallele. \"l1\" è sempre uguale a \"l\" e per il classico cubo 3×3×3 " "\"l2\" è uguale a \"r2-\" e \"l3\" è uguale a \"r-\"." #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "È possibile usare uno spazio per separare gruppi di mosse." #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Sito del progetto Pybik" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "Questo plugin non funziona per alcun modello.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "Questo plugin funziona solo con:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Questa rompicapo è irrisolvibile." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "Disabilitato" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "Brutto" #: ../pybiklib/schema.py:154 msgid "low" msgstr "Basso" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "Medio" #: ../pybiklib/schema.py:155 msgid "high" msgstr "Alto" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "Massima" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Le impostazioni non possono essere scritte su file: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Informazioni su Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Informazioni" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Traduttori:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Commenti" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Traduzioni" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Licenza" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Aiuto" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "&Gioco" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Modifica" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Visualizza" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "A&iuto" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "&Nuovo casuale" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "N&uovo risolto" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Esci" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "&Seleziona rompicapo ..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Imposta come stato iniziale" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Reimposta la rotazione" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "&Preferenze..." #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "Barra degli s&trumenti" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Barra di &stato" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "I&nformazioni" #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Indietro" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Vai al marcatore precedente (o all'inizio) della sequenza di mosse" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Precedente" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Passo indietro" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Interrompi" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Riproduci" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Prosegue attraverso la sequenza di mosse" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Successiva" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Passo in avanti" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Avanti" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Vai alla prossimo marcatore (o alla fine) della sequenza di mosse" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Aggiungi marcatore" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Segna la posizione corrente nella sequenza di mosse" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Rimuovi marcatore" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Rimuovi il marcatore nella posizione corrente nella sequenza di mosse" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "&Barra delle modifiche" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "A&iuto ..." #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "Seleziona un rompicapo" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Preferenze" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Grafica" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Velocità animazione:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Distanza specchi:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "Qualità:" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" "Un antialiasing più basso offre prestazioni migliori, mentre uno maggiore " "offre una migliore qualità." #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "Antialiasing:" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Mouse" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Quattro direzioni" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Semplificato.\n" "Il pulsante destro inverte il movimento" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Tasti" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Aggiugi" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Rimuovi" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Reimposta" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Aspetto" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Colore:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "File immagine:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Piastrellato" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mosaico" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Sfondo:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;cubo;rompicapo;magico;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Sfide" #: ../data/plugins/01-challenges.plugins.py:19 #, fuzzy msgid "Solve random puzzle" msgstr "Risolvi un cubo casuale" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "Risolvi in {} mossa" msgstr[1] "Risolvi in {} mosse" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Risolutori" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "Metodo per principianti" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Bordi superiori" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Angoli superiori" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Strato intermedio" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "Orientamento bordi inferiori" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Orientameto angoli inferiori" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Angoli inferiori" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Bordi inferiori" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Leyan Lo" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Spiegel migliorato" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Strato superiore" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Modelli graziosi" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Strisce" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Incrociato" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Uova Fritte" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Grandi uova fritte" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 uova fritte" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "2 uova fritte" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Scacchiera" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Croce" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Cubo in Cubo" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Cubo a righe in un Cubo" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "Cuboide a sei facce" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Salto mortale" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Salto mortale facile" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Mamba verde" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Piede d'anatra" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Più" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "Meno" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Vulcano" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "Scacchiera (semplice)" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "Scacchiera (veloce)" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "Scacchiera mista" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "Tipi" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Libreria" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "Scambia bordi" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "3 bordi ⟳, strato superiore" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "3 bordi ⟲, strato superiore" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "3 bordi, strato intermedio" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "4 bordi, davanti e a destra" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "4 bordi, davanti e dietro" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "Scambia 2 bordi e 2 angoli, strato superiore" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "Capovolgi bordi" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "4 bordi" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "2 bordi, strato superiore" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "Scambia angoli" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "2 angoli, strato superiore" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "2 angoli diagonali, strato superiore" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "3 angoli ⟳, starto superiore" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "3 angoli ⟲, starto superiore" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "4 angoli, starto superiore" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "2 angoli, sequenza parziale, starto superiore" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "Ruota angoli" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "1 angolo ⟳, sequenza parziale, stato superiore" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "1 angolo ⟲, sequenza parziale, stato superiore" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "Ruota centro" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2×Su" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "Su ⟳ a davanti ⟳" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "Su ⟳ e davanti ⟲" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "Scambia parti centrali, su e davanti" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "Su ⟳ e giù ⟲" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Varie" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "Indietro ma non il posteriore" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "2 x indietro ma non il posteriore" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "Cambiamenti delle mosse" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "Inverti la sequenza delle mosse" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "Normalizza le rotazioni del cubo" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "Normalizza la sequenza delle mosse" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Mattone" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "{0}×{1}×{2}-Mattone" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Larghezza:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Altezza:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Profondità:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Su" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Giù" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Sinistra" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Destra" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Davanti" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Dietro" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Torre" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "{0}×{1}-Torre" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Base:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Cubo" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "{0}×{0}×{0}-Cubo" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Dimensione:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 #, fuzzy msgid "Void Cube" msgstr "Cubo" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "Tetraedro" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "{0}-Tetraedro" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Right" msgstr "Destra" #: ../buildlib/modeldef.py:318 #, fuzzy msgid "Front Left" msgstr "Davanti" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "" pybik-2.1/po/ms.po0000664000175000017500000012046712556245211014254 0ustar barccbarcc00000000000000# Malay translation for pybik # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the pybik package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: pybik\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/pybik/+filebug\n" "POT-Creation-Date: 2015-07-20 20:12+0200\n" "PO-Revision-Date: 2015-07-24 06:25+0000\n" "Last-Translator: abuyop \n" "Language-Team: Malay \n" "Language: ms\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" "X-Launchpad-Export-Date: 2015-07-25 05:16+0000\n" "X-Generator: Launchpad (build 17628)\n" #: ../pybiklib/application.py:106 #, python-brace-format msgid "" "An error occurred while reading the settings:\n" "{error_message}" msgstr "" "Ralat berlaku semasa membaca tetapan:\n" "{error_message}" #: ../pybiklib/application.py:456 msgid "Press the Esc key to exit Edit Mode" msgstr "Tekan kekunci Esc untuk keluar dari Mod Sunting" #. substitution for {move_text} in statusbar text #: ../pybiklib/application.py:465 #, python-brace-format msgid "{current} / {total} move" msgid_plural "{current} / {total} moves" msgstr[0] "{current} / {total} gerakan" msgstr[1] "{current} / {total} gerakan" #. substitution for {solved_text} in statusbar text #: ../pybiklib/application.py:469 msgid "solved" msgstr "diselesaikan" #: ../pybiklib/application.py:469 msgid "not solved" msgstr "tidak selesai" #. statusbar text #: ../pybiklib/application.py:472 #, python-brace-format msgid "{model_text}, {move_text}, {solved_text}" msgstr "{model_text}, {move_text}, {solved_text}" #: ../pybiklib/application.py:503 msgid "Congratulations, you have solved the puzzle!" msgstr "Tahniah, anda telah berjaya menyelesaikannya!" #. Name of the application, probably should not be translated. #: ../pybiklib/config.py:31 ../pybiklib/ui/main.py:46 #: ../data/applications/pybik.desktop.in.h:1 msgid "Pybik" msgstr "Pybik" #: ../pybiklib/config.py:70 ../data/applications/pybik.desktop.in.h:2 msgid "Rubik's cube game" msgstr "Permainan kiub Rubik" #. The next 7 lines belong together and form the long description #: ../pybiklib/config.py:73 msgid "Pybik is a 3D puzzle game about the cube invented by Ernő Rubik." msgstr "" "Pybik merupakan permainan teka-teki 3D mengenai kiub yang direka oleh Erno " "Rubik." #: ../pybiklib/config.py:74 msgid "* Different 3D puzzles - up to 10x10x10:" msgstr "* Teka-tek 3D berlainan - sehingga 10x10x10:" #: ../pybiklib/config.py:75 msgid " cubes, towers, bricks, tetrahedra and prisms" msgstr " kiub, menara, batu-bata, tetrahedra dan prisma" #: ../pybiklib/config.py:76 msgid "* Solvers for some puzzles" msgstr "* Penyelesaian untuk beberapa teka-teki" #: ../pybiklib/config.py:77 msgid "* Pretty patterns" msgstr "* Corak yang menarik" #: ../pybiklib/config.py:78 msgid "* Editor for move sequences" msgstr "* Penyunting untuk jujukan gerakan" #: ../pybiklib/config.py:79 msgid "* Changeable colors and images" msgstr "* Warna dan imej boleh diubah" #: ../pybiklib/config.py:83 msgid "" "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 3 of the License, or (at your option) " "any later version.\n" "\n" "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." msgstr "" "Program ini adalah perisian bebas; anda boleh mengedarkannya dan/atau " "mengubahsuainya dibawah terma Pelesenan Awam Am GNU yang diterbitkan oleh " "Free Software Foundation, versi 3, atau (mengikut pilihan anda) mana-mana " "versi terkemudian.\n" "\n" "Perisian ini diedarkan dengan harapan ianya akan berguna, TANPA SEBARANG " "JAMINAN; termasuk juga KESESUAIAN UNTUK DIPASARKAN, JAMINAN KUALITI, atau " "JAMINAN ATAS APA JUA SEBAB. Sila lihat GNU General Public License untuk " "maklumat lanjut." #. Text between "<" and ">" is expanded to a link by the program and should not be modified. #. Text between "" and "<|>" is the translatable text for the link. #: ../pybiklib/config.py:95 msgid "" "Read the full text of the GNU General Public " "License<|> or see ." msgstr "" "Baca teks penuh GNU General Public License<|> atau " "rujuk ." #: ../pybiklib/config.py:98 msgid "" "You should have received a copy of the GNU General Public License along with " "this program. If not, see ." msgstr "" "Anda seharusnya menerima salinan GNU General Public License bersama program " "ini. Jika tidak, sila layari ." #. "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated #: ../pybiklib/config.py:104 #, python-brace-format msgid "" "If you find any bugs in Pybik or have a suggestion for an improvement then " "please submit a <{CONTACT_FILEBUG}|>bug report<|>. In the latter case you " "can mark the bug report as \"Wishlist\"." msgstr "" "Jika anda temui sebarang pepijat di dalam Pybik atau mempunyai cadangan " "untuk penambahbaikan, sila serahkan <{CONTACT_FILEBUG}|>laporan pepijat<|>. " "Bagi kes terkemudian anda boleh tanda laporan pepijat sebagai \"Wishlist\"." #: ../pybiklib/config.py:110 msgid "" "Translations are managed by the Launchpad translation group<|>.\n" "\n" "If you want help to translate Pybik to your language you can do it through " "the web interface<|>.\n" "\n" "Read more about \"Translating with " "Launchpad\"<|> and \"Starting to translate\"<|>." msgstr "" "Terjemahan diurus oleh Launchpad translation group<|>.\n" "\n" "Jika anda mahu bantu menterjemah Pybik ke bahasa ibunda anda, anda boleh " "lakukan melalui antaramuka " "sesawang<|>.\n" "\n" "Ketahui lebih lanjut mengenai " "\"Menterjemah menggunakan Launchpad\"<|> dan \"Memulakan terjemahan\"<|>." #: ../pybiklib/dialogs.py:168 msgid "Press a key …" msgstr "Tekan mana-mana kekunci ..." #: ../pybiklib/dialogs.py:243 msgid "Lighting" msgstr "Pencahayaan" #: ../pybiklib/dialogs.py:243 msgid "Simple" msgstr "Ringkas" #: ../pybiklib/dialogs.py:268 msgid "The program needs to be restarted for the changes to take effect." msgstr "Program perlu dimulakan semula supaya perubahan berkesan." #: ../pybiklib/dialogs.py:303 msgid "plain" msgstr "biasa" #: ../pybiklib/dialogs.py:307 msgid "select …" msgstr "pilih ..." #: ../pybiklib/dialogs.py:340 msgid "Move" msgstr "Gerak" #: ../pybiklib/dialogs.py:341 msgid "Key" msgstr "Kekunci" #: ../pybiklib/dialogs.py:481 msgid "Open Image" msgstr "Buka Imej" #: ../pybiklib/dialogs.py:580 msgid "Canceling operation, please wait" msgstr "Membatalkan operasi, sila tunggu" #. The next strings form the text in the help dialog #: ../pybiklib/dialogs.py:608 msgid "Using the mouse to rotate the cube" msgstr "Boleh guna tetikus untuk memutarkan kiub" #: ../pybiklib/dialogs.py:609 msgid "" "Position the mouse cursor over the puzzle and you will see an arrow that " "gives you a hint in which direction the slice under the mouse cursor will be " "rotated." msgstr "" "Letak kursor tetikus diatas teka-teki dan anda dapat melihat anak panah yang " "memberitahu pembayang yang mana arah lapisan di bawah kursor tetikus akan " "diputarkan." #: ../pybiklib/dialogs.py:611 msgid "" "The left mouse button rotates a single slice of the cube in the direction of " "the arrow." msgstr "Butang tetikus kiri putar satu lapisan kiub dalam arah anak panah." #: ../pybiklib/dialogs.py:612 msgid "" "The right mouse button rotates a single slice of the cube against the " "direction of the arrow." msgstr "Butang tetikus kanan putar satu lapisan kiub melawan arah anak panah." #: ../pybiklib/dialogs.py:613 msgid "" "To rotate the whole cube instead of a single slice press the Ctrl key " "together with the mouse button." msgstr "" "Putar keseluruhan kiub selain dari satu lapisan dengan menekan kekunci Ctrl " "bersama-sama dengan butang tetikus." #: ../pybiklib/dialogs.py:615 msgid "Using the keyboard to rotate the cube" msgstr "Gunakan papan kekunci untuk putar kiub" #: ../pybiklib/dialogs.py:616 msgid "" "Make sure the keyboard focus is on the cube area (e.g. click on the " "background of the cube). The keys can be configured in the preferences " "dialog, the default is:" msgstr "" "Pastikan fokus papan kekunci di kawasan kiub (iaitu klik pada latar belakang " "kiub). Kekunci boleh dikonfigur dalam dialog keutamaan, lalai ialah:" #: ../pybiklib/dialogs.py:618 ../pybiklib/dialogs.py:631 msgid "Moves the left, right, upper, down, front or back slice clockwise." msgstr "" "Gerak lapisan kiri, kanan, atas, bawah, hadapan atau belakang mengikut arah " "jam." #: ../pybiklib/dialogs.py:619 ../pybiklib/dialogs.py:632 msgid "Moves a slice couterclockwise." msgstr "Gerak lapisan melawan jam." #: ../pybiklib/dialogs.py:620 ../pybiklib/dialogs.py:633 msgid "Moves the whole cube." msgstr "Gerak keseluruhan kiub." #: ../pybiklib/dialogs.py:622 msgid "Other keys and buttons" msgstr "Lain-lain kekunci dan butang" #: ../pybiklib/dialogs.py:623 msgid "Mouse wheel – Zoom in/out" msgstr "Rod tetikus - Zum masuk/keluar" #: ../pybiklib/dialogs.py:624 msgid "" "Arrow keys, Left mouse button on the background – Changes the direction of " "looking at the cube." msgstr "" "Kekunci anak panah, butang tetikus kiri pada latar belakang - Ubah arah " "melihat kiub." #: ../pybiklib/dialogs.py:625 msgid "" "Moves keyboard focus to the sequence editor above the cube area where you " "can edit the move sequence in the notation described below. Hit enter when " "done." msgstr "" "Gerak fokus papan kekunci ke penyunting jujukan diatas kawasan kiub yang " "mana anda boleh sunting jujukan gerakan dalam catatan yang dijelaskan di " "bawah. Tekan enter bila selesai." #: ../pybiklib/dialogs.py:629 msgid "Notation for moves" msgstr "Catatan gerakan" #: ../pybiklib/dialogs.py:630 msgid "" "All moves, however they are made, are displayed progressively above the cube " "area:" msgstr "" "Semua gerakan, walaupun dibuat, dipapar secara prograsif atas kawasan kiub:" #: ../pybiklib/dialogs.py:634 msgid "" "Moves the first, second or third slice from left clockwise. The allowed " "numbers are in the range from 1 to the count of parallel slices. \"l1\" is " "always the same as \"l\" and for the classic 3×3×3-Cube \"l2\" is the same " "as \"r2-\" and \"l3\" is the same as \"r-\"." msgstr "" "Gerak lapisan pertama, kedua atau ketiga dari arah kiri melawan jam. " "Bilangan yang dibenarkan dalam julat 1 untuk mengira lapisan yang selari. " "\"l1\" sentiasa sama seperti \"l\" dan untuk Kiub klasik 3×3×3 \"l2\" adalah " "sama dengan \"r2-\" dan \"l3\" sama dengan \"r-\"." #: ../pybiklib/dialogs.py:638 msgid "You can use a space to separate groups of moves." msgstr "Anda boleh guna ruang untuk memisahkan kumpulan gerakan." #: ../pybiklib/dialogs.py:747 msgid "Pybik project website" msgstr "Laman sesawang projek Pybik" #: ../pybiklib/pluginlib.py:302 msgid "This plugin does not work for any model.\n" msgstr "Pemalam ini tidak berfungdi pada mana mana model.\n" #: ../pybiklib/pluginlib.py:304 ../pybiklib/pluginlib.py:307 msgid "This plugin only works for:\n" msgstr "Pemalam ini hanya berfungsi untuk:\n" #: ../pybiklib/pluginlib.py:500 msgid "This puzzle is not solvable." msgstr "Teka-teki ini tidak boleh diselesaikan." #. The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher #: ../pybiklib/schema.py:154 msgid "disabled" msgstr "dilumpuhkan" #: ../pybiklib/schema.py:154 msgid "ugly" msgstr "buruk" #: ../pybiklib/schema.py:154 msgid "low" msgstr "rendah" #: ../pybiklib/schema.py:155 msgid "medium" msgstr "sederhana" #: ../pybiklib/schema.py:155 msgid "high" msgstr "tinggi" #: ../pybiklib/schema.py:155 msgid "higher" msgstr "lebih tinggi" #: ../pybiklib/settings.py:178 #, python-brace-format msgid "Settings can not be written to file: {error_message}" msgstr "Tetapan tidak dapat ditulis ke fail: {error_message}" #: ../pybiklib/ui/about.py:29 msgid "About Pybik" msgstr "Perihal Pybik" #: ../pybiklib/ui/about.py:30 msgid "About" msgstr "Perihal" #: ../pybiklib/ui/about.py:31 msgid "Translators:" msgstr "Penterjemah:" #: ../pybiklib/ui/about.py:32 msgid "Feedback" msgstr "Maklumbalas" #: ../pybiklib/ui/about.py:33 msgid "Translate" msgstr "Terjemah" #: ../pybiklib/ui/about.py:34 msgid "License" msgstr "Lesen" #: ../pybiklib/ui/help.py:12 ../pybiklib/ui/main.py:107 msgid "Help" msgstr "Bantuan" #: ../pybiklib/ui/main.py:47 msgid "&Game" msgstr "Per&mainan" #: ../pybiklib/ui/main.py:48 msgid "&Edit" msgstr "&Sunting" #: ../pybiklib/ui/main.py:49 msgid "&View" msgstr "&Lihat" #: ../pybiklib/ui/main.py:50 msgid "&Help" msgstr "&Bantuan" #: ../pybiklib/ui/main.py:51 msgid "&New Random" msgstr "Rawak &Baru" #: ../pybiklib/ui/main.py:53 msgid "Ne&w Solved" msgstr "Diselesai Ba&ru" #: ../pybiklib/ui/main.py:55 msgid "&Quit" msgstr "&Keluar" #: ../pybiklib/ui/main.py:57 msgid "&Select Puzzle …" msgstr "P&ilih Teka-Teki ..." #: ../pybiklib/ui/main.py:59 msgid "&Set as Initial State" msgstr "&Tetap sebagai Keadaan Awal" #: ../pybiklib/ui/main.py:61 msgid "&Reset Rotation" msgstr "&Tetap Semula Putaran" #: ../pybiklib/ui/main.py:63 msgid "&Preferences …" msgstr "K&eutamaan ..." #: ../pybiklib/ui/main.py:65 msgid "&Toolbar" msgstr "Palang Ala&t" #: ../pybiklib/ui/main.py:67 msgid "&Status Bar" msgstr "Palang &Status" #: ../pybiklib/ui/main.py:69 msgid "&Info …" msgstr "&Maklumat ..." #: ../pybiklib/ui/main.py:71 msgid "Rewind" msgstr "Ulang Semula" #: ../pybiklib/ui/main.py:73 msgid "Go to the previous mark (or the beginning) of the sequence of moves" msgstr "Pergi ke tanda terdahulu (atau permulaan) bagi jujukan gerakan" #: ../pybiklib/ui/main.py:75 msgid "Previous" msgstr "Terdahulu" #: ../pybiklib/ui/main.py:77 msgid "Make one step backwards" msgstr "Buat satu langkah mengundur" #: ../pybiklib/ui/main.py:79 ../pybiklib/ui/main.py:81 msgid "Stop" msgstr "Henti" #: ../pybiklib/ui/main.py:83 msgid "Play" msgstr "Main" #: ../pybiklib/ui/main.py:85 msgid "Run forward through the sequence of moves" msgstr "Jalan kehadapan menerusi jujukan gerakan" #: ../pybiklib/ui/main.py:87 msgid "Next" msgstr "Berikutnya" #: ../pybiklib/ui/main.py:89 msgid "Make one step forwards" msgstr "Buat satu langkah kehadapan" #: ../pybiklib/ui/main.py:91 msgid "Forward" msgstr "Maju" #: ../pybiklib/ui/main.py:93 msgid "Go to the next mark (or the end) of the sequence of moves" msgstr "Pergi ke tanda berikutnya (atau hujung) bagi jujukan gerakan" #: ../pybiklib/ui/main.py:95 msgid "Add Mark" msgstr "Tambah Tanda" #: ../pybiklib/ui/main.py:97 msgid "Mark the current place in the sequence of moves" msgstr "Tanda tempat semasa dalam jujukan gerakan" #: ../pybiklib/ui/main.py:99 msgid "Remove Mark" msgstr "Buang Tanda" #: ../pybiklib/ui/main.py:101 msgid "Remove the mark at the current place in the sequence of moves" msgstr "Buang tanda pada tempat semasa dalam jujukan gerakan" #: ../pybiklib/ui/main.py:103 msgid "&Edit Bar" msgstr "S&unting Palang" #: ../pybiklib/ui/main.py:105 msgid "&Help …" msgstr "&Bantuan ..." #: ../pybiklib/ui/model.py:19 msgid "Select Puzzle" msgstr "Pilih Teka-Teki" #: ../pybiklib/ui/preferences.py:50 msgid "Preferences" msgstr "Keutamaan" #: ../pybiklib/ui/preferences.py:51 msgid "Graphic" msgstr "Grafik" #: ../pybiklib/ui/preferences.py:52 msgid "Animation Speed:" msgstr "Kelajuan Animasi:" #: ../pybiklib/ui/preferences.py:53 msgid "Mirror Distance:" msgstr "Jarak Cermin:" #: ../pybiklib/ui/preferences.py:54 msgid "Quality:" msgstr "Kualiti:" #: ../pybiklib/ui/preferences.py:55 msgid "" "Lower antialiasing has better performance, higher antialiasing has better " "quality." msgstr "" "Antialias lebih rendah mempunyai prestasi lebih baik, antialias lebih tinggi " "mempunyai kualiti lebih baik." #: ../pybiklib/ui/preferences.py:56 msgid "Antialiasing:" msgstr "Anti alias:" #: ../pybiklib/ui/preferences.py:57 msgid "Mouse" msgstr "Tetikus" #: ../pybiklib/ui/preferences.py:58 msgid "Four directions" msgstr "Empat arah" #: ../pybiklib/ui/preferences.py:59 msgid "" "Simplified,\n" "right button inverts move" msgstr "" "Diringkaskan,\n" "butang kanan songsangkan gerakan" #: ../pybiklib/ui/preferences.py:60 msgid "Keys" msgstr "Kunci" #: ../pybiklib/ui/preferences.py:61 ../pybiklib/ui/preferences.py:62 msgid "Add" msgstr "Tambah" #: ../pybiklib/ui/preferences.py:63 ../pybiklib/ui/preferences.py:64 msgid "Remove" msgstr "Buang" #: ../pybiklib/ui/preferences.py:65 ../pybiklib/ui/preferences.py:66 msgid "Reset" msgstr "Tetap Semula" #: ../pybiklib/ui/preferences.py:67 msgid "Appearance" msgstr "Penampilan" #: ../pybiklib/ui/preferences.py:68 msgid "Color:" msgstr "Warna:" #: ../pybiklib/ui/preferences.py:69 msgid "Image File:" msgstr "Fail Imej:" #: ../pybiklib/ui/preferences.py:70 msgid "Tiled" msgstr "Berjubin" #: ../pybiklib/ui/preferences.py:71 msgid "Mosaic" msgstr "Mozek" #: ../pybiklib/ui/preferences.py:72 msgid "Background:" msgstr "Latar Belakang:" #. Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. #: ../data/applications/pybik.desktop.in.h:4 msgid "rubik;cube;puzzle;magic;" msgstr "rubik;kuib;teka-teki;magik;" #: ../data/plugins/01-challenges.plugins.py:18 #: ../data/plugins/01-challenges.plugins.py:21 #: ../data/plugins/01-challenges.plugins.py:24 #: ../data/plugins/01-challenges.plugins.py:27 #: ../data/plugins/01-challenges.plugins.py:30 #: ../data/plugins/01-challenges.plugins.py:33 #: ../data/plugins/01-challenges.plugins.py:36 #: ../data/plugins/01-challenges.plugins.py:39 #: ../data/plugins/01-challenges.plugins.py:42 #: ../data/plugins/01-challenges.plugins.py:45 #: ../data/plugins/01-challenges.plugins.py:48 msgid "Challenges" msgstr "Cabaran" #: ../data/plugins/01-challenges.plugins.py:19 msgid "Solve random puzzle" msgstr "Selesaikan teka-teki rawak" #: ../data/plugins/01-challenges.plugins.py:22 #: ../data/plugins/01-challenges.plugins.py:25 #: ../data/plugins/01-challenges.plugins.py:28 #: ../data/plugins/01-challenges.plugins.py:31 #: ../data/plugins/01-challenges.plugins.py:34 #: ../data/plugins/01-challenges.plugins.py:37 #: ../data/plugins/01-challenges.plugins.py:40 #: ../data/plugins/01-challenges.plugins.py:43 #: ../data/plugins/01-challenges.plugins.py:46 #: ../data/plugins/01-challenges.plugins.py:49 msgid "Solve in {} move" msgid_plural "Solve in {} moves" msgstr[0] "Selesai dalam {} gerakan" msgstr[1] "Selesai dalam {} gerakan" #: ../data/plugins/10-beginners.plugins.py:31 #: ../data/plugins/10-beginners.plugins.py:34 #: ../data/plugins/10-beginners.plugins.py:56 #: ../data/plugins/10-beginners.plugins.py:73 #: ../data/plugins/10-beginners.plugins.py:100 #: ../data/plugins/10-beginners.plugins.py:118 #: ../data/plugins/10-beginners.plugins.py:140 #: ../data/plugins/10-beginners.plugins.py:158 #: ../data/plugins/14-leyan-lo.plugins.py:21 #: ../data/plugins/14-leyan-lo.plugins.py:24 #: ../data/plugins/14-leyan-lo.plugins.py:53 #: ../data/plugins/14-leyan-lo.plugins.py:74 #: ../data/plugins/14-leyan-lo.plugins.py:90 #: ../data/plugins/14-leyan-lo.plugins.py:107 #: ../data/plugins/14-leyan-lo.plugins.py:129 #: ../data/plugins/14-leyan-lo.plugins.py:170 #: ../data/plugins/150-spiegel.plugins.py:32 #: ../data/plugins/150-spiegel.plugins.py:35 #: ../data/plugins/150-spiegel.plugins.py:64 #: ../data/plugins/150-spiegel.plugins.py:85 #: ../data/plugins/150-spiegel.plugins.py:100 #: ../data/plugins/150-spiegel.plugins.py:113 #: ../data/plugins/150-spiegel.plugins.py:130 #: ../data/plugins/150-spiegel.plugins.py:141 #: ../data/plugins/151-spiegel-improved.plugins.py:20 #: ../data/plugins/151-spiegel-improved.plugins.py:23 #: ../data/plugins/151-spiegel-improved.plugins.py:68 #: ../data/plugins/151-spiegel-improved.plugins.py:107 #: ../data/plugins/151-spiegel-improved.plugins.py:139 #: ../data/plugins/151-spiegel-improved.plugins.py:165 #: ../data/plugins/151-spiegel-improved.plugins.py:183 #: ../data/plugins/151-spiegel-improved.plugins.py:197 #: ../data/plugins/20-2x2x2.plugins.py:18 #: ../data/plugins/20-2x2x2.plugins.py:21 #: ../data/plugins/20-2x2x2.plugins.py:37 #: ../data/plugins/20-2x2x2.plugins.py:55 msgid "Solvers" msgstr "Penyelesai" #: ../data/plugins/10-beginners.plugins.py:32 #: ../data/plugins/10-beginners.plugins.py:35 #: ../data/plugins/10-beginners.plugins.py:57 #: ../data/plugins/10-beginners.plugins.py:74 #: ../data/plugins/10-beginners.plugins.py:101 #: ../data/plugins/10-beginners.plugins.py:119 #: ../data/plugins/10-beginners.plugins.py:141 #: ../data/plugins/10-beginners.plugins.py:159 msgid "Beginner's method" msgstr "Kaedah pemula" #: ../data/plugins/10-beginners.plugins.py:36 #: ../data/plugins/14-leyan-lo.plugins.py:26 #: ../data/plugins/150-spiegel.plugins.py:37 #: ../data/plugins/151-spiegel-improved.plugins.py:25 msgid "Top edges" msgstr "Pingir teratas" #: ../data/plugins/10-beginners.plugins.py:58 #: ../data/plugins/14-leyan-lo.plugins.py:55 #: ../data/plugins/150-spiegel.plugins.py:66 #: ../data/plugins/151-spiegel-improved.plugins.py:70 msgid "Top corners" msgstr "Bucu teratas" #: ../data/plugins/10-beginners.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:76 #: ../data/plugins/150-spiegel.plugins.py:87 #: ../data/plugins/151-spiegel-improved.plugins.py:109 msgid "Middle slice" msgstr "Hirisan tengah" #: ../data/plugins/10-beginners.plugins.py:102 #: ../data/plugins/14-leyan-lo.plugins.py:92 #: ../data/plugins/150-spiegel.plugins.py:115 #: ../data/plugins/151-spiegel-improved.plugins.py:167 msgid "Bottom edge orient" msgstr "orientasi pinggir bawah" #: ../data/plugins/10-beginners.plugins.py:120 #: ../data/plugins/14-leyan-lo.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:143 #: ../data/plugins/151-spiegel-improved.plugins.py:199 #: ../data/plugins/20-2x2x2.plugins.py:57 msgid "Bottom corner orient" msgstr "Orientasi bucu bawah" #: ../data/plugins/10-beginners.plugins.py:142 #: ../data/plugins/14-leyan-lo.plugins.py:109 #: ../data/plugins/150-spiegel.plugins.py:132 #: ../data/plugins/151-spiegel-improved.plugins.py:185 #: ../data/plugins/20-2x2x2.plugins.py:39 msgid "Bottom corner place" msgstr "Tempat dibucu bawah" #: ../data/plugins/10-beginners.plugins.py:160 #: ../data/plugins/14-leyan-lo.plugins.py:172 #: ../data/plugins/150-spiegel.plugins.py:102 #: ../data/plugins/151-spiegel-improved.plugins.py:141 msgid "Bottom edge place" msgstr "Tempat dipinggir bawah" #. Leyan Lo is the inventor of the solution #: ../data/plugins/14-leyan-lo.plugins.py:23 #: ../data/plugins/14-leyan-lo.plugins.py:25 #: ../data/plugins/14-leyan-lo.plugins.py:54 #: ../data/plugins/14-leyan-lo.plugins.py:75 #: ../data/plugins/14-leyan-lo.plugins.py:91 #: ../data/plugins/14-leyan-lo.plugins.py:108 #: ../data/plugins/14-leyan-lo.plugins.py:130 #: ../data/plugins/14-leyan-lo.plugins.py:171 msgid "Leyan Lo" msgstr "Leyan Lo" #. Spiegel is a german magazine #: ../data/plugins/150-spiegel.plugins.py:34 #: ../data/plugins/150-spiegel.plugins.py:36 #: ../data/plugins/150-spiegel.plugins.py:65 #: ../data/plugins/150-spiegel.plugins.py:86 #: ../data/plugins/150-spiegel.plugins.py:101 #: ../data/plugins/150-spiegel.plugins.py:114 #: ../data/plugins/150-spiegel.plugins.py:131 #: ../data/plugins/150-spiegel.plugins.py:142 msgid "Spiegel" msgstr "Spiegel" #. Spiegel is a german magazine #: ../data/plugins/151-spiegel-improved.plugins.py:22 #: ../data/plugins/151-spiegel-improved.plugins.py:24 #: ../data/plugins/151-spiegel-improved.plugins.py:69 #: ../data/plugins/151-spiegel-improved.plugins.py:108 #: ../data/plugins/151-spiegel-improved.plugins.py:140 #: ../data/plugins/151-spiegel-improved.plugins.py:166 #: ../data/plugins/151-spiegel-improved.plugins.py:184 #: ../data/plugins/151-spiegel-improved.plugins.py:198 msgid "Spiegel improved" msgstr "Spiegel dipertingkat" #: ../data/plugins/20-2x2x2.plugins.py:19 #: ../data/plugins/20-2x2x2.plugins.py:22 #: ../data/plugins/20-2x2x2.plugins.py:38 #: ../data/plugins/20-2x2x2.plugins.py:56 msgid "2×2×2" msgstr "2×2×2" #: ../data/plugins/20-2x2x2.plugins.py:23 msgid "Top slice" msgstr "Hirisan teratas" #. Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". #: ../data/plugins/80-pretty-patterns.plugins.py:19 #: ../data/plugins/80-pretty-patterns.plugins.py:22 #: ../data/plugins/80-pretty-patterns.plugins.py:26 #: ../data/plugins/80-pretty-patterns.plugins.py:30 #: ../data/plugins/80-pretty-patterns.plugins.py:34 #: ../data/plugins/80-pretty-patterns.plugins.py:39 #: ../data/plugins/80-pretty-patterns.plugins.py:43 #: ../data/plugins/80-pretty-patterns.plugins.py:48 #: ../data/plugins/80-pretty-patterns.plugins.py:52 #: ../data/plugins/80-pretty-patterns.plugins.py:56 #: ../data/plugins/80-pretty-patterns.plugins.py:60 #: ../data/plugins/80-pretty-patterns.plugins.py:64 #: ../data/plugins/80-pretty-patterns.plugins.py:68 #: ../data/plugins/80-pretty-patterns.plugins.py:72 #: ../data/plugins/80-pretty-patterns.plugins.py:76 #: ../data/plugins/80-pretty-patterns.plugins.py:82 #: ../data/plugins/80-pretty-patterns.plugins.py:86 #: ../data/plugins/80-pretty-patterns.plugins.py:91 #: ../data/plugins/80-pretty-patterns.plugins.py:95 #: ../data/plugins/80-pretty-patterns.plugins.py:99 #: ../data/plugins/80-pretty-patterns.plugins.py:103 #: ../data/plugins/80-pretty-patterns.plugins.py:107 #: ../data/plugins/80-pretty-patterns.plugins.py:111 #: ../data/plugins/80-pretty-patterns.plugins.py:116 #: ../data/plugins/80-pretty-patterns.plugins.py:120 #: ../data/plugins/80-pretty-patterns.plugins.py:124 #: ../data/plugins/80-pretty-patterns.plugins.py:128 #: ../data/plugins/80-pretty-patterns.plugins.py:133 #: ../data/plugins/80-pretty-patterns.plugins.py:137 #: ../data/plugins/80-pretty-patterns.plugins.py:141 #: ../data/plugins/80-pretty-patterns.plugins.py:145 #: ../data/plugins/80-pretty-patterns.plugins.py:149 #: ../data/plugins/80-pretty-patterns.plugins.py:153 #: ../data/plugins/80-pretty-patterns.plugins.py:157 #: ../data/plugins/80-pretty-patterns.plugins.py:161 #: ../data/plugins/80-pretty-patterns.plugins.py:165 #: ../data/plugins/80-pretty-patterns.plugins.py:169 #: ../data/plugins/80-pretty-patterns.plugins.py:173 #: ../data/plugins/80-pretty-patterns.plugins.py:177 #: ../data/plugins/80-pretty-patterns.plugins.py:181 #: ../data/plugins/80-pretty-patterns.plugins.py:185 #: ../data/plugins/80-pretty-patterns.plugins.py:190 #: ../data/plugins/80-pretty-patterns.plugins.py:195 #: ../data/plugins/80-pretty-patterns.plugins.py:199 #: ../data/plugins/80-pretty-patterns.plugins.py:203 #: ../data/plugins/80-pretty-patterns.plugins.py:207 #: ../data/plugins/80-pretty-patterns.plugins.py:211 #: ../data/plugins/80-pretty-patterns.plugins.py:215 #: ../data/plugins/80-pretty-patterns.plugins.py:219 msgid "Pretty patterns" msgstr "Corak cantik" #: ../data/plugins/80-pretty-patterns.plugins.py:20 #: ../data/plugins/80-pretty-patterns.plugins.py:23 #: ../data/plugins/80-pretty-patterns.plugins.py:27 #: ../data/plugins/80-pretty-patterns.plugins.py:31 #: ../data/plugins/80-pretty-patterns.plugins.py:35 #: ../data/plugins/80-pretty-patterns.plugins.py:40 #: ../data/plugins/80-pretty-patterns.plugins.py:44 msgid "Stripes" msgstr "Jalur" #: ../data/plugins/80-pretty-patterns.plugins.py:49 #: ../data/plugins/80-pretty-patterns.plugins.py:53 msgid "Criss-Cross" msgstr "Silang" #: ../data/plugins/80-pretty-patterns.plugins.py:57 msgid "Fried Eggs" msgstr "Telur Goreng" #: ../data/plugins/80-pretty-patterns.plugins.py:61 msgid "Big Fried Eggs" msgstr "Telur Goreng Besar" #: ../data/plugins/80-pretty-patterns.plugins.py:65 #: ../data/plugins/80-pretty-patterns.plugins.py:69 msgid "4 Fried Eggs" msgstr "4 Telur Goreng" #: ../data/plugins/80-pretty-patterns.plugins.py:73 msgid "2 Fried Eggs" msgstr "2 Telur Goreng" #: ../data/plugins/80-pretty-patterns.plugins.py:77 msgid "Chessboard" msgstr "Papan Catur" #: ../data/plugins/80-pretty-patterns.plugins.py:83 msgid "Cross" msgstr "Silang" #: ../data/plugins/80-pretty-patterns.plugins.py:87 msgid "Zig Zag" msgstr "Zig Zag" #. T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. #: ../data/plugins/80-pretty-patterns.plugins.py:93 #: ../data/plugins/80-pretty-patterns.plugins.py:96 #: ../data/plugins/80-pretty-patterns.plugins.py:100 #: ../data/plugins/80-pretty-patterns.plugins.py:104 #: ../data/plugins/80-pretty-patterns.plugins.py:108 #: ../data/plugins/80-pretty-patterns.plugins.py:112 msgid "T-Time" msgstr "Masa-T" #. C is the shape formed by the cube labels #: ../data/plugins/80-pretty-patterns.plugins.py:118 msgid "C" msgstr "C" #: ../data/plugins/80-pretty-patterns.plugins.py:121 msgid "Cube in a Cube" msgstr "Kiub dalam Kiub" #: ../data/plugins/80-pretty-patterns.plugins.py:125 msgid "Striped Cube in a Cube" msgstr "Kiub Berjalur dalam Kiub" #: ../data/plugins/80-pretty-patterns.plugins.py:129 msgid "Six square cuboids" msgstr "Kuboid enam petak" #. Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. #: ../data/plugins/80-pretty-patterns.plugins.py:135 msgid "Superflip" msgstr "Kalih Super" #: ../data/plugins/80-pretty-patterns.plugins.py:138 msgid "Superflip easy" msgstr "Kalih super mudah" #: ../data/plugins/80-pretty-patterns.plugins.py:142 msgid "Green Mamba" msgstr "Mamba Hijau" #: ../data/plugins/80-pretty-patterns.plugins.py:146 msgid "Anaconda" msgstr "Anaconda" #: ../data/plugins/80-pretty-patterns.plugins.py:150 msgid "Duck Feet" msgstr "Kaki Itik" #: ../data/plugins/80-pretty-patterns.plugins.py:154 #: ../data/plugins/80-pretty-patterns.plugins.py:158 #: ../data/plugins/80-pretty-patterns.plugins.py:162 #: ../data/plugins/80-pretty-patterns.plugins.py:166 #: ../data/plugins/80-pretty-patterns.plugins.py:170 #: ../data/plugins/80-pretty-patterns.plugins.py:174 #: ../data/plugins/80-pretty-patterns.plugins.py:178 #: ../data/plugins/80-pretty-patterns.plugins.py:182 msgid "Plus" msgstr "Tambah" #: ../data/plugins/80-pretty-patterns.plugins.py:186 #: ../data/plugins/80-pretty-patterns.plugins.py:191 #: ../data/plugins/80-pretty-patterns.plugins.py:196 #: ../data/plugins/80-pretty-patterns.plugins.py:200 msgid "Minus" msgstr "Tolak" #: ../data/plugins/80-pretty-patterns.plugins.py:204 msgid "Volcano" msgstr "Gunung Berapi" #: ../data/plugins/80-pretty-patterns.plugins.py:208 msgid "Checkerboard (easy)" msgstr "Papan dam (mudah)" #: ../data/plugins/80-pretty-patterns.plugins.py:212 msgid "Checkerboard (fast)" msgstr "Papan Dam (pantas)" #: ../data/plugins/80-pretty-patterns.plugins.py:216 msgid "Mixed Checkerboard" msgstr "Papan Dam Bercampur" #: ../data/plugins/80-pretty-patterns.plugins.py:220 msgid "Tipi" msgstr "Tipi" #: ../data/plugins/90-library.plugins.py:18 #: ../data/plugins/90-library.plugins.py:22 #: ../data/plugins/90-library.plugins.py:26 #: ../data/plugins/90-library.plugins.py:30 #: ../data/plugins/90-library.plugins.py:34 #: ../data/plugins/90-library.plugins.py:38 #: ../data/plugins/90-library.plugins.py:42 #: ../data/plugins/90-library.plugins.py:46 #: ../data/plugins/90-library.plugins.py:50 #: ../data/plugins/90-library.plugins.py:54 #: ../data/plugins/90-library.plugins.py:58 #: ../data/plugins/90-library.plugins.py:62 #: ../data/plugins/90-library.plugins.py:66 #: ../data/plugins/90-library.plugins.py:70 #: ../data/plugins/90-library.plugins.py:74 #: ../data/plugins/90-library.plugins.py:78 #: ../data/plugins/90-library.plugins.py:82 #: ../data/plugins/90-library.plugins.py:86 #: ../data/plugins/90-library.plugins.py:91 #: ../data/plugins/90-library.plugins.py:96 #: ../data/plugins/90-library.plugins.py:101 #: ../data/plugins/90-library.plugins.py:105 #: ../data/plugins/90-library.plugins.py:110 #: ../data/plugins/90-library.plugins.py:115 #: ../data/plugins/90-library.plugins.py:119 #: ../data/plugins/90-library.plugins.py:123 #: ../data/plugins/90-library.plugins.py:127 msgid "Library" msgstr "Pustaka" #: ../data/plugins/90-library.plugins.py:19 #: ../data/plugins/90-library.plugins.py:23 #: ../data/plugins/90-library.plugins.py:27 #: ../data/plugins/90-library.plugins.py:31 #: ../data/plugins/90-library.plugins.py:35 msgid "Swap edges" msgstr "Silih pinggir" #: ../data/plugins/90-library.plugins.py:20 msgid "3 edges ⟳, top layer" msgstr "3 pinggir⟳, lapisan teratas" #: ../data/plugins/90-library.plugins.py:24 msgid "3 edges ⟲, top layer" msgstr "3 pinggir⟲, lapisan teratas" #: ../data/plugins/90-library.plugins.py:28 msgid "3 edges, middle layer" msgstr "3 pinggir, lapisan tengah" #: ../data/plugins/90-library.plugins.py:32 msgid "4 edges, front and right" msgstr "4 pinggir, hadapan dan kanan" #: ../data/plugins/90-library.plugins.py:36 msgid "4 edges, front and back" msgstr "4 pinggir, hadapan dan belakang" #: ../data/plugins/90-library.plugins.py:39 msgid "Swap 2 edges and 2 corners, top layer" msgstr "Silih 2 pinggir dan 2 bucu, lapisan teratas" #: ../data/plugins/90-library.plugins.py:43 #: ../data/plugins/90-library.plugins.py:47 msgid "Flip edges" msgstr "Kalih pinggir" #: ../data/plugins/90-library.plugins.py:44 msgid "4 edges" msgstr "4 pinggir" #: ../data/plugins/90-library.plugins.py:48 msgid "2 edges, top layer" msgstr "2 pinggir, lapisan teratas" #: ../data/plugins/90-library.plugins.py:51 #: ../data/plugins/90-library.plugins.py:55 #: ../data/plugins/90-library.plugins.py:59 #: ../data/plugins/90-library.plugins.py:63 #: ../data/plugins/90-library.plugins.py:67 #: ../data/plugins/90-library.plugins.py:71 msgid "Swap corners" msgstr "Silih bucu" #: ../data/plugins/90-library.plugins.py:52 #: ../data/plugins/90-library.plugins.py:76 msgid "2 corners, top layer" msgstr "2 bucu, lapisan teratas" #: ../data/plugins/90-library.plugins.py:56 msgid "2 corners diagonal, top layer" msgstr "2 bucu berpepenjuru, lapisan teratas" #: ../data/plugins/90-library.plugins.py:60 #: ../data/plugins/90-library.plugins.py:80 msgid "3 corners ⟳, top layer" msgstr "3 bucu⟳, lapisan teratas" #: ../data/plugins/90-library.plugins.py:64 msgid "3 corners ⟲, top layer" msgstr "3 bucu⟲, lapisan teratas" #: ../data/plugins/90-library.plugins.py:68 msgid "4 corners, top layer" msgstr "4 bucu, lapisan teratas" #: ../data/plugins/90-library.plugins.py:72 msgid "2 corners, partial sequence, top layer" msgstr "2 bucu, jujukan separa, lapisan teratas" #: ../data/plugins/90-library.plugins.py:75 #: ../data/plugins/90-library.plugins.py:79 #: ../data/plugins/90-library.plugins.py:83 #: ../data/plugins/90-library.plugins.py:87 msgid "Rotate corners" msgstr "Putar bucu" #: ../data/plugins/90-library.plugins.py:84 msgid "1 corner ⟳, partial sequence, top layer" msgstr "1 bucu⟳, jujjukan separa, lapisan teratas" #: ../data/plugins/90-library.plugins.py:88 msgid "1 corner ⟲, partial sequence, top layer" msgstr "1 bucu⟲, jujukan separa, lapisan teratas" #: ../data/plugins/90-library.plugins.py:92 #: ../data/plugins/90-library.plugins.py:97 #: ../data/plugins/90-library.plugins.py:102 #: ../data/plugins/90-library.plugins.py:111 msgid "Rotate center" msgstr "Putar tengah" #. 2 rotations of the center face in the upper layer #: ../data/plugins/90-library.plugins.py:94 msgid "2×Up" msgstr "2xNaik" #. Up clockwise and front clockwise #: ../data/plugins/90-library.plugins.py:99 msgid "Up ⟳ and front ⟳" msgstr "Atas ⟳ dan hadapan" #. Up clockwise and front counterclockwise #: ../data/plugins/90-library.plugins.py:104 msgid "Up ⟳ and front ⟲" msgstr "Atas ⟳ dan hadapan" #: ../data/plugins/90-library.plugins.py:106 msgid "Swap center parts, up and front" msgstr "Silih bahagian tengah, atas dan hadapan" #. Up clockwise and down counterclockwise #: ../data/plugins/90-library.plugins.py:113 msgid "Up ⟳ and down ⟲" msgstr "Atas ⟳ dan bawah" #: ../data/plugins/90-library.plugins.py:116 #: ../data/plugins/90-library.plugins.py:120 #: ../data/plugins/90-library.plugins.py:124 #: ../data/plugins/90-library.plugins.py:128 msgid "Misc" msgstr "Pelbagai" #. Yields in a rotated back layer, but the sequence of moves does not touch the back layer #: ../data/plugins/90-library.plugins.py:118 #: ../data/plugins/90-library.plugins.py:125 #: ../data/plugins/90-library.plugins.py:129 msgid "Back without back" msgstr "Undur tanpa belakang" #: ../data/plugins/90-library.plugins.py:121 msgid "2×Back without back" msgstr "2×Undur tanpa belakang" #: ../data/plugins/95-transformations.plugins.py:18 #: ../data/plugins/95-transformations.plugins.py:21 #: ../data/plugins/95-transformations.plugins.py:24 msgid "Move transformations" msgstr "Gerak transformasi" #: ../data/plugins/95-transformations.plugins.py:19 msgid "Invert move sequence" msgstr "Songsangkan jujukan gerakan" #: ../data/plugins/95-transformations.plugins.py:22 msgid "Normalize cube rotations" msgstr "Normalkan putaran kiub" #: ../data/plugins/95-transformations.plugins.py:25 msgid "Normalize move sequence" msgstr "Normalkan jujukan gerakan" #: ../buildlib/modeldef.py:111 msgid "Brick" msgstr "Bata" #: ../buildlib/modeldef.py:112 #, python-brace-format msgid "{0}×{1}×{2}-Brick" msgstr "Bata-{0}×{1}×{2}" #: ../buildlib/modeldef.py:113 msgid "Width:" msgstr "Lebar:" #: ../buildlib/modeldef.py:113 ../buildlib/modeldef.py:151 #: ../buildlib/modeldef.py:247 ../buildlib/modeldef.py:299 #: ../buildlib/modeldef.py:310 msgid "Height:" msgstr "Tinggi:" #: ../buildlib/modeldef.py:113 msgid "Depth:" msgstr "Kedalaman:" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:254 #: ../buildlib/modeldef.py:317 msgid "Up" msgstr "Naik" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:317 msgid "Down" msgstr "Turun" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Left" msgstr "Kiri" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Right" msgstr "Kanan" #: ../buildlib/modeldef.py:120 msgid "Front" msgstr "Hadapan" #: ../buildlib/modeldef.py:120 ../buildlib/modeldef.py:204 #: ../buildlib/modeldef.py:254 ../buildlib/modeldef.py:318 msgid "Back" msgstr "Undur" #: ../buildlib/modeldef.py:149 msgid "Tower" msgstr "Menara" #: ../buildlib/modeldef.py:150 #, python-brace-format msgid "{0}×{1}-Tower" msgstr "Menara-{0}×{1}" #: ../buildlib/modeldef.py:151 ../buildlib/modeldef.py:247 #: ../buildlib/modeldef.py:299 ../buildlib/modeldef.py:310 msgid "Basis:" msgstr "Asas:" #: ../buildlib/modeldef.py:163 msgid "Cube" msgstr "Kiub" #: ../buildlib/modeldef.py:164 #, python-brace-format msgid "{0}×{0}×{0}-Cube" msgstr "Kiub-{0}×{0}×{0}" #: ../buildlib/modeldef.py:165 ../buildlib/modeldef.py:197 msgid "Size:" msgstr "Saiz:" #: ../buildlib/modeldef.py:177 ../buildlib/modeldef.py:178 msgid "Void Cube" msgstr "Kiub Void" #: ../buildlib/modeldef.py:195 msgid "Tetrahedron" msgstr "Tetrahedron" #: ../buildlib/modeldef.py:196 #, python-brace-format msgid "{0}-Tetrahedron" msgstr "{0}-Tetrahedron" #: ../buildlib/modeldef.py:245 msgid "Triangular Prism" msgstr "Prisma Segitiga" #: ../buildlib/modeldef.py:246 #, python-brace-format msgid "{0}×{1} Triangular Prism" msgstr "{0}×{1} Prisma Segitiga" #: ../buildlib/modeldef.py:297 msgid "Triangular Prism (complex)" msgstr "Prosma Segitiga (kompleks)" #: ../buildlib/modeldef.py:298 #, python-brace-format msgid "{0}×{1} Triangular Prism (complex)" msgstr "{0}×{1} Prisma Segitiga (kompleks)" #: ../buildlib/modeldef.py:308 msgid "Pentagonal Prism" msgstr "Prisma Pentagon" #: ../buildlib/modeldef.py:309 #, python-brace-format msgid "{0}×{1} Pentagonal Prism" msgstr "{0}×{1} Prisma Pentagon" #: ../buildlib/modeldef.py:318 msgid "Front Right" msgstr "Kanan Hadapan" #: ../buildlib/modeldef.py:318 msgid "Front Left" msgstr "Kiri Hadapan" #: ../buildlib/modeldef.py:358 msgid "Pentagonal Prism (stretched)" msgstr "Prisma Pentagon (diregang)" #: ../buildlib/modeldef.py:359 #, python-brace-format msgid "{0}×{1} Pentagonal Prism (stretched)" msgstr "{0}×{1} Prisma Pentagon (diregang)" pybik-2.1/csrc/0000775000175000017500000000000012556245305013603 5ustar barccbarcc00000000000000pybik-2.1/csrc/_gldraw.c0000664000175000017500000063743212556224643015407 0ustar barccbarcc00000000000000/* Generated by Cython 0.21.1 */ #define PY_SSIZE_T_CLEAN #ifndef CYTHON_USE_PYLONG_INTERNALS #ifdef PYLONG_BITS_IN_DIGIT #define CYTHON_USE_PYLONG_INTERNALS 0 #else #include "pyconfig.h" #ifdef PYLONG_BITS_IN_DIGIT #define CYTHON_USE_PYLONG_INTERNALS 1 #else #define CYTHON_USE_PYLONG_INTERNALS 0 #endif #endif #endif #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) #error Cython requires Python 2.6+ or Python 3.2+. #else #define CYTHON_ABI "0_21_1" #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyType_Type #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #if PY_VERSION_HEX < 0x030400a1 && !defined(Py_TPFLAGS_HAVE_FINALIZE) #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #else #define CYTHON_PEP393_ENABLED 0 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #define __Pyx_PyFrozenSet_Size(s) PyObject_Size(s) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ? \ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #define __Pyx_PyFrozenSet_Size(s) PySet_Size(s) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is a quiet NaN. */ float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #ifdef __cplusplus template void __Pyx_call_destructor(T* x) { x->~T(); } #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #endif #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE___gldraw #define __PYX_HAVE_API___gldraw #include "stddef.h" #include "stdint.h" #include "GL/gl.h" #include "GL/glext.h" #include "math.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_fits_Py_ssize_t(v, type, is_signed) ( \ (sizeof(type) < sizeof(Py_ssize_t)) || \ (sizeof(type) > sizeof(Py_ssize_t) && \ likely(v < (type)PY_SSIZE_T_MAX || \ v == (type)PY_SSIZE_T_MAX) && \ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN || \ v == (type)PY_SSIZE_T_MIN))) || \ (sizeof(type) == sizeof(Py_ssize_t) && \ (is_signed || likely(v < (type)PY_SSIZE_T_MAX || \ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromUString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromUString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromUString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((const char*)s) #if PY_MAJOR_VERSION < 3 static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #else #define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen #endif #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_COMPILING_IN_CPYTHON #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "_gldraw.pyx", }; /* "gl.pxd":64 * # from /usr/include/GL/gl.h: * * ctypedef unsigned int GLenum # <<<<<<<<<<<<<< * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield */ typedef unsigned int __pyx_t_2gl_GLenum; /* "gl.pxd":65 * * ctypedef unsigned int GLenum * ctypedef unsigned char GLboolean # <<<<<<<<<<<<<< * ctypedef unsigned int GLbitfield * ctypedef void GLvoid */ typedef unsigned char __pyx_t_2gl_GLboolean; /* "gl.pxd":66 * ctypedef unsigned int GLenum * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield # <<<<<<<<<<<<<< * ctypedef void GLvoid * ctypedef int GLint */ typedef unsigned int __pyx_t_2gl_GLbitfield; /* "gl.pxd":68 * ctypedef unsigned int GLbitfield * ctypedef void GLvoid * ctypedef int GLint # <<<<<<<<<<<<<< * ctypedef unsigned char GLubyte * ctypedef unsigned int GLuint */ typedef int __pyx_t_2gl_GLint; /* "gl.pxd":69 * ctypedef void GLvoid * ctypedef int GLint * ctypedef unsigned char GLubyte # <<<<<<<<<<<<<< * ctypedef unsigned int GLuint * ctypedef int GLsizei */ typedef unsigned char __pyx_t_2gl_GLubyte; /* "gl.pxd":70 * ctypedef int GLint * ctypedef unsigned char GLubyte * ctypedef unsigned int GLuint # <<<<<<<<<<<<<< * ctypedef int GLsizei * ctypedef float GLfloat */ typedef unsigned int __pyx_t_2gl_GLuint; /* "gl.pxd":71 * ctypedef unsigned char GLubyte * ctypedef unsigned int GLuint * ctypedef int GLsizei # <<<<<<<<<<<<<< * ctypedef float GLfloat * ctypedef float GLclampf */ typedef int __pyx_t_2gl_GLsizei; /* "gl.pxd":72 * ctypedef unsigned int GLuint * ctypedef int GLsizei * ctypedef float GLfloat # <<<<<<<<<<<<<< * ctypedef float GLclampf * */ typedef float __pyx_t_2gl_GLfloat; /* "gl.pxd":73 * ctypedef int GLsizei * ctypedef float GLfloat * ctypedef float GLclampf # <<<<<<<<<<<<<< * * */ typedef float __pyx_t_2gl_GLclampf; /* "gl.pxd":78 * # from /usr/include/GL/glext.h: * * ctypedef ptrdiff_t GLsizeiptr # <<<<<<<<<<<<<< * ctypedef ptrdiff_t GLintptr * ctypedef char GLchar */ typedef ptrdiff_t __pyx_t_2gl_GLsizeiptr; /* "gl.pxd":79 * * ctypedef ptrdiff_t GLsizeiptr * ctypedef ptrdiff_t GLintptr # <<<<<<<<<<<<<< * ctypedef char GLchar * */ typedef ptrdiff_t __pyx_t_2gl_GLintptr; /* "gl.pxd":80 * ctypedef ptrdiff_t GLsizeiptr * ctypedef ptrdiff_t GLintptr * ctypedef char GLchar # <<<<<<<<<<<<<< * * */ typedef char __pyx_t_2gl_GLchar; /*--- Type declarations ---*/ /* "gl.pxd":67 * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield * ctypedef void GLvoid # <<<<<<<<<<<<<< * ctypedef int GLint * ctypedef unsigned char GLubyte */ typedef void __pyx_t_2gl_GLvoid; struct __pyx_t_7_gldraw_Block; struct __pyx_t_7_gldraw_Cube; struct __pyx_t_7_gldraw_Animation_Struct; /* "_gldraw.pxd":4 * * from gl cimport * #line 35 * cdef enum: # #line 52 # <<<<<<<<<<<<<< * ATTRIB_LOCATION = 0 #line 57 * PICKATTRIB_LOCATION = 5 #line 58 */ enum { __pyx_e_7_gldraw_ATTRIB_LOCATION = 0, __pyx_e_7_gldraw_PICKATTRIB_LOCATION = 5 }; /* "_gldraw.pxd":7 * ATTRIB_LOCATION = 0 #line 57 * PICKATTRIB_LOCATION = 5 #line 58 * ctypedef float vec4[4] #line 61 # <<<<<<<<<<<<<< * ctypedef vec4 mat4[4] #line 62 * cdef matrix_set_identity(mat4& matrix) #line 66 */ typedef float __pyx_t_7_gldraw_vec4[4]; /* "_gldraw.pxd":8 * PICKATTRIB_LOCATION = 5 #line 58 * ctypedef float vec4[4] #line 61 * ctypedef vec4 mat4[4] #line 62 # <<<<<<<<<<<<<< * cdef matrix_set_identity(mat4& matrix) #line 66 * cdef void gl_draw_cube() #line 186 */ typedef __pyx_t_7_gldraw_vec4 __pyx_t_7_gldraw_mat4[4]; /* "_gldraw.pyx":52 * * * cdef enum: # #pxd/ # <<<<<<<<<<<<<< * #if True: * MAX_TRANSFORMATIONS = 24 */ enum { __pyx_e_7_gldraw_MAX_TRANSFORMATIONS = 24, __pyx_e_7_gldraw_MAX_BLOCKS = 1000 }; /* "_gldraw.pyx":73 * matrix[3][0] = 0.; matrix[3][1] = 0.; matrix[3][2] = 0.; matrix[3][3] = 1. * * cdef struct Block: #px/ # <<<<<<<<<<<<<< * #class Block: # pylint: disable=R0903 * ##px- */ struct __pyx_t_7_gldraw_Block { __pyx_t_7_gldraw_vec4 *transformation; int in_motion; int idx_triangles; int cnt_triangles; }; /* "_gldraw.pyx":88 * #self.cnt_triangles = None * * cdef struct Cube: #px/ # <<<<<<<<<<<<<< * #class cube: # pylint: disable=W0232, R0903 * mat4 transformations[MAX_TRANSFORMATIONS] #px/ */ struct __pyx_t_7_gldraw_Cube { __pyx_t_7_gldraw_mat4 transformations[__pyx_e_7_gldraw_MAX_TRANSFORMATIONS]; unsigned int number_blocks; struct __pyx_t_7_gldraw_Block blocks[__pyx_e_7_gldraw_MAX_BLOCKS]; int cnt_pick; int idx_debug; __pyx_t_2gl_GLuint object_location; __pyx_t_2gl_GLuint glbuffer; }; /* "_gldraw.pyx":105 * cdef Cube cube #px+ * * cdef struct Animation_Struct: #px/ # <<<<<<<<<<<<<< * #class animation: * float angle, angle_max #px+ */ struct __pyx_t_7_gldraw_Animation_Struct { float angle; float angle_max; float rotation_x; float rotation_y; float rotation_z; __pyx_t_7_gldraw_mat4 rotation_matrix; }; #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil) \ if (acquire_gil) { \ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ PyGILState_Release(__pyx_gilstate_save); \ } else { \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil) \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext() \ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do { \ PyObject *tmp = (PyObject *) r; \ r = v; __Pyx_XDECREF(tmp); \ } while (0) #define __Pyx_DECREF_SET(r, v) do { \ PyObject *tmp = (PyObject *) r; \ r = v; __Pyx_DECREF(tmp); \ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif static PyObject *__Pyx_GetBuiltinName(PyObject *name); static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ const char* function_name); static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); static CYTHON_INLINE int __Pyx_IterFinish(void); static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); static double __Pyx__PyObject_AsDouble(PyObject* obj); #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyObject_AsDouble(obj) \ (likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \ likely(PyInt_CheckExact(obj)) ? \ PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) #else #define __Pyx_PyObject_AsDouble(obj) \ ((likely(PyFloat_CheckExact(obj))) ? \ PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj)) #endif static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); static void __Pyx_WriteUnraisable(const char *name, int clineno, int lineno, const char *filename, int full_traceback); static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); typedef struct { int code_line; PyCodeObject* code_object; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); static int __Pyx_check_binary_version(void); static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'libc.stddef' */ /* Module declarations from 'libc.stdint' */ /* Module declarations from 'gl' */ /* Module declarations from 'libc.math' */ /* Module declarations from '_gldraw' */ static struct __pyx_t_7_gldraw_Cube __pyx_v_7_gldraw_cube; static struct __pyx_t_7_gldraw_Animation_Struct __pyx_v_7_gldraw_animation; static PyObject *__pyx_f_7_gldraw_matrix_set_identity(__pyx_t_7_gldraw_vec4 *); /*proto*/ static PyObject *__pyx_f_7_gldraw_gl_set_atlas_texture(int, int, int, PyObject *, int __pyx_skip_dispatch); /*proto*/ static PyObject *__pyx_f_7_gldraw_set_animation_start(PyObject *, float, float, float, float, int __pyx_skip_dispatch); /*proto*/ static void __pyx_f_7_gldraw__update_animation_rotation_matrix(void); /*proto*/ static PyObject *__pyx_f_7_gldraw_set_animation_next(float, int __pyx_skip_dispatch); /*proto*/ static void __pyx_f_7_gldraw__mult_matrix(__pyx_t_7_gldraw_vec4 *, __pyx_t_7_gldraw_vec4 *, __pyx_t_7_gldraw_vec4 *); /*proto*/ static void __pyx_f_7_gldraw__gl_set_pointer(__pyx_t_2gl_GLuint, __pyx_t_2gl_GLint, __pyx_t_2gl_GLenum, __pyx_t_2gl_GLboolean, long); /*proto*/ static PyObject *__pyx_f_7_gldraw_gl_set_data(int, PyObject *, PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch); /*proto*/ #define __Pyx_MODULE_NAME "_gldraw" int __pyx_module_is_main__gldraw = 0; /* Implementation of '_gldraw' */ static PyObject *__pyx_builtin_enumerate; static PyObject *__pyx_builtin_range; static PyObject *__pyx_pf_7_gldraw_init_module(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_gldraw_2set_transformations(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_blocks); /* proto */ static PyObject *__pyx_pf_7_gldraw_4gl_set_atlas_texture(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_x, int __pyx_v_w, int __pyx_v_h, PyObject *__pyx_v_data); /* proto */ static PyObject *__pyx_pf_7_gldraw_6set_animation_start(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_blocks, float __pyx_v_angle_max, float __pyx_v_axisx, float __pyx_v_axisy, float __pyx_v_axisz); /* proto */ static PyObject *__pyx_pf_7_gldraw_8set_animation_next(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_increment); /* proto */ static PyObject *__pyx_pf_7_gldraw_10gl_set_data(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_nblocks, PyObject *__pyx_v_vertexdata, PyObject *__pyx_v_vertexpointers, PyObject *__pyx_v_vertexinfo, PyObject *__pyx_v_transformations); /* proto */ static char __pyx_k_b[] = "b"; static char __pyx_k_h[] = "h"; static char __pyx_k_i[] = "i"; static char __pyx_k_w[] = "w"; static char __pyx_k_x[] = "x"; static char __pyx_k_all[] = "__all__"; static char __pyx_k_data[] = "data"; static char __pyx_k_main[] = "__main__"; static char __pyx_k_mat4[] = "mat4"; static char __pyx_k_name[] = "__name__"; static char __pyx_k_test[] = "__test__"; static char __pyx_k_DEBUG[] = "DEBUG"; static char __pyx_k_axisx[] = "axisx"; static char __pyx_k_axisy[] = "axisy"; static char __pyx_k_axisz[] = "axisz"; static char __pyx_k_debug[] = "debug"; static char __pyx_k_range[] = "range"; static char __pyx_k_blocks[] = "blocks"; static char __pyx_k_format[] = "format"; static char __pyx_k_gldraw[] = "_gldraw"; static char __pyx_k_import[] = "__import__"; static char __pyx_k_nblocks[] = "nblocks"; static char __pyx_k_package[] = "__package__"; static char __pyx_k_compiled[] = "__compiled"; static char __pyx_k_angle_max[] = "angle_max"; static char __pyx_k_enumerate[] = "enumerate"; static char __pyx_k_compiled_2[] = " compiled:"; static char __pyx_k_vertexdata[] = "vertexdata"; static char __pyx_k_vertexinfo[] = "vertexinfo"; static char __pyx_k_init_module[] = "init_module"; static char __pyx_k_from_package[] = " from package:"; static char __pyx_k_gl_draw_cube[] = "gl_draw_cube"; static char __pyx_k_gl_pick_cube[] = "gl_pick_cube"; static char __pyx_k_vertexpointers[] = "vertexpointers"; static char __pyx_k_ATTRIB_LOCATION[] = "ATTRIB_LOCATION"; static char __pyx_k_gl_init_buffers[] = "gl_init_buffers"; static char __pyx_k_transformations[] = "transformations"; static char __pyx_k_Importing_module[] = "Importing module:"; static char __pyx_k_gl_delete_buffers[] = "gl_delete_buffers"; static char __pyx_k_gl_draw_cube_debug[] = "gl_draw_cube_debug"; static char __pyx_k_PICKATTRIB_LOCATION[] = "PICKATTRIB_LOCATION"; static char __pyx_k_matrix_set_identity[] = "matrix_set_identity"; static char __pyx_k_set_transformations[] = "set_transformations"; static char __pyx_k_gl_draw_select_debug[] = "gl_draw_select_debug"; static char __pyx_k_gl_init_object_location[] = "gl_init_object_location"; static char __pyx_k_blocks_hardcoded_limit_is[] = "{} blocks, hardcoded limit is {}"; static char __pyx_k_tmp[] = "/tmp/build/temp.linux-x86_64-3.4/pybiklib/_gldraw.pyx"; static char __pyx_k_transformations_hardcoded_limit[] = "{} transformations, hardcoded limit is {}"; static PyObject *__pyx_n_u_ATTRIB_LOCATION; static PyObject *__pyx_n_s_DEBUG; static PyObject *__pyx_kp_u_Importing_module; static PyObject *__pyx_n_u_PICKATTRIB_LOCATION; static PyObject *__pyx_n_s_all; static PyObject *__pyx_n_s_angle_max; static PyObject *__pyx_n_s_axisx; static PyObject *__pyx_n_s_axisy; static PyObject *__pyx_n_s_axisz; static PyObject *__pyx_n_s_b; static PyObject *__pyx_n_s_blocks; static PyObject *__pyx_kp_u_blocks_hardcoded_limit_is; static PyObject *__pyx_n_s_compiled; static PyObject *__pyx_kp_u_compiled_2; static PyObject *__pyx_n_s_data; static PyObject *__pyx_n_s_debug; static PyObject *__pyx_n_s_enumerate; static PyObject *__pyx_n_s_format; static PyObject *__pyx_kp_u_from_package; static PyObject *__pyx_n_u_gl_delete_buffers; static PyObject *__pyx_n_u_gl_draw_cube; static PyObject *__pyx_n_u_gl_draw_cube_debug; static PyObject *__pyx_n_u_gl_draw_select_debug; static PyObject *__pyx_n_u_gl_init_buffers; static PyObject *__pyx_n_u_gl_init_object_location; static PyObject *__pyx_n_u_gl_pick_cube; static PyObject *__pyx_n_s_gldraw; static PyObject *__pyx_n_s_h; static PyObject *__pyx_kp_s_tmp; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_import; static PyObject *__pyx_n_s_init_module; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_u_mat4; static PyObject *__pyx_n_u_matrix_set_identity; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_nblocks; static PyObject *__pyx_n_s_package; static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_set_transformations; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_transformations; static PyObject *__pyx_kp_u_transformations_hardcoded_limit; static PyObject *__pyx_n_s_vertexdata; static PyObject *__pyx_n_s_vertexinfo; static PyObject *__pyx_n_s_vertexpointers; static PyObject *__pyx_n_s_w; static PyObject *__pyx_n_s_x; static PyObject *__pyx_tuple_; static PyObject *__pyx_tuple__3; static PyObject *__pyx_codeobj__2; static PyObject *__pyx_codeobj__4; /* "_gldraw.pyx":66 * #mat4 = lambda: [[0.]*4 for _i in range(4)] * * cdef matrix_set_identity(mat4& matrix): #pxd/ # <<<<<<<<<<<<<< * #def matrix_set_identity(matrix): * matrix[0][0] = 1.; matrix[0][1] = 0.; matrix[0][2] = 0.; matrix[0][3] = 0. */ static PyObject *__pyx_f_7_gldraw_matrix_set_identity(__pyx_t_7_gldraw_vec4 *__pyx_v_matrix) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("matrix_set_identity", 0); /* "_gldraw.pyx":68 * cdef matrix_set_identity(mat4& matrix): #pxd/ * #def matrix_set_identity(matrix): * matrix[0][0] = 1.; matrix[0][1] = 0.; matrix[0][2] = 0.; matrix[0][3] = 0. # <<<<<<<<<<<<<< * matrix[1][0] = 0.; matrix[1][1] = 1.; matrix[1][2] = 0.; matrix[1][3] = 0. * matrix[2][0] = 0.; matrix[2][1] = 0.; matrix[2][2] = 1.; matrix[2][3] = 0. */ ((__pyx_v_matrix[0])[0]) = 1.; ((__pyx_v_matrix[0])[1]) = 0.; ((__pyx_v_matrix[0])[2]) = 0.; ((__pyx_v_matrix[0])[3]) = 0.; /* "_gldraw.pyx":69 * #def matrix_set_identity(matrix): * matrix[0][0] = 1.; matrix[0][1] = 0.; matrix[0][2] = 0.; matrix[0][3] = 0. * matrix[1][0] = 0.; matrix[1][1] = 1.; matrix[1][2] = 0.; matrix[1][3] = 0. # <<<<<<<<<<<<<< * matrix[2][0] = 0.; matrix[2][1] = 0.; matrix[2][2] = 1.; matrix[2][3] = 0. * matrix[3][0] = 0.; matrix[3][1] = 0.; matrix[3][2] = 0.; matrix[3][3] = 1. */ ((__pyx_v_matrix[1])[0]) = 0.; ((__pyx_v_matrix[1])[1]) = 1.; ((__pyx_v_matrix[1])[2]) = 0.; ((__pyx_v_matrix[1])[3]) = 0.; /* "_gldraw.pyx":70 * matrix[0][0] = 1.; matrix[0][1] = 0.; matrix[0][2] = 0.; matrix[0][3] = 0. * matrix[1][0] = 0.; matrix[1][1] = 1.; matrix[1][2] = 0.; matrix[1][3] = 0. * matrix[2][0] = 0.; matrix[2][1] = 0.; matrix[2][2] = 1.; matrix[2][3] = 0. # <<<<<<<<<<<<<< * matrix[3][0] = 0.; matrix[3][1] = 0.; matrix[3][2] = 0.; matrix[3][3] = 1. * */ ((__pyx_v_matrix[2])[0]) = 0.; ((__pyx_v_matrix[2])[1]) = 0.; ((__pyx_v_matrix[2])[2]) = 1.; ((__pyx_v_matrix[2])[3]) = 0.; /* "_gldraw.pyx":71 * matrix[1][0] = 0.; matrix[1][1] = 1.; matrix[1][2] = 0.; matrix[1][3] = 0. * matrix[2][0] = 0.; matrix[2][1] = 0.; matrix[2][2] = 1.; matrix[2][3] = 0. * matrix[3][0] = 0.; matrix[3][1] = 0.; matrix[3][2] = 0.; matrix[3][3] = 1. # <<<<<<<<<<<<<< * * cdef struct Block: #px/ */ ((__pyx_v_matrix[3])[0]) = 0.; ((__pyx_v_matrix[3])[1]) = 0.; ((__pyx_v_matrix[3])[2]) = 0.; ((__pyx_v_matrix[3])[3]) = 1.; /* "_gldraw.pyx":66 * #mat4 = lambda: [[0.]*4 for _i in range(4)] * * cdef matrix_set_identity(mat4& matrix): #pxd/ # <<<<<<<<<<<<<< * #def matrix_set_identity(matrix): * matrix[0][0] = 1.; matrix[0][1] = 0.; matrix[0][2] = 0.; matrix[0][3] = 0. */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":114 * * * def init_module(): # <<<<<<<<<<<<<< * cdef int i #px+ * */ /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_1init_module(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_gldraw_1init_module = {"init_module", (PyCFunction)__pyx_pw_7_gldraw_1init_module, METH_NOARGS, 0}; static PyObject *__pyx_pw_7_gldraw_1init_module(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_module (wrapper)", 0); __pyx_r = __pyx_pf_7_gldraw_init_module(__pyx_self); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_gldraw_init_module(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_module", 0); /* "_gldraw.pyx":117 * cdef int i #px+ * * cube.number_blocks = 0 # <<<<<<<<<<<<<< * #cube.blocks * */ __pyx_v_7_gldraw_cube.number_blocks = 0; /* "_gldraw.pyx":120 * #cube.blocks * * cube.cnt_pick = 0 # <<<<<<<<<<<<<< * cube.idx_debug = 0 * */ __pyx_v_7_gldraw_cube.cnt_pick = 0; /* "_gldraw.pyx":121 * * cube.cnt_pick = 0 * cube.idx_debug = 0 # <<<<<<<<<<<<<< * * animation.angle = animation.angle_max = 0 */ __pyx_v_7_gldraw_cube.idx_debug = 0; /* "_gldraw.pyx":123 * cube.idx_debug = 0 * * animation.angle = animation.angle_max = 0 # <<<<<<<<<<<<<< * * def set_transformations(blocks): */ __pyx_v_7_gldraw_animation.angle = 0.0; __pyx_v_7_gldraw_animation.angle_max = 0.0; /* "_gldraw.pyx":114 * * * def init_module(): # <<<<<<<<<<<<<< * cdef int i #px+ * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":125 * animation.angle = animation.angle_max = 0 * * def set_transformations(blocks): # <<<<<<<<<<<<<< * cdef unsigned int i, b #px+ * for i, b in enumerate(blocks): */ /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_3set_transformations(PyObject *__pyx_self, PyObject *__pyx_v_blocks); /*proto*/ static PyMethodDef __pyx_mdef_7_gldraw_3set_transformations = {"set_transformations", (PyCFunction)__pyx_pw_7_gldraw_3set_transformations, METH_O, 0}; static PyObject *__pyx_pw_7_gldraw_3set_transformations(PyObject *__pyx_self, PyObject *__pyx_v_blocks) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_transformations (wrapper)", 0); __pyx_r = __pyx_pf_7_gldraw_2set_transformations(__pyx_self, ((PyObject *)__pyx_v_blocks)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_gldraw_2set_transformations(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_blocks) { unsigned int __pyx_v_i; unsigned int __pyx_v_b; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations unsigned int __pyx_t_1; PyObject *__pyx_t_2 = NULL; Py_ssize_t __pyx_t_3; PyObject *(*__pyx_t_4)(PyObject *); PyObject *__pyx_t_5 = NULL; unsigned int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_transformations", 0); /* "_gldraw.pyx":127 * def set_transformations(blocks): * cdef unsigned int i, b #px+ * for i, b in enumerate(blocks): # <<<<<<<<<<<<<< * cube.blocks[i].transformation = cube.transformations[b] * cube.blocks[i].in_motion = False */ __pyx_t_1 = 0; if (likely(PyList_CheckExact(__pyx_v_blocks)) || PyTuple_CheckExact(__pyx_v_blocks)) { __pyx_t_2 = __pyx_v_blocks; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; __pyx_t_4 = NULL; } else { __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_blocks); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } for (;;) { if (likely(!__pyx_t_4)) { if (likely(PyList_CheckExact(__pyx_t_2))) { if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } else { if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } } else { __pyx_t_5 = __pyx_t_4(__pyx_t_2); if (unlikely(!__pyx_t_5)) { PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } break; } __Pyx_GOTREF(__pyx_t_5); } __pyx_t_6 = __Pyx_PyInt_As_unsigned_int(__pyx_t_5); if (unlikely((__pyx_t_6 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_b = __pyx_t_6; __pyx_v_i = __pyx_t_1; __pyx_t_1 = (__pyx_t_1 + 1); /* "_gldraw.pyx":128 * cdef unsigned int i, b #px+ * for i, b in enumerate(blocks): * cube.blocks[i].transformation = cube.transformations[b] # <<<<<<<<<<<<<< * cube.blocks[i].in_motion = False * */ (__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).transformation = (__pyx_v_7_gldraw_cube.transformations[__pyx_v_b]); /* "_gldraw.pyx":129 * for i, b in enumerate(blocks): * cube.blocks[i].transformation = cube.transformations[b] * cube.blocks[i].in_motion = False # <<<<<<<<<<<<<< * * cpdef gl_set_atlas_texture(int x, int w, int h, bytes data): #px/ */ (__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).in_motion = 0; /* "_gldraw.pyx":127 * def set_transformations(blocks): * cdef unsigned int i, b #px+ * for i, b in enumerate(blocks): # <<<<<<<<<<<<<< * cube.blocks[i].transformation = cube.transformations[b] * cube.blocks[i].in_motion = False */ } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":125 * animation.angle = animation.angle_max = 0 * * def set_transformations(blocks): # <<<<<<<<<<<<<< * cdef unsigned int i, b #px+ * for i, b in enumerate(blocks): */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("_gldraw.set_transformations", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":131 * cube.blocks[i].in_motion = False * * cpdef gl_set_atlas_texture(int x, int w, int h, bytes data): #px/ # <<<<<<<<<<<<<< * #def gl_set_atlas_texture(x, w, h, data): * glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data) #px/ */ static PyObject *__pyx_pw_7_gldraw_5gl_set_atlas_texture(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7_gldraw_gl_set_atlas_texture(int __pyx_v_x, int __pyx_v_w, int __pyx_v_h, PyObject *__pyx_v_data, CYTHON_UNUSED int __pyx_skip_dispatch) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations char *__pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_set_atlas_texture", 0); /* "_gldraw.pyx":133 * cpdef gl_set_atlas_texture(int x, int w, int h, bytes data): #px/ * #def gl_set_atlas_texture(x, w, h, data): * glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data) #px/ # <<<<<<<<<<<<<< * #glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data) * */ __pyx_t_1 = __Pyx_PyObject_AsString(__pyx_v_data); if (unlikely((!__pyx_t_1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} glTexSubImage2D(GL_TEXTURE_2D, 0, __pyx_v_x, 0, __pyx_v_w, __pyx_v_h, GL_RGBA, GL_UNSIGNED_BYTE, ((char *)__pyx_t_1)); /* "_gldraw.pyx":131 * cube.blocks[i].in_motion = False * * cpdef gl_set_atlas_texture(int x, int w, int h, bytes data): #px/ # <<<<<<<<<<<<<< * #def gl_set_atlas_texture(x, w, h, data): * glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data) #px/ */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_gldraw.gl_set_atlas_texture", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_5gl_set_atlas_texture(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7_gldraw_5gl_set_atlas_texture(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { int __pyx_v_x; int __pyx_v_w; int __pyx_v_h; PyObject *__pyx_v_data = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_set_atlas_texture (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_w,&__pyx_n_s_h,&__pyx_n_s_data,0}; PyObject* values[4] = {0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_w)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_atlas_texture", 1, 4, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_h)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_atlas_texture", 1, 4, 4, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_data)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_atlas_texture", 1, 4, 4, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_set_atlas_texture") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); } __pyx_v_x = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_x == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_w = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_w == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_h = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_h == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_data = ((PyObject*)values[3]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_set_atlas_texture", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_gldraw.gl_set_atlas_texture", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_data), (&PyBytes_Type), 1, "data", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_gldraw_4gl_set_atlas_texture(__pyx_self, __pyx_v_x, __pyx_v_w, __pyx_v_h, __pyx_v_data); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_gldraw_4gl_set_atlas_texture(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_x, int __pyx_v_w, int __pyx_v_h, PyObject *__pyx_v_data) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_set_atlas_texture", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_gldraw_gl_set_atlas_texture(__pyx_v_x, __pyx_v_w, __pyx_v_h, __pyx_v_data, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.gl_set_atlas_texture", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":136 * #glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data) * * cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): #px/ # <<<<<<<<<<<<<< * #def set_animation_start(blocks, angle_max, axisx, axisy, axisz): * animation.angle = 0.0 */ static PyObject *__pyx_pw_7_gldraw_7set_animation_start(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7_gldraw_set_animation_start(PyObject *__pyx_v_blocks, float __pyx_v_angle_max, float __pyx_v_axisx, float __pyx_v_axisy, float __pyx_v_axisz, CYTHON_UNUSED int __pyx_skip_dispatch) { int __pyx_v_block_id; CYTHON_UNUSED PyObject *__pyx_v_unused_block = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; float __pyx_t_2; float __pyx_t_3; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; PyObject *(*__pyx_t_6)(PyObject *); PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *(*__pyx_t_11)(PyObject *); int __pyx_t_12; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_animation_start", 0); /* "_gldraw.pyx":138 * cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): #px/ * #def set_animation_start(blocks, angle_max, axisx, axisy, axisz): * animation.angle = 0.0 # <<<<<<<<<<<<<< * animation.angle_max = angle_max * animation.rotation_x, animation.rotation_y, animation.rotation_z = axisx, axisy, axisz */ __pyx_v_7_gldraw_animation.angle = 0.0; /* "_gldraw.pyx":139 * #def set_animation_start(blocks, angle_max, axisx, axisy, axisz): * animation.angle = 0.0 * animation.angle_max = angle_max # <<<<<<<<<<<<<< * animation.rotation_x, animation.rotation_y, animation.rotation_z = axisx, axisy, axisz * matrix_set_identity(animation.rotation_matrix) */ __pyx_v_7_gldraw_animation.angle_max = __pyx_v_angle_max; /* "_gldraw.pyx":140 * animation.angle = 0.0 * animation.angle_max = angle_max * animation.rotation_x, animation.rotation_y, animation.rotation_z = axisx, axisy, axisz # <<<<<<<<<<<<<< * matrix_set_identity(animation.rotation_matrix) * cdef int block_id #px+ */ __pyx_t_1 = __pyx_v_axisx; __pyx_t_2 = __pyx_v_axisy; __pyx_t_3 = __pyx_v_axisz; __pyx_v_7_gldraw_animation.rotation_x = __pyx_t_1; __pyx_v_7_gldraw_animation.rotation_y = __pyx_t_2; __pyx_v_7_gldraw_animation.rotation_z = __pyx_t_3; /* "_gldraw.pyx":141 * animation.angle_max = angle_max * animation.rotation_x, animation.rotation_y, animation.rotation_z = axisx, axisy, axisz * matrix_set_identity(animation.rotation_matrix) # <<<<<<<<<<<<<< * cdef int block_id #px+ * cdef bint selected #px+ */ __pyx_t_4 = __pyx_f_7_gldraw_matrix_set_identity(__pyx_v_7_gldraw_animation.rotation_matrix); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "_gldraw.pyx":144 * cdef int block_id #px+ * cdef bint selected #px+ * for block_id, unused_block in blocks: # <<<<<<<<<<<<<< * cube.blocks[block_id].in_motion = True * */ if (likely(PyList_CheckExact(__pyx_v_blocks)) || PyTuple_CheckExact(__pyx_v_blocks)) { __pyx_t_4 = __pyx_v_blocks; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; __pyx_t_6 = NULL; } else { __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_blocks); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } for (;;) { if (likely(!__pyx_t_6)) { if (likely(PyList_CheckExact(__pyx_t_4))) { if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } else { if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } } else { __pyx_t_7 = __pyx_t_6(__pyx_t_4); if (unlikely(!__pyx_t_7)) { PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } break; } __Pyx_GOTREF(__pyx_t_7); } if ((likely(PyTuple_CheckExact(__pyx_t_7))) || (PyList_CheckExact(__pyx_t_7))) { PyObject* sequence = __pyx_t_7; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); } else { __pyx_t_8 = PyList_GET_ITEM(sequence, 0); __pyx_t_9 = PyList_GET_ITEM(sequence, 1); } __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(__pyx_t_9); #else __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); #endif __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } else { Py_ssize_t index = -1; __pyx_t_10 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_11 = Py_TYPE(__pyx_t_10)->tp_iternext; index = 0; __pyx_t_8 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_8); index = 1; __pyx_t_9 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_9)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_9); if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_11 = NULL; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; goto __pyx_L6_unpacking_done; __pyx_L5_unpacking_failed:; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_11 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L6_unpacking_done:; } __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_t_8); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_v_block_id = __pyx_t_12; __Pyx_XDECREF_SET(__pyx_v_unused_block, __pyx_t_9); __pyx_t_9 = 0; /* "_gldraw.pyx":145 * cdef bint selected #px+ * for block_id, unused_block in blocks: * cube.blocks[block_id].in_motion = True # <<<<<<<<<<<<<< * * cdef void _update_animation_rotation_matrix(): #px/ */ (__pyx_v_7_gldraw_cube.blocks[__pyx_v_block_id]).in_motion = 1; /* "_gldraw.pyx":144 * cdef int block_id #px+ * cdef bint selected #px+ * for block_id, unused_block in blocks: # <<<<<<<<<<<<<< * cube.blocks[block_id].in_motion = True * */ } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "_gldraw.pyx":136 * #glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data) * * cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): #px/ # <<<<<<<<<<<<<< * #def set_animation_start(blocks, angle_max, axisx, axisy, axisz): * animation.angle = 0.0 */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_AddTraceback("_gldraw.set_animation_start", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_unused_block); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_7set_animation_start(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7_gldraw_7set_animation_start(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_blocks = 0; float __pyx_v_angle_max; float __pyx_v_axisx; float __pyx_v_axisy; float __pyx_v_axisz; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_animation_start (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_blocks,&__pyx_n_s_angle_max,&__pyx_n_s_axisx,&__pyx_n_s_axisy,&__pyx_n_s_axisz,0}; PyObject* values[5] = {0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_blocks)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_angle_max)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_axisx)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_axisy)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_axisz)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_animation_start") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); } __pyx_v_blocks = values[0]; __pyx_v_angle_max = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_angle_max == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_axisx = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_axisx == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_axisy = __pyx_PyFloat_AsFloat(values[3]); if (unlikely((__pyx_v_axisy == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_axisz = __pyx_PyFloat_AsFloat(values[4]); if (unlikely((__pyx_v_axisz == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_animation_start", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_gldraw.set_animation_start", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_gldraw_6set_animation_start(__pyx_self, __pyx_v_blocks, __pyx_v_angle_max, __pyx_v_axisx, __pyx_v_axisy, __pyx_v_axisz); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_gldraw_6set_animation_start(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_blocks, float __pyx_v_angle_max, float __pyx_v_axisx, float __pyx_v_axisy, float __pyx_v_axisz) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_animation_start", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_gldraw_set_animation_start(__pyx_v_blocks, __pyx_v_angle_max, __pyx_v_axisx, __pyx_v_axisy, __pyx_v_axisz, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.set_animation_start", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":147 * cube.blocks[block_id].in_motion = True * * cdef void _update_animation_rotation_matrix(): #px/ # <<<<<<<<<<<<<< * #def _update_animation_rotation_matrix(): * cdef float angle = animation.angle / 180. * M_PI #px/ */ static void __pyx_f_7_gldraw__update_animation_rotation_matrix(void) { float __pyx_v_angle; float __pyx_v_x; float __pyx_v_y; float __pyx_v_z; float __pyx_v_c; float __pyx_v_s; __Pyx_RefNannyDeclarations float __pyx_t_1; __Pyx_RefNannySetupContext("_update_animation_rotation_matrix", 0); /* "_gldraw.pyx":149 * cdef void _update_animation_rotation_matrix(): #px/ * #def _update_animation_rotation_matrix(): * cdef float angle = animation.angle / 180. * M_PI #px/ # <<<<<<<<<<<<<< * #angle = radians(animation.angle) * cdef float x, y, z #px+ */ __pyx_v_angle = ((((double)__pyx_v_7_gldraw_animation.angle) / 180.) * M_PI); /* "_gldraw.pyx":152 * #angle = radians(animation.angle) * cdef float x, y, z #px+ * x = animation.rotation_x # <<<<<<<<<<<<<< * y = animation.rotation_y * z = animation.rotation_z */ __pyx_t_1 = __pyx_v_7_gldraw_animation.rotation_x; __pyx_v_x = __pyx_t_1; /* "_gldraw.pyx":153 * cdef float x, y, z #px+ * x = animation.rotation_x * y = animation.rotation_y # <<<<<<<<<<<<<< * z = animation.rotation_z * cdef float c, s #px+ */ __pyx_t_1 = __pyx_v_7_gldraw_animation.rotation_y; __pyx_v_y = __pyx_t_1; /* "_gldraw.pyx":154 * x = animation.rotation_x * y = animation.rotation_y * z = animation.rotation_z # <<<<<<<<<<<<<< * cdef float c, s #px+ * c = cos(angle) */ __pyx_t_1 = __pyx_v_7_gldraw_animation.rotation_z; __pyx_v_z = __pyx_t_1; /* "_gldraw.pyx":156 * z = animation.rotation_z * cdef float c, s #px+ * c = cos(angle) # <<<<<<<<<<<<<< * s = sin(angle) * */ __pyx_v_c = cos(__pyx_v_angle); /* "_gldraw.pyx":157 * cdef float c, s #px+ * c = cos(angle) * s = sin(angle) # <<<<<<<<<<<<<< * * animation.rotation_matrix[0][0] = x*x*(1-c) + c */ __pyx_v_s = sin(__pyx_v_angle); /* "_gldraw.pyx":159 * s = sin(angle) * * animation.rotation_matrix[0][0] = x*x*(1-c) + c # <<<<<<<<<<<<<< * animation.rotation_matrix[0][1] = x*y*(1-c) + z*s * animation.rotation_matrix[0][2] = x*z*(1-c) - y*s */ ((__pyx_v_7_gldraw_animation.rotation_matrix[0])[0]) = (((__pyx_v_x * __pyx_v_x) * (1.0 - __pyx_v_c)) + __pyx_v_c); /* "_gldraw.pyx":160 * * animation.rotation_matrix[0][0] = x*x*(1-c) + c * animation.rotation_matrix[0][1] = x*y*(1-c) + z*s # <<<<<<<<<<<<<< * animation.rotation_matrix[0][2] = x*z*(1-c) - y*s * animation.rotation_matrix[1][0] = y*x*(1-c) - z*s */ ((__pyx_v_7_gldraw_animation.rotation_matrix[0])[1]) = (((__pyx_v_x * __pyx_v_y) * (1.0 - __pyx_v_c)) + (__pyx_v_z * __pyx_v_s)); /* "_gldraw.pyx":161 * animation.rotation_matrix[0][0] = x*x*(1-c) + c * animation.rotation_matrix[0][1] = x*y*(1-c) + z*s * animation.rotation_matrix[0][2] = x*z*(1-c) - y*s # <<<<<<<<<<<<<< * animation.rotation_matrix[1][0] = y*x*(1-c) - z*s * animation.rotation_matrix[1][1] = y*y*(1-c) + c */ ((__pyx_v_7_gldraw_animation.rotation_matrix[0])[2]) = (((__pyx_v_x * __pyx_v_z) * (1.0 - __pyx_v_c)) - (__pyx_v_y * __pyx_v_s)); /* "_gldraw.pyx":162 * animation.rotation_matrix[0][1] = x*y*(1-c) + z*s * animation.rotation_matrix[0][2] = x*z*(1-c) - y*s * animation.rotation_matrix[1][0] = y*x*(1-c) - z*s # <<<<<<<<<<<<<< * animation.rotation_matrix[1][1] = y*y*(1-c) + c * animation.rotation_matrix[1][2] = y*z*(1-c) + x*s */ ((__pyx_v_7_gldraw_animation.rotation_matrix[1])[0]) = (((__pyx_v_y * __pyx_v_x) * (1.0 - __pyx_v_c)) - (__pyx_v_z * __pyx_v_s)); /* "_gldraw.pyx":163 * animation.rotation_matrix[0][2] = x*z*(1-c) - y*s * animation.rotation_matrix[1][0] = y*x*(1-c) - z*s * animation.rotation_matrix[1][1] = y*y*(1-c) + c # <<<<<<<<<<<<<< * animation.rotation_matrix[1][2] = y*z*(1-c) + x*s * animation.rotation_matrix[2][0] = x*z*(1-c) + y*s */ ((__pyx_v_7_gldraw_animation.rotation_matrix[1])[1]) = (((__pyx_v_y * __pyx_v_y) * (1.0 - __pyx_v_c)) + __pyx_v_c); /* "_gldraw.pyx":164 * animation.rotation_matrix[1][0] = y*x*(1-c) - z*s * animation.rotation_matrix[1][1] = y*y*(1-c) + c * animation.rotation_matrix[1][2] = y*z*(1-c) + x*s # <<<<<<<<<<<<<< * animation.rotation_matrix[2][0] = x*z*(1-c) + y*s * animation.rotation_matrix[2][1] = y*z*(1-c) - x*s */ ((__pyx_v_7_gldraw_animation.rotation_matrix[1])[2]) = (((__pyx_v_y * __pyx_v_z) * (1.0 - __pyx_v_c)) + (__pyx_v_x * __pyx_v_s)); /* "_gldraw.pyx":165 * animation.rotation_matrix[1][1] = y*y*(1-c) + c * animation.rotation_matrix[1][2] = y*z*(1-c) + x*s * animation.rotation_matrix[2][0] = x*z*(1-c) + y*s # <<<<<<<<<<<<<< * animation.rotation_matrix[2][1] = y*z*(1-c) - x*s * animation.rotation_matrix[2][2] = z*z*(1-c) + c */ ((__pyx_v_7_gldraw_animation.rotation_matrix[2])[0]) = (((__pyx_v_x * __pyx_v_z) * (1.0 - __pyx_v_c)) + (__pyx_v_y * __pyx_v_s)); /* "_gldraw.pyx":166 * animation.rotation_matrix[1][2] = y*z*(1-c) + x*s * animation.rotation_matrix[2][0] = x*z*(1-c) + y*s * animation.rotation_matrix[2][1] = y*z*(1-c) - x*s # <<<<<<<<<<<<<< * animation.rotation_matrix[2][2] = z*z*(1-c) + c * */ ((__pyx_v_7_gldraw_animation.rotation_matrix[2])[1]) = (((__pyx_v_y * __pyx_v_z) * (1.0 - __pyx_v_c)) - (__pyx_v_x * __pyx_v_s)); /* "_gldraw.pyx":167 * animation.rotation_matrix[2][0] = x*z*(1-c) + y*s * animation.rotation_matrix[2][1] = y*z*(1-c) - x*s * animation.rotation_matrix[2][2] = z*z*(1-c) + c # <<<<<<<<<<<<<< * * cpdef set_animation_next(float increment): #px/ */ ((__pyx_v_7_gldraw_animation.rotation_matrix[2])[2]) = (((__pyx_v_z * __pyx_v_z) * (1.0 - __pyx_v_c)) + __pyx_v_c); /* "_gldraw.pyx":147 * cube.blocks[block_id].in_motion = True * * cdef void _update_animation_rotation_matrix(): #px/ # <<<<<<<<<<<<<< * #def _update_animation_rotation_matrix(): * cdef float angle = animation.angle / 180. * M_PI #px/ */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":169 * animation.rotation_matrix[2][2] = z*z*(1-c) + c * * cpdef set_animation_next(float increment): #px/ # <<<<<<<<<<<<<< * #def set_animation_next(increment): * animation.angle -= increment */ static PyObject *__pyx_pw_7_gldraw_9set_animation_next(PyObject *__pyx_self, PyObject *__pyx_arg_increment); /*proto*/ static PyObject *__pyx_f_7_gldraw_set_animation_next(float __pyx_v_increment, CYTHON_UNUSED int __pyx_skip_dispatch) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_animation_next", 0); /* "_gldraw.pyx":171 * cpdef set_animation_next(float increment): #px/ * #def set_animation_next(increment): * animation.angle -= increment # <<<<<<<<<<<<<< * _update_animation_rotation_matrix() * return abs(animation.angle) < animation.angle_max */ __pyx_v_7_gldraw_animation.angle = (__pyx_v_7_gldraw_animation.angle - __pyx_v_increment); /* "_gldraw.pyx":172 * #def set_animation_next(increment): * animation.angle -= increment * _update_animation_rotation_matrix() # <<<<<<<<<<<<<< * return abs(animation.angle) < animation.angle_max * */ __pyx_f_7_gldraw__update_animation_rotation_matrix(); /* "_gldraw.pyx":173 * animation.angle -= increment * _update_animation_rotation_matrix() * return abs(animation.angle) < animation.angle_max # <<<<<<<<<<<<<< * * cdef void _mult_matrix(mat4 &dest, mat4 &src1, mat4 &src2): #px/ */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyBool_FromLong((fabsf(__pyx_v_7_gldraw_animation.angle) < __pyx_v_7_gldraw_animation.angle_max)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "_gldraw.pyx":169 * animation.rotation_matrix[2][2] = z*z*(1-c) + c * * cpdef set_animation_next(float increment): #px/ # <<<<<<<<<<<<<< * #def set_animation_next(increment): * animation.angle -= increment */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.set_animation_next", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_9set_animation_next(PyObject *__pyx_self, PyObject *__pyx_arg_increment); /*proto*/ static PyObject *__pyx_pw_7_gldraw_9set_animation_next(PyObject *__pyx_self, PyObject *__pyx_arg_increment) { float __pyx_v_increment; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_animation_next (wrapper)", 0); assert(__pyx_arg_increment); { __pyx_v_increment = __pyx_PyFloat_AsFloat(__pyx_arg_increment); if (unlikely((__pyx_v_increment == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; __Pyx_AddTraceback("_gldraw.set_animation_next", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_gldraw_8set_animation_next(__pyx_self, ((float)__pyx_v_increment)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_gldraw_8set_animation_next(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_increment) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_animation_next", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_gldraw_set_animation_next(__pyx_v_increment, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.set_animation_next", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":175 * return abs(animation.angle) < animation.angle_max * * cdef void _mult_matrix(mat4 &dest, mat4 &src1, mat4 &src2): #px/ # <<<<<<<<<<<<<< * #def _mult_matrix(dest, src1, src2): * cdef int i, j, k #px+ */ static void __pyx_f_7_gldraw__mult_matrix(__pyx_t_7_gldraw_vec4 *__pyx_v_dest, __pyx_t_7_gldraw_vec4 *__pyx_v_src1, __pyx_t_7_gldraw_vec4 *__pyx_v_src2) { int __pyx_v_i; int __pyx_v_j; int __pyx_v_k; float __pyx_v_sum_; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; __Pyx_RefNannySetupContext("_mult_matrix", 0); /* "_gldraw.pyx":179 * cdef int i, j, k #px+ * cdef float sum_ #px+ * for j in range(4): # <<<<<<<<<<<<<< * for i in range(4): * sum_ = 0. */ for (__pyx_t_1 = 0; __pyx_t_1 < 4; __pyx_t_1+=1) { __pyx_v_j = __pyx_t_1; /* "_gldraw.pyx":180 * cdef float sum_ #px+ * for j in range(4): * for i in range(4): # <<<<<<<<<<<<<< * sum_ = 0. * for k in range(4): */ for (__pyx_t_2 = 0; __pyx_t_2 < 4; __pyx_t_2+=1) { __pyx_v_i = __pyx_t_2; /* "_gldraw.pyx":181 * for j in range(4): * for i in range(4): * sum_ = 0. # <<<<<<<<<<<<<< * for k in range(4): * sum_ += src1[k][i] * src2[j][k] */ __pyx_v_sum_ = 0.; /* "_gldraw.pyx":182 * for i in range(4): * sum_ = 0. * for k in range(4): # <<<<<<<<<<<<<< * sum_ += src1[k][i] * src2[j][k] * dest[j][i] = sum_ */ for (__pyx_t_3 = 0; __pyx_t_3 < 4; __pyx_t_3+=1) { __pyx_v_k = __pyx_t_3; /* "_gldraw.pyx":183 * sum_ = 0. * for k in range(4): * sum_ += src1[k][i] * src2[j][k] # <<<<<<<<<<<<<< * dest[j][i] = sum_ * */ __pyx_v_sum_ = (__pyx_v_sum_ + (((__pyx_v_src1[__pyx_v_k])[__pyx_v_i]) * ((__pyx_v_src2[__pyx_v_j])[__pyx_v_k]))); } /* "_gldraw.pyx":184 * for k in range(4): * sum_ += src1[k][i] * src2[j][k] * dest[j][i] = sum_ # <<<<<<<<<<<<<< * * cdef void gl_draw_cube(): #pxd/ */ ((__pyx_v_dest[__pyx_v_j])[__pyx_v_i]) = __pyx_v_sum_; } } /* "_gldraw.pyx":175 * return abs(animation.angle) < animation.angle_max * * cdef void _mult_matrix(mat4 &dest, mat4 &src1, mat4 &src2): #px/ # <<<<<<<<<<<<<< * #def _mult_matrix(dest, src1, src2): * cdef int i, j, k #px+ */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":186 * dest[j][i] = sum_ * * cdef void gl_draw_cube(): #pxd/ # <<<<<<<<<<<<<< * #def gl_draw_cube(): * cdef unsigned int i #px+ */ static void __pyx_f_7_gldraw_gl_draw_cube(void) { unsigned int __pyx_v_i; __pyx_t_7_gldraw_mat4 __pyx_v_object_matrix; __Pyx_RefNannyDeclarations unsigned int __pyx_t_1; unsigned int __pyx_t_2; int __pyx_t_3; __Pyx_RefNannySetupContext("gl_draw_cube", 0); /* "_gldraw.pyx":191 * cdef mat4 object_matrix #px/ * #object_matrix = mat4() * for i in range(cube.number_blocks): # <<<<<<<<<<<<<< * if cube.blocks[i].in_motion: * _mult_matrix(object_matrix, animation.rotation_matrix, cube.blocks[i].transformation) */ __pyx_t_1 = __pyx_v_7_gldraw_cube.number_blocks; for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { __pyx_v_i = __pyx_t_2; /* "_gldraw.pyx":192 * #object_matrix = mat4() * for i in range(cube.number_blocks): * if cube.blocks[i].in_motion: # <<<<<<<<<<<<<< * _mult_matrix(object_matrix, animation.rotation_matrix, cube.blocks[i].transformation) * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ */ __pyx_t_3 = ((__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).in_motion != 0); if (__pyx_t_3) { /* "_gldraw.pyx":193 * for i in range(cube.number_blocks): * if cube.blocks[i].in_motion: * _mult_matrix(object_matrix, animation.rotation_matrix, cube.blocks[i].transformation) # <<<<<<<<<<<<<< * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ * #glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) */ __pyx_f_7_gldraw__mult_matrix(__pyx_v_object_matrix, __pyx_v_7_gldraw_animation.rotation_matrix, (__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).transformation); /* "_gldraw.pyx":194 * if cube.blocks[i].in_motion: * _mult_matrix(object_matrix, animation.rotation_matrix, cube.blocks[i].transformation) * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ # <<<<<<<<<<<<<< * #glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * else: */ glUniformMatrix4fv(__pyx_v_7_gldraw_cube.object_location, 1, GL_FALSE, (&((__pyx_v_object_matrix[0])[0]))); goto __pyx_L5; } /*else*/ { /* "_gldraw.pyx":197 * #glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * else: * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &cube.blocks[i].transformation[0][0]) #px/ # <<<<<<<<<<<<<< * #glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, cube.blocks[i].transformation) * glDrawArrays(GL_TRIANGLES, cube.blocks[i].idx_triangles, cube.blocks[i].cnt_triangles) */ glUniformMatrix4fv(__pyx_v_7_gldraw_cube.object_location, 1, GL_FALSE, (&(((__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).transformation[0])[0]))); } __pyx_L5:; /* "_gldraw.pyx":199 * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &cube.blocks[i].transformation[0][0]) #px/ * #glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, cube.blocks[i].transformation) * glDrawArrays(GL_TRIANGLES, cube.blocks[i].idx_triangles, cube.blocks[i].cnt_triangles) # <<<<<<<<<<<<<< * * cdef void gl_pick_cube(): #pxd/ */ glDrawArrays(GL_TRIANGLES, (__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).idx_triangles, (__pyx_v_7_gldraw_cube.blocks[__pyx_v_i]).cnt_triangles); } /* "_gldraw.pyx":186 * dest[j][i] = sum_ * * cdef void gl_draw_cube(): #pxd/ # <<<<<<<<<<<<<< * #def gl_draw_cube(): * cdef unsigned int i #px+ */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":201 * glDrawArrays(GL_TRIANGLES, cube.blocks[i].idx_triangles, cube.blocks[i].cnt_triangles) * * cdef void gl_pick_cube(): #pxd/ # <<<<<<<<<<<<<< * #def gl_pick_cube(): * glDrawArrays(GL_TRIANGLES, 0, cube.cnt_pick) */ static void __pyx_f_7_gldraw_gl_pick_cube(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_pick_cube", 0); /* "_gldraw.pyx":203 * cdef void gl_pick_cube(): #pxd/ * #def gl_pick_cube(): * glDrawArrays(GL_TRIANGLES, 0, cube.cnt_pick) # <<<<<<<<<<<<<< * * cdef void gl_init_buffers(): #pxd/ */ glDrawArrays(GL_TRIANGLES, 0, __pyx_v_7_gldraw_cube.cnt_pick); /* "_gldraw.pyx":201 * glDrawArrays(GL_TRIANGLES, cube.blocks[i].idx_triangles, cube.blocks[i].cnt_triangles) * * cdef void gl_pick_cube(): #pxd/ # <<<<<<<<<<<<<< * #def gl_pick_cube(): * glDrawArrays(GL_TRIANGLES, 0, cube.cnt_pick) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":205 * glDrawArrays(GL_TRIANGLES, 0, cube.cnt_pick) * * cdef void gl_init_buffers(): #pxd/ # <<<<<<<<<<<<<< * #def gl_init_buffers(): * glGenBuffers(1, &cube.glbuffer) #px/ */ static void __pyx_f_7_gldraw_gl_init_buffers(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_init_buffers", 0); /* "_gldraw.pyx":207 * cdef void gl_init_buffers(): #pxd/ * #def gl_init_buffers(): * glGenBuffers(1, &cube.glbuffer) #px/ # <<<<<<<<<<<<<< * #cube.glbuffer = glGenBuffers(1) * */ glGenBuffers(1, (&__pyx_v_7_gldraw_cube.glbuffer)); /* "_gldraw.pyx":205 * glDrawArrays(GL_TRIANGLES, 0, cube.cnt_pick) * * cdef void gl_init_buffers(): #pxd/ # <<<<<<<<<<<<<< * #def gl_init_buffers(): * glGenBuffers(1, &cube.glbuffer) #px/ */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":210 * #cube.glbuffer = glGenBuffers(1) * * cdef void gl_delete_buffers(): #pxd/ # <<<<<<<<<<<<<< * #def gl_delete_buffers(): * glBindBuffer(GL_ARRAY_BUFFER, 0) */ static void __pyx_f_7_gldraw_gl_delete_buffers(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_delete_buffers", 0); /* "_gldraw.pyx":212 * cdef void gl_delete_buffers(): #pxd/ * #def gl_delete_buffers(): * glBindBuffer(GL_ARRAY_BUFFER, 0) # <<<<<<<<<<<<<< * glDeleteBuffers(1, &cube.glbuffer) #px/ * #glDeleteBuffers(1, [cube.glbuffer]) */ glBindBuffer(GL_ARRAY_BUFFER, 0); /* "_gldraw.pyx":213 * #def gl_delete_buffers(): * glBindBuffer(GL_ARRAY_BUFFER, 0) * glDeleteBuffers(1, &cube.glbuffer) #px/ # <<<<<<<<<<<<<< * #glDeleteBuffers(1, [cube.glbuffer]) * cube.glbuffer = 0 */ glDeleteBuffers(1, (&__pyx_v_7_gldraw_cube.glbuffer)); /* "_gldraw.pyx":215 * glDeleteBuffers(1, &cube.glbuffer) #px/ * #glDeleteBuffers(1, [cube.glbuffer]) * cube.glbuffer = 0 # <<<<<<<<<<<<<< * * cdef void _gl_set_pointer(GLuint index, GLint size, GLenum type, GLboolean normalized, long pointer): #px/ */ __pyx_v_7_gldraw_cube.glbuffer = 0; /* "_gldraw.pyx":210 * #cube.glbuffer = glGenBuffers(1) * * cdef void gl_delete_buffers(): #pxd/ # <<<<<<<<<<<<<< * #def gl_delete_buffers(): * glBindBuffer(GL_ARRAY_BUFFER, 0) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":217 * cube.glbuffer = 0 * * cdef void _gl_set_pointer(GLuint index, GLint size, GLenum type, GLboolean normalized, long pointer): #px/ # <<<<<<<<<<<<<< * #def _gl_set_pointer(index, size, type, normalized, pointer): * glVertexAttribPointer(index, size, type, normalized, 0, pointer) #px/ */ static void __pyx_f_7_gldraw__gl_set_pointer(__pyx_t_2gl_GLuint __pyx_v_index, __pyx_t_2gl_GLint __pyx_v_size, __pyx_t_2gl_GLenum __pyx_v_type, __pyx_t_2gl_GLboolean __pyx_v_normalized, long __pyx_v_pointer) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_gl_set_pointer", 0); /* "_gldraw.pyx":219 * cdef void _gl_set_pointer(GLuint index, GLint size, GLenum type, GLboolean normalized, long pointer): #px/ * #def _gl_set_pointer(index, size, type, normalized, pointer): * glVertexAttribPointer(index, size, type, normalized, 0, pointer) #px/ # <<<<<<<<<<<<<< * #glVertexAttribPointer(index, size, type, normalized, 0, ctypes.cast(pointer, ctypes.c_void_p)) * glEnableVertexAttribArray(index) */ glVertexAttribPointer(__pyx_v_index, __pyx_v_size, __pyx_v_type, __pyx_v_normalized, 0, ((void *)__pyx_v_pointer)); /* "_gldraw.pyx":221 * glVertexAttribPointer(index, size, type, normalized, 0, pointer) #px/ * #glVertexAttribPointer(index, size, type, normalized, 0, ctypes.cast(pointer, ctypes.c_void_p)) * glEnableVertexAttribArray(index) # <<<<<<<<<<<<<< * * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, transformations): #px/ */ glEnableVertexAttribArray(__pyx_v_index); /* "_gldraw.pyx":217 * cube.glbuffer = 0 * * cdef void _gl_set_pointer(GLuint index, GLint size, GLenum type, GLboolean normalized, long pointer): #px/ # <<<<<<<<<<<<<< * #def _gl_set_pointer(index, size, type, normalized, pointer): * glVertexAttribPointer(index, size, type, normalized, 0, pointer) #px/ */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":223 * glEnableVertexAttribArray(index) * * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, transformations): #px/ # <<<<<<<<<<<<<< * #def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, transformations): * assert nblocks <= MAX_BLOCKS, '{} blocks, hardcoded limit is {}'.format( */ static PyObject *__pyx_pw_7_gldraw_11gl_set_data(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7_gldraw_gl_set_data(int __pyx_v_nblocks, PyObject *__pyx_v_vertexdata, PyObject *__pyx_v_vertexpointers, PyObject *__pyx_v_vertexinfo, PyObject *__pyx_v_transformations, CYTHON_UNUSED int __pyx_skip_dispatch) { long __pyx_v_normalpointer; long __pyx_v_colorpointer; long __pyx_v_texpospointer; long __pyx_v_barycpointer; unsigned int __pyx_v_idx_debug; unsigned int __pyx_v_cnt_pick; PyObject *__pyx_v_pickvertpointer = NULL; PyObject *__pyx_v_pickcolorpointer = NULL; PyObject *__pyx_v_cnts_block = NULL; unsigned int __pyx_v_idx_block; unsigned int __pyx_v_idx; unsigned int __pyx_v_i; unsigned int __pyx_v_j; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; Py_ssize_t __pyx_t_6; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *(*__pyx_t_9)(PyObject *); long __pyx_t_10; long __pyx_t_11; long __pyx_t_12; long __pyx_t_13; unsigned int __pyx_t_14; unsigned int __pyx_t_15; int __pyx_t_16; unsigned int __pyx_t_17; char *__pyx_t_18; Py_ssize_t __pyx_t_19; double __pyx_t_20; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_set_data", 0); /* "_gldraw.pyx":225 * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, transformations): #px/ * #def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, transformations): * assert nblocks <= MAX_BLOCKS, '{} blocks, hardcoded limit is {}'.format( # <<<<<<<<<<<<<< * nblocks, MAX_BLOCKS) * cube.number_blocks = nblocks */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!Py_OptimizeFlag)) { if (unlikely(!((__pyx_v_nblocks <= __pyx_e_7_gldraw_MAX_BLOCKS) != 0))) { __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_blocks_hardcoded_limit_is, __pyx_n_s_format); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); /* "_gldraw.pyx":226 * #def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, transformations): * assert nblocks <= MAX_BLOCKS, '{} blocks, hardcoded limit is {}'.format( * nblocks, MAX_BLOCKS) # <<<<<<<<<<<<<< * cube.number_blocks = nblocks * */ __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_nblocks); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_e_7_gldraw_MAX_BLOCKS); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; __pyx_t_6 = 0; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_6 = 1; } } __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); if (__pyx_t_5) { PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL; } PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":225 * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, transformations): #px/ * #def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, transformations): * assert nblocks <= MAX_BLOCKS, '{} blocks, hardcoded limit is {}'.format( # <<<<<<<<<<<<<< * nblocks, MAX_BLOCKS) * cube.number_blocks = nblocks */ __pyx_t_2 = PyTuple_Pack(1, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; PyErr_SetObject(PyExc_AssertionError, __pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif /* "_gldraw.pyx":227 * assert nblocks <= MAX_BLOCKS, '{} blocks, hardcoded limit is {}'.format( * nblocks, MAX_BLOCKS) * cube.number_blocks = nblocks # <<<<<<<<<<<<<< * * #### Create the raw GL data #### */ __pyx_v_7_gldraw_cube.number_blocks = __pyx_v_nblocks; /* "_gldraw.pyx":232 * cdef long normalpointer, colorpointer, texpospointer, barycpointer #px+ * cdef unsigned int idx_debug, cnt_pick #px+ * normalpointer, colorpointer, texpospointer, barycpointer, pickvertpointer, pickcolorpointer = vertexpointers # <<<<<<<<<<<<<< * cnts_block, idx_debug, cnt_pick = vertexinfo * */ if ((likely(PyTuple_CheckExact(__pyx_v_vertexpointers))) || (PyList_CheckExact(__pyx_v_vertexpointers))) { PyObject* sequence = __pyx_v_vertexpointers; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 6)) { if (size > 6) __Pyx_RaiseTooManyValuesError(6); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 3); __pyx_t_3 = PyTuple_GET_ITEM(sequence, 4); __pyx_t_5 = PyTuple_GET_ITEM(sequence, 5); } else { __pyx_t_2 = PyList_GET_ITEM(sequence, 0); __pyx_t_1 = PyList_GET_ITEM(sequence, 1); __pyx_t_7 = PyList_GET_ITEM(sequence, 2); __pyx_t_4 = PyList_GET_ITEM(sequence, 3); __pyx_t_3 = PyList_GET_ITEM(sequence, 4); __pyx_t_5 = PyList_GET_ITEM(sequence, 5); } __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_5); #else { Py_ssize_t i; PyObject** temps[6] = {&__pyx_t_2,&__pyx_t_1,&__pyx_t_7,&__pyx_t_4,&__pyx_t_3,&__pyx_t_5}; for (i=0; i < 6; i++) { PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(item); *(temps[i]) = item; } } #endif } else { Py_ssize_t index = -1; PyObject** temps[6] = {&__pyx_t_2,&__pyx_t_1,&__pyx_t_7,&__pyx_t_4,&__pyx_t_3,&__pyx_t_5}; __pyx_t_8 = PyObject_GetIter(__pyx_v_vertexpointers); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext; for (index=0; index < 6; index++) { PyObject* item = __pyx_t_9(__pyx_t_8); if (unlikely(!item)) goto __pyx_L3_unpacking_failed; __Pyx_GOTREF(item); *(temps[index]) = item; } if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_9 = NULL; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; goto __pyx_L4_unpacking_done; __pyx_L3_unpacking_failed:; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_9 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L4_unpacking_done:; } __pyx_t_10 = __Pyx_PyInt_As_long(__pyx_t_2); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_11 = __Pyx_PyInt_As_long(__pyx_t_1); if (unlikely((__pyx_t_11 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_12 = __Pyx_PyInt_As_long(__pyx_t_7); if (unlikely((__pyx_t_12 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_13 = __Pyx_PyInt_As_long(__pyx_t_4); if (unlikely((__pyx_t_13 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_normalpointer = __pyx_t_10; __pyx_v_colorpointer = __pyx_t_11; __pyx_v_texpospointer = __pyx_t_12; __pyx_v_barycpointer = __pyx_t_13; __pyx_v_pickvertpointer = __pyx_t_3; __pyx_t_3 = 0; __pyx_v_pickcolorpointer = __pyx_t_5; __pyx_t_5 = 0; /* "_gldraw.pyx":233 * cdef unsigned int idx_debug, cnt_pick #px+ * normalpointer, colorpointer, texpospointer, barycpointer, pickvertpointer, pickcolorpointer = vertexpointers * cnts_block, idx_debug, cnt_pick = vertexinfo # <<<<<<<<<<<<<< * * cdef unsigned int idx_block, idx, i, j #px+ */ if ((likely(PyTuple_CheckExact(__pyx_v_vertexinfo))) || (PyList_CheckExact(__pyx_v_vertexinfo))) { PyObject* sequence = __pyx_v_vertexinfo; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 3)) { if (size > 3) __Pyx_RaiseTooManyValuesError(3); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON if (likely(PyTuple_CheckExact(sequence))) { __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); } else { __pyx_t_5 = PyList_GET_ITEM(sequence, 0); __pyx_t_3 = PyList_GET_ITEM(sequence, 1); __pyx_t_4 = PyList_GET_ITEM(sequence, 2); } __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); #else __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); #endif } else { Py_ssize_t index = -1; __pyx_t_7 = PyObject_GetIter(__pyx_v_vertexinfo); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext; index = 0; __pyx_t_5 = __pyx_t_9(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_5); index = 1; __pyx_t_3 = __pyx_t_9(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_3); index = 2; __pyx_t_4 = __pyx_t_9(__pyx_t_7); if (unlikely(!__pyx_t_4)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_7), 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_9 = NULL; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; goto __pyx_L6_unpacking_done; __pyx_L5_unpacking_failed:; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_9 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L6_unpacking_done:; } __pyx_t_14 = __Pyx_PyInt_As_unsigned_int(__pyx_t_3); if (unlikely((__pyx_t_14 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_15 = __Pyx_PyInt_As_unsigned_int(__pyx_t_4); if (unlikely((__pyx_t_15 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_cnts_block = __pyx_t_5; __pyx_t_5 = 0; __pyx_v_idx_debug = __pyx_t_14; __pyx_v_cnt_pick = __pyx_t_15; /* "_gldraw.pyx":236 * * cdef unsigned int idx_block, idx, i, j #px+ * idx_block = 0 # <<<<<<<<<<<<<< * * for idx in range(cube.number_blocks): */ __pyx_v_idx_block = 0; /* "_gldraw.pyx":238 * idx_block = 0 * * for idx in range(cube.number_blocks): # <<<<<<<<<<<<<< * cube.blocks[idx].idx_triangles = idx_block * cube.blocks[idx].cnt_triangles = cnts_block[idx] */ __pyx_t_15 = __pyx_v_7_gldraw_cube.number_blocks; for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_15; __pyx_t_14+=1) { __pyx_v_idx = __pyx_t_14; /* "_gldraw.pyx":239 * * for idx in range(cube.number_blocks): * cube.blocks[idx].idx_triangles = idx_block # <<<<<<<<<<<<<< * cube.blocks[idx].cnt_triangles = cnts_block[idx] * idx_block += cnts_block[idx] */ (__pyx_v_7_gldraw_cube.blocks[__pyx_v_idx]).idx_triangles = __pyx_v_idx_block; /* "_gldraw.pyx":240 * for idx in range(cube.number_blocks): * cube.blocks[idx].idx_triangles = idx_block * cube.blocks[idx].cnt_triangles = cnts_block[idx] # <<<<<<<<<<<<<< * idx_block += cnts_block[idx] * */ __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_cnts_block, __pyx_v_idx, unsigned int, 0, __Pyx_PyInt_From_unsigned_int, 0, 0, 1); if (unlikely(__pyx_t_4 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_4); __pyx_t_16 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_16 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 240; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; (__pyx_v_7_gldraw_cube.blocks[__pyx_v_idx]).cnt_triangles = __pyx_t_16; /* "_gldraw.pyx":241 * cube.blocks[idx].idx_triangles = idx_block * cube.blocks[idx].cnt_triangles = cnts_block[idx] * idx_block += cnts_block[idx] # <<<<<<<<<<<<<< * * cube.cnt_pick = cnt_pick */ __pyx_t_4 = __Pyx_PyInt_From_unsigned_int(__pyx_v_idx_block); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_cnts_block, __pyx_v_idx, unsigned int, 0, __Pyx_PyInt_From_unsigned_int, 0, 0, 1); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyNumber_InPlaceAdd(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_17 = __Pyx_PyInt_As_unsigned_int(__pyx_t_5); if (unlikely((__pyx_t_17 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_idx_block = __pyx_t_17; } /* "_gldraw.pyx":243 * idx_block += cnts_block[idx] * * cube.cnt_pick = cnt_pick # <<<<<<<<<<<<<< * cube.idx_debug = idx_debug * */ __pyx_v_7_gldraw_cube.cnt_pick = __pyx_v_cnt_pick; /* "_gldraw.pyx":244 * * cube.cnt_pick = cnt_pick * cube.idx_debug = idx_debug # <<<<<<<<<<<<<< * * glBindBuffer(GL_ARRAY_BUFFER, cube.glbuffer) */ __pyx_v_7_gldraw_cube.idx_debug = __pyx_v_idx_debug; /* "_gldraw.pyx":246 * cube.idx_debug = idx_debug * * glBindBuffer(GL_ARRAY_BUFFER, cube.glbuffer) # <<<<<<<<<<<<<< * glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) #px/ * #glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) */ glBindBuffer(GL_ARRAY_BUFFER, __pyx_v_7_gldraw_cube.glbuffer); /* "_gldraw.pyx":247 * * glBindBuffer(GL_ARRAY_BUFFER, cube.glbuffer) * glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) #px/ # <<<<<<<<<<<<<< * #glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) * */ if (unlikely(__pyx_v_vertexdata == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_6 = PyBytes_GET_SIZE(__pyx_v_vertexdata); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_18 = __Pyx_PyObject_AsString(__pyx_v_vertexdata); if (unlikely((!__pyx_t_18) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} glBufferData(GL_ARRAY_BUFFER, __pyx_t_6, ((char *)__pyx_t_18), GL_STATIC_DRAW); /* "_gldraw.pyx":250 * #glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) * * _gl_set_pointer(ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0) # <<<<<<<<<<<<<< * _gl_set_pointer(ATTRIB_LOCATION+1, 3, GL_FLOAT, GL_FALSE, normalpointer) * _gl_set_pointer(ATTRIB_LOCATION+2, 3, GL_UNSIGNED_BYTE, GL_TRUE, colorpointer) */ __pyx_f_7_gldraw__gl_set_pointer(__pyx_e_7_gldraw_ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0); /* "_gldraw.pyx":251 * * _gl_set_pointer(ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0) * _gl_set_pointer(ATTRIB_LOCATION+1, 3, GL_FLOAT, GL_FALSE, normalpointer) # <<<<<<<<<<<<<< * _gl_set_pointer(ATTRIB_LOCATION+2, 3, GL_UNSIGNED_BYTE, GL_TRUE, colorpointer) * _gl_set_pointer(ATTRIB_LOCATION+3, 2, GL_FLOAT, GL_FALSE, texpospointer) */ __pyx_f_7_gldraw__gl_set_pointer((__pyx_e_7_gldraw_ATTRIB_LOCATION + 1), 3, GL_FLOAT, GL_FALSE, __pyx_v_normalpointer); /* "_gldraw.pyx":252 * _gl_set_pointer(ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0) * _gl_set_pointer(ATTRIB_LOCATION+1, 3, GL_FLOAT, GL_FALSE, normalpointer) * _gl_set_pointer(ATTRIB_LOCATION+2, 3, GL_UNSIGNED_BYTE, GL_TRUE, colorpointer) # <<<<<<<<<<<<<< * _gl_set_pointer(ATTRIB_LOCATION+3, 2, GL_FLOAT, GL_FALSE, texpospointer) * _gl_set_pointer(ATTRIB_LOCATION+4, 3, GL_FLOAT, GL_FALSE, barycpointer) */ __pyx_f_7_gldraw__gl_set_pointer((__pyx_e_7_gldraw_ATTRIB_LOCATION + 2), 3, GL_UNSIGNED_BYTE, GL_TRUE, __pyx_v_colorpointer); /* "_gldraw.pyx":253 * _gl_set_pointer(ATTRIB_LOCATION+1, 3, GL_FLOAT, GL_FALSE, normalpointer) * _gl_set_pointer(ATTRIB_LOCATION+2, 3, GL_UNSIGNED_BYTE, GL_TRUE, colorpointer) * _gl_set_pointer(ATTRIB_LOCATION+3, 2, GL_FLOAT, GL_FALSE, texpospointer) # <<<<<<<<<<<<<< * _gl_set_pointer(ATTRIB_LOCATION+4, 3, GL_FLOAT, GL_FALSE, barycpointer) * _gl_set_pointer(PICKATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, pickvertpointer) */ __pyx_f_7_gldraw__gl_set_pointer((__pyx_e_7_gldraw_ATTRIB_LOCATION + 3), 2, GL_FLOAT, GL_FALSE, __pyx_v_texpospointer); /* "_gldraw.pyx":254 * _gl_set_pointer(ATTRIB_LOCATION+2, 3, GL_UNSIGNED_BYTE, GL_TRUE, colorpointer) * _gl_set_pointer(ATTRIB_LOCATION+3, 2, GL_FLOAT, GL_FALSE, texpospointer) * _gl_set_pointer(ATTRIB_LOCATION+4, 3, GL_FLOAT, GL_FALSE, barycpointer) # <<<<<<<<<<<<<< * _gl_set_pointer(PICKATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, pickvertpointer) * _gl_set_pointer(PICKATTRIB_LOCATION+1, 3, GL_UNSIGNED_BYTE, GL_TRUE, pickcolorpointer) */ __pyx_f_7_gldraw__gl_set_pointer((__pyx_e_7_gldraw_ATTRIB_LOCATION + 4), 3, GL_FLOAT, GL_FALSE, __pyx_v_barycpointer); /* "_gldraw.pyx":255 * _gl_set_pointer(ATTRIB_LOCATION+3, 2, GL_FLOAT, GL_FALSE, texpospointer) * _gl_set_pointer(ATTRIB_LOCATION+4, 3, GL_FLOAT, GL_FALSE, barycpointer) * _gl_set_pointer(PICKATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, pickvertpointer) # <<<<<<<<<<<<<< * _gl_set_pointer(PICKATTRIB_LOCATION+1, 3, GL_UNSIGNED_BYTE, GL_TRUE, pickcolorpointer) * */ __pyx_t_13 = __Pyx_PyInt_As_long(__pyx_v_pickvertpointer); if (unlikely((__pyx_t_13 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 255; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_f_7_gldraw__gl_set_pointer(__pyx_e_7_gldraw_PICKATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, __pyx_t_13); /* "_gldraw.pyx":256 * _gl_set_pointer(ATTRIB_LOCATION+4, 3, GL_FLOAT, GL_FALSE, barycpointer) * _gl_set_pointer(PICKATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, pickvertpointer) * _gl_set_pointer(PICKATTRIB_LOCATION+1, 3, GL_UNSIGNED_BYTE, GL_TRUE, pickcolorpointer) # <<<<<<<<<<<<<< * * assert len(transformations) <= MAX_TRANSFORMATIONS, '{} transformations, hardcoded limit is {}'.format( */ __pyx_t_13 = __Pyx_PyInt_As_long(__pyx_v_pickcolorpointer); if (unlikely((__pyx_t_13 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_f_7_gldraw__gl_set_pointer((__pyx_e_7_gldraw_PICKATTRIB_LOCATION + 1), 3, GL_UNSIGNED_BYTE, GL_TRUE, __pyx_t_13); /* "_gldraw.pyx":258 * _gl_set_pointer(PICKATTRIB_LOCATION+1, 3, GL_UNSIGNED_BYTE, GL_TRUE, pickcolorpointer) * * assert len(transformations) <= MAX_TRANSFORMATIONS, '{} transformations, hardcoded limit is {}'.format( # <<<<<<<<<<<<<< * len(transformations), MAX_TRANSFORMATIONS) * for idx in range(len(transformations)): */ #ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!Py_OptimizeFlag)) { __pyx_t_6 = PyObject_Length(__pyx_v_transformations); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!((__pyx_t_6 <= __pyx_e_7_gldraw_MAX_TRANSFORMATIONS) != 0))) { __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_transformations_hardcoded_limit, __pyx_n_s_format); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); /* "_gldraw.pyx":259 * * assert len(transformations) <= MAX_TRANSFORMATIONS, '{} transformations, hardcoded limit is {}'.format( * len(transformations), MAX_TRANSFORMATIONS) # <<<<<<<<<<<<<< * for idx in range(len(transformations)): * for i in range(4): */ __pyx_t_19 = PyObject_Length(__pyx_v_transformations); if (unlikely(__pyx_t_19 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = PyInt_FromSsize_t(__pyx_t_19); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_e_7_gldraw_MAX_TRANSFORMATIONS); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_1 = NULL; __pyx_t_19 = 0; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); __pyx_t_19 = 1; } } __pyx_t_2 = PyTuple_New(2+__pyx_t_19); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (__pyx_t_1) { PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = NULL; } PyTuple_SET_ITEM(__pyx_t_2, 0+__pyx_t_19, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_2, 1+__pyx_t_19, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_4 = 0; __pyx_t_7 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_gldraw.pyx":258 * _gl_set_pointer(PICKATTRIB_LOCATION+1, 3, GL_UNSIGNED_BYTE, GL_TRUE, pickcolorpointer) * * assert len(transformations) <= MAX_TRANSFORMATIONS, '{} transformations, hardcoded limit is {}'.format( # <<<<<<<<<<<<<< * len(transformations), MAX_TRANSFORMATIONS) * for idx in range(len(transformations)): */ __pyx_t_3 = PyTuple_Pack(1, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; PyErr_SetObject(PyExc_AssertionError, __pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif /* "_gldraw.pyx":260 * assert len(transformations) <= MAX_TRANSFORMATIONS, '{} transformations, hardcoded limit is {}'.format( * len(transformations), MAX_TRANSFORMATIONS) * for idx in range(len(transformations)): # <<<<<<<<<<<<<< * for i in range(4): * for j in range(4): */ __pyx_t_6 = PyObject_Length(__pyx_v_transformations); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_6; __pyx_t_15+=1) { __pyx_v_idx = __pyx_t_15; /* "_gldraw.pyx":261 * len(transformations), MAX_TRANSFORMATIONS) * for idx in range(len(transformations)): * for i in range(4): # <<<<<<<<<<<<<< * for j in range(4): * cube.transformations[idx][i][j] = float(transformations[idx][i][j]) */ for (__pyx_t_14 = 0; __pyx_t_14 < 4; __pyx_t_14+=1) { __pyx_v_i = __pyx_t_14; /* "_gldraw.pyx":262 * for idx in range(len(transformations)): * for i in range(4): * for j in range(4): # <<<<<<<<<<<<<< * cube.transformations[idx][i][j] = float(transformations[idx][i][j]) * */ for (__pyx_t_17 = 0; __pyx_t_17 < 4; __pyx_t_17+=1) { __pyx_v_j = __pyx_t_17; /* "_gldraw.pyx":263 * for i in range(4): * for j in range(4): * cube.transformations[idx][i][j] = float(transformations[idx][i][j]) # <<<<<<<<<<<<<< * * cdef void gl_draw_cube_debug(): #pxd/ */ __pyx_t_3 = __Pyx_GetItemInt(__pyx_v_transformations, __pyx_v_idx, unsigned int, 0, __Pyx_PyInt_From_unsigned_int, 0, 0, 1); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_3, __pyx_v_i, unsigned int, 0, __Pyx_PyInt_From_unsigned_int, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_5, __pyx_v_j, unsigned int, 0, __Pyx_PyInt_From_unsigned_int, 0, 0, 1); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_20 = __Pyx_PyObject_AsDouble(__pyx_t_3); if (unlikely(__pyx_t_20 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; (((__pyx_v_7_gldraw_cube.transformations[__pyx_v_idx])[__pyx_v_i])[__pyx_v_j]) = __pyx_t_20; } } } /* "_gldraw.pyx":223 * glEnableVertexAttribArray(index) * * cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, transformations): #px/ # <<<<<<<<<<<<<< * #def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, transformations): * assert nblocks <= MAX_BLOCKS, '{} blocks, hardcoded limit is {}'.format( */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("_gldraw.gl_set_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_pickvertpointer); __Pyx_XDECREF(__pyx_v_pickcolorpointer); __Pyx_XDECREF(__pyx_v_cnts_block); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_gldraw_11gl_set_data(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7_gldraw_11gl_set_data(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { int __pyx_v_nblocks; PyObject *__pyx_v_vertexdata = 0; PyObject *__pyx_v_vertexpointers = 0; PyObject *__pyx_v_vertexinfo = 0; PyObject *__pyx_v_transformations = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_set_data (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_nblocks,&__pyx_n_s_vertexdata,&__pyx_n_s_vertexpointers,&__pyx_n_s_vertexinfo,&__pyx_n_s_transformations,0}; PyObject* values[5] = {0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_nblocks)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_vertexdata)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_vertexpointers)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_vertexinfo)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_transformations)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_set_data") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 5) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); } __pyx_v_nblocks = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_nblocks == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_vertexdata = ((PyObject*)values[1]); __pyx_v_vertexpointers = values[2]; __pyx_v_vertexinfo = values[3]; __pyx_v_transformations = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_set_data", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_gldraw.gl_set_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertexdata), (&PyBytes_Type), 1, "vertexdata", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_gldraw_10gl_set_data(__pyx_self, __pyx_v_nblocks, __pyx_v_vertexdata, __pyx_v_vertexpointers, __pyx_v_vertexinfo, __pyx_v_transformations); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_gldraw_10gl_set_data(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_nblocks, PyObject *__pyx_v_vertexdata, PyObject *__pyx_v_vertexpointers, PyObject *__pyx_v_vertexinfo, PyObject *__pyx_v_transformations) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_set_data", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_gldraw_gl_set_data(__pyx_v_nblocks, __pyx_v_vertexdata, __pyx_v_vertexpointers, __pyx_v_vertexinfo, __pyx_v_transformations, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_gldraw.gl_set_data", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_gldraw.pyx":265 * cube.transformations[idx][i][j] = float(transformations[idx][i][j]) * * cdef void gl_draw_cube_debug(): #pxd/ # <<<<<<<<<<<<<< * #def gl_draw_cube_debug(): * cdef mat4 object_matrix #px/ */ static void __pyx_f_7_gldraw_gl_draw_cube_debug(void) { __pyx_t_7_gldraw_mat4 __pyx_v_object_matrix; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_draw_cube_debug", 0); /* "_gldraw.pyx":269 * cdef mat4 object_matrix #px/ * #object_matrix = mat4() * matrix_set_identity(object_matrix) # <<<<<<<<<<<<<< * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ * #glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) */ __pyx_t_1 = __pyx_f_7_gldraw_matrix_set_identity(__pyx_v_object_matrix); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_gldraw.pyx":270 * #object_matrix = mat4() * matrix_set_identity(object_matrix) * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ # <<<<<<<<<<<<<< * #glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * glDrawArrays(GL_LINES, cube.idx_debug, 6) */ glUniformMatrix4fv(__pyx_v_7_gldraw_cube.object_location, 1, GL_FALSE, (&((__pyx_v_object_matrix[0])[0]))); /* "_gldraw.pyx":272 * glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) #px/ * #glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) * glDrawArrays(GL_LINES, cube.idx_debug, 6) # <<<<<<<<<<<<<< * * cdef void gl_draw_select_debug(GLfloat *selectdata, GLsizeiptr size, GLuint prog_hud): #pxd/ */ glDrawArrays(GL_LINES, __pyx_v_7_gldraw_cube.idx_debug, 6); /* "_gldraw.pyx":265 * cube.transformations[idx][i][j] = float(transformations[idx][i][j]) * * cdef void gl_draw_cube_debug(): #pxd/ # <<<<<<<<<<<<<< * #def gl_draw_cube_debug(): * cdef mat4 object_matrix #px/ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_WriteUnraisable("_gldraw.gl_draw_cube_debug", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":274 * glDrawArrays(GL_LINES, cube.idx_debug, 6) * * cdef void gl_draw_select_debug(GLfloat *selectdata, GLsizeiptr size, GLuint prog_hud): #pxd/ # <<<<<<<<<<<<<< * #def gl_draw_select_debug(selectdata, size, prog_hud): * cdef int i, j #px+ */ static void __pyx_f_7_gldraw_gl_draw_select_debug(__pyx_t_2gl_GLfloat *__pyx_v_selectdata, __pyx_t_2gl_GLsizeiptr __pyx_v_size, __pyx_t_2gl_GLuint __pyx_v_prog_hud) { __pyx_t_2gl_GLintptr __pyx_v_offset; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_draw_select_debug", 0); /* "_gldraw.pyx":278 * cdef int i, j #px+ * cdef GLintptr offset #px+ * offset = (cube.idx_debug+6) * 3 * sizeof(GLfloat) # <<<<<<<<<<<<<< * glBufferSubData(GL_ARRAY_BUFFER, offset, size, &selectdata[0]) #px/ * #glBufferSubData(GL_ARRAY_BUFFER, offset, len(selectdata) * sizeof(GLfloat), ArrayDatatype.asArray(selectdata, GL_FLOAT)) */ __pyx_v_offset = (((__pyx_v_7_gldraw_cube.idx_debug + 6) * 3) * (sizeof(__pyx_t_2gl_GLfloat))); /* "_gldraw.pyx":279 * cdef GLintptr offset #px+ * offset = (cube.idx_debug+6) * 3 * sizeof(GLfloat) * glBufferSubData(GL_ARRAY_BUFFER, offset, size, &selectdata[0]) #px/ # <<<<<<<<<<<<<< * #glBufferSubData(GL_ARRAY_BUFFER, offset, len(selectdata) * sizeof(GLfloat), ArrayDatatype.asArray(selectdata, GL_FLOAT)) * */ glBufferSubData(GL_ARRAY_BUFFER, __pyx_v_offset, __pyx_v_size, (&(__pyx_v_selectdata[0]))); /* "_gldraw.pyx":282 * #glBufferSubData(GL_ARRAY_BUFFER, offset, len(selectdata) * sizeof(GLfloat), ArrayDatatype.asArray(selectdata, GL_FLOAT)) * * glDisable(GL_DEPTH_TEST) # <<<<<<<<<<<<<< * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) * glUseProgram(prog_hud) */ glDisable(GL_DEPTH_TEST); /* "_gldraw.pyx":283 * * glDisable(GL_DEPTH_TEST) * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) # <<<<<<<<<<<<<< * glUseProgram(prog_hud) * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) */ glDrawArrays(GL_LINES, (__pyx_v_7_gldraw_cube.idx_debug + 6), 2); /* "_gldraw.pyx":284 * glDisable(GL_DEPTH_TEST) * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) * glUseProgram(prog_hud) # <<<<<<<<<<<<<< * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) * glEnable(GL_DEPTH_TEST) */ glUseProgram(__pyx_v_prog_hud); /* "_gldraw.pyx":285 * glDrawArrays(GL_LINES, cube.idx_debug+6, 2) * glUseProgram(prog_hud) * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) # <<<<<<<<<<<<<< * glEnable(GL_DEPTH_TEST) * */ glDrawArrays(GL_POINTS, ((__pyx_v_7_gldraw_cube.idx_debug + 6) + 2), 2); /* "_gldraw.pyx":286 * glUseProgram(prog_hud) * glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) * glEnable(GL_DEPTH_TEST) # <<<<<<<<<<<<<< * * cdef void gl_init_object_location(GLuint location): #pxd/ */ glEnable(GL_DEPTH_TEST); /* "_gldraw.pyx":274 * glDrawArrays(GL_LINES, cube.idx_debug, 6) * * cdef void gl_draw_select_debug(GLfloat *selectdata, GLsizeiptr size, GLuint prog_hud): #pxd/ # <<<<<<<<<<<<<< * #def gl_draw_select_debug(selectdata, size, prog_hud): * cdef int i, j #px+ */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_gldraw.pyx":288 * glEnable(GL_DEPTH_TEST) * * cdef void gl_init_object_location(GLuint location): #pxd/ # <<<<<<<<<<<<<< * #def gl_init_object_location(location): * cube.object_location = location */ static void __pyx_f_7_gldraw_gl_init_object_location(__pyx_t_2gl_GLuint __pyx_v_location) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_init_object_location", 0); /* "_gldraw.pyx":290 * cdef void gl_init_object_location(GLuint location): #pxd/ * #def gl_init_object_location(location): * cube.object_location = location # <<<<<<<<<<<<<< * * */ __pyx_v_7_gldraw_cube.object_location = __pyx_v_location; /* "_gldraw.pyx":288 * glEnable(GL_DEPTH_TEST) * * cdef void gl_init_object_location(GLuint location): #pxd/ # <<<<<<<<<<<<<< * #def gl_init_object_location(location): * cube.object_location = location */ /* function exit code */ __Pyx_RefNannyFinishContext(); } static PyMethodDef __pyx_methods[] = { {"gl_set_atlas_texture", (PyCFunction)__pyx_pw_7_gldraw_5gl_set_atlas_texture, METH_VARARGS|METH_KEYWORDS, 0}, {"set_animation_start", (PyCFunction)__pyx_pw_7_gldraw_7set_animation_start, METH_VARARGS|METH_KEYWORDS, 0}, {"set_animation_next", (PyCFunction)__pyx_pw_7_gldraw_9set_animation_next, METH_O, 0}, {"gl_set_data", (PyCFunction)__pyx_pw_7_gldraw_11gl_set_data, METH_VARARGS|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { #if PY_VERSION_HEX < 0x03020000 { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, #else PyModuleDef_HEAD_INIT, #endif "_gldraw", 0, /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_u_ATTRIB_LOCATION, __pyx_k_ATTRIB_LOCATION, sizeof(__pyx_k_ATTRIB_LOCATION), 0, 1, 0, 1}, {&__pyx_n_s_DEBUG, __pyx_k_DEBUG, sizeof(__pyx_k_DEBUG), 0, 0, 1, 1}, {&__pyx_kp_u_Importing_module, __pyx_k_Importing_module, sizeof(__pyx_k_Importing_module), 0, 1, 0, 0}, {&__pyx_n_u_PICKATTRIB_LOCATION, __pyx_k_PICKATTRIB_LOCATION, sizeof(__pyx_k_PICKATTRIB_LOCATION), 0, 1, 0, 1}, {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, {&__pyx_n_s_angle_max, __pyx_k_angle_max, sizeof(__pyx_k_angle_max), 0, 0, 1, 1}, {&__pyx_n_s_axisx, __pyx_k_axisx, sizeof(__pyx_k_axisx), 0, 0, 1, 1}, {&__pyx_n_s_axisy, __pyx_k_axisy, sizeof(__pyx_k_axisy), 0, 0, 1, 1}, {&__pyx_n_s_axisz, __pyx_k_axisz, sizeof(__pyx_k_axisz), 0, 0, 1, 1}, {&__pyx_n_s_b, __pyx_k_b, sizeof(__pyx_k_b), 0, 0, 1, 1}, {&__pyx_n_s_blocks, __pyx_k_blocks, sizeof(__pyx_k_blocks), 0, 0, 1, 1}, {&__pyx_kp_u_blocks_hardcoded_limit_is, __pyx_k_blocks_hardcoded_limit_is, sizeof(__pyx_k_blocks_hardcoded_limit_is), 0, 1, 0, 0}, {&__pyx_n_s_compiled, __pyx_k_compiled, sizeof(__pyx_k_compiled), 0, 0, 1, 1}, {&__pyx_kp_u_compiled_2, __pyx_k_compiled_2, sizeof(__pyx_k_compiled_2), 0, 1, 0, 0}, {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, {&__pyx_n_s_debug, __pyx_k_debug, sizeof(__pyx_k_debug), 0, 0, 1, 1}, {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, {&__pyx_kp_u_from_package, __pyx_k_from_package, sizeof(__pyx_k_from_package), 0, 1, 0, 0}, {&__pyx_n_u_gl_delete_buffers, __pyx_k_gl_delete_buffers, sizeof(__pyx_k_gl_delete_buffers), 0, 1, 0, 1}, {&__pyx_n_u_gl_draw_cube, __pyx_k_gl_draw_cube, sizeof(__pyx_k_gl_draw_cube), 0, 1, 0, 1}, {&__pyx_n_u_gl_draw_cube_debug, __pyx_k_gl_draw_cube_debug, sizeof(__pyx_k_gl_draw_cube_debug), 0, 1, 0, 1}, {&__pyx_n_u_gl_draw_select_debug, __pyx_k_gl_draw_select_debug, sizeof(__pyx_k_gl_draw_select_debug), 0, 1, 0, 1}, {&__pyx_n_u_gl_init_buffers, __pyx_k_gl_init_buffers, sizeof(__pyx_k_gl_init_buffers), 0, 1, 0, 1}, {&__pyx_n_u_gl_init_object_location, __pyx_k_gl_init_object_location, sizeof(__pyx_k_gl_init_object_location), 0, 1, 0, 1}, {&__pyx_n_u_gl_pick_cube, __pyx_k_gl_pick_cube, sizeof(__pyx_k_gl_pick_cube), 0, 1, 0, 1}, {&__pyx_n_s_gldraw, __pyx_k_gldraw, sizeof(__pyx_k_gldraw), 0, 0, 1, 1}, {&__pyx_n_s_h, __pyx_k_h, sizeof(__pyx_k_h), 0, 0, 1, 1}, {&__pyx_kp_s_tmp, __pyx_k_tmp, sizeof(__pyx_k_tmp), 0, 0, 1, 0}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_init_module, __pyx_k_init_module, sizeof(__pyx_k_init_module), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_u_mat4, __pyx_k_mat4, sizeof(__pyx_k_mat4), 0, 1, 0, 1}, {&__pyx_n_u_matrix_set_identity, __pyx_k_matrix_set_identity, sizeof(__pyx_k_matrix_set_identity), 0, 1, 0, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_nblocks, __pyx_k_nblocks, sizeof(__pyx_k_nblocks), 0, 0, 1, 1}, {&__pyx_n_s_package, __pyx_k_package, sizeof(__pyx_k_package), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_set_transformations, __pyx_k_set_transformations, sizeof(__pyx_k_set_transformations), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_transformations, __pyx_k_transformations, sizeof(__pyx_k_transformations), 0, 0, 1, 1}, {&__pyx_kp_u_transformations_hardcoded_limit, __pyx_k_transformations_hardcoded_limit, sizeof(__pyx_k_transformations_hardcoded_limit), 0, 1, 0, 0}, {&__pyx_n_s_vertexdata, __pyx_k_vertexdata, sizeof(__pyx_k_vertexdata), 0, 0, 1, 1}, {&__pyx_n_s_vertexinfo, __pyx_k_vertexinfo, sizeof(__pyx_k_vertexinfo), 0, 0, 1, 1}, {&__pyx_n_s_vertexpointers, __pyx_k_vertexpointers, sizeof(__pyx_k_vertexpointers), 0, 0, 1, 1}, {&__pyx_n_s_w, __pyx_k_w, sizeof(__pyx_k_w), 0, 0, 1, 1}, {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "_gldraw.pyx":114 * * * def init_module(): # <<<<<<<<<<<<<< * cdef int i #px+ * */ __pyx_tuple_ = PyTuple_Pack(1, __pyx_n_s_i); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_init_module, 114, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_gldraw.pyx":125 * animation.angle = animation.angle_max = 0 * * def set_transformations(blocks): # <<<<<<<<<<<<<< * cdef unsigned int i, b #px+ * for i, b in enumerate(blocks): */ __pyx_tuple__3 = PyTuple_Pack(3, __pyx_n_s_blocks, __pyx_n_s_i, __pyx_n_s_b); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_set_transformations, 125, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC init_gldraw(void); /*proto*/ PyMODINIT_FUNC init_gldraw(void) #else PyMODINIT_FUNC PyInit__gldraw(void); /*proto*/ PyMODINIT_FUNC PyInit__gldraw(void) #endif { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; Py_ssize_t __pyx_t_6; PyObject *__pyx_t_7 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__gldraw(void)", 0); if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __Pyx_CyFunction_USED if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_gldraw", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif if (__pyx_module_is_main__gldraw) { if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (!PyDict_GetItemString(modules, "_gldraw")) { if (unlikely(PyDict_SetItemString(modules, "_gldraw", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ if (__Pyx_ExportFunction("matrix_set_identity", (void (*)(void))__pyx_f_7_gldraw_matrix_set_identity, "PyObject *(__pyx_t_7_gldraw_vec4 *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_draw_cube", (void (*)(void))__pyx_f_7_gldraw_gl_draw_cube, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_pick_cube", (void (*)(void))__pyx_f_7_gldraw_gl_pick_cube, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_init_buffers", (void (*)(void))__pyx_f_7_gldraw_gl_init_buffers, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_delete_buffers", (void (*)(void))__pyx_f_7_gldraw_gl_delete_buffers, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_draw_cube_debug", (void (*)(void))__pyx_f_7_gldraw_gl_draw_cube_debug, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_draw_select_debug", (void (*)(void))__pyx_f_7_gldraw_gl_draw_select_debug, "void (__pyx_t_2gl_GLfloat *, __pyx_t_2gl_GLsizeiptr, __pyx_t_2gl_GLuint)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("gl_init_object_location", (void (*)(void))__pyx_f_7_gldraw_gl_init_object_location, "void (__pyx_t_2gl_GLuint)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Type init code ---*/ /*--- Type import code ---*/ /*--- Variable import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ /* "_gldraw.pyx":25 * # This line makes cython happy * global __name__, __package__ # pylint: disable=W0604 * __compiled = True #px/ # <<<<<<<<<<<<<< * #__compiled = False * */ if (PyDict_SetItem(__pyx_d, __pyx_n_s_compiled, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_gldraw.pyx":28 * #__compiled = False * * __all__ = ['ATTRIB_LOCATION', 'PICKATTRIB_LOCATION', # <<<<<<<<<<<<<< * 'matrix_set_identity', 'mat4', * 'gl_draw_cube', 'gl_pick_cube', 'gl_init_buffers', 'gl_delete_buffers', */ __pyx_t_1 = PyList_New(11); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_u_ATTRIB_LOCATION); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_ATTRIB_LOCATION); __Pyx_GIVEREF(__pyx_n_u_ATTRIB_LOCATION); __Pyx_INCREF(__pyx_n_u_PICKATTRIB_LOCATION); PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_u_PICKATTRIB_LOCATION); __Pyx_GIVEREF(__pyx_n_u_PICKATTRIB_LOCATION); __Pyx_INCREF(__pyx_n_u_matrix_set_identity); PyList_SET_ITEM(__pyx_t_1, 2, __pyx_n_u_matrix_set_identity); __Pyx_GIVEREF(__pyx_n_u_matrix_set_identity); __Pyx_INCREF(__pyx_n_u_mat4); PyList_SET_ITEM(__pyx_t_1, 3, __pyx_n_u_mat4); __Pyx_GIVEREF(__pyx_n_u_mat4); __Pyx_INCREF(__pyx_n_u_gl_draw_cube); PyList_SET_ITEM(__pyx_t_1, 4, __pyx_n_u_gl_draw_cube); __Pyx_GIVEREF(__pyx_n_u_gl_draw_cube); __Pyx_INCREF(__pyx_n_u_gl_pick_cube); PyList_SET_ITEM(__pyx_t_1, 5, __pyx_n_u_gl_pick_cube); __Pyx_GIVEREF(__pyx_n_u_gl_pick_cube); __Pyx_INCREF(__pyx_n_u_gl_init_buffers); PyList_SET_ITEM(__pyx_t_1, 6, __pyx_n_u_gl_init_buffers); __Pyx_GIVEREF(__pyx_n_u_gl_init_buffers); __Pyx_INCREF(__pyx_n_u_gl_delete_buffers); PyList_SET_ITEM(__pyx_t_1, 7, __pyx_n_u_gl_delete_buffers); __Pyx_GIVEREF(__pyx_n_u_gl_delete_buffers); __Pyx_INCREF(__pyx_n_u_gl_draw_cube_debug); PyList_SET_ITEM(__pyx_t_1, 8, __pyx_n_u_gl_draw_cube_debug); __Pyx_GIVEREF(__pyx_n_u_gl_draw_cube_debug); __Pyx_INCREF(__pyx_n_u_gl_draw_select_debug); PyList_SET_ITEM(__pyx_t_1, 9, __pyx_n_u_gl_draw_select_debug); __Pyx_GIVEREF(__pyx_n_u_gl_draw_select_debug); __Pyx_INCREF(__pyx_n_u_gl_init_object_location); PyList_SET_ITEM(__pyx_t_1, 10, __pyx_n_u_gl_init_object_location); __Pyx_GIVEREF(__pyx_n_u_gl_init_object_location); if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_gldraw.pyx":43 * ##px. * * from .debug import debug, DEBUG # <<<<<<<<<<<<<< * * */ __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_debug); PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_debug); __Pyx_GIVEREF(__pyx_n_s_debug); __Pyx_INCREF(__pyx_n_s_DEBUG); PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_DEBUG); __Pyx_GIVEREF(__pyx_n_s_DEBUG); __pyx_t_2 = __Pyx_Import(__pyx_n_s_debug, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_debug, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_DEBUG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":46 * * * if DEBUG: # <<<<<<<<<<<<<< * debug('Importing module:', __name__) * debug(' from package:', __package__) */ __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_3) { /* "_gldraw.pyx":47 * * if DEBUG: * debug('Importing module:', __name__) # <<<<<<<<<<<<<< * debug(' from package:', __package__) * debug(' compiled:', __compiled) */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_name); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = NULL; __pyx_t_6 = 0; if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); __pyx_t_6 = 1; } } __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); if (__pyx_t_5) { PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL; } __Pyx_INCREF(__pyx_kp_u_Importing_module); PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_kp_u_Importing_module); __Pyx_GIVEREF(__pyx_kp_u_Importing_module); PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":48 * if DEBUG: * debug('Importing module:', __name__) * debug(' from package:', __package__) # <<<<<<<<<<<<<< * debug(' compiled:', __compiled) * */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_package); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_4 = NULL; __pyx_t_6 = 0; if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); __pyx_t_6 = 1; } } __pyx_t_5 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); if (__pyx_t_4) { PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_4 = NULL; } __Pyx_INCREF(__pyx_kp_u_from_package); PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_6, __pyx_kp_u_from_package); __Pyx_GIVEREF(__pyx_kp_u_from_package); PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_6, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":49 * debug('Importing module:', __name__) * debug(' from package:', __package__) * debug(' compiled:', __compiled) # <<<<<<<<<<<<<< * * */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_compiled); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_7 = NULL; __pyx_t_6 = 0; if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); __pyx_t_6 = 1; } } __pyx_t_4 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); if (__pyx_t_7) { PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL; } __Pyx_INCREF(__pyx_kp_u_compiled_2); PyTuple_SET_ITEM(__pyx_t_4, 0+__pyx_t_6, __pyx_kp_u_compiled_2); __Pyx_GIVEREF(__pyx_kp_u_compiled_2); PyTuple_SET_ITEM(__pyx_t_4, 1+__pyx_t_6, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L2; } __pyx_L2:; /* "_gldraw.pyx":114 * * * def init_module(): # <<<<<<<<<<<<<< * cdef int i #px+ * */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_gldraw_1init_module, NULL, __pyx_n_s_gldraw); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_init_module, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":125 * animation.angle = animation.angle_max = 0 * * def set_transformations(blocks): # <<<<<<<<<<<<<< * cdef unsigned int i, b #px+ * for i, b in enumerate(blocks): */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_gldraw_3set_transformations, NULL, __pyx_n_s_gldraw); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_transformations, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_gldraw.pyx":1 * #-*- coding:utf-8 -*- # <<<<<<<<<<<<<< * # cython: profile=False * */ __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_7); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init _gldraw", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init _gldraw"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) { PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", name, type->tp_name, Py_TYPE(obj)->tp_name); } static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } if (none_allowed && obj == Py_None) return 1; else if (exact) { if (likely(Py_TYPE(obj) == type)) return 1; #if PY_MAJOR_VERSION == 2 else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; #endif } else { if (likely(PyObject_TypeCheck(obj, type))) return 1; } __Pyx_RaiseArgumentTypeInvalid(name, obj, type); return 0; } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", index, (index == 1) ? "" : "s"); } static CYTHON_INLINE int __Pyx_IterFinish(void) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); PyObject* exc_type = tstate->curexc_type; if (unlikely(exc_type)) { if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) { PyObject *exc_value, *exc_tb; exc_value = tstate->curexc_value; exc_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; Py_DECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); return 0; } else { return -1; } } return 0; #else if (unlikely(PyErr_Occurred())) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { PyErr_Clear(); return 0; } else { return -1; } } return 0; #endif } static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } else { return __Pyx_IterFinish(); } return 0; } #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = func->ob_type->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck) { #if CYTHON_COMPILING_IN_CPYTHON if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o); if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck) { #if CYTHON_COMPILING_IN_CPYTHON if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o); if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck) { #if CYTHON_COMPILING_IN_CPYTHON if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (PyErr_ExceptionMatches(PyExc_OverflowError)) PyErr_Clear(); else return NULL; } } return m->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } static double __Pyx__PyObject_AsDouble(PyObject* obj) { PyObject* float_value; #if CYTHON_COMPILING_IN_PYPY float_value = PyNumber_Float(obj); #else PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number; if (likely(nb) && likely(nb->nb_float)) { float_value = nb->nb_float(obj); if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) { PyErr_Format(PyExc_TypeError, "__float__ returned non-float (type %.200s)", Py_TYPE(float_value)->tp_name); Py_DECREF(float_value); goto bad; } } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) { #if PY_MAJOR_VERSION >= 3 float_value = PyFloat_FromString(obj); #else float_value = PyFloat_FromString(obj, 0); #endif } else { PyObject* args = PyTuple_New(1); if (unlikely(!args)) goto bad; PyTuple_SET_ITEM(args, 0, obj); float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0); PyTuple_SET_ITEM(args, 0, 0); Py_DECREF(args); } #endif if (likely(float_value)) { double value = PyFloat_AS_DOUBLE(float_value); Py_DECREF(float_value); return value; } bad: return (double)-1; } static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_COMPILING_IN_CPYTHON PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_Restore(type, value, tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(type, value, tb); #endif } static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, int full_traceback) { PyObject *old_exc, *old_val, *old_tb; PyObject *ctx; __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); if (full_traceback) { Py_XINCREF(old_exc); Py_XINCREF(old_val); Py_XINCREF(old_tb); __Pyx_ErrRestore(old_exc, old_val, old_tb); PyErr_PrintEx(1); } #if PY_MAJOR_VERSION < 3 ctx = PyString_FromString(name); #else ctx = PyUnicode_FromString(name); #endif __Pyx_ErrRestore(old_exc, old_val, old_tb); if (!ctx) { PyErr_WriteUnraisable(Py_None); } else { PyErr_WriteUnraisable(ctx); Py_DECREF(ctx); } } static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { PyObject *result; #if CYTHON_COMPILING_IN_CPYTHON result = PyDict_GetItem(__pyx_d, name); if (likely(result)) { Py_INCREF(result); } else { #else result = PyObject_GetItem(__pyx_d, name); if (!result) { PyErr_Clear(); #endif result = __Pyx_GetBuiltinName(name); } return result; } static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = (start + end) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; py_code = __pyx_find_code_object(c_line ? c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? c_line : py_line, py_code); } py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = py_line; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; #if PY_VERSION_HEX < 0x03030000 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (!py_import) goto bad; #endif if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.')) { #if PY_VERSION_HEX < 0x03030000 PyObject *py_level = PyInt_FromLong(1); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); #endif if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_VERSION_HEX < 0x03030000 PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, level); #endif } } bad: #if PY_VERSION_HEX < 0x03030000 Py_XDECREF(py_import); #endif Py_XDECREF(empty_list); Py_XDECREF(empty_dict); return module; } #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value) \ { \ func_type value = func_value; \ if (sizeof(target_type) < sizeof(func_type)) { \ if (unlikely(value != (func_type) (target_type) value)) { \ func_type zero = 0; \ if (is_unsigned && unlikely(value < zero)) \ goto raise_neg_overflow; \ else \ goto raise_overflow; \ } \ } \ return (target_type) value; \ } #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #endif #endif static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { const int neg_one = (int) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x)) } else if (sizeof(int) <= sizeof(unsigned long long)) { __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x)) } } else { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, +(((PyLongObject*)x)->ob_digit[0])); case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x)) } else if (sizeof(int) <= sizeof(long long)) { __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x)) } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { const unsigned int neg_one = (unsigned int) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(unsigned int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(unsigned int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (unsigned int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } if (sizeof(unsigned int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, PyLong_AsUnsignedLong(x)) } else if (sizeof(unsigned int) <= sizeof(unsigned long long)) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long long, PyLong_AsUnsignedLongLong(x)) } } else { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, +(((PyLongObject*)x)->ob_digit[0])); case -1: __PYX_VERIFY_RETURN_INT(unsigned int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (sizeof(unsigned int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT(unsigned int, long, PyLong_AsLong(x)) } else if (sizeof(unsigned int) <= sizeof(long long)) { __PYX_VERIFY_RETURN_INT(unsigned int, long long, PyLong_AsLongLong(x)) } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else unsigned int val; PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (unsigned int) -1; } } else { unsigned int val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned int) -1; val = __Pyx_PyInt_As_unsigned_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to unsigned int"); return (unsigned int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned int"); return (unsigned int) -1; } static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { const unsigned int neg_one = (unsigned int) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(unsigned int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); } else if (sizeof(unsigned int) <= sizeof(unsigned long long)) { return PyLong_FromUnsignedLongLong((unsigned long long) value); } } else { if (sizeof(unsigned int) <= sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(unsigned int) <= sizeof(long long)) { return PyLong_FromLongLong((long long) value); } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(unsigned int), little, !is_unsigned); } } static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { const int neg_one = (int) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); } else if (sizeof(int) <= sizeof(unsigned long long)) { return PyLong_FromUnsignedLongLong((unsigned long long) value); } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(long long)) { return PyLong_FromLongLong((long long) value); } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(int), little, !is_unsigned); } } static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { const long neg_one = (long) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, PyLong_AsUnsignedLong(x)) } else if (sizeof(long) <= sizeof(unsigned long long)) { __PYX_VERIFY_RETURN_INT(long, unsigned long long, PyLong_AsUnsignedLongLong(x)) } } else { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, +(((PyLongObject*)x)->ob_digit[0])); case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyLong_AsLong(x)) } else if (sizeof(long) <= sizeof(long long)) { __PYX_VERIFY_RETURN_INT(long, long long, PyLong_AsLongLong(x)) } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); } else if (sizeof(long) <= sizeof(unsigned long long)) { return PyLong_FromUnsignedLongLong((unsigned long long) value); } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(long long)) { return PyLong_FromLongLong((long long) value); } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); return PyErr_WarnEx(NULL, message, 1); } return 0; } static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) { PyObject *d = 0; PyObject *cobj = 0; union { void (*fp)(void); void *p; } tmp; d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__"); if (!d) { PyErr_Clear(); d = PyDict_New(); if (!d) goto bad; Py_INCREF(d); if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0) goto bad; } tmp.fp = f; #if PY_VERSION_HEX >= 0x02070000 cobj = PyCapsule_New(tmp.p, sig, 0); #else cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0); #endif if (!cobj) goto bad; if (PyDict_SetItemString(d, name, cobj) < 0) goto bad; Py_DECREF(cobj); Py_DECREF(d); return 0; bad: Py_XDECREF(cobj); Py_XDECREF(d); return -1; } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { #if PY_VERSION_HEX < 0x03030000 char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; #else if (__Pyx_PyUnicode_READY(o) == -1) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (PyUnicode_IS_ASCII(o)) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif #endif } else #endif #if !CYTHON_COMPILING_IN_PYPY if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_MAJOR_VERSION < 3 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) return PyInt_AS_LONG(b); #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(b)) { case -1: return -(sdigit)((PyLongObject*)b)->ob_digit[0]; case 0: return 0; case 1: return ((PyLongObject*)b)->ob_digit[0]; } #endif #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ pybik-2.1/csrc/_glarea.c0000664000175000017500000141240012556224645015347 0ustar barccbarcc00000000000000/* Generated by Cython 0.21.1 */ #define PY_SSIZE_T_CLEAN #ifndef CYTHON_USE_PYLONG_INTERNALS #ifdef PYLONG_BITS_IN_DIGIT #define CYTHON_USE_PYLONG_INTERNALS 0 #else #include "pyconfig.h" #ifdef PYLONG_BITS_IN_DIGIT #define CYTHON_USE_PYLONG_INTERNALS 1 #else #define CYTHON_USE_PYLONG_INTERNALS 0 #endif #endif #endif #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) #error Cython requires Python 2.6+ or Python 3.2+. #else #define CYTHON_ABI "0_21_1" #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyType_Type #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #if PY_VERSION_HEX < 0x030400a1 && !defined(Py_TPFLAGS_HAVE_FINALIZE) #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #else #define CYTHON_PEP393_ENABLED 0 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #define __Pyx_PyFrozenSet_Size(s) PyObject_Size(s) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ? \ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #define __Pyx_PyFrozenSet_Size(s) PySet_Size(s) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is a quiet NaN. */ float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #ifdef __cplusplus template void __Pyx_call_destructor(T* x) { x->~T(); } #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #endif #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE___glarea #define __PYX_HAVE_API___glarea #include "math.h" #include "stddef.h" #include "stdint.h" #include "GL/gl.h" #include "GL/glext.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_fits_Py_ssize_t(v, type, is_signed) ( \ (sizeof(type) < sizeof(Py_ssize_t)) || \ (sizeof(type) > sizeof(Py_ssize_t) && \ likely(v < (type)PY_SSIZE_T_MAX || \ v == (type)PY_SSIZE_T_MAX) && \ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN || \ v == (type)PY_SSIZE_T_MIN))) || \ (sizeof(type) == sizeof(Py_ssize_t) && \ (is_signed || likely(v < (type)PY_SSIZE_T_MAX || \ v == (type)PY_SSIZE_T_MAX))) ) static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromUString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromUString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromUString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((const char*)s) #if PY_MAJOR_VERSION < 3 static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #else #define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen #endif #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_COMPILING_IN_CPYTHON #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "_glarea.pyx", }; /* "gl.pxd":64 * # from /usr/include/GL/gl.h: * * ctypedef unsigned int GLenum # <<<<<<<<<<<<<< * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield */ typedef unsigned int __pyx_t_2gl_GLenum; /* "gl.pxd":65 * * ctypedef unsigned int GLenum * ctypedef unsigned char GLboolean # <<<<<<<<<<<<<< * ctypedef unsigned int GLbitfield * ctypedef void GLvoid */ typedef unsigned char __pyx_t_2gl_GLboolean; /* "gl.pxd":66 * ctypedef unsigned int GLenum * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield # <<<<<<<<<<<<<< * ctypedef void GLvoid * ctypedef int GLint */ typedef unsigned int __pyx_t_2gl_GLbitfield; /* "gl.pxd":68 * ctypedef unsigned int GLbitfield * ctypedef void GLvoid * ctypedef int GLint # <<<<<<<<<<<<<< * ctypedef unsigned char GLubyte * ctypedef unsigned int GLuint */ typedef int __pyx_t_2gl_GLint; /* "gl.pxd":69 * ctypedef void GLvoid * ctypedef int GLint * ctypedef unsigned char GLubyte # <<<<<<<<<<<<<< * ctypedef unsigned int GLuint * ctypedef int GLsizei */ typedef unsigned char __pyx_t_2gl_GLubyte; /* "gl.pxd":70 * ctypedef int GLint * ctypedef unsigned char GLubyte * ctypedef unsigned int GLuint # <<<<<<<<<<<<<< * ctypedef int GLsizei * ctypedef float GLfloat */ typedef unsigned int __pyx_t_2gl_GLuint; /* "gl.pxd":71 * ctypedef unsigned char GLubyte * ctypedef unsigned int GLuint * ctypedef int GLsizei # <<<<<<<<<<<<<< * ctypedef float GLfloat * ctypedef float GLclampf */ typedef int __pyx_t_2gl_GLsizei; /* "gl.pxd":72 * ctypedef unsigned int GLuint * ctypedef int GLsizei * ctypedef float GLfloat # <<<<<<<<<<<<<< * ctypedef float GLclampf * */ typedef float __pyx_t_2gl_GLfloat; /* "gl.pxd":73 * ctypedef int GLsizei * ctypedef float GLfloat * ctypedef float GLclampf # <<<<<<<<<<<<<< * * */ typedef float __pyx_t_2gl_GLclampf; /* "gl.pxd":78 * # from /usr/include/GL/glext.h: * * ctypedef ptrdiff_t GLsizeiptr # <<<<<<<<<<<<<< * ctypedef ptrdiff_t GLintptr * ctypedef char GLchar */ typedef ptrdiff_t __pyx_t_2gl_GLsizeiptr; /* "gl.pxd":79 * * ctypedef ptrdiff_t GLsizeiptr * ctypedef ptrdiff_t GLintptr # <<<<<<<<<<<<<< * ctypedef char GLchar * */ typedef ptrdiff_t __pyx_t_2gl_GLintptr; /* "gl.pxd":80 * ctypedef ptrdiff_t GLsizeiptr * ctypedef ptrdiff_t GLintptr * ctypedef char GLchar # <<<<<<<<<<<<<< * * */ typedef char __pyx_t_2gl_GLchar; /*--- Type declarations ---*/ /* "gl.pxd":67 * ctypedef unsigned char GLboolean * ctypedef unsigned int GLbitfield * ctypedef void GLvoid # <<<<<<<<<<<<<< * ctypedef int GLint * ctypedef unsigned char GLubyte */ typedef void __pyx_t_2gl_GLvoid; /* "_gldraw.pxd":4 * * from gl cimport * #line 35 * cdef enum: # #line 52 # <<<<<<<<<<<<<< * ATTRIB_LOCATION = 0 #line 57 * PICKATTRIB_LOCATION = 5 #line 58 */ enum { __pyx_e_7_gldraw_ATTRIB_LOCATION = 0, __pyx_e_7_gldraw_PICKATTRIB_LOCATION = 5 }; /* "_gldraw.pxd":7 * ATTRIB_LOCATION = 0 #line 57 * PICKATTRIB_LOCATION = 5 #line 58 * ctypedef float vec4[4] #line 61 # <<<<<<<<<<<<<< * ctypedef vec4 mat4[4] #line 62 * cdef matrix_set_identity(mat4& matrix) #line 66 */ typedef float __pyx_t_7_gldraw_vec4[4]; /* "_gldraw.pxd":8 * PICKATTRIB_LOCATION = 5 #line 58 * ctypedef float vec4[4] #line 61 * ctypedef vec4 mat4[4] #line 62 # <<<<<<<<<<<<<< * cdef matrix_set_identity(mat4& matrix) #line 66 * cdef void gl_draw_cube() #line 186 */ typedef __pyx_t_7_gldraw_vec4 __pyx_t_7_gldraw_mat4[4]; struct __pyx_t_7_glarea_Terrain; struct __pyx_t_7_glarea_Frustum; struct __pyx_t_7_glarea_Program; struct __pyx_t_7_glarea_SelectionDebugPoints; /* "_glarea.pyx":53 * * * cdef struct Terrain: #px/ # <<<<<<<<<<<<<< * #class terrain: pass # pylint: disable=W0232, C0321, R0903 * float red #px+ */ struct __pyx_t_7_glarea_Terrain { float red; float green; float blue; int width; int height; }; /* "_glarea.pyx":62 * cdef Terrain terrain #px+ * * cdef struct Frustum: #px/ # <<<<<<<<<<<<<< * #class frustum: * float fovy_angle # field of view angle #px+ */ struct __pyx_t_7_glarea_Frustum { float fovy_angle; float fovy_radius; float fovy_radius_zoom; double bounding_sphere_radius; int multisample; __pyx_t_7_gldraw_mat4 modelview_matrix; __pyx_t_7_gldraw_mat4 projection_matrix; __pyx_t_7_gldraw_mat4 picking_matrix; }; /* "_glarea.pyx":77 * cdef Frustum frustum #px+ * * cdef struct Program: #px/ # <<<<<<<<<<<<<< * #class program: pass * GLuint prog_render #px+ */ struct __pyx_t_7_glarea_Program { __pyx_t_2gl_GLuint prog_render; __pyx_t_2gl_GLuint projection_location; __pyx_t_2gl_GLuint modelview_location; __pyx_t_2gl_GLuint prog_hud; __pyx_t_2gl_GLuint prog_pick; __pyx_t_2gl_GLuint picking_location; __pyx_t_2gl_GLuint projection_pick_location; __pyx_t_2gl_GLuint modelview_pick_location; }; /* "_glarea.pyx":89 * cdef Program program #px+ * * cdef struct SelectionDebugPoints: #px/ # <<<<<<<<<<<<<< * #class selection_debug_points: * float modelview1[3] #px/ */ struct __pyx_t_7_glarea_SelectionDebugPoints { float modelview1[3]; float modelview2[3]; int viewport1[2]; int viewport2[2]; }; #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil) \ if (acquire_gil) { \ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ PyGILState_Release(__pyx_gilstate_save); \ } else { \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil) \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext() \ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do { \ PyObject *tmp = (PyObject *) r; \ r = v; __Pyx_XDECREF(tmp); \ } while (0) #define __Pyx_DECREF_SET(r, v) do { \ PyObject *tmp = (PyObject *) r; \ r = v; __Pyx_DECREF(tmp); \ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif static PyObject *__Pyx_GetBuiltinName(PyObject *name); #ifndef __PYX_FORCE_INIT_THREADS #define __PYX_FORCE_INIT_THREADS 0 #endif static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); static void __Pyx_WriteUnraisable(const char *name, int clineno, int lineno, const char *filename, int full_traceback); static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ const char* function_name); #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); #define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \ (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i)))) #define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \ (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); #define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \ (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck); #include static CYTHON_INLINE PyObject* __Pyx_decode_c_string( const char* cstring, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); #endif static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); #else #define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) #endif static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); #if PY_MAJOR_VERSION >= 3 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { PyObject *value; value = PyDict_GetItemWithError(d, key); if (unlikely(!value)) { if (!PyErr_Occurred()) { PyObject* args = PyTuple_Pack(1, key); if (likely(args)) PyErr_SetObject(PyExc_KeyError, args); Py_XDECREF(args); } return NULL; } Py_INCREF(value); return value; } #else #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) #endif static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); typedef struct { int code_line; PyCodeObject* code_object; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_char(unsigned char value); static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); static int __Pyx_check_binary_version(void); #if !defined(__Pyx_PyIdentifier_FromString) #if PY_MAJOR_VERSION < 3 #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) #else #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) #endif #endif static PyObject *__Pyx_ImportModule(const char *name); static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig); static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'libc.math' */ /* Module declarations from 'libc.stddef' */ /* Module declarations from 'libc.stdint' */ /* Module declarations from 'gl' */ /* Module declarations from '_gldraw' */ static PyObject *(*__pyx_f_7_gldraw_matrix_set_identity)(__pyx_t_7_gldraw_vec4 *); /*proto*/ static void (*__pyx_f_7_gldraw_gl_draw_cube)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_pick_cube)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_init_buffers)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_delete_buffers)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_draw_cube_debug)(void); /*proto*/ static void (*__pyx_f_7_gldraw_gl_draw_select_debug)(__pyx_t_2gl_GLfloat *, __pyx_t_2gl_GLsizeiptr, __pyx_t_2gl_GLuint); /*proto*/ static void (*__pyx_f_7_gldraw_gl_init_object_location)(__pyx_t_2gl_GLuint); /*proto*/ /* Module declarations from '_glarea' */ static struct __pyx_t_7_glarea_Terrain __pyx_v_7_glarea_terrain; static struct __pyx_t_7_glarea_Frustum __pyx_v_7_glarea_frustum; static struct __pyx_t_7_glarea_Program __pyx_v_7_glarea_program; static struct __pyx_t_7_glarea_SelectionDebugPoints __pyx_v_7_glarea_selection_debug_points; static void __pyx_f_7_glarea__update_modelview_matrix_translation(void); /*proto*/ static void __pyx_f_7_glarea__set_modelview_matrix_rotation(float, float); /*proto*/ static void __pyx_f_7_glarea__update_projection_matrix(void); /*proto*/ static void __pyx_f_7_glarea__set_picking_matrix(int, int); /*proto*/ static void __pyx_f_7_glarea__set_picking_matrix_identity(void); /*proto*/ static void __pyx_f_7_glarea__gl_print_string(PyObject *, __pyx_t_2gl_GLenum); /*proto*/ static void __pyx_f_7_glarea__gl_print_float(PyObject *, __pyx_t_2gl_GLenum); /*proto*/ static void __pyx_f_7_glarea__gl_print_integer(PyObject *, __pyx_t_2gl_GLenum); /*proto*/ static void __pyx_f_7_glarea__gl_print_bool(PyObject *, __pyx_t_2gl_GLenum); /*proto*/ static void __pyx_f_7_glarea__gl_set_matrix(__pyx_t_2gl_GLint, __pyx_t_7_gldraw_vec4 *); /*proto*/ static void __pyx_f_7_glarea__gl_render_pick(void); /*proto*/ static PyObject *__pyx_f_7_glarea_gl_pick_polygons(int, int, int __pyx_skip_dispatch); /*proto*/ static void __pyx_f_7_glarea__modelview_to_viewport(float *, int *); /*proto*/ static void __pyx_f_7_glarea__viewport_to_modelview(int *, float *); /*proto*/ static void __pyx_f_7_glarea__gl_print_shader_log(__pyx_t_2gl_GLuint); /*proto*/ static void __pyx_f_7_glarea__gl_print_program_log(__pyx_t_2gl_GLuint); /*proto*/ static __pyx_t_2gl_GLuint __pyx_f_7_glarea__gl_create_compiled_shader(__pyx_t_2gl_GLenum, PyObject *); /*proto*/ static void __pyx_f_7_glarea__gl_print_program_info(__pyx_t_2gl_GLuint); /*proto*/ static __pyx_t_2gl_GLuint __pyx_f_7_glarea__gl_create_program(PyObject *, PyObject *, int, PyObject *); /*proto*/ #define __Pyx_MODULE_NAME "_glarea" int __pyx_module_is_main__glarea = 0; /* Implementation of '_glarea' */ static PyObject *__pyx_builtin_print; static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_enumerate; static PyObject *__pyx_pf_7_glarea_init_module(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_2set_frustum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_bounding_sphere_radius, PyObject *__pyx_v_zoom); /* proto */ static PyObject *__pyx_pf_7_glarea_4set_background_color(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_red, PyObject *__pyx_v_green, PyObject *__pyx_v_blue); /* proto */ static PyObject *__pyx_pf_7_glarea_6set_antialiasing(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_multisample); /* proto */ static PyObject *__pyx_pf_7_glarea_8set_rotation_xy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */ static PyObject *__pyx_pf_7_glarea_10gl_init(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_12gl_exit(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_14gl_resize(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_width, PyObject *__pyx_v_height); /* proto */ static PyObject *__pyx_pf_7_glarea_16gl_render(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_18gl_render_select_debug(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ static PyObject *__pyx_pf_7_glarea_20gl_pick_polygons(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_x, int __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7_glarea_22get_cursor_angle(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_xi, PyObject *__pyx_v_yi, PyObject *__pyx_v_d); /* proto */ static PyObject *__pyx_pf_7_glarea_24gl_create_render_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source); /* proto */ static PyObject *__pyx_pf_7_glarea_26gl_create_hud_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source); /* proto */ static PyObject *__pyx_pf_7_glarea_28gl_create_pick_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source); /* proto */ static char __pyx_k_d[] = "d"; static char __pyx_k_i[] = "i"; static char __pyx_k_x[] = "x"; static char __pyx_k_y[] = "y"; static char __pyx_k_GL[] = "GL"; static char __pyx_k__3[] = "===="; static char __pyx_k_xi[] = "xi"; static char __pyx_k_yi[] = "yi"; static char __pyx_k__10[] = " "; static char __pyx_k_red[] = "red"; static char __pyx_k_tex[] = "tex"; static char __pyx_k_blue[] = "blue"; static char __pyx_k_main[] = "__main__"; static char __pyx_k_name[] = "__name__"; static char __pyx_k_prog[] = "prog"; static char __pyx_k_test[] = "__test__"; static char __pyx_k_zoom[] = "zoom"; static char __pyx_k_DEBUG[] = "DEBUG"; static char __pyx_k_angle[] = "angle"; static char __pyx_k_debug[] = "debug"; static char __pyx_k_green[] = "green"; static char __pyx_k_print[] = "print"; static char __pyx_k_range[] = "range"; static char __pyx_k_width[] = "width"; static char __pyx_k_format[] = "format"; static char __pyx_k_glarea[] = "_glarea"; static char __pyx_k_height[] = "height"; static char __pyx_k_import[] = "__import__"; static char __pyx_k_object[] = "object"; static char __pyx_k_rstrip[] = "rstrip"; static char __pyx_k_GL_GLES[] = " GL/GLES:"; static char __pyx_k_gl_exit[] = "gl_exit"; static char __pyx_k_gl_init[] = "gl_init"; static char __pyx_k_package[] = "__package__"; static char __pyx_k_picking[] = "picking"; static char __pyx_k_compiled[] = "__compiled"; static char __pyx_k_location[] = "location"; static char __pyx_k_DEBUG_MSG[] = "DEBUG_MSG"; static char __pyx_k_GL_Vendor[] = " GL Vendor:"; static char __pyx_k_enumerate[] = "enumerate"; static char __pyx_k_gl_render[] = "gl_render"; static char __pyx_k_gl_resize[] = "gl_resize"; static char __pyx_k_modelview[] = "modelview"; static char __pyx_k_DEBUG_DRAW[] = "DEBUG_DRAW"; static char __pyx_k_DEBUG_PICK[] = "DEBUG_PICK"; static char __pyx_k_GL_SAMPLES[] = " GL_SAMPLES:"; static char __pyx_k_GL_Strings[] = "GL Strings:"; static char __pyx_k_GL_Version[] = " GL Version:"; static char __pyx_k_attributes[] = "attributes"; static char __pyx_k_color_attr[] = "color_attr"; static char __pyx_k_compiled_2[] = " compiled:"; static char __pyx_k_projection[] = "projection"; static char __pyx_k_selectdata[] = "selectdata"; static char __pyx_k_GL_Renderer[] = " GL Renderer:"; static char __pyx_k_init_module[] = "init_module"; static char __pyx_k_link_status[] = "link status"; static char __pyx_k_multisample[] = "multisample"; static char __pyx_k_normal_attr[] = "normal_attr"; static char __pyx_k_set_frustum[] = "set_frustum"; static char __pyx_k_vertex_attr[] = "vertex_attr"; static char __pyx_k_from_package[] = " from package:"; static char __pyx_k_delete_status[] = "delete status"; static char __pyx_k_texcoord_attr[] = "texcoord_attr"; static char __pyx_k_vertex_source[] = "vertex_source"; static char __pyx_k_DEBUG_NOSHADER[] = "DEBUG_NOSHADER"; static char __pyx_k_GL_MULTISAMPLE[] = " GL_MULTISAMPLE:"; static char __pyx_k_DEBUG_NOFSHADER[] = "DEBUG_NOFSHADER"; static char __pyx_k_DEBUG_NOVSHADER[] = "DEBUG_NOVSHADER"; static char __pyx_k_active_uniforms[] = "active uniforms"; static char __pyx_k_fragment_source[] = "fragment_source"; static char __pyx_k_info_log_length[] = "info log length"; static char __pyx_k_set_rotation_xy[] = "set_rotation_xy"; static char __pyx_k_validate_status[] = "validate status"; static char __pyx_k_Importing_module[] = "Importing module:"; static char __pyx_k_attached_shaders[] = "attached shaders"; static char __pyx_k_barycentric_attr[] = "barycentric_attr"; static char __pyx_k_get_cursor_angle[] = "get_cursor_angle"; static char __pyx_k_set_antialiasing[] = "set_antialiasing"; static char __pyx_k_GL_SAMPLE_BUFFERS[] = " GL_SAMPLE_BUFFERS:"; static char __pyx_k_active_attributes[] = "active attributes"; static char __pyx_k_active_uniforms_2[] = "active uniforms:"; static char __pyx_k_GL_SAMPLE_COVERAGE[] = " GL_SAMPLE_COVERAGE:"; static char __pyx_k_active_attributes_2[] = "active attributes:"; static char __pyx_k_shader_program_info[] = "shader program info"; static char __pyx_k_set_background_color[] = "set_background_color"; static char __pyx_k_GL_MAX_VERTEX_ATTRIBS[] = " GL_MAX_VERTEX_ATTRIBS:"; static char __pyx_k_gl_create_hud_program[] = "gl_create_hud_program"; static char __pyx_k_Error_compiling_shader[] = "==== Error compiling shader:"; static char __pyx_k_bounding_sphere_radius[] = "bounding_sphere_radius"; static char __pyx_k_creating_vertex_shader[] = " creating vertex shader"; static char __pyx_k_error_no_vertex_shader[] = "error: no vertex shader"; static char __pyx_k_gl_create_pick_program[] = "gl_create_pick_program"; static char __pyx_k_gl_render_select_debug[] = "gl_render_select_debug"; static char __pyx_k_Failed_to_create_shader[] = "Failed to create shader"; static char __pyx_k_GL_SAMPLE_COVERAGE_VALUE[] = " GL_SAMPLE_COVERAGE_VALUE:"; static char __pyx_k_creating_fragment_shader[] = " creating fragment shader"; static char __pyx_k_error_no_fragment_shader[] = "error: no fragment shader"; static char __pyx_k_gl_create_render_program[] = "gl_create_render_program"; static char __pyx_k_GL_SAMPLE_COVERAGE_INVERT[] = " GL_SAMPLE_COVERAGE_INVERT:"; static char __pyx_k_active_uniform_max_length[] = "active uniform max length"; static char __pyx_k_length_size_type_location[] = " {}, {}: length={} size={} type={} location={}"; static char __pyx_k_GL_SAMPLE_ALPHA_TO_COVERAGE[] = " GL_SAMPLE_ALPHA_TO_COVERAGE:"; static char __pyx_k_GL_Shading_Language_Version[] = " GL Shading Language Version:"; static char __pyx_k_active_attribute_max_length[] = "active attribute max length"; static char __pyx_k_Error_linking_shader_program[] = "==== Error linking shader program:"; static char __pyx_k_Error_compiling_shader_no_log[] = "==== Error compiling shader (no log)"; static char __pyx_k_Error_linking_shader_program_no[] = "==== Error linking shader program (no log)"; static char __pyx_k_tmp[] = "/tmp/build/temp.linux-x86_64-3.4/pybiklib/_glarea.pyx"; static PyObject *__pyx_n_s_DEBUG; static PyObject *__pyx_n_s_DEBUG_DRAW; static PyObject *__pyx_n_s_DEBUG_MSG; static PyObject *__pyx_n_s_DEBUG_NOFSHADER; static PyObject *__pyx_n_s_DEBUG_NOSHADER; static PyObject *__pyx_n_s_DEBUG_NOVSHADER; static PyObject *__pyx_n_s_DEBUG_PICK; static PyObject *__pyx_kp_u_Error_compiling_shader; static PyObject *__pyx_kp_u_Error_compiling_shader_no_log; static PyObject *__pyx_kp_u_Error_linking_shader_program; static PyObject *__pyx_kp_u_Error_linking_shader_program_no; static PyObject *__pyx_kp_u_Failed_to_create_shader; static PyObject *__pyx_n_u_GL; static PyObject *__pyx_kp_u_GL_GLES; static PyObject *__pyx_kp_u_GL_MAX_VERTEX_ATTRIBS; static PyObject *__pyx_kp_u_GL_MULTISAMPLE; static PyObject *__pyx_kp_u_GL_Renderer; static PyObject *__pyx_kp_u_GL_SAMPLES; static PyObject *__pyx_kp_u_GL_SAMPLE_ALPHA_TO_COVERAGE; static PyObject *__pyx_kp_u_GL_SAMPLE_BUFFERS; static PyObject *__pyx_kp_u_GL_SAMPLE_COVERAGE; static PyObject *__pyx_kp_u_GL_SAMPLE_COVERAGE_INVERT; static PyObject *__pyx_kp_u_GL_SAMPLE_COVERAGE_VALUE; static PyObject *__pyx_kp_u_GL_Shading_Language_Version; static PyObject *__pyx_kp_u_GL_Strings; static PyObject *__pyx_kp_u_GL_Vendor; static PyObject *__pyx_kp_u_GL_Version; static PyObject *__pyx_kp_u_Importing_module; static PyObject *__pyx_kp_u__10; static PyObject *__pyx_kp_u__3; static PyObject *__pyx_kp_u_active_attribute_max_length; static PyObject *__pyx_kp_u_active_attributes; static PyObject *__pyx_kp_u_active_attributes_2; static PyObject *__pyx_kp_u_active_uniform_max_length; static PyObject *__pyx_kp_u_active_uniforms; static PyObject *__pyx_kp_u_active_uniforms_2; static PyObject *__pyx_n_s_angle; static PyObject *__pyx_kp_u_attached_shaders; static PyObject *__pyx_n_s_attributes; static PyObject *__pyx_n_b_barycentric_attr; static PyObject *__pyx_n_s_blue; static PyObject *__pyx_n_s_bounding_sphere_radius; static PyObject *__pyx_n_b_color_attr; static PyObject *__pyx_n_s_compiled; static PyObject *__pyx_kp_u_compiled_2; static PyObject *__pyx_kp_u_creating_fragment_shader; static PyObject *__pyx_kp_u_creating_vertex_shader; static PyObject *__pyx_n_s_d; static PyObject *__pyx_n_s_debug; static PyObject *__pyx_kp_u_delete_status; static PyObject *__pyx_n_s_enumerate; static PyObject *__pyx_kp_u_error_no_fragment_shader; static PyObject *__pyx_kp_u_error_no_vertex_shader; static PyObject *__pyx_n_s_format; static PyObject *__pyx_n_s_fragment_source; static PyObject *__pyx_kp_u_from_package; static PyObject *__pyx_n_s_get_cursor_angle; static PyObject *__pyx_n_s_gl_create_hud_program; static PyObject *__pyx_n_s_gl_create_pick_program; static PyObject *__pyx_n_s_gl_create_render_program; static PyObject *__pyx_n_s_gl_exit; static PyObject *__pyx_n_s_gl_init; static PyObject *__pyx_n_s_gl_render; static PyObject *__pyx_n_s_gl_render_select_debug; static PyObject *__pyx_n_s_gl_resize; static PyObject *__pyx_n_s_glarea; static PyObject *__pyx_n_s_green; static PyObject *__pyx_n_s_height; static PyObject *__pyx_kp_s_tmp; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_import; static PyObject *__pyx_kp_u_info_log_length; static PyObject *__pyx_n_s_init_module; static PyObject *__pyx_kp_u_length_size_type_location; static PyObject *__pyx_kp_u_link_status; static PyObject *__pyx_n_s_location; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_multisample; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_b_normal_attr; static PyObject *__pyx_n_s_package; static PyObject *__pyx_n_s_print; static PyObject *__pyx_n_s_prog; static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_red; static PyObject *__pyx_n_s_rstrip; static PyObject *__pyx_n_s_selectdata; static PyObject *__pyx_n_s_set_antialiasing; static PyObject *__pyx_n_s_set_background_color; static PyObject *__pyx_n_s_set_frustum; static PyObject *__pyx_n_s_set_rotation_xy; static PyObject *__pyx_kp_u_shader_program_info; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_b_texcoord_attr; static PyObject *__pyx_kp_u_validate_status; static PyObject *__pyx_n_b_vertex_attr; static PyObject *__pyx_n_s_vertex_source; static PyObject *__pyx_n_s_width; static PyObject *__pyx_n_s_x; static PyObject *__pyx_n_s_xi; static PyObject *__pyx_n_s_y; static PyObject *__pyx_n_s_yi; static PyObject *__pyx_n_s_zoom; static PyObject *__pyx_float_180_0; static PyObject *__pyx_int_0; static PyObject *__pyx_int_1; static PyObject *__pyx_int_90; static PyObject *__pyx_int_360; static PyObject *__pyx_int_neg_90; static PyObject *__pyx_tuple_; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__4; static PyObject *__pyx_tuple__5; static PyObject *__pyx_tuple__6; static PyObject *__pyx_tuple__7; static PyObject *__pyx_tuple__8; static PyObject *__pyx_tuple__9; static PyObject *__pyx_tuple__11; static PyObject *__pyx_tuple__12; static PyObject *__pyx_tuple__13; static PyObject *__pyx_tuple__14; static PyObject *__pyx_tuple__15; static PyObject *__pyx_tuple__16; static PyObject *__pyx_tuple__17; static PyObject *__pyx_tuple__19; static PyObject *__pyx_tuple__21; static PyObject *__pyx_tuple__23; static PyObject *__pyx_tuple__25; static PyObject *__pyx_tuple__28; static PyObject *__pyx_tuple__30; static PyObject *__pyx_tuple__33; static PyObject *__pyx_tuple__35; static PyObject *__pyx_tuple__37; static PyObject *__pyx_tuple__39; static PyObject *__pyx_tuple__41; static PyObject *__pyx_codeobj__18; static PyObject *__pyx_codeobj__20; static PyObject *__pyx_codeobj__22; static PyObject *__pyx_codeobj__24; static PyObject *__pyx_codeobj__26; static PyObject *__pyx_codeobj__27; static PyObject *__pyx_codeobj__29; static PyObject *__pyx_codeobj__31; static PyObject *__pyx_codeobj__32; static PyObject *__pyx_codeobj__34; static PyObject *__pyx_codeobj__36; static PyObject *__pyx_codeobj__38; static PyObject *__pyx_codeobj__40; static PyObject *__pyx_codeobj__42; /* "_glarea.pyx":103 * ### module state * * def init_module(): # <<<<<<<<<<<<<< * terrain.red = 0.0 * terrain.green = 0.0 */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_1init_module(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_1init_module = {"init_module", (PyCFunction)__pyx_pw_7_glarea_1init_module, METH_NOARGS, 0}; static PyObject *__pyx_pw_7_glarea_1init_module(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("init_module (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_init_module(__pyx_self); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_init_module(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations double __pyx_t_1; float __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("init_module", 0); /* "_glarea.pyx":104 * * def init_module(): * terrain.red = 0.0 # <<<<<<<<<<<<<< * terrain.green = 0.0 * terrain.blue = 0.0 */ __pyx_v_7_glarea_terrain.red = 0.0; /* "_glarea.pyx":105 * def init_module(): * terrain.red = 0.0 * terrain.green = 0.0 # <<<<<<<<<<<<<< * terrain.blue = 0.0 * terrain.width = 1 */ __pyx_v_7_glarea_terrain.green = 0.0; /* "_glarea.pyx":106 * terrain.red = 0.0 * terrain.green = 0.0 * terrain.blue = 0.0 # <<<<<<<<<<<<<< * terrain.width = 1 * terrain.height = 1 */ __pyx_v_7_glarea_terrain.blue = 0.0; /* "_glarea.pyx":107 * terrain.green = 0.0 * terrain.blue = 0.0 * terrain.width = 1 # <<<<<<<<<<<<<< * terrain.height = 1 * */ __pyx_v_7_glarea_terrain.width = 1; /* "_glarea.pyx":108 * terrain.blue = 0.0 * terrain.width = 1 * terrain.height = 1 # <<<<<<<<<<<<<< * * frustum.fovy_angle = 33.0 # field of view angle */ __pyx_v_7_glarea_terrain.height = 1; /* "_glarea.pyx":110 * terrain.height = 1 * * frustum.fovy_angle = 33.0 # field of view angle # <<<<<<<<<<<<<< * frustum.fovy_radius = 1 / tan(frustum.fovy_angle * M_PI / 360.0) * frustum.fovy_radius_zoom = frustum.fovy_radius # zoom == 1. */ __pyx_v_7_glarea_frustum.fovy_angle = 33.0; /* "_glarea.pyx":111 * * frustum.fovy_angle = 33.0 # field of view angle * frustum.fovy_radius = 1 / tan(frustum.fovy_angle * M_PI / 360.0) # <<<<<<<<<<<<<< * frustum.fovy_radius_zoom = frustum.fovy_radius # zoom == 1. * frustum.bounding_sphere_radius = 1. */ __pyx_t_1 = tan(((__pyx_v_7_glarea_frustum.fovy_angle * M_PI) / 360.0)); if (unlikely(__pyx_t_1 == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_7_glarea_frustum.fovy_radius = (1.0 / __pyx_t_1); /* "_glarea.pyx":112 * frustum.fovy_angle = 33.0 # field of view angle * frustum.fovy_radius = 1 / tan(frustum.fovy_angle * M_PI / 360.0) * frustum.fovy_radius_zoom = frustum.fovy_radius # zoom == 1. # <<<<<<<<<<<<<< * frustum.bounding_sphere_radius = 1. * frustum.multisample = 0 */ __pyx_t_2 = __pyx_v_7_glarea_frustum.fovy_radius; __pyx_v_7_glarea_frustum.fovy_radius_zoom = __pyx_t_2; /* "_glarea.pyx":113 * frustum.fovy_radius = 1 / tan(frustum.fovy_angle * M_PI / 360.0) * frustum.fovy_radius_zoom = frustum.fovy_radius # zoom == 1. * frustum.bounding_sphere_radius = 1. # <<<<<<<<<<<<<< * frustum.multisample = 0 * # fill modelview_matrix */ __pyx_v_7_glarea_frustum.bounding_sphere_radius = 1.; /* "_glarea.pyx":114 * frustum.fovy_radius_zoom = frustum.fovy_radius # zoom == 1. * frustum.bounding_sphere_radius = 1. * frustum.multisample = 0 # <<<<<<<<<<<<<< * # fill modelview_matrix * matrix_set_identity(frustum.modelview_matrix) */ __pyx_v_7_glarea_frustum.multisample = 0; /* "_glarea.pyx":116 * frustum.multisample = 0 * # fill modelview_matrix * matrix_set_identity(frustum.modelview_matrix) # <<<<<<<<<<<<<< * _update_modelview_matrix_translation() * # fill projection_matrix, see doc of _glFrustum */ __pyx_t_3 = __pyx_f_7_gldraw_matrix_set_identity(__pyx_v_7_glarea_frustum.modelview_matrix); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":117 * # fill modelview_matrix * matrix_set_identity(frustum.modelview_matrix) * _update_modelview_matrix_translation() # <<<<<<<<<<<<<< * # fill projection_matrix, see doc of _glFrustum * matrix_set_identity(frustum.projection_matrix) */ __pyx_f_7_glarea__update_modelview_matrix_translation(); /* "_glarea.pyx":119 * _update_modelview_matrix_translation() * # fill projection_matrix, see doc of _glFrustum * matrix_set_identity(frustum.projection_matrix) # <<<<<<<<<<<<<< * frustum.projection_matrix[2][3] = -1. * frustum.projection_matrix[3][3] = 0. */ __pyx_t_3 = __pyx_f_7_gldraw_matrix_set_identity(__pyx_v_7_glarea_frustum.projection_matrix); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":120 * # fill projection_matrix, see doc of _glFrustum * matrix_set_identity(frustum.projection_matrix) * frustum.projection_matrix[2][3] = -1. # <<<<<<<<<<<<<< * frustum.projection_matrix[3][3] = 0. * _update_projection_matrix() */ ((__pyx_v_7_glarea_frustum.projection_matrix[2])[3]) = -1.; /* "_glarea.pyx":121 * matrix_set_identity(frustum.projection_matrix) * frustum.projection_matrix[2][3] = -1. * frustum.projection_matrix[3][3] = 0. # <<<<<<<<<<<<<< * _update_projection_matrix() * # fill picking_matrix */ ((__pyx_v_7_glarea_frustum.projection_matrix[3])[3]) = 0.; /* "_glarea.pyx":122 * frustum.projection_matrix[2][3] = -1. * frustum.projection_matrix[3][3] = 0. * _update_projection_matrix() # <<<<<<<<<<<<<< * # fill picking_matrix * matrix_set_identity(frustum.picking_matrix) */ __pyx_f_7_glarea__update_projection_matrix(); /* "_glarea.pyx":124 * _update_projection_matrix() * # fill picking_matrix * matrix_set_identity(frustum.picking_matrix) # <<<<<<<<<<<<<< * * program.prog_render = 0 */ __pyx_t_3 = __pyx_f_7_gldraw_matrix_set_identity(__pyx_v_7_glarea_frustum.picking_matrix); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":126 * matrix_set_identity(frustum.picking_matrix) * * program.prog_render = 0 # <<<<<<<<<<<<<< * program.prog_hud = 0 * program.prog_pick = 0 */ __pyx_v_7_glarea_program.prog_render = 0; /* "_glarea.pyx":127 * * program.prog_render = 0 * program.prog_hud = 0 # <<<<<<<<<<<<<< * program.prog_pick = 0 * */ __pyx_v_7_glarea_program.prog_hud = 0; /* "_glarea.pyx":128 * program.prog_render = 0 * program.prog_hud = 0 * program.prog_pick = 0 # <<<<<<<<<<<<<< * * cdef void _update_modelview_matrix_translation(): #px/ */ __pyx_v_7_glarea_program.prog_pick = 0; /* "_glarea.pyx":103 * ### module state * * def init_module(): # <<<<<<<<<<<<<< * terrain.red = 0.0 * terrain.green = 0.0 */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("_glarea.init_module", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":130 * program.prog_pick = 0 * * cdef void _update_modelview_matrix_translation(): #px/ # <<<<<<<<<<<<<< * #def _update_modelview_matrix_translation(): * frustum.modelview_matrix[3][2] = -frustum.bounding_sphere_radius * (frustum.fovy_radius_zoom + 1.) */ static void __pyx_f_7_glarea__update_modelview_matrix_translation(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_update_modelview_matrix_translation", 0); /* "_glarea.pyx":132 * cdef void _update_modelview_matrix_translation(): #px/ * #def _update_modelview_matrix_translation(): * frustum.modelview_matrix[3][2] = -frustum.bounding_sphere_radius * (frustum.fovy_radius_zoom + 1.) # <<<<<<<<<<<<<< * * cdef void _set_modelview_matrix_rotation(float radiansx, float radiansy): #px/ */ ((__pyx_v_7_glarea_frustum.modelview_matrix[3])[2]) = ((-__pyx_v_7_glarea_frustum.bounding_sphere_radius) * (__pyx_v_7_glarea_frustum.fovy_radius_zoom + 1.)); /* "_glarea.pyx":130 * program.prog_pick = 0 * * cdef void _update_modelview_matrix_translation(): #px/ # <<<<<<<<<<<<<< * #def _update_modelview_matrix_translation(): * frustum.modelview_matrix[3][2] = -frustum.bounding_sphere_radius * (frustum.fovy_radius_zoom + 1.) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":134 * frustum.modelview_matrix[3][2] = -frustum.bounding_sphere_radius * (frustum.fovy_radius_zoom + 1.) * * cdef void _set_modelview_matrix_rotation(float radiansx, float radiansy): #px/ # <<<<<<<<<<<<<< * #def _set_modelview_matrix_rotation(radiansx, radiansy): * cdef vec4 *M #px+ */ static void __pyx_f_7_glarea__set_modelview_matrix_rotation(float __pyx_v_radiansx, float __pyx_v_radiansy) { __pyx_t_7_gldraw_vec4 *__pyx_v_M; float __pyx_v_sx; float __pyx_v_sy; float __pyx_v_cx; float __pyx_v_cy; float __pyx_v_m00; float __pyx_v_m11; float __pyx_v_m12; float __pyx_v_m20; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_set_modelview_matrix_rotation", 0); /* "_glarea.pyx":140 * cdef float m00, m11, m12, m20 #px+ * * M = &frustum.modelview_matrix[0][0] #px/ # <<<<<<<<<<<<<< * #M = frustum.modelview_matrix * */ __pyx_v_M = ((__pyx_t_7_gldraw_vec4 *)(&((__pyx_v_7_glarea_frustum.modelview_matrix[0])[0]))); /* "_glarea.pyx":143 * #M = frustum.modelview_matrix * * sx = sin(radiansx/2) # <<<<<<<<<<<<<< * sy = sin(radiansy/2) * cx = cos(radiansx/2) */ __pyx_v_sx = sin((__pyx_v_radiansx / 2.0)); /* "_glarea.pyx":144 * * sx = sin(radiansx/2) * sy = sin(radiansy/2) # <<<<<<<<<<<<<< * cx = cos(radiansx/2) * cy = cos(radiansy/2) */ __pyx_v_sy = sin((__pyx_v_radiansy / 2.0)); /* "_glarea.pyx":145 * sx = sin(radiansx/2) * sy = sin(radiansy/2) * cx = cos(radiansx/2) # <<<<<<<<<<<<<< * cy = cos(radiansy/2) * */ __pyx_v_cx = cos((__pyx_v_radiansx / 2.0)); /* "_glarea.pyx":146 * sy = sin(radiansy/2) * cx = cos(radiansx/2) * cy = cos(radiansy/2) # <<<<<<<<<<<<<< * * m00 = 2*cx*cx - 1. */ __pyx_v_cy = cos((__pyx_v_radiansy / 2.0)); /* "_glarea.pyx":148 * cy = cos(radiansy/2) * * m00 = 2*cx*cx - 1. # <<<<<<<<<<<<<< * m11 = 2*cy*cy - 1. * m12 = 2*sy*cy */ __pyx_v_m00 = (((2.0 * __pyx_v_cx) * __pyx_v_cx) - 1.); /* "_glarea.pyx":149 * * m00 = 2*cx*cx - 1. * m11 = 2*cy*cy - 1. # <<<<<<<<<<<<<< * m12 = 2*sy*cy * m20 = 2*sx*cx */ __pyx_v_m11 = (((2.0 * __pyx_v_cy) * __pyx_v_cy) - 1.); /* "_glarea.pyx":150 * m00 = 2*cx*cx - 1. * m11 = 2*cy*cy - 1. * m12 = 2*sy*cy # <<<<<<<<<<<<<< * m20 = 2*sx*cx * # pylint: disable=C0321,C0326 */ __pyx_v_m12 = ((2.0 * __pyx_v_sy) * __pyx_v_cy); /* "_glarea.pyx":151 * m11 = 2*cy*cy - 1. * m12 = 2*sy*cy * m20 = 2*sx*cx # <<<<<<<<<<<<<< * # pylint: disable=C0321,C0326 * M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 */ __pyx_v_m20 = ((2.0 * __pyx_v_sx) * __pyx_v_cx); /* "_glarea.pyx":153 * m20 = 2*sx*cx * # pylint: disable=C0321,C0326 * M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 # <<<<<<<<<<<<<< * M[0][1] = m12 * m20; M[1][1] = m11; M[2][1] = -m00 * m12 * M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 */ ((__pyx_v_M[0])[0]) = __pyx_v_m00; ((__pyx_v_M[1])[0]) = 0.; ((__pyx_v_M[2])[0]) = __pyx_v_m20; /* "_glarea.pyx":154 * # pylint: disable=C0321,C0326 * M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 * M[0][1] = m12 * m20; M[1][1] = m11; M[2][1] = -m00 * m12 # <<<<<<<<<<<<<< * M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 * */ ((__pyx_v_M[0])[1]) = (__pyx_v_m12 * __pyx_v_m20); ((__pyx_v_M[1])[1]) = __pyx_v_m11; ((__pyx_v_M[2])[1]) = ((-__pyx_v_m00) * __pyx_v_m12); /* "_glarea.pyx":155 * M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 * M[0][1] = m12 * m20; M[1][1] = m11; M[2][1] = -m00 * m12 * M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 # <<<<<<<<<<<<<< * * cdef void _update_projection_matrix(): #px/ */ ((__pyx_v_M[0])[2]) = ((-__pyx_v_m11) * __pyx_v_m20); ((__pyx_v_M[1])[2]) = __pyx_v_m12; ((__pyx_v_M[2])[2]) = (__pyx_v_m00 * __pyx_v_m11); /* "_glarea.pyx":134 * frustum.modelview_matrix[3][2] = -frustum.bounding_sphere_radius * (frustum.fovy_radius_zoom + 1.) * * cdef void _set_modelview_matrix_rotation(float radiansx, float radiansy): #px/ # <<<<<<<<<<<<<< * #def _set_modelview_matrix_rotation(radiansx, radiansy): * cdef vec4 *M #px+ */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":157 * M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 * * cdef void _update_projection_matrix(): #px/ # <<<<<<<<<<<<<< * #def _update_projection_matrix(): * if terrain.width < terrain.height: */ static void __pyx_f_7_glarea__update_projection_matrix(void) { double __pyx_v_aspectx; double __pyx_v_aspecty; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_update_projection_matrix", 0); /* "_glarea.pyx":159 * cdef void _update_projection_matrix(): #px/ * #def _update_projection_matrix(): * if terrain.width < terrain.height: # <<<<<<<<<<<<<< * aspectx = 1. * aspecty = terrain.height / terrain.width */ __pyx_t_1 = ((__pyx_v_7_glarea_terrain.width < __pyx_v_7_glarea_terrain.height) != 0); if (__pyx_t_1) { /* "_glarea.pyx":160 * #def _update_projection_matrix(): * if terrain.width < terrain.height: * aspectx = 1. # <<<<<<<<<<<<<< * aspecty = terrain.height / terrain.width * else: */ __pyx_v_aspectx = 1.; /* "_glarea.pyx":161 * if terrain.width < terrain.height: * aspectx = 1. * aspecty = terrain.height / terrain.width # <<<<<<<<<<<<<< * else: * aspectx = terrain.width / terrain.height */ if (unlikely(__pyx_v_7_glarea_terrain.width == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_aspecty = (((double)__pyx_v_7_glarea_terrain.height) / ((double)__pyx_v_7_glarea_terrain.width)); goto __pyx_L3; } /*else*/ { /* "_glarea.pyx":163 * aspecty = terrain.height / terrain.width * else: * aspectx = terrain.width / terrain.height # <<<<<<<<<<<<<< * aspecty = 1. * # see doc of _glFrustum */ if (unlikely(__pyx_v_7_glarea_terrain.height == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_aspectx = (((double)__pyx_v_7_glarea_terrain.width) / ((double)__pyx_v_7_glarea_terrain.height)); /* "_glarea.pyx":164 * else: * aspectx = terrain.width / terrain.height * aspecty = 1. # <<<<<<<<<<<<<< * # see doc of _glFrustum * frustum.projection_matrix[0][0] = frustum.fovy_radius / aspectx */ __pyx_v_aspecty = 1.; } __pyx_L3:; /* "_glarea.pyx":166 * aspecty = 1. * # see doc of _glFrustum * frustum.projection_matrix[0][0] = frustum.fovy_radius / aspectx # <<<<<<<<<<<<<< * frustum.projection_matrix[1][1] = frustum.fovy_radius / aspecty * frustum.projection_matrix[2][2] = -(frustum.fovy_radius_zoom + 1.) */ if (unlikely(__pyx_v_aspectx == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } ((__pyx_v_7_glarea_frustum.projection_matrix[0])[0]) = (((double)__pyx_v_7_glarea_frustum.fovy_radius) / __pyx_v_aspectx); /* "_glarea.pyx":167 * # see doc of _glFrustum * frustum.projection_matrix[0][0] = frustum.fovy_radius / aspectx * frustum.projection_matrix[1][1] = frustum.fovy_radius / aspecty # <<<<<<<<<<<<<< * frustum.projection_matrix[2][2] = -(frustum.fovy_radius_zoom + 1.) * frustum.projection_matrix[3][2] = -(frustum.fovy_radius_zoom + 2. */ if (unlikely(__pyx_v_aspecty == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 167; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } ((__pyx_v_7_glarea_frustum.projection_matrix[1])[1]) = (((double)__pyx_v_7_glarea_frustum.fovy_radius) / __pyx_v_aspecty); /* "_glarea.pyx":168 * frustum.projection_matrix[0][0] = frustum.fovy_radius / aspectx * frustum.projection_matrix[1][1] = frustum.fovy_radius / aspecty * frustum.projection_matrix[2][2] = -(frustum.fovy_radius_zoom + 1.) # <<<<<<<<<<<<<< * frustum.projection_matrix[3][2] = -(frustum.fovy_radius_zoom + 2. * ) * frustum.bounding_sphere_radius * frustum.fovy_radius_zoom */ ((__pyx_v_7_glarea_frustum.projection_matrix[2])[2]) = (-(__pyx_v_7_glarea_frustum.fovy_radius_zoom + 1.)); /* "_glarea.pyx":169 * frustum.projection_matrix[1][1] = frustum.fovy_radius / aspecty * frustum.projection_matrix[2][2] = -(frustum.fovy_radius_zoom + 1.) * frustum.projection_matrix[3][2] = -(frustum.fovy_radius_zoom + 2. # <<<<<<<<<<<<<< * ) * frustum.bounding_sphere_radius * frustum.fovy_radius_zoom * */ ((__pyx_v_7_glarea_frustum.projection_matrix[3])[2]) = (((-(__pyx_v_7_glarea_frustum.fovy_radius_zoom + 2.)) * __pyx_v_7_glarea_frustum.bounding_sphere_radius) * __pyx_v_7_glarea_frustum.fovy_radius_zoom); /* "_glarea.pyx":157 * M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 * * cdef void _update_projection_matrix(): #px/ # <<<<<<<<<<<<<< * #def _update_projection_matrix(): * if terrain.width < terrain.height: */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_WriteUnraisable("_glarea._update_projection_matrix", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":172 * ) * frustum.bounding_sphere_radius * frustum.fovy_radius_zoom * * cdef void _set_picking_matrix(int x, int y): #px/ # <<<<<<<<<<<<<< * #def _set_picking_matrix(x, y): * # Set picking matrix, restrict drawing to one pixel of the viewport */ static void __pyx_f_7_glarea__set_picking_matrix(int __pyx_v_x, int __pyx_v_y) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("_set_picking_matrix", 0); /* "_glarea.pyx":180 * # _glTranslatef(terrain.width - 2*x, terrain.height - 2*y, 0.) * # _glScalef(terrain.width, terrain.height, 1.0) * frustum.picking_matrix[3][0] = terrain.width - 2*x # <<<<<<<<<<<<<< * frustum.picking_matrix[3][1] = terrain.height - 2*y * frustum.picking_matrix[0][0] = terrain.width */ ((__pyx_v_7_glarea_frustum.picking_matrix[3])[0]) = (__pyx_v_7_glarea_terrain.width - (2 * __pyx_v_x)); /* "_glarea.pyx":181 * # _glScalef(terrain.width, terrain.height, 1.0) * frustum.picking_matrix[3][0] = terrain.width - 2*x * frustum.picking_matrix[3][1] = terrain.height - 2*y # <<<<<<<<<<<<<< * frustum.picking_matrix[0][0] = terrain.width * frustum.picking_matrix[1][1] = terrain.height */ ((__pyx_v_7_glarea_frustum.picking_matrix[3])[1]) = (__pyx_v_7_glarea_terrain.height - (2 * __pyx_v_y)); /* "_glarea.pyx":182 * frustum.picking_matrix[3][0] = terrain.width - 2*x * frustum.picking_matrix[3][1] = terrain.height - 2*y * frustum.picking_matrix[0][0] = terrain.width # <<<<<<<<<<<<<< * frustum.picking_matrix[1][1] = terrain.height * */ __pyx_t_1 = __pyx_v_7_glarea_terrain.width; ((__pyx_v_7_glarea_frustum.picking_matrix[0])[0]) = __pyx_t_1; /* "_glarea.pyx":183 * frustum.picking_matrix[3][1] = terrain.height - 2*y * frustum.picking_matrix[0][0] = terrain.width * frustum.picking_matrix[1][1] = terrain.height # <<<<<<<<<<<<<< * * cdef void _set_picking_matrix_identity(): #px/ */ __pyx_t_1 = __pyx_v_7_glarea_terrain.height; ((__pyx_v_7_glarea_frustum.picking_matrix[1])[1]) = __pyx_t_1; /* "_glarea.pyx":172 * ) * frustum.bounding_sphere_radius * frustum.fovy_radius_zoom * * cdef void _set_picking_matrix(int x, int y): #px/ # <<<<<<<<<<<<<< * #def _set_picking_matrix(x, y): * # Set picking matrix, restrict drawing to one pixel of the viewport */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":185 * frustum.picking_matrix[1][1] = terrain.height * * cdef void _set_picking_matrix_identity(): #px/ # <<<<<<<<<<<<<< * #def _set_picking_matrix_identity(): * frustum.picking_matrix[3][0] = 0. */ static void __pyx_f_7_glarea__set_picking_matrix_identity(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_set_picking_matrix_identity", 0); /* "_glarea.pyx":187 * cdef void _set_picking_matrix_identity(): #px/ * #def _set_picking_matrix_identity(): * frustum.picking_matrix[3][0] = 0. # <<<<<<<<<<<<<< * frustum.picking_matrix[3][1] = 0. * frustum.picking_matrix[0][0] = 1. */ ((__pyx_v_7_glarea_frustum.picking_matrix[3])[0]) = 0.; /* "_glarea.pyx":188 * #def _set_picking_matrix_identity(): * frustum.picking_matrix[3][0] = 0. * frustum.picking_matrix[3][1] = 0. # <<<<<<<<<<<<<< * frustum.picking_matrix[0][0] = 1. * frustum.picking_matrix[1][1] = 1. */ ((__pyx_v_7_glarea_frustum.picking_matrix[3])[1]) = 0.; /* "_glarea.pyx":189 * frustum.picking_matrix[3][0] = 0. * frustum.picking_matrix[3][1] = 0. * frustum.picking_matrix[0][0] = 1. # <<<<<<<<<<<<<< * frustum.picking_matrix[1][1] = 1. * */ ((__pyx_v_7_glarea_frustum.picking_matrix[0])[0]) = 1.; /* "_glarea.pyx":190 * frustum.picking_matrix[3][1] = 0. * frustum.picking_matrix[0][0] = 1. * frustum.picking_matrix[1][1] = 1. # <<<<<<<<<<<<<< * * def set_frustum(bounding_sphere_radius, zoom): */ ((__pyx_v_7_glarea_frustum.picking_matrix[1])[1]) = 1.; /* "_glarea.pyx":185 * frustum.picking_matrix[1][1] = terrain.height * * cdef void _set_picking_matrix_identity(): #px/ # <<<<<<<<<<<<<< * #def _set_picking_matrix_identity(): * frustum.picking_matrix[3][0] = 0. */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":192 * frustum.picking_matrix[1][1] = 1. * * def set_frustum(bounding_sphere_radius, zoom): # <<<<<<<<<<<<<< * if bounding_sphere_radius > 0: * frustum.bounding_sphere_radius = bounding_sphere_radius */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_3set_frustum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_3set_frustum = {"set_frustum", (PyCFunction)__pyx_pw_7_glarea_3set_frustum, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7_glarea_3set_frustum(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_bounding_sphere_radius = 0; PyObject *__pyx_v_zoom = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_frustum (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_bounding_sphere_radius,&__pyx_n_s_zoom,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_bounding_sphere_radius)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_zoom)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_frustum", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_frustum") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_bounding_sphere_radius = values[0]; __pyx_v_zoom = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_frustum", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.set_frustum", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_2set_frustum(__pyx_self, __pyx_v_bounding_sphere_radius, __pyx_v_zoom); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_2set_frustum(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_bounding_sphere_radius, PyObject *__pyx_v_zoom) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; double __pyx_t_3; PyObject *__pyx_t_4 = NULL; float __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_frustum", 0); /* "_glarea.pyx":193 * * def set_frustum(bounding_sphere_radius, zoom): * if bounding_sphere_radius > 0: # <<<<<<<<<<<<<< * frustum.bounding_sphere_radius = bounding_sphere_radius * frustum.fovy_radius_zoom = frustum.fovy_radius / zoom */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_bounding_sphere_radius, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":194 * def set_frustum(bounding_sphere_radius, zoom): * if bounding_sphere_radius > 0: * frustum.bounding_sphere_radius = bounding_sphere_radius # <<<<<<<<<<<<<< * frustum.fovy_radius_zoom = frustum.fovy_radius / zoom * _update_modelview_matrix_translation() */ __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_v_bounding_sphere_radius); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 194; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_frustum.bounding_sphere_radius = __pyx_t_3; goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":195 * if bounding_sphere_radius > 0: * frustum.bounding_sphere_radius = bounding_sphere_radius * frustum.fovy_radius_zoom = frustum.fovy_radius / zoom # <<<<<<<<<<<<<< * _update_modelview_matrix_translation() * _update_projection_matrix() */ __pyx_t_1 = PyFloat_FromDouble(__pyx_v_7_glarea_frustum.fovy_radius); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyNumber_Divide(__pyx_t_1, __pyx_v_zoom); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_7_glarea_frustum.fovy_radius_zoom = __pyx_t_5; /* "_glarea.pyx":196 * frustum.bounding_sphere_radius = bounding_sphere_radius * frustum.fovy_radius_zoom = frustum.fovy_radius / zoom * _update_modelview_matrix_translation() # <<<<<<<<<<<<<< * _update_projection_matrix() * */ __pyx_f_7_glarea__update_modelview_matrix_translation(); /* "_glarea.pyx":197 * frustum.fovy_radius_zoom = frustum.fovy_radius / zoom * _update_modelview_matrix_translation() * _update_projection_matrix() # <<<<<<<<<<<<<< * * def set_background_color(red, green, blue): */ __pyx_f_7_glarea__update_projection_matrix(); /* "_glarea.pyx":192 * frustum.picking_matrix[1][1] = 1. * * def set_frustum(bounding_sphere_radius, zoom): # <<<<<<<<<<<<<< * if bounding_sphere_radius > 0: * frustum.bounding_sphere_radius = bounding_sphere_radius */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.set_frustum", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":199 * _update_projection_matrix() * * def set_background_color(red, green, blue): # <<<<<<<<<<<<<< * terrain.red = red * terrain.green = green */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_5set_background_color(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_5set_background_color = {"set_background_color", (PyCFunction)__pyx_pw_7_glarea_5set_background_color, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7_glarea_5set_background_color(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_red = 0; PyObject *__pyx_v_green = 0; PyObject *__pyx_v_blue = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_background_color (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_red,&__pyx_n_s_green,&__pyx_n_s_blue,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_red)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_green)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_background_color", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_blue)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_background_color", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_background_color") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v_red = values[0]; __pyx_v_green = values[1]; __pyx_v_blue = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_background_color", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.set_background_color", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_4set_background_color(__pyx_self, __pyx_v_red, __pyx_v_green, __pyx_v_blue); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_4set_background_color(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_red, PyObject *__pyx_v_green, PyObject *__pyx_v_blue) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_background_color", 0); /* "_glarea.pyx":200 * * def set_background_color(red, green, blue): * terrain.red = red # <<<<<<<<<<<<<< * terrain.green = green * terrain.blue = blue */ __pyx_t_1 = __pyx_PyFloat_AsFloat(__pyx_v_red); if (unlikely((__pyx_t_1 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.red = __pyx_t_1; /* "_glarea.pyx":201 * def set_background_color(red, green, blue): * terrain.red = red * terrain.green = green # <<<<<<<<<<<<<< * terrain.blue = blue * */ __pyx_t_1 = __pyx_PyFloat_AsFloat(__pyx_v_green); if (unlikely((__pyx_t_1 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.green = __pyx_t_1; /* "_glarea.pyx":202 * terrain.red = red * terrain.green = green * terrain.blue = blue # <<<<<<<<<<<<<< * * def set_antialiasing(multisample): */ __pyx_t_1 = __pyx_PyFloat_AsFloat(__pyx_v_blue); if (unlikely((__pyx_t_1 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 202; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.blue = __pyx_t_1; /* "_glarea.pyx":199 * _update_projection_matrix() * * def set_background_color(red, green, blue): # <<<<<<<<<<<<<< * terrain.red = red * terrain.green = green */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.set_background_color", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":204 * terrain.blue = blue * * def set_antialiasing(multisample): # <<<<<<<<<<<<<< * frustum.multisample = multisample * */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_7set_antialiasing(PyObject *__pyx_self, PyObject *__pyx_v_multisample); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_7set_antialiasing = {"set_antialiasing", (PyCFunction)__pyx_pw_7_glarea_7set_antialiasing, METH_O, 0}; static PyObject *__pyx_pw_7_glarea_7set_antialiasing(PyObject *__pyx_self, PyObject *__pyx_v_multisample) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_antialiasing (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_6set_antialiasing(__pyx_self, ((PyObject *)__pyx_v_multisample)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_6set_antialiasing(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_multisample) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_antialiasing", 0); /* "_glarea.pyx":205 * * def set_antialiasing(multisample): * frustum.multisample = multisample # <<<<<<<<<<<<<< * * def set_rotation_xy(x, y): */ __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_multisample); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_frustum.multisample = __pyx_t_1; /* "_glarea.pyx":204 * terrain.blue = blue * * def set_antialiasing(multisample): # <<<<<<<<<<<<<< * frustum.multisample = multisample * */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.set_antialiasing", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":207 * frustum.multisample = multisample * * def set_rotation_xy(x, y): # <<<<<<<<<<<<<< * x %= 360 * # pylint: disable=C0321 */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_9set_rotation_xy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_9set_rotation_xy = {"set_rotation_xy", (PyCFunction)__pyx_pw_7_glarea_9set_rotation_xy, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7_glarea_9set_rotation_xy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_x = 0; PyObject *__pyx_v_y = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_rotation_xy (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_rotation_xy", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "set_rotation_xy") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_x = values[0]; __pyx_v_y = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_rotation_xy", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.set_rotation_xy", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_8set_rotation_xy(__pyx_self, __pyx_v_x, __pyx_v_y); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_8set_rotation_xy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; float __pyx_t_4; float __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("set_rotation_xy", 0); __Pyx_INCREF(__pyx_v_x); __Pyx_INCREF(__pyx_v_y); /* "_glarea.pyx":208 * * def set_rotation_xy(x, y): * x %= 360 # <<<<<<<<<<<<<< * # pylint: disable=C0321 * if y < -90: y = -90 */ __pyx_t_1 = PyNumber_InPlaceRemainder(__pyx_v_x, __pyx_int_360); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF_SET(__pyx_v_x, __pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":210 * x %= 360 * # pylint: disable=C0321 * if y < -90: y = -90 # <<<<<<<<<<<<<< * elif y > 90: y = 90 * _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_y, __pyx_int_neg_90, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { __Pyx_INCREF(__pyx_int_neg_90); __Pyx_DECREF_SET(__pyx_v_y, __pyx_int_neg_90); goto __pyx_L3; } /* "_glarea.pyx":211 * # pylint: disable=C0321 * if y < -90: y = -90 * elif y > 90: y = 90 # <<<<<<<<<<<<<< * _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) * return x, y */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_y, __pyx_int_90, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { __Pyx_INCREF(__pyx_int_90); __Pyx_DECREF_SET(__pyx_v_y, __pyx_int_90); goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":212 * if y < -90: y = -90 * elif y > 90: y = 90 * _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) # <<<<<<<<<<<<<< * return x, y * */ __pyx_t_1 = PyFloat_FromDouble(M_PI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_v_x); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyNumber_Divide(__pyx_t_3, __pyx_float_180_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyFloat_FromDouble(M_PI); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyNumber_Divide(__pyx_t_3, __pyx_float_180_0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_1); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 212; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_f_7_glarea__set_modelview_matrix_rotation(__pyx_t_4, __pyx_t_5); /* "_glarea.pyx":213 * elif y > 90: y = 90 * _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) * return x, y # <<<<<<<<<<<<<< * * ### GL state */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_x); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_x); __Pyx_GIVEREF(__pyx_v_x); __Pyx_INCREF(__pyx_v_y); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_y); __Pyx_GIVEREF(__pyx_v_y); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "_glarea.pyx":207 * frustum.multisample = multisample * * def set_rotation_xy(x, y): # <<<<<<<<<<<<<< * x %= 360 * # pylint: disable=C0321 */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("_glarea.set_rotation_xy", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_x); __Pyx_XDECREF(__pyx_v_y); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":217 * ### GL state * * cdef void _gl_print_string(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #def _gl_print_string(msg, name): * print(msg, glGetString(name)) #px/ */ static void __pyx_f_7_glarea__gl_print_string(PyObject *__pyx_v_msg, __pyx_t_2gl_GLenum __pyx_v_name) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_string", 0); /* "_glarea.pyx":219 * cdef void _gl_print_string(msg, GLenum name): #px/ * #def _gl_print_string(msg, name): * print(msg, glGetString(name)) #px/ # <<<<<<<<<<<<<< * #print(msg, glGetString(name)) * */ __pyx_t_1 = __Pyx_PyBytes_FromString(((char *)glGetString(__pyx_v_name))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":217 * ### GL state * * cdef void _gl_print_string(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #def _gl_print_string(msg, name): * print(msg, glGetString(name)) #px/ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_print_string", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":222 * #print(msg, glGetString(name)) * * cdef void _gl_print_float(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #def _gl_print_float(msg, name): * cdef GLfloat i #px+ */ static void __pyx_f_7_glarea__gl_print_float(PyObject *__pyx_v_msg, __pyx_t_2gl_GLenum __pyx_v_name) { __pyx_t_2gl_GLfloat __pyx_v_i; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_float", 0); /* "_glarea.pyx":225 * #def _gl_print_float(msg, name): * cdef GLfloat i #px+ * glGetFloatv(name, &i) #px/ # <<<<<<<<<<<<<< * #i = glGetFloatv(name) * print(msg, i) */ glGetFloatv(__pyx_v_name, (&__pyx_v_i)); /* "_glarea.pyx":227 * glGetFloatv(name, &i) #px/ * #i = glGetFloatv(name) * print(msg, i) # <<<<<<<<<<<<<< * * cdef void _gl_print_integer(msg, GLenum name): #px/ */ __pyx_t_1 = PyFloat_FromDouble(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 227; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":222 * #print(msg, glGetString(name)) * * cdef void _gl_print_float(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #def _gl_print_float(msg, name): * cdef GLfloat i #px+ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_print_float", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":229 * print(msg, i) * * cdef void _gl_print_integer(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #def _gl_print_integer(msg, name): * cdef GLint i #px+ */ static void __pyx_f_7_glarea__gl_print_integer(PyObject *__pyx_v_msg, __pyx_t_2gl_GLenum __pyx_v_name) { __pyx_t_2gl_GLint __pyx_v_i; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_integer", 0); /* "_glarea.pyx":232 * #def _gl_print_integer(msg, name): * cdef GLint i #px+ * glGetIntegerv(name, &i) #px/ # <<<<<<<<<<<<<< * #i = glGetIntegerv(name) * print(msg, i) */ glGetIntegerv(__pyx_v_name, (&__pyx_v_i)); /* "_glarea.pyx":234 * glGetIntegerv(name, &i) #px/ * #i = glGetIntegerv(name) * print(msg, i) # <<<<<<<<<<<<<< * * cdef void _gl_print_bool(msg, GLenum name): #px/ */ __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":229 * print(msg, i) * * cdef void _gl_print_integer(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #def _gl_print_integer(msg, name): * cdef GLint i #px+ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_print_integer", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":236 * print(msg, i) * * cdef void _gl_print_bool(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #def _gl_print_bool(msg, name): * cdef GLboolean i #px+ */ static void __pyx_f_7_glarea__gl_print_bool(PyObject *__pyx_v_msg, __pyx_t_2gl_GLenum __pyx_v_name) { __pyx_t_2gl_GLboolean __pyx_v_i; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_bool", 0); /* "_glarea.pyx":239 * #def _gl_print_bool(msg, name): * cdef GLboolean i #px+ * glGetBooleanv(name, &i) #px/ # <<<<<<<<<<<<<< * #i = glGetBooleanv(name) * print(msg, i) */ glGetBooleanv(__pyx_v_name, (&__pyx_v_i)); /* "_glarea.pyx":241 * glGetBooleanv(name, &i) #px/ * #i = glGetBooleanv(name) * print(msg, i) # <<<<<<<<<<<<<< * * def gl_init(): */ __pyx_t_1 = __Pyx_PyInt_From_unsigned_char(__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 241; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":236 * print(msg, i) * * cdef void _gl_print_bool(msg, GLenum name): #px/ # <<<<<<<<<<<<<< * #def _gl_print_bool(msg, name): * cdef GLboolean i #px+ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_print_bool", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":243 * print(msg, i) * * def gl_init(): # <<<<<<<<<<<<<< * if DEBUG_MSG: * print('GL Strings:') */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_11gl_init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_11gl_init = {"gl_init", (PyCFunction)__pyx_pw_7_glarea_11gl_init, METH_NOARGS, 0}; static PyObject *__pyx_pw_7_glarea_11gl_init(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_init (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_10gl_init(__pyx_self); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_10gl_init(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_init", 0); /* "_glarea.pyx":244 * * def gl_init(): * if DEBUG_MSG: # <<<<<<<<<<<<<< * print('GL Strings:') * _gl_print_string(' GL Vendor:', GL_VENDOR) */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG_MSG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 244; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":245 * def gl_init(): * if DEBUG_MSG: * print('GL Strings:') # <<<<<<<<<<<<<< * _gl_print_string(' GL Vendor:', GL_VENDOR) * _gl_print_string(' GL Renderer:', GL_RENDERER) */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":246 * if DEBUG_MSG: * print('GL Strings:') * _gl_print_string(' GL Vendor:', GL_VENDOR) # <<<<<<<<<<<<<< * _gl_print_string(' GL Renderer:', GL_RENDERER) * _gl_print_string(' GL Version:', GL_VERSION) */ __pyx_f_7_glarea__gl_print_string(__pyx_kp_u_GL_Vendor, GL_VENDOR); /* "_glarea.pyx":247 * print('GL Strings:') * _gl_print_string(' GL Vendor:', GL_VENDOR) * _gl_print_string(' GL Renderer:', GL_RENDERER) # <<<<<<<<<<<<<< * _gl_print_string(' GL Version:', GL_VERSION) * _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) */ __pyx_f_7_glarea__gl_print_string(__pyx_kp_u_GL_Renderer, GL_RENDERER); /* "_glarea.pyx":248 * _gl_print_string(' GL Vendor:', GL_VENDOR) * _gl_print_string(' GL Renderer:', GL_RENDERER) * _gl_print_string(' GL Version:', GL_VERSION) # <<<<<<<<<<<<<< * _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) * #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) */ __pyx_f_7_glarea__gl_print_string(__pyx_kp_u_GL_Version, GL_VERSION); /* "_glarea.pyx":249 * _gl_print_string(' GL Renderer:', GL_RENDERER) * _gl_print_string(' GL Version:', GL_VERSION) * _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) # <<<<<<<<<<<<<< * #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) * _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) */ __pyx_f_7_glarea__gl_print_string(__pyx_kp_u_GL_Shading_Language_Version, GL_SHADING_LANGUAGE_VERSION); /* "_glarea.pyx":251 * _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) * #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) * _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) # <<<<<<<<<<<<<< * _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) * _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) */ __pyx_f_7_glarea__gl_print_integer(__pyx_kp_u_GL_SAMPLE_BUFFERS, GL_SAMPLE_BUFFERS); /* "_glarea.pyx":252 * #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) * _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) * _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) # <<<<<<<<<<<<<< * _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) * _gl_print_integer(' GL_SAMPLES:', GL_SAMPLES) */ __pyx_f_7_glarea__gl_print_float(__pyx_kp_u_GL_SAMPLE_COVERAGE_VALUE, GL_SAMPLE_COVERAGE_VALUE); /* "_glarea.pyx":253 * _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) * _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) * _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) # <<<<<<<<<<<<<< * _gl_print_integer(' GL_SAMPLES:', GL_SAMPLES) * IF SOURCEGLVERSION == 'GL': #px/ */ __pyx_f_7_glarea__gl_print_bool(__pyx_kp_u_GL_SAMPLE_COVERAGE_INVERT, GL_SAMPLE_COVERAGE_INVERT); /* "_glarea.pyx":254 * _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) * _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) * _gl_print_integer(' GL_SAMPLES:', GL_SAMPLES) # <<<<<<<<<<<<<< * IF SOURCEGLVERSION == 'GL': #px/ * #if True: */ __pyx_f_7_glarea__gl_print_integer(__pyx_kp_u_GL_SAMPLES, GL_SAMPLES); /* "_glarea.pyx":257 * IF SOURCEGLVERSION == 'GL': #px/ * #if True: * print(' GL_MULTISAMPLE:', glIsEnabled(GL_MULTISAMPLE)) # <<<<<<<<<<<<<< * print(' GL_SAMPLE_ALPHA_TO_COVERAGE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)) * #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) */ __pyx_t_1 = __Pyx_PyInt_From_unsigned_char(glIsEnabled(GL_MULTISAMPLE)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_kp_u_GL_MULTISAMPLE); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_GL_MULTISAMPLE); __Pyx_GIVEREF(__pyx_kp_u_GL_MULTISAMPLE); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":258 * #if True: * print(' GL_MULTISAMPLE:', glIsEnabled(GL_MULTISAMPLE)) * print(' GL_SAMPLE_ALPHA_TO_COVERAGE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)) # <<<<<<<<<<<<<< * #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) * print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) */ __pyx_t_1 = __Pyx_PyInt_From_unsigned_char(glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_kp_u_GL_SAMPLE_ALPHA_TO_COVERAGE); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_GL_SAMPLE_ALPHA_TO_COVERAGE); __Pyx_GIVEREF(__pyx_kp_u_GL_SAMPLE_ALPHA_TO_COVERAGE); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":260 * print(' GL_SAMPLE_ALPHA_TO_COVERAGE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)) * #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) * print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) # <<<<<<<<<<<<<< * _gl_print_integer(' GL_MAX_VERTEX_ATTRIBS:', GL_MAX_VERTEX_ATTRIBS) * glClearColor(0., 0., 0., 1.) */ __pyx_t_1 = __Pyx_PyInt_From_unsigned_char(glIsEnabled(GL_SAMPLE_COVERAGE)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_kp_u_GL_SAMPLE_COVERAGE); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_GL_SAMPLE_COVERAGE); __Pyx_GIVEREF(__pyx_kp_u_GL_SAMPLE_COVERAGE); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":261 * #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) * print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) * _gl_print_integer(' GL_MAX_VERTEX_ATTRIBS:', GL_MAX_VERTEX_ATTRIBS) # <<<<<<<<<<<<<< * glClearColor(0., 0., 0., 1.) * glEnable(GL_DEPTH_TEST) */ __pyx_f_7_glarea__gl_print_integer(__pyx_kp_u_GL_MAX_VERTEX_ATTRIBS, GL_MAX_VERTEX_ATTRIBS); goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":262 * print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) * _gl_print_integer(' GL_MAX_VERTEX_ATTRIBS:', GL_MAX_VERTEX_ATTRIBS) * glClearColor(0., 0., 0., 1.) # <<<<<<<<<<<<<< * glEnable(GL_DEPTH_TEST) * glEnable(GL_CULL_FACE) */ glClearColor(0., 0., 0., 1.); /* "_glarea.pyx":263 * _gl_print_integer(' GL_MAX_VERTEX_ATTRIBS:', GL_MAX_VERTEX_ATTRIBS) * glClearColor(0., 0., 0., 1.) * glEnable(GL_DEPTH_TEST) # <<<<<<<<<<<<<< * glEnable(GL_CULL_FACE) * glCullFace(GL_BACK) */ glEnable(GL_DEPTH_TEST); /* "_glarea.pyx":264 * glClearColor(0., 0., 0., 1.) * glEnable(GL_DEPTH_TEST) * glEnable(GL_CULL_FACE) # <<<<<<<<<<<<<< * glCullFace(GL_BACK) * glFrontFace(GL_CCW) */ glEnable(GL_CULL_FACE); /* "_glarea.pyx":265 * glEnable(GL_DEPTH_TEST) * glEnable(GL_CULL_FACE) * glCullFace(GL_BACK) # <<<<<<<<<<<<<< * glFrontFace(GL_CCW) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) */ glCullFace(GL_BACK); /* "_glarea.pyx":266 * glEnable(GL_CULL_FACE) * glCullFace(GL_BACK) * glFrontFace(GL_CCW) # <<<<<<<<<<<<<< * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_init_buffers() */ glFrontFace(GL_CCW); /* "_glarea.pyx":267 * glCullFace(GL_BACK) * glFrontFace(GL_CCW) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # <<<<<<<<<<<<<< * gl_init_buffers() * */ glClear((GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); /* "_glarea.pyx":268 * glFrontFace(GL_CCW) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_init_buffers() # <<<<<<<<<<<<<< * * def gl_exit(): */ __pyx_f_7_gldraw_gl_init_buffers(); /* "_glarea.pyx":243 * print(msg, i) * * def gl_init(): # <<<<<<<<<<<<<< * if DEBUG_MSG: * print('GL Strings:') */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("_glarea.gl_init", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":270 * gl_init_buffers() * * def gl_exit(): # <<<<<<<<<<<<<< * gl_delete_buffers() * cdef GLuint prog #px+ */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_13gl_exit(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_13gl_exit = {"gl_exit", (PyCFunction)__pyx_pw_7_glarea_13gl_exit, METH_NOARGS, 0}; static PyObject *__pyx_pw_7_glarea_13gl_exit(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_exit (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_12gl_exit(__pyx_self); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_12gl_exit(CYTHON_UNUSED PyObject *__pyx_self) { __pyx_t_2gl_GLuint __pyx_v_prog; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; __pyx_t_2gl_GLuint __pyx_t_6; int __pyx_t_7; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_exit", 0); /* "_glarea.pyx":271 * * def gl_exit(): * gl_delete_buffers() # <<<<<<<<<<<<<< * cdef GLuint prog #px+ * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: */ __pyx_f_7_gldraw_gl_delete_buffers(); /* "_glarea.pyx":273 * gl_delete_buffers() * cdef GLuint prog #px+ * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: # <<<<<<<<<<<<<< * if prog > 0: * glDeleteProgram(prog) */ __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__pyx_v_7_glarea_program.prog_render); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyInt_From_unsigned_int(__pyx_v_7_glarea_program.prog_hud); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__pyx_v_7_glarea_program.prog_pick); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; for (;;) { if (__pyx_t_5 >= 3) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __pyx_t_6 = __Pyx_PyInt_As_unsigned_int(__pyx_t_4); if (unlikely((__pyx_t_6 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_prog = __pyx_t_6; /* "_glarea.pyx":274 * cdef GLuint prog #px+ * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: * if prog > 0: # <<<<<<<<<<<<<< * glDeleteProgram(prog) * program.prog_render = 0 */ __pyx_t_7 = ((__pyx_v_prog > 0) != 0); if (__pyx_t_7) { /* "_glarea.pyx":275 * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: * if prog > 0: * glDeleteProgram(prog) # <<<<<<<<<<<<<< * program.prog_render = 0 * program.prog_hud = 0 */ glDeleteProgram(__pyx_v_prog); goto __pyx_L5; } __pyx_L5:; /* "_glarea.pyx":273 * gl_delete_buffers() * cdef GLuint prog #px+ * for prog in [program.prog_render, program.prog_hud, program.prog_pick]: # <<<<<<<<<<<<<< * if prog > 0: * glDeleteProgram(prog) */ } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":276 * if prog > 0: * glDeleteProgram(prog) * program.prog_render = 0 # <<<<<<<<<<<<<< * program.prog_hud = 0 * program.prog_pick = 0 */ __pyx_v_7_glarea_program.prog_render = 0; /* "_glarea.pyx":277 * glDeleteProgram(prog) * program.prog_render = 0 * program.prog_hud = 0 # <<<<<<<<<<<<<< * program.prog_pick = 0 * */ __pyx_v_7_glarea_program.prog_hud = 0; /* "_glarea.pyx":278 * program.prog_render = 0 * program.prog_hud = 0 * program.prog_pick = 0 # <<<<<<<<<<<<<< * * def gl_resize(width, height): */ __pyx_v_7_glarea_program.prog_pick = 0; /* "_glarea.pyx":270 * gl_init_buffers() * * def gl_exit(): # <<<<<<<<<<<<<< * gl_delete_buffers() * cdef GLuint prog #px+ */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.gl_exit", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":280 * program.prog_pick = 0 * * def gl_resize(width, height): # <<<<<<<<<<<<<< * terrain.width = width * terrain.height = height */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_15gl_resize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_15gl_resize = {"gl_resize", (PyCFunction)__pyx_pw_7_glarea_15gl_resize, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7_glarea_15gl_resize(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_width = 0; PyObject *__pyx_v_height = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_resize (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_width,&__pyx_n_s_height,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_width)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_height)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_resize", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_resize") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_width = values[0]; __pyx_v_height = values[1]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_resize", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_resize", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_14gl_resize(__pyx_self, __pyx_v_width, __pyx_v_height); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_14gl_resize(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_width, PyObject *__pyx_v_height) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_resize", 0); /* "_glarea.pyx":281 * * def gl_resize(width, height): * terrain.width = width # <<<<<<<<<<<<<< * terrain.height = height * glViewport(0, 0, terrain.width, terrain.height) */ __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_width); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.width = __pyx_t_1; /* "_glarea.pyx":282 * def gl_resize(width, height): * terrain.width = width * terrain.height = height # <<<<<<<<<<<<<< * glViewport(0, 0, terrain.width, terrain.height) * _update_projection_matrix() */ __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_height); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_7_glarea_terrain.height = __pyx_t_1; /* "_glarea.pyx":283 * terrain.width = width * terrain.height = height * glViewport(0, 0, terrain.width, terrain.height) # <<<<<<<<<<<<<< * _update_projection_matrix() * */ glViewport(0, 0, __pyx_v_7_glarea_terrain.width, __pyx_v_7_glarea_terrain.height); /* "_glarea.pyx":284 * terrain.height = height * glViewport(0, 0, terrain.width, terrain.height) * _update_projection_matrix() # <<<<<<<<<<<<<< * * ### render functions */ __pyx_f_7_glarea__update_projection_matrix(); /* "_glarea.pyx":280 * program.prog_pick = 0 * * def gl_resize(width, height): # <<<<<<<<<<<<<< * terrain.width = width * terrain.height = height */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.gl_resize", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":288 * ### render functions * * cdef void _gl_set_matrix(GLint location, mat4 &matrix): #px/ # <<<<<<<<<<<<<< * #def _gl_set_matrix(location, matrix): * glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]) #px/ */ static void __pyx_f_7_glarea__gl_set_matrix(__pyx_t_2gl_GLint __pyx_v_location, __pyx_t_7_gldraw_vec4 *__pyx_v_matrix) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_gl_set_matrix", 0); /* "_glarea.pyx":290 * cdef void _gl_set_matrix(GLint location, mat4 &matrix): #px/ * #def _gl_set_matrix(location, matrix): * glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]) #px/ # <<<<<<<<<<<<<< * #glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * */ glUniformMatrix4fv(__pyx_v_location, 1, GL_FALSE, (&((__pyx_v_matrix[0])[0]))); /* "_glarea.pyx":288 * ### render functions * * cdef void _gl_set_matrix(GLint location, mat4 &matrix): #px/ # <<<<<<<<<<<<<< * #def _gl_set_matrix(location, matrix): * glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]) #px/ */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":293 * #glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * * def gl_render(): # <<<<<<<<<<<<<< * if DEBUG_PICK: * _set_picking_matrix_identity() */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_17gl_render(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_17gl_render = {"gl_render", (PyCFunction)__pyx_pw_7_glarea_17gl_render, METH_NOARGS, 0}; static PyObject *__pyx_pw_7_glarea_17gl_render(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_render (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_16gl_render(__pyx_self); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_16gl_render(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_render", 0); /* "_glarea.pyx":294 * * def gl_render(): * if DEBUG_PICK: # <<<<<<<<<<<<<< * _set_picking_matrix_identity() * _gl_render_pick() */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG_PICK); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":295 * def gl_render(): * if DEBUG_PICK: * _set_picking_matrix_identity() # <<<<<<<<<<<<<< * _gl_render_pick() * else: */ __pyx_f_7_glarea__set_picking_matrix_identity(); /* "_glarea.pyx":296 * if DEBUG_PICK: * _set_picking_matrix_identity() * _gl_render_pick() # <<<<<<<<<<<<<< * else: * glUseProgram(program.prog_render) */ __pyx_f_7_glarea__gl_render_pick(); goto __pyx_L3; } /*else*/ { /* "_glarea.pyx":298 * _gl_render_pick() * else: * glUseProgram(program.prog_render) # <<<<<<<<<<<<<< * IF SOURCEGLVERSION == 'GL': #px/ * #if True: */ glUseProgram(__pyx_v_7_glarea_program.prog_render); /* "_glarea.pyx":301 * IF SOURCEGLVERSION == 'GL': #px/ * #if True: * if frustum.multisample: # <<<<<<<<<<<<<< * glEnable(GL_MULTISAMPLE) * else: */ __pyx_t_2 = (__pyx_v_7_glarea_frustum.multisample != 0); if (__pyx_t_2) { /* "_glarea.pyx":302 * #if True: * if frustum.multisample: * glEnable(GL_MULTISAMPLE) # <<<<<<<<<<<<<< * else: * glDisable(GL_MULTISAMPLE) */ glEnable(GL_MULTISAMPLE); goto __pyx_L4; } /*else*/ { /* "_glarea.pyx":304 * glEnable(GL_MULTISAMPLE) * else: * glDisable(GL_MULTISAMPLE) # <<<<<<<<<<<<<< * glClearColor(terrain.red, terrain.green, terrain.blue, 1.) * _gl_set_matrix(program.projection_location, frustum.projection_matrix) */ glDisable(GL_MULTISAMPLE); } __pyx_L4:; /* "_glarea.pyx":305 * else: * glDisable(GL_MULTISAMPLE) * glClearColor(terrain.red, terrain.green, terrain.blue, 1.) # <<<<<<<<<<<<<< * _gl_set_matrix(program.projection_location, frustum.projection_matrix) * _gl_set_matrix(program.modelview_location, frustum.modelview_matrix) */ glClearColor(__pyx_v_7_glarea_terrain.red, __pyx_v_7_glarea_terrain.green, __pyx_v_7_glarea_terrain.blue, 1.); /* "_glarea.pyx":306 * glDisable(GL_MULTISAMPLE) * glClearColor(terrain.red, terrain.green, terrain.blue, 1.) * _gl_set_matrix(program.projection_location, frustum.projection_matrix) # <<<<<<<<<<<<<< * _gl_set_matrix(program.modelview_location, frustum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.projection_location, __pyx_v_7_glarea_frustum.projection_matrix); /* "_glarea.pyx":307 * glClearColor(terrain.red, terrain.green, terrain.blue, 1.) * _gl_set_matrix(program.projection_location, frustum.projection_matrix) * _gl_set_matrix(program.modelview_location, frustum.modelview_matrix) # <<<<<<<<<<<<<< * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_draw_cube() */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.modelview_location, __pyx_v_7_glarea_frustum.modelview_matrix); /* "_glarea.pyx":308 * _gl_set_matrix(program.projection_location, frustum.projection_matrix) * _gl_set_matrix(program.modelview_location, frustum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # <<<<<<<<<<<<<< * gl_draw_cube() * if DEBUG_DRAW: */ glClear((GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); /* "_glarea.pyx":309 * _gl_set_matrix(program.modelview_location, frustum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_draw_cube() # <<<<<<<<<<<<<< * if DEBUG_DRAW: * gl_draw_cube_debug() */ __pyx_f_7_gldraw_gl_draw_cube(); } __pyx_L3:; /* "_glarea.pyx":310 * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_draw_cube() * if DEBUG_DRAW: # <<<<<<<<<<<<<< * gl_draw_cube_debug() * */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG_DRAW); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":311 * gl_draw_cube() * if DEBUG_DRAW: * gl_draw_cube_debug() # <<<<<<<<<<<<<< * * def gl_render_select_debug(): */ __pyx_f_7_gldraw_gl_draw_cube_debug(); goto __pyx_L5; } __pyx_L5:; /* "_glarea.pyx":293 * #glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * * def gl_render(): # <<<<<<<<<<<<<< * if DEBUG_PICK: * _set_picking_matrix_identity() */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_glarea.gl_render", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":313 * gl_draw_cube_debug() * * def gl_render_select_debug(): # <<<<<<<<<<<<<< * cdef GLfloat selectdata[12] #px/ * #selectdata = [0.] * 12 */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_19gl_render_select_debug(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_19gl_render_select_debug = {"gl_render_select_debug", (PyCFunction)__pyx_pw_7_glarea_19gl_render_select_debug, METH_NOARGS, 0}; static PyObject *__pyx_pw_7_glarea_19gl_render_select_debug(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_render_select_debug (wrapper)", 0); __pyx_r = __pyx_pf_7_glarea_18gl_render_select_debug(__pyx_self); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_18gl_render_select_debug(CYTHON_UNUSED PyObject *__pyx_self) { __pyx_t_2gl_GLfloat __pyx_v_selectdata[12]; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_render_select_debug", 0); /* "_glarea.pyx":316 * cdef GLfloat selectdata[12] #px/ * #selectdata = [0.] * 12 * selectdata[0] = selection_debug_points.modelview1[0] # <<<<<<<<<<<<<< * selectdata[1] = selection_debug_points.modelview1[1] * selectdata[2] = selection_debug_points.modelview1[2] */ (__pyx_v_selectdata[0]) = (__pyx_v_7_glarea_selection_debug_points.modelview1[0]); /* "_glarea.pyx":317 * #selectdata = [0.] * 12 * selectdata[0] = selection_debug_points.modelview1[0] * selectdata[1] = selection_debug_points.modelview1[1] # <<<<<<<<<<<<<< * selectdata[2] = selection_debug_points.modelview1[2] * selectdata[3] = selection_debug_points.modelview2[0] */ (__pyx_v_selectdata[1]) = (__pyx_v_7_glarea_selection_debug_points.modelview1[1]); /* "_glarea.pyx":318 * selectdata[0] = selection_debug_points.modelview1[0] * selectdata[1] = selection_debug_points.modelview1[1] * selectdata[2] = selection_debug_points.modelview1[2] # <<<<<<<<<<<<<< * selectdata[3] = selection_debug_points.modelview2[0] * selectdata[4] = selection_debug_points.modelview2[1] */ (__pyx_v_selectdata[2]) = (__pyx_v_7_glarea_selection_debug_points.modelview1[2]); /* "_glarea.pyx":319 * selectdata[1] = selection_debug_points.modelview1[1] * selectdata[2] = selection_debug_points.modelview1[2] * selectdata[3] = selection_debug_points.modelview2[0] # <<<<<<<<<<<<<< * selectdata[4] = selection_debug_points.modelview2[1] * selectdata[5] = selection_debug_points.modelview2[2] */ (__pyx_v_selectdata[3]) = (__pyx_v_7_glarea_selection_debug_points.modelview2[0]); /* "_glarea.pyx":320 * selectdata[2] = selection_debug_points.modelview1[2] * selectdata[3] = selection_debug_points.modelview2[0] * selectdata[4] = selection_debug_points.modelview2[1] # <<<<<<<<<<<<<< * selectdata[5] = selection_debug_points.modelview2[2] * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 */ (__pyx_v_selectdata[4]) = (__pyx_v_7_glarea_selection_debug_points.modelview2[1]); /* "_glarea.pyx":321 * selectdata[3] = selection_debug_points.modelview2[0] * selectdata[4] = selection_debug_points.modelview2[1] * selectdata[5] = selection_debug_points.modelview2[2] # <<<<<<<<<<<<<< * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 */ (__pyx_v_selectdata[5]) = (__pyx_v_7_glarea_selection_debug_points.modelview2[2]); /* "_glarea.pyx":322 * selectdata[4] = selection_debug_points.modelview2[1] * selectdata[5] = selection_debug_points.modelview2[2] * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 # <<<<<<<<<<<<<< * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 * selectdata[8] = 0 */ if (unlikely(__pyx_v_7_glarea_terrain.width == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_selectdata[6]) = (((((double)(__pyx_v_7_glarea_selection_debug_points.viewport1[0])) / ((double)__pyx_v_7_glarea_terrain.width)) * 2.0) - 1.0); /* "_glarea.pyx":323 * selectdata[5] = selection_debug_points.modelview2[2] * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 # <<<<<<<<<<<<<< * selectdata[8] = 0 * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 */ if (unlikely(__pyx_v_7_glarea_terrain.height == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_selectdata[7]) = (((((double)(__pyx_v_7_glarea_selection_debug_points.viewport1[1])) / ((double)__pyx_v_7_glarea_terrain.height)) * 2.0) - 1.0); /* "_glarea.pyx":324 * selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 * selectdata[8] = 0 # <<<<<<<<<<<<<< * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 */ (__pyx_v_selectdata[8]) = 0.0; /* "_glarea.pyx":325 * selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 * selectdata[8] = 0 * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 # <<<<<<<<<<<<<< * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 * selectdata[11] = 0 */ if (unlikely(__pyx_v_7_glarea_terrain.width == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_selectdata[9]) = (((((double)(__pyx_v_7_glarea_selection_debug_points.viewport2[0])) / ((double)__pyx_v_7_glarea_terrain.width)) * 2.0) - 1.0); /* "_glarea.pyx":326 * selectdata[8] = 0 * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 # <<<<<<<<<<<<<< * selectdata[11] = 0 * gl_draw_select_debug(&selectdata[0], sizeof(selectdata), program.prog_hud) #px/ */ if (unlikely(__pyx_v_7_glarea_terrain.height == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_selectdata[10]) = (((((double)(__pyx_v_7_glarea_selection_debug_points.viewport2[1])) / ((double)__pyx_v_7_glarea_terrain.height)) * 2.0) - 1.0); /* "_glarea.pyx":327 * selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 * selectdata[11] = 0 # <<<<<<<<<<<<<< * gl_draw_select_debug(&selectdata[0], sizeof(selectdata), program.prog_hud) #px/ * #gl_draw_select_debug(selectdata, 0, program.prog_hud) */ (__pyx_v_selectdata[11]) = 0.0; /* "_glarea.pyx":328 * selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 * selectdata[11] = 0 * gl_draw_select_debug(&selectdata[0], sizeof(selectdata), program.prog_hud) #px/ # <<<<<<<<<<<<<< * #gl_draw_select_debug(selectdata, 0, program.prog_hud) * */ __pyx_f_7_gldraw_gl_draw_select_debug((&(__pyx_v_selectdata[0])), (sizeof(__pyx_v_selectdata)), __pyx_v_7_glarea_program.prog_hud); /* "_glarea.pyx":313 * gl_draw_cube_debug() * * def gl_render_select_debug(): # <<<<<<<<<<<<<< * cdef GLfloat selectdata[12] #px/ * #selectdata = [0.] * 12 */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("_glarea.gl_render_select_debug", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":334 * ### picking functions * * cdef void _gl_render_pick(): #px/ # <<<<<<<<<<<<<< * #def _gl_render_pick(): * glUseProgram(program.prog_pick) */ static void __pyx_f_7_glarea__gl_render_pick(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_gl_render_pick", 0); /* "_glarea.pyx":336 * cdef void _gl_render_pick(): #px/ * #def _gl_render_pick(): * glUseProgram(program.prog_pick) # <<<<<<<<<<<<<< * IF SOURCEGLVERSION == 'GL': #px/ * #if True: */ glUseProgram(__pyx_v_7_glarea_program.prog_pick); /* "_glarea.pyx":339 * IF SOURCEGLVERSION == 'GL': #px/ * #if True: * glDisable(GL_MULTISAMPLE) # <<<<<<<<<<<<<< * glClearColor(0., 0., 0., 1.) * _gl_set_matrix(program.picking_location, frustum.picking_matrix) */ glDisable(GL_MULTISAMPLE); /* "_glarea.pyx":340 * #if True: * glDisable(GL_MULTISAMPLE) * glClearColor(0., 0., 0., 1.) # <<<<<<<<<<<<<< * _gl_set_matrix(program.picking_location, frustum.picking_matrix) * _gl_set_matrix(program.projection_pick_location, frustum.projection_matrix) */ glClearColor(0., 0., 0., 1.); /* "_glarea.pyx":341 * glDisable(GL_MULTISAMPLE) * glClearColor(0., 0., 0., 1.) * _gl_set_matrix(program.picking_location, frustum.picking_matrix) # <<<<<<<<<<<<<< * _gl_set_matrix(program.projection_pick_location, frustum.projection_matrix) * _gl_set_matrix(program.modelview_pick_location, frustum.modelview_matrix) */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.picking_location, __pyx_v_7_glarea_frustum.picking_matrix); /* "_glarea.pyx":342 * glClearColor(0., 0., 0., 1.) * _gl_set_matrix(program.picking_location, frustum.picking_matrix) * _gl_set_matrix(program.projection_pick_location, frustum.projection_matrix) # <<<<<<<<<<<<<< * _gl_set_matrix(program.modelview_pick_location, frustum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.projection_pick_location, __pyx_v_7_glarea_frustum.projection_matrix); /* "_glarea.pyx":343 * _gl_set_matrix(program.picking_location, frustum.picking_matrix) * _gl_set_matrix(program.projection_pick_location, frustum.projection_matrix) * _gl_set_matrix(program.modelview_pick_location, frustum.modelview_matrix) # <<<<<<<<<<<<<< * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_pick_cube() */ __pyx_f_7_glarea__gl_set_matrix(__pyx_v_7_glarea_program.modelview_pick_location, __pyx_v_7_glarea_frustum.modelview_matrix); /* "_glarea.pyx":344 * _gl_set_matrix(program.projection_pick_location, frustum.projection_matrix) * _gl_set_matrix(program.modelview_pick_location, frustum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # <<<<<<<<<<<<<< * gl_pick_cube() * */ glClear((GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); /* "_glarea.pyx":345 * _gl_set_matrix(program.modelview_pick_location, frustum.modelview_matrix) * glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) * gl_pick_cube() # <<<<<<<<<<<<<< * * cpdef gl_pick_polygons(int x, int y): #px/ */ __pyx_f_7_gldraw_gl_pick_cube(); /* "_glarea.pyx":334 * ### picking functions * * cdef void _gl_render_pick(): #px/ # <<<<<<<<<<<<<< * #def _gl_render_pick(): * glUseProgram(program.prog_pick) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":347 * gl_pick_cube() * * cpdef gl_pick_polygons(int x, int y): #px/ # <<<<<<<<<<<<<< * #def gl_pick_polygons(x, y): * cdef unsigned char pixel[3] #px+ */ static PyObject *__pyx_pw_7_glarea_21gl_pick_polygons(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_f_7_glarea_gl_pick_polygons(int __pyx_v_x, int __pyx_v_y, CYTHON_UNUSED int __pyx_skip_dispatch) { unsigned char __pyx_v_pixel[3]; long __pyx_v_index; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_pick_polygons", 0); /* "_glarea.pyx":351 * cdef unsigned char pixel[3] #px+ * * if not (0 <= x < terrain.width and 0 <= y < terrain.height): # <<<<<<<<<<<<<< * return 0 * _set_picking_matrix(x, y) */ __pyx_t_2 = (0 <= __pyx_v_x); if (__pyx_t_2) { __pyx_t_2 = (__pyx_v_x < __pyx_v_7_glarea_terrain.width); } __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { } else { __pyx_t_1 = __pyx_t_3; goto __pyx_L4_bool_binop_done; } __pyx_t_3 = (0 <= __pyx_v_y); if (__pyx_t_3) { __pyx_t_3 = (__pyx_v_y < __pyx_v_7_glarea_terrain.height); } __pyx_t_2 = (__pyx_t_3 != 0); __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; __pyx_t_2 = ((!__pyx_t_1) != 0); if (__pyx_t_2) { /* "_glarea.pyx":352 * * if not (0 <= x < terrain.width and 0 <= y < terrain.height): * return 0 # <<<<<<<<<<<<<< * _set_picking_matrix(x, y) * _gl_render_pick() */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_int_0); __pyx_r = __pyx_int_0; goto __pyx_L0; } /* "_glarea.pyx":353 * if not (0 <= x < terrain.width and 0 <= y < terrain.height): * return 0 * _set_picking_matrix(x, y) # <<<<<<<<<<<<<< * _gl_render_pick() * glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) #px/ */ __pyx_f_7_glarea__set_picking_matrix(__pyx_v_x, __pyx_v_y); /* "_glarea.pyx":354 * return 0 * _set_picking_matrix(x, y) * _gl_render_pick() # <<<<<<<<<<<<<< * glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) #px/ * #pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] */ __pyx_f_7_glarea__gl_render_pick(); /* "_glarea.pyx":355 * _set_picking_matrix(x, y) * _gl_render_pick() * glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) #px/ # <<<<<<<<<<<<<< * #pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] * index = pixel[0]<<4 | pixel[1] | pixel[2]>>4 */ glReadPixels(__pyx_v_x, __pyx_v_y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, __pyx_v_pixel); /* "_glarea.pyx":357 * glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) #px/ * #pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] * index = pixel[0]<<4 | pixel[1] | pixel[2]>>4 # <<<<<<<<<<<<<< * return index * */ __pyx_v_index = ((((__pyx_v_pixel[0]) << 4) | (__pyx_v_pixel[1])) | ((__pyx_v_pixel[2]) >> 4)); /* "_glarea.pyx":358 * #pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] * index = pixel[0]<<4 | pixel[1] | pixel[2]>>4 * return index # <<<<<<<<<<<<<< * * cdef void _modelview_to_viewport(float *vvect, int *mvect): #px/ */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_PyInt_From_long(__pyx_v_index); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; /* "_glarea.pyx":347 * gl_pick_cube() * * cpdef gl_pick_polygons(int x, int y): #px/ # <<<<<<<<<<<<<< * #def gl_pick_polygons(x, y): * cdef unsigned char pixel[3] #px+ */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.gl_pick_polygons", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_21gl_pick_polygons(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7_glarea_21gl_pick_polygons(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { int __pyx_v_x; int __pyx_v_y; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_pick_polygons (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_pick_polygons", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_pick_polygons") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_x = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_x == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_y == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_pick_polygons", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_pick_polygons", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_20gl_pick_polygons(__pyx_self, __pyx_v_x, __pyx_v_y); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_20gl_pick_polygons(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_x, int __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_pick_polygons", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = __pyx_f_7_glarea_gl_pick_polygons(__pyx_v_x, __pyx_v_y, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 347; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("_glarea.gl_pick_polygons", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":360 * return index * * cdef void _modelview_to_viewport(float *vvect, int *mvect): #px/ # <<<<<<<<<<<<<< * #def _modelview_to_viewport(vvect, mvect): * cdef vec4 *M #px+ */ static void __pyx_f_7_glarea__modelview_to_viewport(float *__pyx_v_vvect, int *__pyx_v_mvect) { __pyx_t_7_gldraw_vec4 *__pyx_v_M; __pyx_t_7_gldraw_vec4 *__pyx_v_P; float __pyx_v_u0; float __pyx_v_u1; float __pyx_v_u2; float __pyx_v_v0; float __pyx_v_v1; float __pyx_v_v3; __Pyx_RefNannyDeclarations int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_modelview_to_viewport", 0); /* "_glarea.pyx":366 * cdef float u0, u1, u2, v0, v1, v3 #px+ * * M = &frustum.modelview_matrix[0][0] #px/ # <<<<<<<<<<<<<< * #M = frustum.modelview_matrix * P = &frustum.projection_matrix[0][0] #px/ */ __pyx_v_M = ((__pyx_t_7_gldraw_vec4 *)(&((__pyx_v_7_glarea_frustum.modelview_matrix[0])[0]))); /* "_glarea.pyx":368 * M = &frustum.modelview_matrix[0][0] #px/ * #M = frustum.modelview_matrix * P = &frustum.projection_matrix[0][0] #px/ # <<<<<<<<<<<<<< * #P = frustum.projection_matrix * */ __pyx_v_P = ((__pyx_t_7_gldraw_vec4 *)(&((__pyx_v_7_glarea_frustum.projection_matrix[0])[0]))); /* "_glarea.pyx":373 * # u = M^T * vvect * #assert M[1][0] == 0 * u0 = M[0][0]*vvect[0] + M[1][0]*vvect[1] + M[2][0]*vvect[2] + M[3][0] # <<<<<<<<<<<<<< * u1 = M[0][1]*vvect[0] + M[1][1]*vvect[1] + M[2][1]*vvect[2] + M[3][1] * u2 = M[0][2]*vvect[0] + M[1][2]*vvect[1] + M[2][2]*vvect[2] + M[3][2] */ __pyx_v_u0 = ((((((__pyx_v_M[0])[0]) * (__pyx_v_vvect[0])) + (((__pyx_v_M[1])[0]) * (__pyx_v_vvect[1]))) + (((__pyx_v_M[2])[0]) * (__pyx_v_vvect[2]))) + ((__pyx_v_M[3])[0])); /* "_glarea.pyx":374 * #assert M[1][0] == 0 * u0 = M[0][0]*vvect[0] + M[1][0]*vvect[1] + M[2][0]*vvect[2] + M[3][0] * u1 = M[0][1]*vvect[0] + M[1][1]*vvect[1] + M[2][1]*vvect[2] + M[3][1] # <<<<<<<<<<<<<< * u2 = M[0][2]*vvect[0] + M[1][2]*vvect[1] + M[2][2]*vvect[2] + M[3][2] * #u3 = 1. */ __pyx_v_u1 = ((((((__pyx_v_M[0])[1]) * (__pyx_v_vvect[0])) + (((__pyx_v_M[1])[1]) * (__pyx_v_vvect[1]))) + (((__pyx_v_M[2])[1]) * (__pyx_v_vvect[2]))) + ((__pyx_v_M[3])[1])); /* "_glarea.pyx":375 * u0 = M[0][0]*vvect[0] + M[1][0]*vvect[1] + M[2][0]*vvect[2] + M[3][0] * u1 = M[0][1]*vvect[0] + M[1][1]*vvect[1] + M[2][1]*vvect[2] + M[3][1] * u2 = M[0][2]*vvect[0] + M[1][2]*vvect[1] + M[2][2]*vvect[2] + M[3][2] # <<<<<<<<<<<<<< * #u3 = 1. * */ __pyx_v_u2 = ((((((__pyx_v_M[0])[2]) * (__pyx_v_vvect[0])) + (((__pyx_v_M[1])[2]) * (__pyx_v_vvect[1]))) + (((__pyx_v_M[2])[2]) * (__pyx_v_vvect[2]))) + ((__pyx_v_M[3])[2])); /* "_glarea.pyx":379 * * # v = P * u * v0 = P[0][0] * u0 + P[1][0] * u1 + P[2][0] * u2 + P[3][0] #* u3 # <<<<<<<<<<<<<< * v1 = P[0][1] * u0 + P[1][1] * u1 + P[2][1] * u2 + P[3][1] #* u3 * #v2 = P[0][2] * u0 + P[1][2] * u1 + P[2][2] * u2 + P[3][2] * u3 */ __pyx_v_v0 = ((((((__pyx_v_P[0])[0]) * __pyx_v_u0) + (((__pyx_v_P[1])[0]) * __pyx_v_u1)) + (((__pyx_v_P[2])[0]) * __pyx_v_u2)) + ((__pyx_v_P[3])[0])); /* "_glarea.pyx":380 * # v = P * u * v0 = P[0][0] * u0 + P[1][0] * u1 + P[2][0] * u2 + P[3][0] #* u3 * v1 = P[0][1] * u0 + P[1][1] * u1 + P[2][1] * u2 + P[3][1] #* u3 # <<<<<<<<<<<<<< * #v2 = P[0][2] * u0 + P[1][2] * u1 + P[2][2] * u2 + P[3][2] * u3 * v3 = P[0][3] * u0 + P[1][3] * u1 + P[2][3] * u2 + P[3][3] #* u3 */ __pyx_v_v1 = ((((((__pyx_v_P[0])[1]) * __pyx_v_u0) + (((__pyx_v_P[1])[1]) * __pyx_v_u1)) + (((__pyx_v_P[2])[1]) * __pyx_v_u2)) + ((__pyx_v_P[3])[1])); /* "_glarea.pyx":382 * v1 = P[0][1] * u0 + P[1][1] * u1 + P[2][1] * u2 + P[3][1] #* u3 * #v2 = P[0][2] * u0 + P[1][2] * u1 + P[2][2] * u2 + P[3][2] * u3 * v3 = P[0][3] * u0 + P[1][3] * u1 + P[2][3] * u2 + P[3][3] #* u3 # <<<<<<<<<<<<<< * * mvect[0] = int((v0 / v3 + 1) / 2 * terrain.width) */ __pyx_v_v3 = ((((((__pyx_v_P[0])[3]) * __pyx_v_u0) + (((__pyx_v_P[1])[3]) * __pyx_v_u1)) + (((__pyx_v_P[2])[3]) * __pyx_v_u2)) + ((__pyx_v_P[3])[3])); /* "_glarea.pyx":384 * v3 = P[0][3] * u0 + P[1][3] * u1 + P[2][3] * u2 + P[3][3] #* u3 * * mvect[0] = int((v0 / v3 + 1) / 2 * terrain.width) # <<<<<<<<<<<<<< * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) * */ if (unlikely(__pyx_v_v3 == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_mvect[0]) = ((int)((((__pyx_v_v0 / __pyx_v_v3) + 1.0) / 2.0) * __pyx_v_7_glarea_terrain.width)); /* "_glarea.pyx":385 * * mvect[0] = int((v0 / v3 + 1) / 2 * terrain.width) * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) # <<<<<<<<<<<<<< * * cdef void _viewport_to_modelview(int *vvect, float *mvect): #px/ */ if (unlikely(__pyx_v_v3 == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 385; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_mvect[1]) = ((int)((((__pyx_v_v1 / __pyx_v_v3) + 1.0) / 2.0) * __pyx_v_7_glarea_terrain.height)); /* "_glarea.pyx":360 * return index * * cdef void _modelview_to_viewport(float *vvect, int *mvect): #px/ # <<<<<<<<<<<<<< * #def _modelview_to_viewport(vvect, mvect): * cdef vec4 *M #px+ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_WriteUnraisable("_glarea._modelview_to_viewport", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":387 * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) * * cdef void _viewport_to_modelview(int *vvect, float *mvect): #px/ # <<<<<<<<<<<<<< * #def _viewport_to_modelview(vvect, mvect): * cdef vec4 *MT #px+ */ static void __pyx_f_7_glarea__viewport_to_modelview(int *__pyx_v_vvect, float *__pyx_v_mvect) { __pyx_t_7_gldraw_vec4 *__pyx_v_MT; __pyx_t_7_gldraw_vec4 *__pyx_v_P; float __pyx_v_u0; float __pyx_v_u1; float __pyx_v_u2; float __pyx_v_u3; float __pyx_v_v0; float __pyx_v_v1; float __pyx_v_v2; __Pyx_RefNannyDeclarations float __pyx_t_1; float __pyx_t_2; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_viewport_to_modelview", 0); /* "_glarea.pyx":393 * cdef float u0, u1, u2, u3, v0, v1, v2 #px+ * * v0 = vvect[0] / terrain.width * 2 - 1 # <<<<<<<<<<<<<< * v1 = vvect[1] / terrain.height * 2 - 1 * v2 = 0 */ if (unlikely(__pyx_v_7_glarea_terrain.width == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_v0 = (((((double)(__pyx_v_vvect[0])) / ((double)__pyx_v_7_glarea_terrain.width)) * 2.0) - 1.0); /* "_glarea.pyx":394 * * v0 = vvect[0] / terrain.width * 2 - 1 * v1 = vvect[1] / terrain.height * 2 - 1 # <<<<<<<<<<<<<< * v2 = 0 * #v3 = 1 */ if (unlikely(__pyx_v_7_glarea_terrain.height == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_v1 = (((((double)(__pyx_v_vvect[1])) / ((double)__pyx_v_7_glarea_terrain.height)) * 2.0) - 1.0); /* "_glarea.pyx":395 * v0 = vvect[0] / terrain.width * 2 - 1 * v1 = vvect[1] / terrain.height * 2 - 1 * v2 = 0 # <<<<<<<<<<<<<< * #v3 = 1 * */ __pyx_v_v2 = 0.0; /* "_glarea.pyx":403 * # 0 0 e c 0 0 0 D 0 0 cC 0 * # 0 0 d 0 0 0 C E 0 0 0 dD * P = &frustum.projection_matrix[0][0] #px/ # <<<<<<<<<<<<<< * #P = frustum.projection_matrix * # u = P^-1 * v */ __pyx_v_P = ((__pyx_t_7_gldraw_vec4 *)(&((__pyx_v_7_glarea_frustum.projection_matrix[0])[0]))); /* "_glarea.pyx":406 * #P = frustum.projection_matrix * # u = P^-1 * v * u0 = 1 / P[0][0] * v0 # <<<<<<<<<<<<<< * u1 = 1 / P[1][1] * v1 * u2 = 1 / P[2][3] */ if (unlikely(((__pyx_v_P[0])[0]) == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_u0 = ((1.0 / ((__pyx_v_P[0])[0])) * __pyx_v_v0); /* "_glarea.pyx":407 * # u = P^-1 * v * u0 = 1 / P[0][0] * v0 * u1 = 1 / P[1][1] * v1 # <<<<<<<<<<<<<< * u2 = 1 / P[2][3] * #assert u2 == -1 */ if (unlikely(((__pyx_v_P[1])[1]) == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_u1 = ((1.0 / ((__pyx_v_P[1])[1])) * __pyx_v_v1); /* "_glarea.pyx":408 * u0 = 1 / P[0][0] * v0 * u1 = 1 / P[1][1] * v1 * u2 = 1 / P[2][3] # <<<<<<<<<<<<<< * #assert u2 == -1 * u3 = - P[2][2] / P[3][2] / P[2][3] */ if (unlikely(((__pyx_v_P[2])[3]) == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_u2 = (1.0 / ((__pyx_v_P[2])[3])); /* "_glarea.pyx":410 * u2 = 1 / P[2][3] * #assert u2 == -1 * u3 = - P[2][2] / P[3][2] / P[2][3] # <<<<<<<<<<<<<< * * # MT * MT^-1 = I */ __pyx_t_1 = (-((__pyx_v_P[2])[2])); if (unlikely(((__pyx_v_P[3])[2]) == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_2 = (__pyx_t_1 / ((__pyx_v_P[3])[2])); if (unlikely(((__pyx_v_P[2])[3]) == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_u3 = (__pyx_t_2 / ((__pyx_v_P[2])[3])); /* "_glarea.pyx":417 * # f g h 0 c e h 0 0 0 1 0 W = -hz * # 0 0 z 1 U V W 1 0 0 0 1 * MT = &frustum.modelview_matrix[0][0] #px/ # <<<<<<<<<<<<<< * #MT = frustum.modelview_matrix * # v = M^-1 * u */ __pyx_v_MT = ((__pyx_t_7_gldraw_vec4 *)(&((__pyx_v_7_glarea_frustum.modelview_matrix[0])[0]))); /* "_glarea.pyx":420 * #MT = frustum.modelview_matrix * # v = M^-1 * u * v0 = MT[0][0]*u0 + MT[0][1]*u1 + MT[0][2]*u2 - MT[0][2] * MT[3][2]*u3 # <<<<<<<<<<<<<< * v1 = MT[1][0]*u0 + MT[1][1]*u1 + MT[1][2]*u2 - MT[1][2] * MT[3][2]*u3 * v2 = MT[2][0]*u0 + MT[2][1]*u1 + MT[2][2]*u2 - MT[2][2] * MT[3][2]*u3 */ __pyx_v_v0 = ((((((__pyx_v_MT[0])[0]) * __pyx_v_u0) + (((__pyx_v_MT[0])[1]) * __pyx_v_u1)) + (((__pyx_v_MT[0])[2]) * __pyx_v_u2)) - ((((__pyx_v_MT[0])[2]) * ((__pyx_v_MT[3])[2])) * __pyx_v_u3)); /* "_glarea.pyx":421 * # v = M^-1 * u * v0 = MT[0][0]*u0 + MT[0][1]*u1 + MT[0][2]*u2 - MT[0][2] * MT[3][2]*u3 * v1 = MT[1][0]*u0 + MT[1][1]*u1 + MT[1][2]*u2 - MT[1][2] * MT[3][2]*u3 # <<<<<<<<<<<<<< * v2 = MT[2][0]*u0 + MT[2][1]*u1 + MT[2][2]*u2 - MT[2][2] * MT[3][2]*u3 * #v3 = u3 */ __pyx_v_v1 = ((((((__pyx_v_MT[1])[0]) * __pyx_v_u0) + (((__pyx_v_MT[1])[1]) * __pyx_v_u1)) + (((__pyx_v_MT[1])[2]) * __pyx_v_u2)) - ((((__pyx_v_MT[1])[2]) * ((__pyx_v_MT[3])[2])) * __pyx_v_u3)); /* "_glarea.pyx":422 * v0 = MT[0][0]*u0 + MT[0][1]*u1 + MT[0][2]*u2 - MT[0][2] * MT[3][2]*u3 * v1 = MT[1][0]*u0 + MT[1][1]*u1 + MT[1][2]*u2 - MT[1][2] * MT[3][2]*u3 * v2 = MT[2][0]*u0 + MT[2][1]*u1 + MT[2][2]*u2 - MT[2][2] * MT[3][2]*u3 # <<<<<<<<<<<<<< * #v3 = u3 * */ __pyx_v_v2 = ((((((__pyx_v_MT[2])[0]) * __pyx_v_u0) + (((__pyx_v_MT[2])[1]) * __pyx_v_u1)) + (((__pyx_v_MT[2])[2]) * __pyx_v_u2)) - ((((__pyx_v_MT[2])[2]) * ((__pyx_v_MT[3])[2])) * __pyx_v_u3)); /* "_glarea.pyx":425 * #v3 = u3 * * mvect[0] = v0 / u3 # <<<<<<<<<<<<<< * mvect[1] = v1 / u3 * mvect[2] = v2 / u3 */ if (unlikely(__pyx_v_u3 == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_mvect[0]) = (__pyx_v_v0 / __pyx_v_u3); /* "_glarea.pyx":426 * * mvect[0] = v0 / u3 * mvect[1] = v1 / u3 # <<<<<<<<<<<<<< * mvect[2] = v2 / u3 * */ if (unlikely(__pyx_v_u3 == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_mvect[1]) = (__pyx_v_v1 / __pyx_v_u3); /* "_glarea.pyx":427 * mvect[0] = v0 / u3 * mvect[1] = v1 / u3 * mvect[2] = v2 / u3 # <<<<<<<<<<<<<< * * def get_cursor_angle(xi, yi, d): */ if (unlikely(__pyx_v_u3 == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } (__pyx_v_mvect[2]) = (__pyx_v_v2 / __pyx_v_u3); /* "_glarea.pyx":387 * mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) * * cdef void _viewport_to_modelview(int *vvect, float *mvect): #px/ # <<<<<<<<<<<<<< * #def _viewport_to_modelview(vvect, mvect): * cdef vec4 *MT #px+ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_WriteUnraisable("_glarea._viewport_to_modelview", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":429 * mvect[2] = v2 / u3 * * def get_cursor_angle(xi, yi, d): # <<<<<<<<<<<<<< * cdef float angle #px+ * cdef int i #px+ */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_23get_cursor_angle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_23get_cursor_angle = {"get_cursor_angle", (PyCFunction)__pyx_pw_7_glarea_23get_cursor_angle, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7_glarea_23get_cursor_angle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_xi = 0; PyObject *__pyx_v_yi = 0; PyObject *__pyx_v_d = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("get_cursor_angle (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_xi,&__pyx_n_s_yi,&__pyx_n_s_d,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_xi)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_yi)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("get_cursor_angle", 1, 3, 3, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_d)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("get_cursor_angle", 1, 3, 3, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_cursor_angle") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v_xi = values[0]; __pyx_v_yi = values[1]; __pyx_v_d = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("get_cursor_angle", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.get_cursor_angle", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7_glarea_22get_cursor_angle(__pyx_self, __pyx_v_xi, __pyx_v_yi, __pyx_v_d); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_22get_cursor_angle(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_xi, PyObject *__pyx_v_yi, PyObject *__pyx_v_d) { float __pyx_v_angle; int __pyx_v_i; float __pyx_v_x; float __pyx_v_y; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; float __pyx_t_5; double __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_cursor_angle", 0); /* "_glarea.pyx":433 * cdef int i #px+ * cdef float x, y #px+ * selection_debug_points.viewport1[0] = xi # <<<<<<<<<<<<<< * selection_debug_points.viewport1[1] = yi * _viewport_to_modelview(selection_debug_points.viewport1, selection_debug_points.modelview1) */ __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_xi); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 433; __pyx_clineno = __LINE__; goto __pyx_L1_error;} (__pyx_v_7_glarea_selection_debug_points.viewport1[0]) = __pyx_t_1; /* "_glarea.pyx":434 * cdef float x, y #px+ * selection_debug_points.viewport1[0] = xi * selection_debug_points.viewport1[1] = yi # <<<<<<<<<<<<<< * _viewport_to_modelview(selection_debug_points.viewport1, selection_debug_points.modelview1) * for i in range(3): */ __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_yi); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;} (__pyx_v_7_glarea_selection_debug_points.viewport1[1]) = __pyx_t_1; /* "_glarea.pyx":435 * selection_debug_points.viewport1[0] = xi * selection_debug_points.viewport1[1] = yi * _viewport_to_modelview(selection_debug_points.viewport1, selection_debug_points.modelview1) # <<<<<<<<<<<<<< * for i in range(3): * selection_debug_points.modelview2[i] = d[i] + selection_debug_points.modelview1[i] */ __pyx_f_7_glarea__viewport_to_modelview(__pyx_v_7_glarea_selection_debug_points.viewport1, __pyx_v_7_glarea_selection_debug_points.modelview1); /* "_glarea.pyx":436 * selection_debug_points.viewport1[1] = yi * _viewport_to_modelview(selection_debug_points.viewport1, selection_debug_points.modelview1) * for i in range(3): # <<<<<<<<<<<<<< * selection_debug_points.modelview2[i] = d[i] + selection_debug_points.modelview1[i] * _modelview_to_viewport(selection_debug_points.modelview2, selection_debug_points.viewport2) */ for (__pyx_t_1 = 0; __pyx_t_1 < 3; __pyx_t_1+=1) { __pyx_v_i = __pyx_t_1; /* "_glarea.pyx":437 * _viewport_to_modelview(selection_debug_points.viewport1, selection_debug_points.modelview1) * for i in range(3): * selection_debug_points.modelview2[i] = d[i] + selection_debug_points.modelview1[i] # <<<<<<<<<<<<<< * _modelview_to_viewport(selection_debug_points.modelview2, selection_debug_points.viewport2) * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] */ __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_d, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble((__pyx_v_7_glarea_selection_debug_points.modelview1[__pyx_v_i])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyNumber_Add(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_5 = __pyx_PyFloat_AsFloat(__pyx_t_4); if (unlikely((__pyx_t_5 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; (__pyx_v_7_glarea_selection_debug_points.modelview2[__pyx_v_i]) = __pyx_t_5; } /* "_glarea.pyx":438 * for i in range(3): * selection_debug_points.modelview2[i] = d[i] + selection_debug_points.modelview1[i] * _modelview_to_viewport(selection_debug_points.modelview2, selection_debug_points.viewport2) # <<<<<<<<<<<<<< * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] */ __pyx_f_7_glarea__modelview_to_viewport(__pyx_v_7_glarea_selection_debug_points.modelview2, __pyx_v_7_glarea_selection_debug_points.viewport2); /* "_glarea.pyx":439 * selection_debug_points.modelview2[i] = d[i] + selection_debug_points.modelview1[i] * _modelview_to_viewport(selection_debug_points.modelview2, selection_debug_points.viewport2) * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] # <<<<<<<<<<<<<< * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] * angle = atan2(x, y) * 180.0 / M_PI */ __pyx_v_x = ((__pyx_v_7_glarea_selection_debug_points.viewport1[0]) - (__pyx_v_7_glarea_selection_debug_points.viewport2[0])); /* "_glarea.pyx":440 * _modelview_to_viewport(selection_debug_points.modelview2, selection_debug_points.viewport2) * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] # <<<<<<<<<<<<<< * angle = atan2(x, y) * 180.0 / M_PI * return angle */ __pyx_v_y = ((__pyx_v_7_glarea_selection_debug_points.viewport1[1]) - (__pyx_v_7_glarea_selection_debug_points.viewport2[1])); /* "_glarea.pyx":441 * x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] * angle = atan2(x, y) * 180.0 / M_PI # <<<<<<<<<<<<<< * return angle * */ __pyx_t_6 = (atan2(__pyx_v_x, __pyx_v_y) * 180.0); if (unlikely(M_PI == 0)) { #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); #endif PyErr_SetString(PyExc_ZeroDivisionError, "float division"); #ifdef WITH_THREAD PyGILState_Release(__pyx_gilstate_save); #endif {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_angle = (__pyx_t_6 / M_PI); /* "_glarea.pyx":442 * y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] * angle = atan2(x, y) * 180.0 / M_PI * return angle # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = PyFloat_FromDouble(__pyx_v_angle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; /* "_glarea.pyx":429 * mvect[2] = v2 / u3 * * def get_cursor_angle(xi, yi, d): # <<<<<<<<<<<<<< * cdef float angle #px+ * cdef int i #px+ */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("_glarea.get_cursor_angle", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":447 * ### shader functions * * cdef void _gl_print_shader_log(GLuint shader): #px/ # <<<<<<<<<<<<<< * #def _gl_print_shader_log(shader): * cdef GLint log_len #px+ */ static void __pyx_f_7_glarea__gl_print_shader_log(__pyx_t_2gl_GLuint __pyx_v_shader) { __pyx_t_2gl_GLint __pyx_v_log_len; __pyx_t_2gl_GLsizei __pyx_v_length; char __pyx_v_log[1024]; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_shader_log", 0); /* "_glarea.pyx":452 * cdef GLsizei length #px+ * cdef char log[1024] #px+ * glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len) #px/ # <<<<<<<<<<<<<< * #log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) * if log_len > 0: */ glGetShaderiv(__pyx_v_shader, GL_INFO_LOG_LENGTH, (&__pyx_v_log_len)); /* "_glarea.pyx":454 * glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len) #px/ * #log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) * if log_len > 0: # <<<<<<<<<<<<<< * print('==== Error compiling shader:') * glGetShaderInfoLog(shader, 1023, &length, log) #px/ */ __pyx_t_1 = ((__pyx_v_log_len > 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":455 * #log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) * if log_len > 0: * print('==== Error compiling shader:') # <<<<<<<<<<<<<< * glGetShaderInfoLog(shader, 1023, &length, log) #px/ * #log = glGetShaderInfoLog(shader) */ __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":456 * if log_len > 0: * print('==== Error compiling shader:') * glGetShaderInfoLog(shader, 1023, &length, log) #px/ # <<<<<<<<<<<<<< * #log = glGetShaderInfoLog(shader) * print(log.decode('utf-8').rstrip()) */ glGetShaderInfoLog(__pyx_v_shader, 1023, (&__pyx_v_length), __pyx_v_log); /* "_glarea.pyx":458 * glGetShaderInfoLog(shader, 1023, &length, log) #px/ * #log = glGetShaderInfoLog(shader) * print(log.decode('utf-8').rstrip()) # <<<<<<<<<<<<<< * print('====') * else: */ __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_log, 0, strlen(__pyx_v_log), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_rstrip); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = NULL; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } if (__pyx_t_3) { __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } else { __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":459 * #log = glGetShaderInfoLog(shader) * print(log.decode('utf-8').rstrip()) * print('====') # <<<<<<<<<<<<<< * else: * print('==== Error compiling shader (no log)') */ __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L3; } /*else*/ { /* "_glarea.pyx":461 * print('====') * else: * print('==== Error compiling shader (no log)') # <<<<<<<<<<<<<< * * cdef void _gl_print_program_log(GLuint program): #px/ */ __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_L3:; /* "_glarea.pyx":447 * ### shader functions * * cdef void _gl_print_shader_log(GLuint shader): #px/ # <<<<<<<<<<<<<< * #def _gl_print_shader_log(shader): * cdef GLint log_len #px+ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("_glarea._gl_print_shader_log", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":463 * print('==== Error compiling shader (no log)') * * cdef void _gl_print_program_log(GLuint program): #px/ # <<<<<<<<<<<<<< * #def _gl_print_program_log(program): * cdef GLint log_len #px+ */ static void __pyx_f_7_glarea__gl_print_program_log(__pyx_t_2gl_GLuint __pyx_v_program) { __pyx_t_2gl_GLint __pyx_v_log_len; __pyx_t_2gl_GLsizei __pyx_v_length; char __pyx_v_log[1024]; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_program_log", 0); /* "_glarea.pyx":468 * cdef GLsizei length #px+ * cdef char log[1024] #px+ * glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len) #px/ # <<<<<<<<<<<<<< * #log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) * if log_len > 0: */ glGetProgramiv(__pyx_v_program, GL_INFO_LOG_LENGTH, (&__pyx_v_log_len)); /* "_glarea.pyx":470 * glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len) #px/ * #log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) * if log_len > 0: # <<<<<<<<<<<<<< * print('==== Error linking shader program:') * glGetProgramInfoLog(program, 1023, &length, log) #px/ */ __pyx_t_1 = ((__pyx_v_log_len > 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":471 * #log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) * if log_len > 0: * print('==== Error linking shader program:') # <<<<<<<<<<<<<< * glGetProgramInfoLog(program, 1023, &length, log) #px/ * #log = glGetProgramInfoLog(program) */ __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":472 * if log_len > 0: * print('==== Error linking shader program:') * glGetProgramInfoLog(program, 1023, &length, log) #px/ # <<<<<<<<<<<<<< * #log = glGetProgramInfoLog(program) * print(log.decode('utf-8').rstrip()) */ glGetProgramInfoLog(__pyx_v_program, 1023, (&__pyx_v_length), __pyx_v_log); /* "_glarea.pyx":474 * glGetProgramInfoLog(program, 1023, &length, log) #px/ * #log = glGetProgramInfoLog(program) * print(log.decode('utf-8').rstrip()) # <<<<<<<<<<<<<< * print('====') * else: */ __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_log, 0, strlen(__pyx_v_log), NULL, NULL, PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_rstrip); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = NULL; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } if (__pyx_t_3) { __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } else { __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":475 * #log = glGetProgramInfoLog(program) * print(log.decode('utf-8').rstrip()) * print('====') # <<<<<<<<<<<<<< * else: * print('==== Error linking shader program (no log)') */ __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L3; } /*else*/ { /* "_glarea.pyx":477 * print('====') * else: * print('==== Error linking shader program (no log)') # <<<<<<<<<<<<<< * * cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): #px/ */ __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_L3:; /* "_glarea.pyx":463 * print('==== Error compiling shader (no log)') * * cdef void _gl_print_program_log(GLuint program): #px/ # <<<<<<<<<<<<<< * #def _gl_print_program_log(program): * cdef GLint log_len #px+ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("_glarea._gl_print_program_log", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":479 * print('==== Error linking shader program (no log)') * * cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): #px/ # <<<<<<<<<<<<<< * #def _gl_create_compiled_shader(shadertype, source): * cdef GLuint shader #px+ */ static __pyx_t_2gl_GLuint __pyx_f_7_glarea__gl_create_compiled_shader(__pyx_t_2gl_GLenum __pyx_v_shadertype, PyObject *__pyx_v_source) { __pyx_t_2gl_GLuint __pyx_v_shader; const GLchar* __pyx_v_pchar; __pyx_t_2gl_GLint __pyx_v_compile_status; __pyx_t_2gl_GLuint __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; char *__pyx_t_3; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_create_compiled_shader", 0); /* "_glarea.pyx":485 * cdef GLint compile_status #px+ * * shader = glCreateShader(shadertype) # <<<<<<<<<<<<<< * if shader == 0: * print('Failed to create shader') */ __pyx_v_shader = glCreateShader(__pyx_v_shadertype); /* "_glarea.pyx":486 * * shader = glCreateShader(shadertype) * if shader == 0: # <<<<<<<<<<<<<< * print('Failed to create shader') * return 0 */ __pyx_t_1 = ((__pyx_v_shader == 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":487 * shader = glCreateShader(shadertype) * if shader == 0: * print('Failed to create shader') # <<<<<<<<<<<<<< * return 0 * pchar = source #px+ */ __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":488 * if shader == 0: * print('Failed to create shader') * return 0 # <<<<<<<<<<<<<< * pchar = source #px+ * glShaderSource(shader, 1, &pchar, NULL) #px/ */ __pyx_r = 0; goto __pyx_L0; } /* "_glarea.pyx":489 * print('Failed to create shader') * return 0 * pchar = source #px+ # <<<<<<<<<<<<<< * glShaderSource(shader, 1, &pchar, NULL) #px/ * #glShaderSource(shader, source.decode('utf-8')) # PyOpenGL needs str currently */ __pyx_t_3 = __Pyx_PyObject_AsString(__pyx_v_source); if (unlikely((!__pyx_t_3) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_pchar = ((const GLchar*)((char *)__pyx_t_3)); /* "_glarea.pyx":490 * return 0 * pchar = source #px+ * glShaderSource(shader, 1, &pchar, NULL) #px/ # <<<<<<<<<<<<<< * #glShaderSource(shader, source.decode('utf-8')) # PyOpenGL needs str currently * glCompileShader(shader) */ glShaderSource(__pyx_v_shader, 1, (&__pyx_v_pchar), NULL); /* "_glarea.pyx":492 * glShaderSource(shader, 1, &pchar, NULL) #px/ * #glShaderSource(shader, source.decode('utf-8')) # PyOpenGL needs str currently * glCompileShader(shader) # <<<<<<<<<<<<<< * glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status) #px/ * #compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) */ glCompileShader(__pyx_v_shader); /* "_glarea.pyx":493 * #glShaderSource(shader, source.decode('utf-8')) # PyOpenGL needs str currently * glCompileShader(shader) * glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status) #px/ # <<<<<<<<<<<<<< * #compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) * if not compile_status: */ glGetShaderiv(__pyx_v_shader, GL_COMPILE_STATUS, (&__pyx_v_compile_status)); /* "_glarea.pyx":495 * glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status) #px/ * #compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) * if not compile_status: # <<<<<<<<<<<<<< * _gl_print_shader_log(shader) * return 0 */ __pyx_t_1 = ((!(__pyx_v_compile_status != 0)) != 0); if (__pyx_t_1) { /* "_glarea.pyx":496 * #compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) * if not compile_status: * _gl_print_shader_log(shader) # <<<<<<<<<<<<<< * return 0 * return shader */ __pyx_f_7_glarea__gl_print_shader_log(__pyx_v_shader); /* "_glarea.pyx":497 * if not compile_status: * _gl_print_shader_log(shader) * return 0 # <<<<<<<<<<<<<< * return shader * */ __pyx_r = 0; goto __pyx_L0; } /* "_glarea.pyx":498 * _gl_print_shader_log(shader) * return 0 * return shader # <<<<<<<<<<<<<< * * cdef void _gl_print_program_info(GLuint program): #px/ */ __pyx_r = __pyx_v_shader; goto __pyx_L0; /* "_glarea.pyx":479 * print('==== Error linking shader program (no log)') * * cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): #px/ # <<<<<<<<<<<<<< * #def _gl_create_compiled_shader(shadertype, source): * cdef GLuint shader #px+ */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_WriteUnraisable("_glarea._gl_create_compiled_shader", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":500 * return shader * * cdef void _gl_print_program_info(GLuint program): #px/ # <<<<<<<<<<<<<< * #def _gl_print_program_info(program): * cdef GLint param #px+ */ static void __pyx_f_7_glarea__gl_print_program_info(__pyx_t_2gl_GLuint __pyx_v_program) { __pyx_t_2gl_GLint __pyx_v_param; int __pyx_v_i; __pyx_t_2gl_GLsizei __pyx_v_alength; __pyx_t_2gl_GLint __pyx_v_asize; __pyx_t_2gl_GLint __pyx_v_location; __pyx_t_2gl_GLenum __pyx_v_atype; char __pyx_v_aname[1024]; PyObject *__pyx_v_program_info = NULL; PyObject *__pyx_v_msg = NULL; PyObject *__pyx_v_pname = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; Py_ssize_t __pyx_t_11; __pyx_t_2gl_GLenum __pyx_t_12; long __pyx_t_13; int __pyx_t_14; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_print_program_info", 0); /* "_glarea.pyx":509 * cdef char aname[1024] #px+ * * print('shader program info', program) # <<<<<<<<<<<<<< * glValidateProgram(program) * program_info = {} */ __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__pyx_v_program); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_kp_u_shader_program_info); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_u_shader_program_info); __Pyx_GIVEREF(__pyx_kp_u_shader_program_info); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":510 * * print('shader program info', program) * glValidateProgram(program) # <<<<<<<<<<<<<< * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), */ glValidateProgram(__pyx_v_program); /* "_glarea.pyx":511 * print('shader program info', program) * glValidateProgram(program) * program_info = {} # <<<<<<<<<<<<<< * for msg, pname in [('delete status', GL_DELETE_STATUS), * ('link status', GL_LINK_STATUS), */ __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_v_program_info = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":512 * glValidateProgram(program) * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), # <<<<<<<<<<<<<< * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_DELETE_STATUS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_kp_u_delete_status); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_u_delete_status); __Pyx_GIVEREF(__pyx_kp_u_delete_status); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":513 * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), * ('link status', GL_LINK_STATUS), # <<<<<<<<<<<<<< * ('validate status', GL_VALIDATE_STATUS), * ('info log length', GL_INFO_LOG_LENGTH), */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_LINK_STATUS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 513; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_kp_u_link_status); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_link_status); __Pyx_GIVEREF(__pyx_kp_u_link_status); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":514 * for msg, pname in [('delete status', GL_DELETE_STATUS), * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), # <<<<<<<<<<<<<< * ('info log length', GL_INFO_LOG_LENGTH), * ('attached shaders', GL_ATTACHED_SHADERS), */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_VALIDATE_STATUS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_kp_u_validate_status); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_u_validate_status); __Pyx_GIVEREF(__pyx_kp_u_validate_status); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":515 * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), * ('info log length', GL_INFO_LOG_LENGTH), # <<<<<<<<<<<<<< * ('attached shaders', GL_ATTACHED_SHADERS), * ('active attributes', GL_ACTIVE_ATTRIBUTES), */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_INFO_LOG_LENGTH); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 515; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_kp_u_info_log_length); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_info_log_length); __Pyx_GIVEREF(__pyx_kp_u_info_log_length); PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":516 * ('validate status', GL_VALIDATE_STATUS), * ('info log length', GL_INFO_LOG_LENGTH), * ('attached shaders', GL_ATTACHED_SHADERS), # <<<<<<<<<<<<<< * ('active attributes', GL_ACTIVE_ATTRIBUTES), * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_ATTACHED_SHADERS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_INCREF(__pyx_kp_u_attached_shaders); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_kp_u_attached_shaders); __Pyx_GIVEREF(__pyx_kp_u_attached_shaders); PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":517 * ('info log length', GL_INFO_LOG_LENGTH), * ('attached shaders', GL_ATTACHED_SHADERS), * ('active attributes', GL_ACTIVE_ATTRIBUTES), # <<<<<<<<<<<<<< * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), * ('active uniforms', GL_ACTIVE_UNIFORMS), */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_ACTIVE_ATTRIBUTES); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_INCREF(__pyx_kp_u_active_attributes); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_kp_u_active_attributes); __Pyx_GIVEREF(__pyx_kp_u_active_attributes); PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":518 * ('attached shaders', GL_ATTACHED_SHADERS), * ('active attributes', GL_ACTIVE_ATTRIBUTES), * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), # <<<<<<<<<<<<<< * ('active uniforms', GL_ACTIVE_UNIFORMS), * ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_ACTIVE_ATTRIBUTE_MAX_LENGTH); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_INCREF(__pyx_kp_u_active_attribute_max_length); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_kp_u_active_attribute_max_length); __Pyx_GIVEREF(__pyx_kp_u_active_attribute_max_length); PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":519 * ('active attributes', GL_ACTIVE_ATTRIBUTES), * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), * ('active uniforms', GL_ACTIVE_UNIFORMS), # <<<<<<<<<<<<<< * ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: * glGetProgramiv(program, pname, ¶m) #px/ */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_ACTIVE_UNIFORMS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __Pyx_INCREF(__pyx_kp_u_active_uniforms); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_kp_u_active_uniforms); __Pyx_GIVEREF(__pyx_kp_u_active_uniforms); PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":520 * ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), * ('active uniforms', GL_ACTIVE_UNIFORMS), * ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: # <<<<<<<<<<<<<< * glGetProgramiv(program, pname, ¶m) #px/ * #param = glGetProgramiv(program, pname) */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_ACTIVE_UNIFORM_MAX_LENGTH); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 520; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_INCREF(__pyx_kp_u_active_uniform_max_length); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_kp_u_active_uniform_max_length); __Pyx_GIVEREF(__pyx_kp_u_active_uniform_max_length); PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":512 * glValidateProgram(program) * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), # <<<<<<<<<<<<<< * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), */ __pyx_t_1 = PyTuple_New(9); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_t_10); __Pyx_GIVEREF(__pyx_t_10); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_10 = __pyx_t_1; __Pyx_INCREF(__pyx_t_10); __pyx_t_11 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; for (;;) { if (__pyx_t_11 >= 9) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_11); __Pyx_INCREF(__pyx_t_1); __pyx_t_11++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_1 = PySequence_ITEM(__pyx_t_10, __pyx_t_11); __pyx_t_11++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif if (likely(__pyx_t_1 != Py_None)) { PyObject* sequence = __pyx_t_1; #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_9 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); __Pyx_INCREF(__pyx_t_9); __Pyx_INCREF(__pyx_t_8); #else __pyx_t_9 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); #endif __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } else { __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_XDECREF_SET(__pyx_v_msg, __pyx_t_9); __pyx_t_9 = 0; __Pyx_XDECREF_SET(__pyx_v_pname, __pyx_t_8); __pyx_t_8 = 0; /* "_glarea.pyx":521 * ('active uniforms', GL_ACTIVE_UNIFORMS), * ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: * glGetProgramiv(program, pname, ¶m) #px/ # <<<<<<<<<<<<<< * #param = glGetProgramiv(program, pname) * program_info[pname] = param */ __pyx_t_12 = __Pyx_PyInt_As_unsigned_int(__pyx_v_pname); if (unlikely((__pyx_t_12 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;} glGetProgramiv(__pyx_v_program, __pyx_t_12, (&__pyx_v_param)); /* "_glarea.pyx":523 * glGetProgramiv(program, pname, ¶m) #px/ * #param = glGetProgramiv(program, pname) * program_info[pname] = param # <<<<<<<<<<<<<< * print(' ', msg, param) * print('active attributes:') */ __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_param); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (unlikely(PyDict_SetItem(__pyx_v_program_info, __pyx_v_pname, __pyx_t_1) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":524 * #param = glGetProgramiv(program, pname) * program_info[pname] = param * print(' ', msg, param) # <<<<<<<<<<<<<< * print('active attributes:') * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): */ __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_param); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_INCREF(__pyx_kp_u__10); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_kp_u__10); __Pyx_GIVEREF(__pyx_kp_u__10); __Pyx_INCREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_v_msg); __Pyx_GIVEREF(__pyx_v_msg); PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_8, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":512 * glValidateProgram(program) * program_info = {} * for msg, pname in [('delete status', GL_DELETE_STATUS), # <<<<<<<<<<<<<< * ('link status', GL_LINK_STATUS), * ('validate status', GL_VALIDATE_STATUS), */ } __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; /* "_glarea.pyx":525 * program_info[pname] = param * print(' ', msg, param) * print('active attributes:') # <<<<<<<<<<<<<< * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ */ __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; /* "_glarea.pyx":526 * print(' ', msg, param) * print('active attributes:') * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): # <<<<<<<<<<<<<< * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ * #aname, asize, atype = glGetActiveAttrib(program, i); alength = len(aname) */ __pyx_t_10 = __Pyx_PyInt_From_int(GL_ACTIVE_ATTRIBUTES); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_1 = __Pyx_PyDict_GetItem(__pyx_v_program_info, __pyx_t_10); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_13 = __Pyx_PyInt_As_long(__pyx_t_1); if (unlikely((__pyx_t_13 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { __pyx_v_i = __pyx_t_14; /* "_glarea.pyx":527 * print('active attributes:') * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ # <<<<<<<<<<<<<< * #aname, asize, atype = glGetActiveAttrib(program, i); alength = len(aname) * location = glGetAttribLocation(program, aname) */ glGetActiveAttrib(__pyx_v_program, __pyx_v_i, 1023, (&__pyx_v_alength), (&__pyx_v_asize), (&__pyx_v_atype), __pyx_v_aname); /* "_glarea.pyx":529 * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ * #aname, asize, atype = glGetActiveAttrib(program, i); alength = len(aname) * location = glGetAttribLocation(program, aname) # <<<<<<<<<<<<<< * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * print('active uniforms:') */ __pyx_v_location = glGetAttribLocation(__pyx_v_program, __pyx_v_aname); /* "_glarea.pyx":530 * #aname, asize, atype = glGetActiveAttrib(program, i); alength = len(aname) * location = glGetAttribLocation(program, aname) * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) # <<<<<<<<<<<<<< * print('active uniforms:') * for i in range(program_info[GL_ACTIVE_UNIFORMS]): */ __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_length_size_type_location, __pyx_n_s_format); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __pyx_t_8 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = __Pyx_PyBytes_FromString(__pyx_v_aname); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_alength); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_asize); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_5 = __Pyx_PyInt_From_unsigned_int(__pyx_v_atype); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_location); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = NULL; __pyx_t_11 = 0; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_10))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_10); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_10, function); __pyx_t_11 = 1; } } __pyx_t_2 = PyTuple_New(6+__pyx_t_11); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (__pyx_t_3) { PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = NULL; } PyTuple_SET_ITEM(__pyx_t_2, 0+__pyx_t_11, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_2, 1+__pyx_t_11, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_2, 2+__pyx_t_11, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_2, 3+__pyx_t_11, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_2, 4+__pyx_t_11, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_2, 5+__pyx_t_11, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_7 = 0; __pyx_t_6 = 0; __pyx_t_5 = 0; __pyx_t_4 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_10, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "_glarea.pyx":531 * location = glGetAttribLocation(program, aname) * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * print('active uniforms:') # <<<<<<<<<<<<<< * for i in range(program_info[GL_ACTIVE_UNIFORMS]): * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":532 * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * print('active uniforms:') * for i in range(program_info[GL_ACTIVE_UNIFORMS]): # <<<<<<<<<<<<<< * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ * #aname, asize, atype = glGetActiveUniform(program, i); alength = len(aname) */ __pyx_t_1 = __Pyx_PyInt_From_int(GL_ACTIVE_UNIFORMS); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_10 = __Pyx_PyDict_GetItem(__pyx_v_program_info, __pyx_t_1); if (unlikely(__pyx_t_10 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_13 = __Pyx_PyInt_As_long(__pyx_t_10); if (unlikely((__pyx_t_13 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 532; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { __pyx_v_i = __pyx_t_14; /* "_glarea.pyx":533 * print('active uniforms:') * for i in range(program_info[GL_ACTIVE_UNIFORMS]): * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ # <<<<<<<<<<<<<< * #aname, asize, atype = glGetActiveUniform(program, i); alength = len(aname) * location = glGetUniformLocation(program, aname) */ glGetActiveUniform(__pyx_v_program, __pyx_v_i, 1023, (&__pyx_v_alength), (&__pyx_v_asize), (&__pyx_v_atype), __pyx_v_aname); /* "_glarea.pyx":535 * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ * #aname, asize, atype = glGetActiveUniform(program, i); alength = len(aname) * location = glGetUniformLocation(program, aname) # <<<<<<<<<<<<<< * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * */ __pyx_v_location = glGetUniformLocation(__pyx_v_program, __pyx_v_aname); /* "_glarea.pyx":536 * #aname, asize, atype = glGetActiveUniform(program, i); alength = len(aname) * location = glGetUniformLocation(program, aname) * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) # <<<<<<<<<<<<<< * * cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, int attrib_location, list attributes): #px/ */ __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_length_size_type_location, __pyx_n_s_format); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_aname); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_alength); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_asize); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = __Pyx_PyInt_From_unsigned_int(__pyx_v_atype); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_9 = __Pyx_PyInt_From_int(__pyx_v_location); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_9); __pyx_t_8 = NULL; __pyx_t_11 = 0; if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) { __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_8)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); __pyx_t_11 = 1; } } __pyx_t_3 = PyTuple_New(6+__pyx_t_11); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); if (__pyx_t_8) { PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); __pyx_t_8 = NULL; } PyTuple_SET_ITEM(__pyx_t_3, 0+__pyx_t_11, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_11, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 2+__pyx_t_11, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 3+__pyx_t_11, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_3, 4+__pyx_t_11, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_3, 5+__pyx_t_11, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_9); __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_9 = 0; __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_10); __Pyx_GIVEREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_1, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 536; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } /* "_glarea.pyx":500 * return shader * * cdef void _gl_print_program_info(GLuint program): #px/ # <<<<<<<<<<<<<< * #def _gl_print_program_info(program): * cdef GLint param #px+ */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_WriteUnraisable("_glarea._gl_print_program_info", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_L0:; __Pyx_XDECREF(__pyx_v_program_info); __Pyx_XDECREF(__pyx_v_msg); __Pyx_XDECREF(__pyx_v_pname); __Pyx_RefNannyFinishContext(); } /* "_glarea.pyx":538 * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * * cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, int attrib_location, list attributes): #px/ # <<<<<<<<<<<<<< * #def _gl_create_program(vertex_source, fragment_source, attrib_location, attributes): * cdef GLuint vertex_shader = 0, fragment_shader = 0 #px+ */ static __pyx_t_2gl_GLuint __pyx_f_7_glarea__gl_create_program(PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source, int __pyx_v_attrib_location, PyObject *__pyx_v_attributes) { __pyx_t_2gl_GLuint __pyx_v_vertex_shader; __pyx_t_2gl_GLuint __pyx_v_fragment_shader; __pyx_t_2gl_GLuint __pyx_v_program; __pyx_t_2gl_GLint __pyx_v_link_status; PyObject *__pyx_v_index = NULL; PyObject *__pyx_v_name = NULL; __pyx_t_2gl_GLuint __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; Py_ssize_t __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; __pyx_t_2gl_GLuint __pyx_t_8; __pyx_t_2gl_GLchar *__pyx_t_9; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_gl_create_program", 0); /* "_glarea.pyx":540 * cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, int attrib_location, list attributes): #px/ * #def _gl_create_program(vertex_source, fragment_source, attrib_location, attributes): * cdef GLuint vertex_shader = 0, fragment_shader = 0 #px+ # <<<<<<<<<<<<<< * cdef GLuint program #px+ * cdef GLint link_status #px+ */ __pyx_v_vertex_shader = 0; __pyx_v_fragment_shader = 0; /* "_glarea.pyx":544 * cdef GLint link_status #px+ * * if DEBUG_NOSHADER: # <<<<<<<<<<<<<< * return 0 * */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG_NOSHADER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "_glarea.pyx":545 * * if DEBUG_NOSHADER: * return 0 # <<<<<<<<<<<<<< * * program = glCreateProgram() */ __pyx_r = 0; goto __pyx_L0; } /* "_glarea.pyx":547 * return 0 * * program = glCreateProgram() # <<<<<<<<<<<<<< * if not DEBUG_NOVSHADER: * debug(' creating vertex shader') */ __pyx_v_program = glCreateProgram(); /* "_glarea.pyx":548 * * program = glCreateProgram() * if not DEBUG_NOVSHADER: # <<<<<<<<<<<<<< * debug(' creating vertex shader') * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG_NOVSHADER); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = ((!__pyx_t_2) != 0); if (__pyx_t_3) { /* "_glarea.pyx":549 * program = glCreateProgram() * if not DEBUG_NOVSHADER: * debug(' creating vertex shader') # <<<<<<<<<<<<<< * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) * if vertex_shader: */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "_glarea.pyx":550 * if not DEBUG_NOVSHADER: * debug(' creating vertex shader') * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) # <<<<<<<<<<<<<< * if vertex_shader: * glAttachShader(program, vertex_shader) */ __pyx_v_vertex_shader = __pyx_f_7_glarea__gl_create_compiled_shader(GL_VERTEX_SHADER, __pyx_v_vertex_source); /* "_glarea.pyx":551 * debug(' creating vertex shader') * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) * if vertex_shader: # <<<<<<<<<<<<<< * glAttachShader(program, vertex_shader) * else: */ __pyx_t_3 = (__pyx_v_vertex_shader != 0); if (__pyx_t_3) { /* "_glarea.pyx":552 * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) * if vertex_shader: * glAttachShader(program, vertex_shader) # <<<<<<<<<<<<<< * else: * print('error: no vertex shader') */ glAttachShader(__pyx_v_program, __pyx_v_vertex_shader); goto __pyx_L5; } /*else*/ { /* "_glarea.pyx":554 * glAttachShader(program, vertex_shader) * else: * print('error: no vertex shader') # <<<<<<<<<<<<<< * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') */ __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; } __pyx_L5:; goto __pyx_L4; } __pyx_L4:; /* "_glarea.pyx":555 * else: * print('error: no vertex shader') * if not DEBUG_NOFSHADER: # <<<<<<<<<<<<<< * debug(' creating fragment shader') * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) */ __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG_NOFSHADER); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_2 = ((!__pyx_t_3) != 0); if (__pyx_t_2) { /* "_glarea.pyx":556 * print('error: no vertex shader') * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') # <<<<<<<<<<<<<< * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) * if fragment_shader: */ __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":557 * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) # <<<<<<<<<<<<<< * if fragment_shader: * glAttachShader(program, fragment_shader) */ __pyx_v_fragment_shader = __pyx_f_7_glarea__gl_create_compiled_shader(GL_FRAGMENT_SHADER, __pyx_v_fragment_source); /* "_glarea.pyx":558 * debug(' creating fragment shader') * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) * if fragment_shader: # <<<<<<<<<<<<<< * glAttachShader(program, fragment_shader) * else: */ __pyx_t_2 = (__pyx_v_fragment_shader != 0); if (__pyx_t_2) { /* "_glarea.pyx":559 * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) * if fragment_shader: * glAttachShader(program, fragment_shader) # <<<<<<<<<<<<<< * else: * print('error: no fragment shader') */ glAttachShader(__pyx_v_program, __pyx_v_fragment_shader); goto __pyx_L7; } /*else*/ { /* "_glarea.pyx":561 * glAttachShader(program, fragment_shader) * else: * print('error: no fragment shader') # <<<<<<<<<<<<<< * for index, name in enumerate(attributes): * if name is not None: */ __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } __pyx_L7:; goto __pyx_L6; } __pyx_L6:; /* "_glarea.pyx":562 * else: * print('error: no fragment shader') * for index, name in enumerate(attributes): # <<<<<<<<<<<<<< * if name is not None: * glBindAttribLocation(program, attrib_location+index, name) */ __Pyx_INCREF(__pyx_int_0); __pyx_t_1 = __pyx_int_0; __pyx_t_4 = __pyx_v_attributes; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; for (;;) { if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_6); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_6 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __Pyx_XDECREF_SET(__pyx_v_name, __pyx_t_6); __pyx_t_6 = 0; __Pyx_INCREF(__pyx_t_1); __Pyx_XDECREF_SET(__pyx_v_index, __pyx_t_1); __pyx_t_6 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = __pyx_t_6; __pyx_t_6 = 0; /* "_glarea.pyx":563 * print('error: no fragment shader') * for index, name in enumerate(attributes): * if name is not None: # <<<<<<<<<<<<<< * glBindAttribLocation(program, attrib_location+index, name) * glLinkProgram(program) */ __pyx_t_2 = (__pyx_v_name != Py_None); __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { /* "_glarea.pyx":564 * for index, name in enumerate(attributes): * if name is not None: * glBindAttribLocation(program, attrib_location+index, name) # <<<<<<<<<<<<<< * glLinkProgram(program) * glGetProgramiv(program, GL_LINK_STATUS, &link_status) #px/ */ __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_attrib_location); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = PyNumber_Add(__pyx_t_6, __pyx_v_index); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_8 = __Pyx_PyInt_As_unsigned_int(__pyx_t_7); if (unlikely((__pyx_t_8 == (unsigned int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_9 = __Pyx_PyObject_AsString(__pyx_v_name); if (unlikely((!__pyx_t_9) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 564; __pyx_clineno = __LINE__; goto __pyx_L1_error;} glBindAttribLocation(__pyx_v_program, __pyx_t_8, __pyx_t_9); goto __pyx_L10; } __pyx_L10:; /* "_glarea.pyx":562 * else: * print('error: no fragment shader') * for index, name in enumerate(attributes): # <<<<<<<<<<<<<< * if name is not None: * glBindAttribLocation(program, attrib_location+index, name) */ } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "_glarea.pyx":565 * if name is not None: * glBindAttribLocation(program, attrib_location+index, name) * glLinkProgram(program) # <<<<<<<<<<<<<< * glGetProgramiv(program, GL_LINK_STATUS, &link_status) #px/ * #link_status = glGetProgramiv(program, GL_LINK_STATUS) */ glLinkProgram(__pyx_v_program); /* "_glarea.pyx":566 * glBindAttribLocation(program, attrib_location+index, name) * glLinkProgram(program) * glGetProgramiv(program, GL_LINK_STATUS, &link_status) #px/ # <<<<<<<<<<<<<< * #link_status = glGetProgramiv(program, GL_LINK_STATUS) * if not link_status: */ glGetProgramiv(__pyx_v_program, GL_LINK_STATUS, (&__pyx_v_link_status)); /* "_glarea.pyx":568 * glGetProgramiv(program, GL_LINK_STATUS, &link_status) #px/ * #link_status = glGetProgramiv(program, GL_LINK_STATUS) * if not link_status: # <<<<<<<<<<<<<< * _gl_print_program_log(program) * return 0 */ __pyx_t_3 = ((!(__pyx_v_link_status != 0)) != 0); if (__pyx_t_3) { /* "_glarea.pyx":569 * #link_status = glGetProgramiv(program, GL_LINK_STATUS) * if not link_status: * _gl_print_program_log(program) # <<<<<<<<<<<<<< * return 0 * if DEBUG_MSG: */ __pyx_f_7_glarea__gl_print_program_log(__pyx_v_program); /* "_glarea.pyx":570 * if not link_status: * _gl_print_program_log(program) * return 0 # <<<<<<<<<<<<<< * if DEBUG_MSG: * _gl_print_program_info(program) */ __pyx_r = 0; goto __pyx_L0; } /* "_glarea.pyx":571 * _gl_print_program_log(program) * return 0 * if DEBUG_MSG: # <<<<<<<<<<<<<< * _gl_print_program_info(program) * glDetachShader(program, vertex_shader) */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG_MSG); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_3) { /* "_glarea.pyx":572 * return 0 * if DEBUG_MSG: * _gl_print_program_info(program) # <<<<<<<<<<<<<< * glDetachShader(program, vertex_shader) * glDetachShader(program, fragment_shader) */ __pyx_f_7_glarea__gl_print_program_info(__pyx_v_program); goto __pyx_L12; } __pyx_L12:; /* "_glarea.pyx":573 * if DEBUG_MSG: * _gl_print_program_info(program) * glDetachShader(program, vertex_shader) # <<<<<<<<<<<<<< * glDetachShader(program, fragment_shader) * glDeleteShader(vertex_shader) */ glDetachShader(__pyx_v_program, __pyx_v_vertex_shader); /* "_glarea.pyx":574 * _gl_print_program_info(program) * glDetachShader(program, vertex_shader) * glDetachShader(program, fragment_shader) # <<<<<<<<<<<<<< * glDeleteShader(vertex_shader) * glDeleteShader(fragment_shader) */ glDetachShader(__pyx_v_program, __pyx_v_fragment_shader); /* "_glarea.pyx":575 * glDetachShader(program, vertex_shader) * glDetachShader(program, fragment_shader) * glDeleteShader(vertex_shader) # <<<<<<<<<<<<<< * glDeleteShader(fragment_shader) * return program */ glDeleteShader(__pyx_v_vertex_shader); /* "_glarea.pyx":576 * glDetachShader(program, fragment_shader) * glDeleteShader(vertex_shader) * glDeleteShader(fragment_shader) # <<<<<<<<<<<<<< * return program * */ glDeleteShader(__pyx_v_fragment_shader); /* "_glarea.pyx":577 * glDeleteShader(vertex_shader) * glDeleteShader(fragment_shader) * return program # <<<<<<<<<<<<<< * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ */ __pyx_r = __pyx_v_program; goto __pyx_L0; /* "_glarea.pyx":538 * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * * cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, int attrib_location, list attributes): #px/ # <<<<<<<<<<<<<< * #def _gl_create_program(vertex_source, fragment_source, attrib_location, attributes): * cdef GLuint vertex_shader = 0, fragment_shader = 0 #px+ */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_WriteUnraisable("_glarea._gl_create_program", __pyx_clineno, __pyx_lineno, __pyx_filename, 0); __pyx_r = 0; __pyx_L0:; __Pyx_XDECREF(__pyx_v_index); __Pyx_XDECREF(__pyx_v_name); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":579 * return program * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_25gl_create_render_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_25gl_create_render_program = {"gl_create_render_program", (PyCFunction)__pyx_pw_7_glarea_25gl_create_render_program, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7_glarea_25gl_create_render_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_vertex_source = 0; PyObject *__pyx_v_fragment_source = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_create_render_program (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_vertex_source,&__pyx_n_s_fragment_source,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_vertex_source)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fragment_source)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_create_render_program", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_create_render_program") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_vertex_source = ((PyObject*)values[0]); __pyx_v_fragment_source = ((PyObject*)values[1]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_create_render_program", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_create_render_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertex_source), (&PyBytes_Type), 1, "vertex_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fragment_source), (&PyBytes_Type), 1, "fragment_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_glarea_24gl_create_render_program(__pyx_self, __pyx_v_vertex_source, __pyx_v_fragment_source); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_24gl_create_render_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source) { __pyx_t_2gl_GLint __pyx_v_location; PyObject *__pyx_v_attributes = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_create_render_program", 0); /* "_glarea.pyx":582 * #def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ * if program.prog_render > 0: # <<<<<<<<<<<<<< * glDeleteProgram(program.prog_render) * attributes = [ */ __pyx_t_1 = ((__pyx_v_7_glarea_program.prog_render > 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":583 * cdef GLint location #px+ * if program.prog_render > 0: * glDeleteProgram(program.prog_render) # <<<<<<<<<<<<<< * attributes = [ * b'vertex_attr', */ glDeleteProgram(__pyx_v_7_glarea_program.prog_render); goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":584 * if program.prog_render > 0: * glDeleteProgram(program.prog_render) * attributes = [ # <<<<<<<<<<<<<< * b'vertex_attr', * b'normal_attr', */ __pyx_t_2 = PyList_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_b_vertex_attr); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_b_vertex_attr); __Pyx_GIVEREF(__pyx_n_b_vertex_attr); __Pyx_INCREF(__pyx_n_b_normal_attr); PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_b_normal_attr); __Pyx_GIVEREF(__pyx_n_b_normal_attr); __Pyx_INCREF(__pyx_n_b_color_attr); PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_b_color_attr); __Pyx_GIVEREF(__pyx_n_b_color_attr); __Pyx_INCREF(__pyx_n_b_texcoord_attr); PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_b_texcoord_attr); __Pyx_GIVEREF(__pyx_n_b_texcoord_attr); __Pyx_INCREF(__pyx_n_b_barycentric_attr); PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_b_barycentric_attr); __Pyx_GIVEREF(__pyx_n_b_barycentric_attr); __pyx_v_attributes = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":591 * b'barycentric_attr', * ] * program.prog_render = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) # <<<<<<<<<<<<<< * if program.prog_render > 0: * glUseProgram(program.prog_render) */ __pyx_v_7_glarea_program.prog_render = __pyx_f_7_glarea__gl_create_program(__pyx_v_vertex_source, __pyx_v_fragment_source, __pyx_e_7_gldraw_ATTRIB_LOCATION, __pyx_v_attributes); /* "_glarea.pyx":592 * ] * program.prog_render = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) * if program.prog_render > 0: # <<<<<<<<<<<<<< * glUseProgram(program.prog_render) * location = glGetUniformLocation(program.prog_render, b'tex') */ __pyx_t_1 = ((__pyx_v_7_glarea_program.prog_render > 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":593 * program.prog_render = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) * if program.prog_render > 0: * glUseProgram(program.prog_render) # <<<<<<<<<<<<<< * location = glGetUniformLocation(program.prog_render, b'tex') * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) */ glUseProgram(__pyx_v_7_glarea_program.prog_render); /* "_glarea.pyx":594 * if program.prog_render > 0: * glUseProgram(program.prog_render) * location = glGetUniformLocation(program.prog_render, b'tex') # <<<<<<<<<<<<<< * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') */ __pyx_v_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_render, __pyx_k_tex); /* "_glarea.pyx":595 * glUseProgram(program.prog_render) * location = glGetUniformLocation(program.prog_render, b'tex') * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) # <<<<<<<<<<<<<< * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') */ glUniform1i(__pyx_v_location, 0); /* "_glarea.pyx":596 * location = glGetUniformLocation(program.prog_render, b'tex') * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') # <<<<<<<<<<<<<< * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') * location = glGetUniformLocation(program.prog_render, b'object') */ __pyx_v_7_glarea_program.modelview_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_render, __pyx_k_modelview); /* "_glarea.pyx":597 * glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') # <<<<<<<<<<<<<< * location = glGetUniformLocation(program.prog_render, b'object') * gl_init_object_location(location) */ __pyx_v_7_glarea_program.projection_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_render, __pyx_k_projection); /* "_glarea.pyx":598 * program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') * location = glGetUniformLocation(program.prog_render, b'object') # <<<<<<<<<<<<<< * gl_init_object_location(location) * */ __pyx_v_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_render, __pyx_k_object); /* "_glarea.pyx":599 * program.projection_location = glGetUniformLocation(program.prog_render, b'projection') * location = glGetUniformLocation(program.prog_render, b'object') * gl_init_object_location(location) # <<<<<<<<<<<<<< * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ */ __pyx_f_7_gldraw_gl_init_object_location(__pyx_v_location); goto __pyx_L4; } __pyx_L4:; /* "_glarea.pyx":579 * return program * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("_glarea.gl_create_render_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_attributes); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":601 * gl_init_object_location(location) * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_27gl_create_hud_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_27gl_create_hud_program = {"gl_create_hud_program", (PyCFunction)__pyx_pw_7_glarea_27gl_create_hud_program, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7_glarea_27gl_create_hud_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_vertex_source = 0; PyObject *__pyx_v_fragment_source = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_create_hud_program (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_vertex_source,&__pyx_n_s_fragment_source,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_vertex_source)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fragment_source)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_create_hud_program", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_create_hud_program") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_vertex_source = ((PyObject*)values[0]); __pyx_v_fragment_source = ((PyObject*)values[1]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_create_hud_program", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_create_hud_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertex_source), (&PyBytes_Type), 1, "vertex_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fragment_source), (&PyBytes_Type), 1, "fragment_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_glarea_26gl_create_hud_program(__pyx_self, __pyx_v_vertex_source, __pyx_v_fragment_source); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_26gl_create_hud_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source) { PyObject *__pyx_v_attributes = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_create_hud_program", 0); /* "_glarea.pyx":604 * #def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ * if program.prog_hud > 0: # <<<<<<<<<<<<<< * glDeleteProgram(program.prog_hud) * attributes = [b'vertex_attr', None, b'color_attr'] */ __pyx_t_1 = ((__pyx_v_7_glarea_program.prog_hud > 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":605 * cdef GLint location #px+ * if program.prog_hud > 0: * glDeleteProgram(program.prog_hud) # <<<<<<<<<<<<<< * attributes = [b'vertex_attr', None, b'color_attr'] * program.prog_hud = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) */ glDeleteProgram(__pyx_v_7_glarea_program.prog_hud); goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":606 * if program.prog_hud > 0: * glDeleteProgram(program.prog_hud) * attributes = [b'vertex_attr', None, b'color_attr'] # <<<<<<<<<<<<<< * program.prog_hud = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) * if program.prog_hud > 0: */ __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 606; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_b_vertex_attr); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_b_vertex_attr); __Pyx_GIVEREF(__pyx_n_b_vertex_attr); __Pyx_INCREF(Py_None); PyList_SET_ITEM(__pyx_t_2, 1, Py_None); __Pyx_GIVEREF(Py_None); __Pyx_INCREF(__pyx_n_b_color_attr); PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_b_color_attr); __Pyx_GIVEREF(__pyx_n_b_color_attr); __pyx_v_attributes = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":607 * glDeleteProgram(program.prog_hud) * attributes = [b'vertex_attr', None, b'color_attr'] * program.prog_hud = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) # <<<<<<<<<<<<<< * if program.prog_hud > 0: * glUseProgram(program.prog_hud) */ __pyx_v_7_glarea_program.prog_hud = __pyx_f_7_glarea__gl_create_program(__pyx_v_vertex_source, __pyx_v_fragment_source, __pyx_e_7_gldraw_ATTRIB_LOCATION, __pyx_v_attributes); /* "_glarea.pyx":608 * attributes = [b'vertex_attr', None, b'color_attr'] * program.prog_hud = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) * if program.prog_hud > 0: # <<<<<<<<<<<<<< * glUseProgram(program.prog_hud) * */ __pyx_t_1 = ((__pyx_v_7_glarea_program.prog_hud > 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":609 * program.prog_hud = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) * if program.prog_hud > 0: * glUseProgram(program.prog_hud) # <<<<<<<<<<<<<< * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ */ glUseProgram(__pyx_v_7_glarea_program.prog_hud); goto __pyx_L4; } __pyx_L4:; /* "_glarea.pyx":601 * gl_init_object_location(location) * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("_glarea.gl_create_hud_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_attributes); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "_glarea.pyx":611 * glUseProgram(program.prog_hud) * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: */ /* Python wrapper */ static PyObject *__pyx_pw_7_glarea_29gl_create_pick_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_7_glarea_29gl_create_pick_program = {"gl_create_pick_program", (PyCFunction)__pyx_pw_7_glarea_29gl_create_pick_program, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_7_glarea_29gl_create_pick_program(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_vertex_source = 0; PyObject *__pyx_v_fragment_source = 0; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("gl_create_pick_program (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_vertex_source,&__pyx_n_s_fragment_source,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_vertex_source)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fragment_source)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("gl_create_pick_program", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "gl_create_pick_program") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_vertex_source = ((PyObject*)values[0]); __pyx_v_fragment_source = ((PyObject*)values[1]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("gl_create_pick_program", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("_glarea.gl_create_pick_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertex_source), (&PyBytes_Type), 1, "vertex_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_fragment_source), (&PyBytes_Type), 1, "fragment_source", 1))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7_glarea_28gl_create_pick_program(__pyx_self, __pyx_v_vertex_source, __pyx_v_fragment_source); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_7_glarea_28gl_create_pick_program(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_vertex_source, PyObject *__pyx_v_fragment_source) { PyObject *__pyx_v_attributes = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("gl_create_pick_program", 0); /* "_glarea.pyx":613 * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ * #def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: # <<<<<<<<<<<<<< * glDeleteProgram(program.prog_pick) * attributes = [b'vertex_attr', b'color_attr'] */ __pyx_t_1 = ((__pyx_v_7_glarea_program.prog_pick > 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":614 * #def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: * glDeleteProgram(program.prog_pick) # <<<<<<<<<<<<<< * attributes = [b'vertex_attr', b'color_attr'] * program.prog_pick = _gl_create_program(vertex_source, fragment_source, PICKATTRIB_LOCATION, attributes) */ glDeleteProgram(__pyx_v_7_glarea_program.prog_pick); goto __pyx_L3; } __pyx_L3:; /* "_glarea.pyx":615 * if program.prog_pick > 0: * glDeleteProgram(program.prog_pick) * attributes = [b'vertex_attr', b'color_attr'] # <<<<<<<<<<<<<< * program.prog_pick = _gl_create_program(vertex_source, fragment_source, PICKATTRIB_LOCATION, attributes) * if program.prog_pick > 0: */ __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_b_vertex_attr); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_b_vertex_attr); __Pyx_GIVEREF(__pyx_n_b_vertex_attr); __Pyx_INCREF(__pyx_n_b_color_attr); PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_b_color_attr); __Pyx_GIVEREF(__pyx_n_b_color_attr); __pyx_v_attributes = ((PyObject*)__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":616 * glDeleteProgram(program.prog_pick) * attributes = [b'vertex_attr', b'color_attr'] * program.prog_pick = _gl_create_program(vertex_source, fragment_source, PICKATTRIB_LOCATION, attributes) # <<<<<<<<<<<<<< * if program.prog_pick > 0: * glUseProgram(program.prog_pick) */ __pyx_v_7_glarea_program.prog_pick = __pyx_f_7_glarea__gl_create_program(__pyx_v_vertex_source, __pyx_v_fragment_source, __pyx_e_7_gldraw_PICKATTRIB_LOCATION, __pyx_v_attributes); /* "_glarea.pyx":617 * attributes = [b'vertex_attr', b'color_attr'] * program.prog_pick = _gl_create_program(vertex_source, fragment_source, PICKATTRIB_LOCATION, attributes) * if program.prog_pick > 0: # <<<<<<<<<<<<<< * glUseProgram(program.prog_pick) * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') */ __pyx_t_1 = ((__pyx_v_7_glarea_program.prog_pick > 0) != 0); if (__pyx_t_1) { /* "_glarea.pyx":618 * program.prog_pick = _gl_create_program(vertex_source, fragment_source, PICKATTRIB_LOCATION, attributes) * if program.prog_pick > 0: * glUseProgram(program.prog_pick) # <<<<<<<<<<<<<< * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') * program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') */ glUseProgram(__pyx_v_7_glarea_program.prog_pick); /* "_glarea.pyx":619 * if program.prog_pick > 0: * glUseProgram(program.prog_pick) * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') # <<<<<<<<<<<<<< * program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') * program.modelview_pick_location = glGetUniformLocation(program.prog_pick, b'modelview') */ __pyx_v_7_glarea_program.picking_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_pick, __pyx_k_picking); /* "_glarea.pyx":620 * glUseProgram(program.prog_pick) * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') * program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') # <<<<<<<<<<<<<< * program.modelview_pick_location = glGetUniformLocation(program.prog_pick, b'modelview') * */ __pyx_v_7_glarea_program.projection_pick_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_pick, __pyx_k_projection); /* "_glarea.pyx":621 * program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') * program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') * program.modelview_pick_location = glGetUniformLocation(program.prog_pick, b'modelview') # <<<<<<<<<<<<<< * * */ __pyx_v_7_glarea_program.modelview_pick_location = glGetUniformLocation(__pyx_v_7_glarea_program.prog_pick, __pyx_k_modelview); goto __pyx_L4; } __pyx_L4:; /* "_glarea.pyx":611 * glUseProgram(program.prog_hud) * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("_glarea.gl_create_pick_program", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_attributes); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {"gl_pick_polygons", (PyCFunction)__pyx_pw_7_glarea_21gl_pick_polygons, METH_VARARGS|METH_KEYWORDS, 0}, {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { #if PY_VERSION_HEX < 0x03020000 { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, #else PyModuleDef_HEAD_INIT, #endif "_glarea", 0, /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_DEBUG, __pyx_k_DEBUG, sizeof(__pyx_k_DEBUG), 0, 0, 1, 1}, {&__pyx_n_s_DEBUG_DRAW, __pyx_k_DEBUG_DRAW, sizeof(__pyx_k_DEBUG_DRAW), 0, 0, 1, 1}, {&__pyx_n_s_DEBUG_MSG, __pyx_k_DEBUG_MSG, sizeof(__pyx_k_DEBUG_MSG), 0, 0, 1, 1}, {&__pyx_n_s_DEBUG_NOFSHADER, __pyx_k_DEBUG_NOFSHADER, sizeof(__pyx_k_DEBUG_NOFSHADER), 0, 0, 1, 1}, {&__pyx_n_s_DEBUG_NOSHADER, __pyx_k_DEBUG_NOSHADER, sizeof(__pyx_k_DEBUG_NOSHADER), 0, 0, 1, 1}, {&__pyx_n_s_DEBUG_NOVSHADER, __pyx_k_DEBUG_NOVSHADER, sizeof(__pyx_k_DEBUG_NOVSHADER), 0, 0, 1, 1}, {&__pyx_n_s_DEBUG_PICK, __pyx_k_DEBUG_PICK, sizeof(__pyx_k_DEBUG_PICK), 0, 0, 1, 1}, {&__pyx_kp_u_Error_compiling_shader, __pyx_k_Error_compiling_shader, sizeof(__pyx_k_Error_compiling_shader), 0, 1, 0, 0}, {&__pyx_kp_u_Error_compiling_shader_no_log, __pyx_k_Error_compiling_shader_no_log, sizeof(__pyx_k_Error_compiling_shader_no_log), 0, 1, 0, 0}, {&__pyx_kp_u_Error_linking_shader_program, __pyx_k_Error_linking_shader_program, sizeof(__pyx_k_Error_linking_shader_program), 0, 1, 0, 0}, {&__pyx_kp_u_Error_linking_shader_program_no, __pyx_k_Error_linking_shader_program_no, sizeof(__pyx_k_Error_linking_shader_program_no), 0, 1, 0, 0}, {&__pyx_kp_u_Failed_to_create_shader, __pyx_k_Failed_to_create_shader, sizeof(__pyx_k_Failed_to_create_shader), 0, 1, 0, 0}, {&__pyx_n_u_GL, __pyx_k_GL, sizeof(__pyx_k_GL), 0, 1, 0, 1}, {&__pyx_kp_u_GL_GLES, __pyx_k_GL_GLES, sizeof(__pyx_k_GL_GLES), 0, 1, 0, 0}, {&__pyx_kp_u_GL_MAX_VERTEX_ATTRIBS, __pyx_k_GL_MAX_VERTEX_ATTRIBS, sizeof(__pyx_k_GL_MAX_VERTEX_ATTRIBS), 0, 1, 0, 0}, {&__pyx_kp_u_GL_MULTISAMPLE, __pyx_k_GL_MULTISAMPLE, sizeof(__pyx_k_GL_MULTISAMPLE), 0, 1, 0, 0}, {&__pyx_kp_u_GL_Renderer, __pyx_k_GL_Renderer, sizeof(__pyx_k_GL_Renderer), 0, 1, 0, 0}, {&__pyx_kp_u_GL_SAMPLES, __pyx_k_GL_SAMPLES, sizeof(__pyx_k_GL_SAMPLES), 0, 1, 0, 0}, {&__pyx_kp_u_GL_SAMPLE_ALPHA_TO_COVERAGE, __pyx_k_GL_SAMPLE_ALPHA_TO_COVERAGE, sizeof(__pyx_k_GL_SAMPLE_ALPHA_TO_COVERAGE), 0, 1, 0, 0}, {&__pyx_kp_u_GL_SAMPLE_BUFFERS, __pyx_k_GL_SAMPLE_BUFFERS, sizeof(__pyx_k_GL_SAMPLE_BUFFERS), 0, 1, 0, 0}, {&__pyx_kp_u_GL_SAMPLE_COVERAGE, __pyx_k_GL_SAMPLE_COVERAGE, sizeof(__pyx_k_GL_SAMPLE_COVERAGE), 0, 1, 0, 0}, {&__pyx_kp_u_GL_SAMPLE_COVERAGE_INVERT, __pyx_k_GL_SAMPLE_COVERAGE_INVERT, sizeof(__pyx_k_GL_SAMPLE_COVERAGE_INVERT), 0, 1, 0, 0}, {&__pyx_kp_u_GL_SAMPLE_COVERAGE_VALUE, __pyx_k_GL_SAMPLE_COVERAGE_VALUE, sizeof(__pyx_k_GL_SAMPLE_COVERAGE_VALUE), 0, 1, 0, 0}, {&__pyx_kp_u_GL_Shading_Language_Version, __pyx_k_GL_Shading_Language_Version, sizeof(__pyx_k_GL_Shading_Language_Version), 0, 1, 0, 0}, {&__pyx_kp_u_GL_Strings, __pyx_k_GL_Strings, sizeof(__pyx_k_GL_Strings), 0, 1, 0, 0}, {&__pyx_kp_u_GL_Vendor, __pyx_k_GL_Vendor, sizeof(__pyx_k_GL_Vendor), 0, 1, 0, 0}, {&__pyx_kp_u_GL_Version, __pyx_k_GL_Version, sizeof(__pyx_k_GL_Version), 0, 1, 0, 0}, {&__pyx_kp_u_Importing_module, __pyx_k_Importing_module, sizeof(__pyx_k_Importing_module), 0, 1, 0, 0}, {&__pyx_kp_u__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 1, 0, 0}, {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, {&__pyx_kp_u_active_attribute_max_length, __pyx_k_active_attribute_max_length, sizeof(__pyx_k_active_attribute_max_length), 0, 1, 0, 0}, {&__pyx_kp_u_active_attributes, __pyx_k_active_attributes, sizeof(__pyx_k_active_attributes), 0, 1, 0, 0}, {&__pyx_kp_u_active_attributes_2, __pyx_k_active_attributes_2, sizeof(__pyx_k_active_attributes_2), 0, 1, 0, 0}, {&__pyx_kp_u_active_uniform_max_length, __pyx_k_active_uniform_max_length, sizeof(__pyx_k_active_uniform_max_length), 0, 1, 0, 0}, {&__pyx_kp_u_active_uniforms, __pyx_k_active_uniforms, sizeof(__pyx_k_active_uniforms), 0, 1, 0, 0}, {&__pyx_kp_u_active_uniforms_2, __pyx_k_active_uniforms_2, sizeof(__pyx_k_active_uniforms_2), 0, 1, 0, 0}, {&__pyx_n_s_angle, __pyx_k_angle, sizeof(__pyx_k_angle), 0, 0, 1, 1}, {&__pyx_kp_u_attached_shaders, __pyx_k_attached_shaders, sizeof(__pyx_k_attached_shaders), 0, 1, 0, 0}, {&__pyx_n_s_attributes, __pyx_k_attributes, sizeof(__pyx_k_attributes), 0, 0, 1, 1}, {&__pyx_n_b_barycentric_attr, __pyx_k_barycentric_attr, sizeof(__pyx_k_barycentric_attr), 0, 0, 0, 1}, {&__pyx_n_s_blue, __pyx_k_blue, sizeof(__pyx_k_blue), 0, 0, 1, 1}, {&__pyx_n_s_bounding_sphere_radius, __pyx_k_bounding_sphere_radius, sizeof(__pyx_k_bounding_sphere_radius), 0, 0, 1, 1}, {&__pyx_n_b_color_attr, __pyx_k_color_attr, sizeof(__pyx_k_color_attr), 0, 0, 0, 1}, {&__pyx_n_s_compiled, __pyx_k_compiled, sizeof(__pyx_k_compiled), 0, 0, 1, 1}, {&__pyx_kp_u_compiled_2, __pyx_k_compiled_2, sizeof(__pyx_k_compiled_2), 0, 1, 0, 0}, {&__pyx_kp_u_creating_fragment_shader, __pyx_k_creating_fragment_shader, sizeof(__pyx_k_creating_fragment_shader), 0, 1, 0, 0}, {&__pyx_kp_u_creating_vertex_shader, __pyx_k_creating_vertex_shader, sizeof(__pyx_k_creating_vertex_shader), 0, 1, 0, 0}, {&__pyx_n_s_d, __pyx_k_d, sizeof(__pyx_k_d), 0, 0, 1, 1}, {&__pyx_n_s_debug, __pyx_k_debug, sizeof(__pyx_k_debug), 0, 0, 1, 1}, {&__pyx_kp_u_delete_status, __pyx_k_delete_status, sizeof(__pyx_k_delete_status), 0, 1, 0, 0}, {&__pyx_n_s_enumerate, __pyx_k_enumerate, sizeof(__pyx_k_enumerate), 0, 0, 1, 1}, {&__pyx_kp_u_error_no_fragment_shader, __pyx_k_error_no_fragment_shader, sizeof(__pyx_k_error_no_fragment_shader), 0, 1, 0, 0}, {&__pyx_kp_u_error_no_vertex_shader, __pyx_k_error_no_vertex_shader, sizeof(__pyx_k_error_no_vertex_shader), 0, 1, 0, 0}, {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, {&__pyx_n_s_fragment_source, __pyx_k_fragment_source, sizeof(__pyx_k_fragment_source), 0, 0, 1, 1}, {&__pyx_kp_u_from_package, __pyx_k_from_package, sizeof(__pyx_k_from_package), 0, 1, 0, 0}, {&__pyx_n_s_get_cursor_angle, __pyx_k_get_cursor_angle, sizeof(__pyx_k_get_cursor_angle), 0, 0, 1, 1}, {&__pyx_n_s_gl_create_hud_program, __pyx_k_gl_create_hud_program, sizeof(__pyx_k_gl_create_hud_program), 0, 0, 1, 1}, {&__pyx_n_s_gl_create_pick_program, __pyx_k_gl_create_pick_program, sizeof(__pyx_k_gl_create_pick_program), 0, 0, 1, 1}, {&__pyx_n_s_gl_create_render_program, __pyx_k_gl_create_render_program, sizeof(__pyx_k_gl_create_render_program), 0, 0, 1, 1}, {&__pyx_n_s_gl_exit, __pyx_k_gl_exit, sizeof(__pyx_k_gl_exit), 0, 0, 1, 1}, {&__pyx_n_s_gl_init, __pyx_k_gl_init, sizeof(__pyx_k_gl_init), 0, 0, 1, 1}, {&__pyx_n_s_gl_render, __pyx_k_gl_render, sizeof(__pyx_k_gl_render), 0, 0, 1, 1}, {&__pyx_n_s_gl_render_select_debug, __pyx_k_gl_render_select_debug, sizeof(__pyx_k_gl_render_select_debug), 0, 0, 1, 1}, {&__pyx_n_s_gl_resize, __pyx_k_gl_resize, sizeof(__pyx_k_gl_resize), 0, 0, 1, 1}, {&__pyx_n_s_glarea, __pyx_k_glarea, sizeof(__pyx_k_glarea), 0, 0, 1, 1}, {&__pyx_n_s_green, __pyx_k_green, sizeof(__pyx_k_green), 0, 0, 1, 1}, {&__pyx_n_s_height, __pyx_k_height, sizeof(__pyx_k_height), 0, 0, 1, 1}, {&__pyx_kp_s_tmp, __pyx_k_tmp, sizeof(__pyx_k_tmp), 0, 0, 1, 0}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_kp_u_info_log_length, __pyx_k_info_log_length, sizeof(__pyx_k_info_log_length), 0, 1, 0, 0}, {&__pyx_n_s_init_module, __pyx_k_init_module, sizeof(__pyx_k_init_module), 0, 0, 1, 1}, {&__pyx_kp_u_length_size_type_location, __pyx_k_length_size_type_location, sizeof(__pyx_k_length_size_type_location), 0, 1, 0, 0}, {&__pyx_kp_u_link_status, __pyx_k_link_status, sizeof(__pyx_k_link_status), 0, 1, 0, 0}, {&__pyx_n_s_location, __pyx_k_location, sizeof(__pyx_k_location), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_multisample, __pyx_k_multisample, sizeof(__pyx_k_multisample), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_b_normal_attr, __pyx_k_normal_attr, sizeof(__pyx_k_normal_attr), 0, 0, 0, 1}, {&__pyx_n_s_package, __pyx_k_package, sizeof(__pyx_k_package), 0, 0, 1, 1}, {&__pyx_n_s_print, __pyx_k_print, sizeof(__pyx_k_print), 0, 0, 1, 1}, {&__pyx_n_s_prog, __pyx_k_prog, sizeof(__pyx_k_prog), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_red, __pyx_k_red, sizeof(__pyx_k_red), 0, 0, 1, 1}, {&__pyx_n_s_rstrip, __pyx_k_rstrip, sizeof(__pyx_k_rstrip), 0, 0, 1, 1}, {&__pyx_n_s_selectdata, __pyx_k_selectdata, sizeof(__pyx_k_selectdata), 0, 0, 1, 1}, {&__pyx_n_s_set_antialiasing, __pyx_k_set_antialiasing, sizeof(__pyx_k_set_antialiasing), 0, 0, 1, 1}, {&__pyx_n_s_set_background_color, __pyx_k_set_background_color, sizeof(__pyx_k_set_background_color), 0, 0, 1, 1}, {&__pyx_n_s_set_frustum, __pyx_k_set_frustum, sizeof(__pyx_k_set_frustum), 0, 0, 1, 1}, {&__pyx_n_s_set_rotation_xy, __pyx_k_set_rotation_xy, sizeof(__pyx_k_set_rotation_xy), 0, 0, 1, 1}, {&__pyx_kp_u_shader_program_info, __pyx_k_shader_program_info, sizeof(__pyx_k_shader_program_info), 0, 1, 0, 0}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_b_texcoord_attr, __pyx_k_texcoord_attr, sizeof(__pyx_k_texcoord_attr), 0, 0, 0, 1}, {&__pyx_kp_u_validate_status, __pyx_k_validate_status, sizeof(__pyx_k_validate_status), 0, 1, 0, 0}, {&__pyx_n_b_vertex_attr, __pyx_k_vertex_attr, sizeof(__pyx_k_vertex_attr), 0, 0, 0, 1}, {&__pyx_n_s_vertex_source, __pyx_k_vertex_source, sizeof(__pyx_k_vertex_source), 0, 0, 1, 1}, {&__pyx_n_s_width, __pyx_k_width, sizeof(__pyx_k_width), 0, 0, 1, 1}, {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1}, {&__pyx_n_s_xi, __pyx_k_xi, sizeof(__pyx_k_xi), 0, 0, 1, 1}, {&__pyx_n_s_y, __pyx_k_y, sizeof(__pyx_k_y), 0, 0, 1, 1}, {&__pyx_n_s_yi, __pyx_k_yi, sizeof(__pyx_k_yi), 0, 0, 1, 1}, {&__pyx_n_s_zoom, __pyx_k_zoom, sizeof(__pyx_k_zoom), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_print = __Pyx_GetBuiltinName(__pyx_n_s_print); if (!__pyx_builtin_print) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "_glarea.pyx":245 * def gl_init(): * if DEBUG_MSG: * print('GL Strings:') # <<<<<<<<<<<<<< * _gl_print_string(' GL Vendor:', GL_VENDOR) * _gl_print_string(' GL Renderer:', GL_RENDERER) */ __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_GL_Strings); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 245; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); /* "_glarea.pyx":455 * #log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) * if log_len > 0: * print('==== Error compiling shader:') # <<<<<<<<<<<<<< * glGetShaderInfoLog(shader, 1023, &length, log) #px/ * #log = glGetShaderInfoLog(shader) */ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_Error_compiling_shader); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); /* "_glarea.pyx":459 * #log = glGetShaderInfoLog(shader) * print(log.decode('utf-8').rstrip()) * print('====') # <<<<<<<<<<<<<< * else: * print('==== Error compiling shader (no log)') */ __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u__3); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); /* "_glarea.pyx":461 * print('====') * else: * print('==== Error compiling shader (no log)') # <<<<<<<<<<<<<< * * cdef void _gl_print_program_log(GLuint program): #px/ */ __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_Error_compiling_shader_no_log); if (unlikely(!__pyx_tuple__5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); /* "_glarea.pyx":471 * #log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) * if log_len > 0: * print('==== Error linking shader program:') # <<<<<<<<<<<<<< * glGetProgramInfoLog(program, 1023, &length, log) #px/ * #log = glGetProgramInfoLog(program) */ __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_Error_linking_shader_program); if (unlikely(!__pyx_tuple__6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); /* "_glarea.pyx":475 * #log = glGetProgramInfoLog(program) * print(log.decode('utf-8').rstrip()) * print('====') # <<<<<<<<<<<<<< * else: * print('==== Error linking shader program (no log)') */ __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u__3); if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); /* "_glarea.pyx":477 * print('====') * else: * print('==== Error linking shader program (no log)') # <<<<<<<<<<<<<< * * cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): #px/ */ __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Error_linking_shader_program_no); if (unlikely(!__pyx_tuple__8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); /* "_glarea.pyx":487 * shader = glCreateShader(shadertype) * if shader == 0: * print('Failed to create shader') # <<<<<<<<<<<<<< * return 0 * pchar = source #px+ */ __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_Failed_to_create_shader); if (unlikely(!__pyx_tuple__9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); /* "_glarea.pyx":525 * program_info[pname] = param * print(' ', msg, param) * print('active attributes:') # <<<<<<<<<<<<<< * for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): * glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) #px/ */ __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_u_active_attributes_2); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11); /* "_glarea.pyx":531 * location = glGetAttribLocation(program, aname) * print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) * print('active uniforms:') # <<<<<<<<<<<<<< * for i in range(program_info[GL_ACTIVE_UNIFORMS]): * glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) #px/ */ __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_u_active_uniforms_2); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__12); __Pyx_GIVEREF(__pyx_tuple__12); /* "_glarea.pyx":549 * program = glCreateProgram() * if not DEBUG_NOVSHADER: * debug(' creating vertex shader') # <<<<<<<<<<<<<< * vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) * if vertex_shader: */ __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_u_creating_vertex_shader); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 549; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__13); __Pyx_GIVEREF(__pyx_tuple__13); /* "_glarea.pyx":554 * glAttachShader(program, vertex_shader) * else: * print('error: no vertex shader') # <<<<<<<<<<<<<< * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') */ __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_u_error_no_vertex_shader); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__14); __Pyx_GIVEREF(__pyx_tuple__14); /* "_glarea.pyx":556 * print('error: no vertex shader') * if not DEBUG_NOFSHADER: * debug(' creating fragment shader') # <<<<<<<<<<<<<< * fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) * if fragment_shader: */ __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_u_creating_fragment_shader); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 556; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__15); __Pyx_GIVEREF(__pyx_tuple__15); /* "_glarea.pyx":561 * glAttachShader(program, fragment_shader) * else: * print('error: no fragment shader') # <<<<<<<<<<<<<< * for index, name in enumerate(attributes): * if name is not None: */ __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_u_error_no_fragment_shader); if (unlikely(!__pyx_tuple__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__16); __Pyx_GIVEREF(__pyx_tuple__16); /* "_glarea.pyx":50 * debug(' from package:', __package__) * debug(' compiled:', __compiled) * debug(' GL/GLES:', SOURCEGLVERSION) # <<<<<<<<<<<<<< * * */ __pyx_tuple__17 = PyTuple_Pack(2, __pyx_kp_u_GL_GLES, __pyx_n_u_GL); if (unlikely(!__pyx_tuple__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__17); __Pyx_GIVEREF(__pyx_tuple__17); /* "_glarea.pyx":103 * ### module state * * def init_module(): # <<<<<<<<<<<<<< * terrain.red = 0.0 * terrain.green = 0.0 */ __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_init_module, 103, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":192 * frustum.picking_matrix[1][1] = 1. * * def set_frustum(bounding_sphere_radius, zoom): # <<<<<<<<<<<<<< * if bounding_sphere_radius > 0: * frustum.bounding_sphere_radius = bounding_sphere_radius */ __pyx_tuple__19 = PyTuple_Pack(2, __pyx_n_s_bounding_sphere_radius, __pyx_n_s_zoom); if (unlikely(!__pyx_tuple__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__19); __Pyx_GIVEREF(__pyx_tuple__19); __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_set_frustum, 192, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":199 * _update_projection_matrix() * * def set_background_color(red, green, blue): # <<<<<<<<<<<<<< * terrain.red = red * terrain.green = green */ __pyx_tuple__21 = PyTuple_Pack(3, __pyx_n_s_red, __pyx_n_s_green, __pyx_n_s_blue); if (unlikely(!__pyx_tuple__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__21); __Pyx_GIVEREF(__pyx_tuple__21); __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_set_background_color, 199, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":204 * terrain.blue = blue * * def set_antialiasing(multisample): # <<<<<<<<<<<<<< * frustum.multisample = multisample * */ __pyx_tuple__23 = PyTuple_Pack(1, __pyx_n_s_multisample); if (unlikely(!__pyx_tuple__23)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__23); __Pyx_GIVEREF(__pyx_tuple__23); __pyx_codeobj__24 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__23, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_set_antialiasing, 204, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__24)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":207 * frustum.multisample = multisample * * def set_rotation_xy(x, y): # <<<<<<<<<<<<<< * x %= 360 * # pylint: disable=C0321 */ __pyx_tuple__25 = PyTuple_Pack(2, __pyx_n_s_x, __pyx_n_s_y); if (unlikely(!__pyx_tuple__25)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__25); __Pyx_GIVEREF(__pyx_tuple__25); __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__25, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_set_rotation_xy, 207, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":243 * print(msg, i) * * def gl_init(): # <<<<<<<<<<<<<< * if DEBUG_MSG: * print('GL Strings:') */ __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_gl_init, 243, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":270 * gl_init_buffers() * * def gl_exit(): # <<<<<<<<<<<<<< * gl_delete_buffers() * cdef GLuint prog #px+ */ __pyx_tuple__28 = PyTuple_Pack(1, __pyx_n_s_prog); if (unlikely(!__pyx_tuple__28)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__28); __Pyx_GIVEREF(__pyx_tuple__28); __pyx_codeobj__29 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_gl_exit, 270, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__29)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":280 * program.prog_pick = 0 * * def gl_resize(width, height): # <<<<<<<<<<<<<< * terrain.width = width * terrain.height = height */ __pyx_tuple__30 = PyTuple_Pack(2, __pyx_n_s_width, __pyx_n_s_height); if (unlikely(!__pyx_tuple__30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__30); __Pyx_GIVEREF(__pyx_tuple__30); __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_gl_resize, 280, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":293 * #glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * * def gl_render(): # <<<<<<<<<<<<<< * if DEBUG_PICK: * _set_picking_matrix_identity() */ __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_gl_render, 293, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":313 * gl_draw_cube_debug() * * def gl_render_select_debug(): # <<<<<<<<<<<<<< * cdef GLfloat selectdata[12] #px/ * #selectdata = [0.] * 12 */ __pyx_tuple__33 = PyTuple_Pack(1, __pyx_n_s_selectdata); if (unlikely(!__pyx_tuple__33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__33); __Pyx_GIVEREF(__pyx_tuple__33); __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_gl_render_select_debug, 313, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":429 * mvect[2] = v2 / u3 * * def get_cursor_angle(xi, yi, d): # <<<<<<<<<<<<<< * cdef float angle #px+ * cdef int i #px+ */ __pyx_tuple__35 = PyTuple_Pack(7, __pyx_n_s_xi, __pyx_n_s_yi, __pyx_n_s_d, __pyx_n_s_angle, __pyx_n_s_i, __pyx_n_s_x, __pyx_n_s_y); if (unlikely(!__pyx_tuple__35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__35); __Pyx_GIVEREF(__pyx_tuple__35); __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(3, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__35, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_get_cursor_angle, 429, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":579 * return program * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ */ __pyx_tuple__37 = PyTuple_Pack(4, __pyx_n_s_vertex_source, __pyx_n_s_fragment_source, __pyx_n_s_location, __pyx_n_s_attributes); if (unlikely(!__pyx_tuple__37)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__37); __Pyx_GIVEREF(__pyx_tuple__37); __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__37, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_gl_create_render_program, 579, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":601 * gl_init_object_location(location) * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ */ __pyx_tuple__39 = PyTuple_Pack(4, __pyx_n_s_vertex_source, __pyx_n_s_fragment_source, __pyx_n_s_location, __pyx_n_s_attributes); if (unlikely(!__pyx_tuple__39)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__39); __Pyx_GIVEREF(__pyx_tuple__39); __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__39, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_gl_create_hud_program, 601, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":611 * glUseProgram(program.prog_hud) * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: */ __pyx_tuple__41 = PyTuple_Pack(3, __pyx_n_s_vertex_source, __pyx_n_s_fragment_source, __pyx_n_s_attributes); if (unlikely(!__pyx_tuple__41)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_tuple__41); __Pyx_GIVEREF(__pyx_tuple__41); __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(2, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__41, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_tmp, __pyx_n_s_gl_create_pick_program, 611, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_float_180_0 = PyFloat_FromDouble(180.0); if (unlikely(!__pyx_float_180_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_int_90 = PyInt_FromLong(90); if (unlikely(!__pyx_int_90)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_int_360 = PyInt_FromLong(360); if (unlikely(!__pyx_int_360)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_int_neg_90 = PyInt_FromLong(-90); if (unlikely(!__pyx_int_neg_90)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC init_glarea(void); /*proto*/ PyMODINIT_FUNC init_glarea(void) #else PyMODINIT_FUNC PyInit__glarea(void); /*proto*/ PyMODINIT_FUNC PyInit__glarea(void) #endif { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; Py_ssize_t __pyx_t_7; PyObject *__pyx_t_8 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__glarea(void)", 0); if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __Pyx_CyFunction_USED if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_glarea", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif if (__pyx_module_is_main__glarea) { if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (!PyDict_GetItemString(modules, "_glarea")) { if (unlikely(PyDict_SetItemString(modules, "_glarea", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ /*--- Type import code ---*/ /*--- Variable import code ---*/ /*--- Function import code ---*/ __pyx_t_1 = __Pyx_ImportModule("_gldraw"); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "matrix_set_identity", (void (**)(void))&__pyx_f_7_gldraw_matrix_set_identity, "PyObject *(__pyx_t_7_gldraw_vec4 *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_draw_cube", (void (**)(void))&__pyx_f_7_gldraw_gl_draw_cube, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_pick_cube", (void (**)(void))&__pyx_f_7_gldraw_gl_pick_cube, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_init_buffers", (void (**)(void))&__pyx_f_7_gldraw_gl_init_buffers, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_delete_buffers", (void (**)(void))&__pyx_f_7_gldraw_gl_delete_buffers, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_draw_cube_debug", (void (**)(void))&__pyx_f_7_gldraw_gl_draw_cube_debug, "void (void)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_draw_select_debug", (void (**)(void))&__pyx_f_7_gldraw_gl_draw_select_debug, "void (__pyx_t_2gl_GLfloat *, __pyx_t_2gl_GLsizeiptr, __pyx_t_2gl_GLuint)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ImportFunction(__pyx_t_1, "gl_init_object_location", (void (**)(void))&__pyx_f_7_gldraw_gl_init_object_location, "void (__pyx_t_2gl_GLuint)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; /*--- Execution code ---*/ /* "_glarea.pyx":25 * # This line makes cython happy * global __name__, __package__ # pylint: disable=W0604 * __compiled = True #px/ # <<<<<<<<<<<<<< * #__compiled = False * */ if (PyDict_SetItem(__pyx_d, __pyx_n_s_compiled, Py_True) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "_glarea.pyx":41 * # pylint: enable=W0614,W0401 * * from .debug import debug, DEBUG, DEBUG_DRAW, DEBUG_PICK, DEBUG_MSG, DEBUG_NOVSHADER, DEBUG_NOFSHADER, DEBUG_NOSHADER # <<<<<<<<<<<<<< * * DEF SOURCEGLVERSION = 'GL' #px/ */ __pyx_t_2 = PyList_New(8); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_n_s_debug); PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_debug); __Pyx_GIVEREF(__pyx_n_s_debug); __Pyx_INCREF(__pyx_n_s_DEBUG); PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_DEBUG); __Pyx_GIVEREF(__pyx_n_s_DEBUG); __Pyx_INCREF(__pyx_n_s_DEBUG_DRAW); PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_DEBUG_DRAW); __Pyx_GIVEREF(__pyx_n_s_DEBUG_DRAW); __Pyx_INCREF(__pyx_n_s_DEBUG_PICK); PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_DEBUG_PICK); __Pyx_GIVEREF(__pyx_n_s_DEBUG_PICK); __Pyx_INCREF(__pyx_n_s_DEBUG_MSG); PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_DEBUG_MSG); __Pyx_GIVEREF(__pyx_n_s_DEBUG_MSG); __Pyx_INCREF(__pyx_n_s_DEBUG_NOVSHADER); PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_DEBUG_NOVSHADER); __Pyx_GIVEREF(__pyx_n_s_DEBUG_NOVSHADER); __Pyx_INCREF(__pyx_n_s_DEBUG_NOFSHADER); PyList_SET_ITEM(__pyx_t_2, 6, __pyx_n_s_DEBUG_NOFSHADER); __Pyx_GIVEREF(__pyx_n_s_DEBUG_NOFSHADER); __Pyx_INCREF(__pyx_n_s_DEBUG_NOSHADER); PyList_SET_ITEM(__pyx_t_2, 7, __pyx_n_s_DEBUG_NOSHADER); __Pyx_GIVEREF(__pyx_n_s_DEBUG_NOSHADER); __pyx_t_3 = __Pyx_Import(__pyx_n_s_debug, __pyx_t_2, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_debug); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_debug, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_DEBUG); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_DEBUG_DRAW); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG_DRAW, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_DEBUG_PICK); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG_PICK, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_DEBUG_MSG); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG_MSG, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_DEBUG_NOVSHADER); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG_NOVSHADER, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_DEBUG_NOFSHADER); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG_NOFSHADER, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_DEBUG_NOSHADER); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG_NOSHADER, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":46 * #SOURCEGLVERSION = 'GL' * * if DEBUG: # <<<<<<<<<<<<<< * debug('Importing module:', __name__) * debug(' from package:', __package__) */ __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_4) { /* "_glarea.pyx":47 * * if DEBUG: * debug('Importing module:', __name__) # <<<<<<<<<<<<<< * debug(' from package:', __package__) * debug(' compiled:', __compiled) */ __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_name); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; __pyx_t_7 = 0; if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_7 = 1; } } __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); if (__pyx_t_6) { PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL; } __Pyx_INCREF(__pyx_kp_u_Importing_module); PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_kp_u_Importing_module); __Pyx_GIVEREF(__pyx_kp_u_Importing_module); PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_8, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":48 * if DEBUG: * debug('Importing module:', __name__) * debug(' from package:', __package__) # <<<<<<<<<<<<<< * debug(' compiled:', __compiled) * debug(' GL/GLES:', SOURCEGLVERSION) */ __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_package); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __pyx_t_5 = NULL; __pyx_t_7 = 0; if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_7 = 1; } } __pyx_t_6 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); if (__pyx_t_5) { PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL; } __Pyx_INCREF(__pyx_kp_u_from_package); PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_7, __pyx_kp_u_from_package); __Pyx_GIVEREF(__pyx_kp_u_from_package); PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_7, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":49 * debug('Importing module:', __name__) * debug(' from package:', __package__) * debug(' compiled:', __compiled) # <<<<<<<<<<<<<< * debug(' GL/GLES:', SOURCEGLVERSION) * */ __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_compiled); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_8 = NULL; __pyx_t_7 = 0; if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_8)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_7 = 1; } } __pyx_t_5 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); if (__pyx_t_8) { PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); __pyx_t_8 = NULL; } __Pyx_INCREF(__pyx_kp_u_compiled_2); PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_7, __pyx_kp_u_compiled_2); __Pyx_GIVEREF(__pyx_kp_u_compiled_2); PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_7, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "_glarea.pyx":50 * debug(' from package:', __package__) * debug(' compiled:', __compiled) * debug(' GL/GLES:', SOURCEGLVERSION) # <<<<<<<<<<<<<< * * */ __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_debug); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; goto __pyx_L2; } __pyx_L2:; /* "_glarea.pyx":103 * ### module state * * def init_module(): # <<<<<<<<<<<<<< * terrain.red = 0.0 * terrain.green = 0.0 */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_1init_module, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_init_module, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":192 * frustum.picking_matrix[1][1] = 1. * * def set_frustum(bounding_sphere_radius, zoom): # <<<<<<<<<<<<<< * if bounding_sphere_radius > 0: * frustum.bounding_sphere_radius = bounding_sphere_radius */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_3set_frustum, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_frustum, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":199 * _update_projection_matrix() * * def set_background_color(red, green, blue): # <<<<<<<<<<<<<< * terrain.red = red * terrain.green = green */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_5set_background_color, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_background_color, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":204 * terrain.blue = blue * * def set_antialiasing(multisample): # <<<<<<<<<<<<<< * frustum.multisample = multisample * */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_7set_antialiasing, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_antialiasing, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":207 * frustum.multisample = multisample * * def set_rotation_xy(x, y): # <<<<<<<<<<<<<< * x %= 360 * # pylint: disable=C0321 */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_9set_rotation_xy, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_rotation_xy, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":243 * print(msg, i) * * def gl_init(): # <<<<<<<<<<<<<< * if DEBUG_MSG: * print('GL Strings:') */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_11gl_init, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_gl_init, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 243; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":270 * gl_init_buffers() * * def gl_exit(): # <<<<<<<<<<<<<< * gl_delete_buffers() * cdef GLuint prog #px+ */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_13gl_exit, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_gl_exit, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":280 * program.prog_pick = 0 * * def gl_resize(width, height): # <<<<<<<<<<<<<< * terrain.width = width * terrain.height = height */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_15gl_resize, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_gl_resize, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 280; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":293 * #glUniformMatrix4fv(location, 1, GL_FALSE, matrix) * * def gl_render(): # <<<<<<<<<<<<<< * if DEBUG_PICK: * _set_picking_matrix_identity() */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_17gl_render, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_gl_render, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 293; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":313 * gl_draw_cube_debug() * * def gl_render_select_debug(): # <<<<<<<<<<<<<< * cdef GLfloat selectdata[12] #px/ * #selectdata = [0.] * 12 */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_19gl_render_select_debug, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_gl_render_select_debug, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":429 * mvect[2] = v2 / u3 * * def get_cursor_angle(xi, yi, d): # <<<<<<<<<<<<<< * cdef float angle #px+ * cdef int i #px+ */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_23get_cursor_angle, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_cursor_angle, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":579 * return program * * def gl_create_render_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_render_program(vertex_source, fragment_source): * cdef GLint location #px+ */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_25gl_create_render_program, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_gl_create_render_program, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":601 * gl_init_object_location(location) * * def gl_create_hud_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_hud_program(vertex_source, fragment_source): * cdef GLint location #px+ */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_27gl_create_hud_program, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_gl_create_hud_program, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":611 * glUseProgram(program.prog_hud) * * def gl_create_pick_program(bytes vertex_source, bytes fragment_source): #px/ # <<<<<<<<<<<<<< * #def gl_create_pick_program(vertex_source, fragment_source): * if program.prog_pick > 0: */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7_glarea_29gl_create_pick_program, NULL, __pyx_n_s_glarea); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_gl_create_pick_program, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "_glarea.pyx":1 * #-*- coding:utf-8 -*- # <<<<<<<<<<<<<< * # cython: profile=False * */ __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_8); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init _glarea", __pyx_clineno, __pyx_lineno, __pyx_filename); } Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init _glarea"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_COMPILING_IN_CPYTHON PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_Restore(type, value, tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(type, value, tb); #endif } static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, int full_traceback) { PyObject *old_exc, *old_val, *old_tb; PyObject *ctx; __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); if (full_traceback) { Py_XINCREF(old_exc); Py_XINCREF(old_val); Py_XINCREF(old_tb); __Pyx_ErrRestore(old_exc, old_val, old_tb); PyErr_PrintEx(1); } #if PY_MAJOR_VERSION < 3 ctx = PyString_FromString(name); #else ctx = PyUnicode_FromString(name); #endif __Pyx_ErrRestore(old_exc, old_val, old_tb); if (!ctx) { PyErr_WriteUnraisable(Py_None); } else { PyErr_WriteUnraisable(ctx); Py_DECREF(ctx); } } static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = func->ob_type->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { PyObject *result; #if CYTHON_COMPILING_IN_CPYTHON result = PyDict_GetItem(__pyx_d, name); if (likely(result)) { Py_INCREF(result); } else { #else result = PyObject_GetItem(__pyx_d, name); if (!result) { PyErr_Clear(); #endif result = __Pyx_GetBuiltinName(name); } return result; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck) { #if CYTHON_COMPILING_IN_CPYTHON if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o); if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, int wraparound, int boundscheck) { #if CYTHON_COMPILING_IN_CPYTHON if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o); if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, int wraparound, int boundscheck) { #if CYTHON_COMPILING_IN_CPYTHON if (is_list || PyList_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (likely(l >= 0)) { i += l; } else { if (PyErr_ExceptionMatches(PyExc_OverflowError)) PyErr_Clear(); else return NULL; } } return m->sq_item(o, i); } } #else if (is_list || PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } static CYTHON_INLINE PyObject* __Pyx_decode_c_string( const char* cstring, Py_ssize_t start, Py_ssize_t stop, const char* encoding, const char* errors, PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { Py_ssize_t length; if (unlikely((start < 0) | (stop < 0))) { length = strlen(cstring); if (start < 0) { start += length; if (start < 0) start = 0; } if (stop < 0) stop += length; } length = stop - start; if (unlikely(length <= 0)) return PyUnicode_FromUnicode(NULL, 0); cstring += start; if (decode_func) { return decode_func(cstring, length, errors); } else { return PyUnicode_Decode(cstring, length, encoding, errors); } } #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { PyObject *self, *result; PyCFunction cfunc; cfunc = PyCFunction_GET_FUNCTION(func); self = PyCFunction_GET_SELF(func); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = cfunc(self, arg); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif #if CYTHON_COMPILING_IN_CPYTHON static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject *result; PyObject *args = PyTuple_New(1); if (unlikely(!args)) return NULL; Py_INCREF(arg); PyTuple_SET_ITEM(args, 0, arg); result = __Pyx_PyObject_Call(func, args, NULL); Py_DECREF(args); return result; } static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { #ifdef __Pyx_CyFunction_USED if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) { #else if (likely(PyCFunction_Check(func))) { #endif if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { return __Pyx_PyObject_CallMethO(func, arg); } } return __Pyx__PyObject_CallOneArg(func, arg); } #else static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { PyObject* args = PyTuple_Pack(1, arg); return (likely(args)) ? __Pyx_PyObject_Call(func, args, NULL) : NULL; } #endif #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { #ifdef __Pyx_CyFunction_USED if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) { #else if (likely(PyCFunction_Check(func))) { #endif if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { return __Pyx_PyObject_CallMethO(func, NULL); } } return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); } #endif static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", index, (index == 1) ? "" : "s"); } static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) { PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", name, type->tp_name, Py_TYPE(obj)->tp_name); } static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } if (none_allowed && obj == Py_None) return 1; else if (exact) { if (likely(Py_TYPE(obj) == type)) return 1; #if PY_MAJOR_VERSION == 2 else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; #endif } else { if (likely(PyObject_TypeCheck(obj, type))) return 1; } __Pyx_RaiseArgumentTypeInvalid(name, obj, type); return 0; } static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Format(PyExc_ImportError, #if PY_MAJOR_VERSION < 3 "cannot import name %.230s", PyString_AS_STRING(name)); #else "cannot import name %S", name); #endif } return value; } static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = (start + end) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; py_code = __pyx_find_code_object(c_line ? c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? c_line : py_line, py_code); } py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = py_line; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; #if PY_VERSION_HEX < 0x03030000 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (!py_import) goto bad; #endif if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.')) { #if PY_VERSION_HEX < 0x03030000 PyObject *py_level = PyInt_FromLong(1); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); #endif if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_VERSION_HEX < 0x03030000 PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, level); #endif } } bad: #if PY_VERSION_HEX < 0x03030000 Py_XDECREF(py_import); #endif Py_XDECREF(empty_list); Py_XDECREF(empty_dict); return module; } #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value) \ { \ func_type value = func_value; \ if (sizeof(target_type) < sizeof(func_type)) { \ if (unlikely(value != (func_type) (target_type) value)) { \ func_type zero = 0; \ if (is_unsigned && unlikely(value < zero)) \ goto raise_neg_overflow; \ else \ goto raise_overflow; \ } \ } \ return (target_type) value; \ } #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #endif #endif static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { const int neg_one = (int) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x)) } else if (sizeof(int) <= sizeof(unsigned long long)) { __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x)) } } else { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, +(((PyLongObject*)x)->ob_digit[0])); case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x)) } else if (sizeof(int) <= sizeof(long long)) { __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x)) } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { const int neg_one = (int) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); } else if (sizeof(int) <= sizeof(unsigned long long)) { return PyLong_FromUnsignedLongLong((unsigned long long) value); } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(long long)) { return PyLong_FromLongLong((long long) value); } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(int), little, !is_unsigned); } } static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_char(unsigned char value) { const unsigned char neg_one = (unsigned char) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(unsigned char) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(unsigned char) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); } else if (sizeof(unsigned char) <= sizeof(unsigned long long)) { return PyLong_FromUnsignedLongLong((unsigned long long) value); } } else { if (sizeof(unsigned char) <= sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(unsigned char) <= sizeof(long long)) { return PyLong_FromLongLong((long long) value); } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(unsigned char), little, !is_unsigned); } } static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { const unsigned int neg_one = (unsigned int) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(unsigned int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); } else if (sizeof(unsigned int) <= sizeof(unsigned long long)) { return PyLong_FromUnsignedLongLong((unsigned long long) value); } } else { if (sizeof(unsigned int) <= sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(unsigned int) <= sizeof(long long)) { return PyLong_FromLongLong((long long) value); } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(unsigned int), little, !is_unsigned); } } static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { const unsigned int neg_one = (unsigned int) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(unsigned int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(unsigned int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (unsigned int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } if (sizeof(unsigned int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, PyLong_AsUnsignedLong(x)) } else if (sizeof(unsigned int) <= sizeof(unsigned long long)) { __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long long, PyLong_AsUnsignedLongLong(x)) } } else { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, +(((PyLongObject*)x)->ob_digit[0])); case -1: __PYX_VERIFY_RETURN_INT(unsigned int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (sizeof(unsigned int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT(unsigned int, long, PyLong_AsLong(x)) } else if (sizeof(unsigned int) <= sizeof(long long)) { __PYX_VERIFY_RETURN_INT(unsigned int, long long, PyLong_AsLongLong(x)) } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else unsigned int val; PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (unsigned int) -1; } } else { unsigned int val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned int) -1; val = __Pyx_PyInt_As_unsigned_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to unsigned int"); return (unsigned int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned int"); return (unsigned int) -1; } static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); } else if (sizeof(long) <= sizeof(unsigned long long)) { return PyLong_FromUnsignedLongLong((unsigned long long) value); } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(long long)) { return PyLong_FromLongLong((long long) value); } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { const long neg_one = (long) -1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT(long, unsigned long, PyLong_AsUnsignedLong(x)) } else if (sizeof(long) <= sizeof(unsigned long long)) { __PYX_VERIFY_RETURN_INT(long, unsigned long long, PyLong_AsUnsignedLongLong(x)) } } else { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(x)) { case 0: return 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, +(((PyLongObject*)x)->ob_digit[0])); case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]); } #endif #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyLong_AsLong(x)) } else if (sizeof(long) <= sizeof(long long)) { __PYX_VERIFY_RETURN_INT(long, long long, PyLong_AsLongLong(x)) } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_Int(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); return PyErr_WarnEx(NULL, message, 1); } return 0; } #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; PyObject *py_module = 0; py_name = __Pyx_PyIdentifier_FromString(name); if (!py_name) goto bad; py_module = PyImport_Import(py_name); Py_DECREF(py_name); return py_module; bad: Py_XDECREF(py_name); return 0; } #endif #ifndef __PYX_HAVE_RT_ImportFunction #define __PYX_HAVE_RT_ImportFunction static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig) { PyObject *d = 0; PyObject *cobj = 0; union { void (*fp)(void); void *p; } tmp; d = PyObject_GetAttrString(module, (char *)"__pyx_capi__"); if (!d) goto bad; cobj = PyDict_GetItemString(d, funcname); if (!cobj) { PyErr_Format(PyExc_ImportError, "%.200s does not export expected C function %.200s", PyModule_GetName(module), funcname); goto bad; } #if PY_VERSION_HEX >= 0x02070000 if (!PyCapsule_IsValid(cobj, sig)) { PyErr_Format(PyExc_TypeError, "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)", PyModule_GetName(module), funcname, sig, PyCapsule_GetName(cobj)); goto bad; } tmp.p = PyCapsule_GetPointer(cobj, sig); #else {const char *desc, *s1, *s2; desc = (const char *)PyCObject_GetDesc(cobj); if (!desc) goto bad; s1 = desc; s2 = sig; while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; } if (*s1 != *s2) { PyErr_Format(PyExc_TypeError, "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)", PyModule_GetName(module), funcname, sig, desc); goto bad; } tmp.p = PyCObject_AsVoidPtr(cobj);} #endif *f = tmp.fp; if (!(*f)) goto bad; Py_DECREF(d); return 0; bad: Py_XDECREF(d); return -1; } #endif static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { #if PY_VERSION_HEX < 0x03030000 char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; #else if (__Pyx_PyUnicode_READY(o) == -1) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (PyUnicode_IS_ASCII(o)) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif #endif } else #endif #if !CYTHON_COMPILING_IN_PYPY if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_MAJOR_VERSION < 3 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) return PyInt_AS_LONG(b); #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 #if CYTHON_USE_PYLONG_INTERNALS switch (Py_SIZE(b)) { case -1: return -(sdigit)((PyLongObject*)b)->ob_digit[0]; case 0: return 0; case 1: return ((PyLongObject*)b)->ob_digit[0]; } #endif #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ pybik-2.1/INSTALL0000664000175000017500000000377612556245304013716 0ustar barccbarcc00000000000000Installation Instructions for Pybik 2.1 ======================================= Currently Pybik is available in the official archive for Ubuntu and Debian. For Ubuntu the latest release is available in the Pybik Personal Package Archive (PPA) . Add `ppa:barcc/pybik` to your system's software sources (with the Ubuntu Software-Center). You can also do this in a terminal: sudo add-apt-repository ppa:barcc/pybik sudo apt-get update sudo apt-get install pybik If Pybik is not available for your distribution, see the following installation instructions. Run from source archive ======================= Please use the latest source from the official download site . Requirements ------------ Please make sure you satisfy Pybik's dependencies: * Python 3.4 * Qt5 and Python 3 bindings for Qt5 (PyQt5) * Python 3 bindings for ICU (PyICU) (optional) For building the rendering engine: * C-compiler (gcc) * development files for Python 3 * Mesa development files * gettext, intltool (for translations) Build + Run ----------- Extract the archive, switch to the created directory in a terminal and enter: ./build_local.sh To run Pybik you can use the command in the same directory ./pybik System-wide installation ======================== This installation method is intended primarily for packagers. Pybik comes with a full featured `setup.py` installation script. To find out more, run: ./setup.py --help You may need additional software * Cython (for Python3, >= 0.17.4, to recreate files in `./csrc/`) * help2man to create a manpage VCS and Daily Builds ==================== Development happens with the Bazaar version control system. Location: You can get the latest revision with: bzr branch lp:pybik Daily build for Ubuntu are provided in the PPA `ppa:barcc/daily-build` pybik-2.1/data/0000775000175000017500000000000012556245305013562 5ustar barccbarcc00000000000000pybik-2.1/data/templates/0000775000175000017500000000000012556245305015560 5ustar barccbarcc00000000000000pybik-2.1/data/templates/README.in0000664000175000017500000000273412556223565017057 0ustar barccbarcc00000000000000 About {APPNAME} {VERSION} === {LONG_DESCRIPTION:join.wrap} Author: {AUTHOR} <{CONTACT_EMAIL}> License: {LICENSE_NAME} Project page: <{WEBSITE}> Installation === {#:wrap}If Pybik is available for your distribution, you should install Pybik with a package manager. Otherwise see the file INSTALL for installation instructions. Feedback === {get_filebug_text:links.wrap} {#footnotes} Translation === {TRANSLATION_TEXT:links.join.wrap} {#footnotes} License === {LICENSE_INFO:wrap} {LICENSE_NOT_FOUND:wrap} Hidden Features === You can change shortcuts for some menu items and actions: Action | Menuitem | Default --- selectmodel | Game->Select Model | Ctrl+M initial_state | Edit->Set as Initial State | None reset_rotation | Edit->Reset Rotation | Ctrl+R preferences | Edit->Preferences | Ctrl+P edit_moves | None (Select moves editor) | Ctrl+L edit_cube | None (Cube editor) | None {#:wrap}Append the following lines with the shortcuts changed as you like to your Pybik config file (~/.config/pybik/settings.conf): action.selectmodel = 'Ctrl+M' action.initial_state = '' action.reset_rotation = 'Ctrl+R' action.preferences = 'Ctrl+P' action.edit_moves = 'Ctrl+L' action.edit_cube = '' {#:wrap}The cube editor is a immature feature. To use it anyway, you must assign a shortcut to the action edit_cube. In cube editor mode swap cubies with left mouse button and rotate cubies with Ctrl and left mouse button. pybik-2.1/data/templates/copyright.in0000664000175000017500000000537712504664041020127 0ustar barccbarcc00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: {APPNAME} Upstream-Contact: {AUTHOR} <{CONTACT_EMAIL}> Source: {DOWNLOADS} Comment: Originally this package was derived from GNUbik 2.3 and ported from C to Python. Authors of GNUbik: * John Mark Darrington is the main author and maintainer of GNUbik. * Dale Mellor Files: * Copyright: 2009-2015 B. Clausius License: {LICENSE_NAME} Files: data/ui/images/BEAMED?EIGHTH?NOTES.png data/ui/images/ATOM?SYMBOL.png data/ui/images/SNOWFLAKE.png data/ui/images/WHITE?SUN?WITH?RAYS.png Copyright: 2002-2010 Free Software Foundation 2012 B. Clausius License: GPL-3+ Comment: Images created from font FreeSerif: U+266B BEAMED EIGHTH NOTES U+269B ATOM SYMBOL U+2744 SNOWFLAKE Image created from font FreeMono: U+263C WHITE SUN WITH RAYS Files: data/ui/images/SHAMROCK.png data/ui/images/SKULL?AND?CROSSBONES.png data/ui/images/PEACE?SYMBOL.png data/ui/images/YIN?YANG.png data/ui/images/BLACK?SMILING?FACE.png data/ui/images/WHITE?SMILING?FACE.png Copyright: DejaVu Authors 2012 B. Clausius License: public-domain The DejaVu fonts are a font family based on the Vera Fonts. License of DejaVu (http://dejavu-fonts.org/wiki/Main_Page): Fonts are © Bitstream (…). DejaVu changes are in public domain. …. Glyphs imported from Arev fonts are © Tavmjung Bah (…). . The used symbols where added in version 2.4 as stated by DejaVu in the file status.txt and therefore are in the public domain. Comment: Images were created from font DejaVu-Sans-Oblique: U+2618 SHAMROCK U+2620 SKULL AND CROSSBONES U+262E PEACE SYMBOL U+262F YIN YANG U+263A WHITE SMILING FACE U+263B BLACK SMILING FACE License: GPL-3+ 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 3 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, see . {#mark:upstream}. The full text of the GPL is distributed in the original source archive in the file COPYING. {#mark:deb}. The full text of the GPL is distributed in /usr/share/common-licenses/GPL-3 on Debian systems. pybik-2.1/data/templates/pybik.desktop.in0000664000175000017500000000064512512475422020700 0ustar barccbarcc00000000000000[Desktop Entry] _Name={APPNAME} _Comment={SHORT_DESCRIPTION} TryExec=pybik Exec=pybik Icon=pybik Type=Application Categories=Game;LogicGame; # Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. _Keywords=rubik;cube;puzzle;magic; StartupNotify=true X-Ubuntu-Gettext-Domain=pybik pybik-2.1/data/templates/INSTALL.in0000664000175000017500000000374512507563527017234 0ustar barccbarcc00000000000000Installation Instructions for {APPNAME} {VERSION} ================================================= Currently Pybik is available in the official archive for Ubuntu and Debian. For Ubuntu the latest release is available in the Pybik Personal Package Archive (PPA) . Add `ppa:barcc/pybik` to your system's software sources (with the Ubuntu Software-Center). You can also do this in a terminal: sudo add-apt-repository ppa:barcc/pybik sudo apt-get update sudo apt-get install pybik If Pybik is not available for your distribution, see the following installation instructions. Run from source archive ======================= Please use the latest source from the official download site <{DOWNLOADS}>. Requirements ------------ Please make sure you satisfy Pybik's dependencies: * Python 3.4 * Qt5 and Python 3 bindings for Qt5 (PyQt5) * Python 3 bindings for ICU (PyICU) (optional) For building the rendering engine: * C-compiler (gcc) * development files for Python 3 * Mesa development files * gettext, intltool (for translations) Build + Run ----------- Extract the archive, switch to the created directory in a terminal and enter: ./build_local.sh To run Pybik you can use the command in the same directory ./pybik System-wide installation ======================== This installation method is intended primarily for packagers. Pybik comes with a full featured `setup.py` installation script. To find out more, run: ./setup.py --help You may need additional software * Cython (for Python3, >= 0.17.4, to recreate files in `./csrc/`) * help2man to create a manpage VCS and Daily Builds ==================== Development happens with the Bazaar version control system. Location: <{REPOSITORY_URL}> You can get the latest revision with: bzr branch {REPOSITORY_SHORT} Daily build for Ubuntu are provided in the PPA `ppa:barcc/daily-build` pybik-2.1/data/GPL-30000777000175000017500000000000012130250057015514 2../COPYINGustar barccbarcc00000000000000pybik-2.1/data/icons/0000775000175000017500000000000012556245305014675 5ustar barccbarcc00000000000000pybik-2.1/data/icons/pybik-64.png0000664000175000017500000001072512446754617016766 0ustar barccbarcc00000000000000PNG  IHDR@@iqsBIT|dIDATxi$WuV`{mG,b p AA@D@ $!Q|0R $EQB6  8!660v :y㷿{O>Tu^߼!Gz[z<+ʳ?yPT6tbJ fZE^JWn#DK5 ۍRh!{וSo3ߖQ)O\"Zm3*:NEvo]jc+ei8'gkA_M|bq#;{Gi*>I^OPQnrƒ^,n4BSSPU#, lT9s۷e@o3l[%iXk^[>{cPCK)Ƶ $%$)wPlX LmIͯy$<{b@h2\0'l3cǍ7/WDj ӑ`>5ZMGUTMEd!% ;bMp^pJrͯ¹Ef)VMMXfi37޼D泡sGZ⬣V3ǎ8!ozET<ЍE.B\܁OB>^DԤQ U{Av-ƃRz:5a5PŜLAqA ZAemѺ׏DUc)gbR6cΣ< ŀn- Z7X[Oqv`d|wh J8瘨1#6ӎ$ >~-r/u ?X a;O3a--`MC A8`*‘TeAJ&tC3S xZny!>j)znj9.8Ȳ[$7RyTߋƅ^ 27x( ƃsiwCDiJ.~snkoZ׽xzh?X a+ŝ@v {I\aH1T+Jo0|xCUOoE |{.I@,' q<{ Li T |ϲMU9綖!jk'h4I0`&IAL=vc }./*]-.ؑ`Hh?@X `2ݕm8y*CGvb݋eDa1WSf4o]]՗$'} Rnkؔu&R24GZ@(\;SgV9v9XU% :pp81au}cRJVJ Ȅ"L $H9uh e+]CP. gvOqݧW_:FָSzcmMh!T*yEJ"ŢB!׎1n2ūZ)I6(q*ɳ"[o-*Bƀu}O{^x`r ̀.r`&3RDs@8h^AopnAtֹܿ]5Zvu}!Nvnj|lL0@+TL0h! bF#~.0Zm!QOp Ptnڰ k_OU|G4Xt-`Si° u~Un3l(/Z}:fc£*-{ ̀tOu߹AZs,QKsSk fZvb硥Υi GUݍ!#S IAKnk}Fƨk ueW( :NRA[Ms 3Q@#j3$١:$GE0lr,=K,R*}<F\jGJ1ƀ%j%ޗ7N TB^kpKȱyK3( yUHl 04N؆>ZoMq_slܽ'i-(Pxy>~S#oh2bmƂs+YN1`$KdAI a5E>α4(jxëJ䱘'`>lď:bp:$K Z_q0;? yͦo1fUu>)JE#}76t%ӕU'*!%w3>Ȭ´̀7G+xZ(aĂ]__Zo:v)ngؗ/6A;-Z ! HV@, y9:ޜM I[5v6Gi>6h4gM?~--wZxPdp{j|UyZ&"NUKL >SVJ;a!z.lS~!k q[?n\,D@{䷯,70 eY_O*V@\YqEKPhxsi2!'SC3oV xr.БGqs`h^wdbnQm tc66ǍabIgW>7`w֎ [ #כFZr_7Yff?tȘŭ0m)th;rQ; (|)dXM4iKL8kBrZIu%.ћ7tV|箕CScKKۡr1-O(WPU8`Al]INKVdAoOllTan Ypu ]K:Sn#g;o]%JvYU=ڲ 6I޶p޷KEC[x6Ⱥ557׻%Aړ|X_q/}%WV.mHٌR*$],ޖ,lb `!O~ސdUF;Z]u[D=?Y= `,)im'+'>wuX*Z<5yJׂ $myymmۓ${Z{US~~"Ϩh,=ymVRU}k0lgYyV~ ErpnIENDB`pybik-2.1/data/icons/pybik.png0000777000175000017500000000000012446754442020656 2pybik-192.pngustar barccbarcc00000000000000pybik-2.1/data/icons/pybik-572.png0000664000175000017500000017125512446657472017061 0ustar barccbarcc00000000000000PNG  IHDR<<qbKGD pHYs   IDATxiv_:xCݯ7%D2 Hؐ/ ȗ8 F`-P"ɖH7zn߾g*{7Y,bUuԩUZ`D"H$-|"H$xD"H$xD"H$xD"H$xD"H$xD"H$xD"H$xD"H$ D"H$ D"H$ D"H$ D"H$ D"H$ D"H$ D"H$ D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$D"H$#D"H$#D"H$#D"H$#D"H$#D"H$#D"H$#D"H$#D"HG$D"HG$D"HG$D"HG$D"HG$D"HG$D"HG$D"HG$D"H$D"H$D"H$D"H$D"H$D"dr#DZ_[g5VX! ` @ 1x88< Eً,H$:8`Bhi"5W.1sc2Ba @̈́pMH$Dl`6"t\"`q(9 - U=&6@c}&{,H$#X6l! -] `q-`q\Xj2#ޖH$#-v0<,dC-$'_2H$#2xHcTK,Ĉ0}#$ D' LaJe$]k >"Odc}#ɗbGr;SyLa1:oHK$,浜<R(p2\#Vτ;L ?X$7769vҿpM` GMq?Y=&\7xD@KKJQ xDx{`l'ߎ bg<|1r}. il[2¾saA(d]0Hc!ce` -B@- 02.}Uf^΄=qDA 10VgHք<)\1vLx 7*gq1^KDrdD7B<ݖf·  }YvgwZl/OE 8RU ? eSw+Skn~zSxݞO8dbkz&cV8$Zƅ(>S ܝR,8B> w\2L ~6<o_X3Dɛ4.-H߰-Vx'Yeո kV}BJkO+e/~j˄@xO ,"eY{' ,ISS%r*Ls:L%FrdsXo<%-;\_[T 1^; 4FgU~ô 5O9~nũ>|WYے=TonXE3kd׾%vcV-ƨoT?/G݉]wiLط_Ts=8۠GƢ0ϓC ܯh \A8pG7Ue(q9>`[('o{3D*h t1bv3q4vIcYqX=~(ybaiqS^9ˆ//qSXxezx<)ai=qvX@^h7brE%*N}V 讀W>_şƿ1Ӧsi)s @!8uGK8EwaKwWd H`tܞDГu3p q1MkAwOx*C_nk}ݞ?OGYvBhe+L@Xmv*_\6+\goiAsT.Ǩg%ܵPsJ(zKc}F.^Vi[fN[l6D$\BG_rZ=2\nOŭ',:Ojn`5,} p5"%sE)f+7| ߯~ 1NcCQ1pr)/>6>i ]0I%ײfszpߒ_nOމ}ʓ?Vku5aKD v tzwD((uքdwW> `I~Ϯi::a<=x,}xYJK"en}c]aTz-tߪܞhrlfL8\I 7!Vb,pc4]^~/yܒ6Rh}q:1L/#פ0b0Ppi w^q(UuM>_: g;(*dBP[YK }ń1Ź@T:0I}s_b/'i +EXY|/'gQSJayd4du qiHn2VCW˺>gxp)b,KB|#%}w@Gh;)#!yX_laRrm[p*I <;y jn8?gx4+- =S&IBuE~UpAsr_]Oƪ; D[L!?46r{R1,/ppx<ɻˊ0 IEc(1[( xդPC\nD(Q:6]{}ͶSh>+܇-SmOn|t{9&R༎1O#xvKJcQJ )2Y3 I/9Y!>e]]S7c7ŨL ^VKX_3龜u5a7_n\II.Dݧ:/i_d5?m&?ҩʗm8ߏaG)wrLMR9Nz"&;&L'/K羴}4{LW ?/ M;N^>[9,Nxm~koƾz5\$%Լ%I5jzT=@wZ(SQCROUըѸ/CG7k(锥Sܗ&V*n{;' %Z ~~UW,xD;6{Jc b Z>Wki&>GW<_K~9ѻˁ)>SG)!iS~Gv7$taC.Ņeb,cH:֠F6 7X᭔ӻ̧K5.$xȄ'Nz}6| wpX1\%a { Lb|=NCL8sӭy8:>-4xw}C}?@ws5m6n^%%؞cH(]m7rpU=`v(Q# `LKɻY&+ ߰cK?wKQ41v$zb盚↪U#[\r_Ki$llS)`@|O }ʶ߁ wrM7IRWPaK ^y/:eMt_Yyԇ:5ᮏXLy>』}:x/plC>YYs _m܅;~Oƈ inV8iM 6b޷2LYgvѷY^KZwWӍr{!ǬpVACCG$v_ҹ/m``sB; &j 2B1$uGkP~?[3tSshN(ĔQi,?\) F\x0Wu7 ?];݃:~ǕO[4 EV;eQܗy>;ɄwY6㜄N47+|aqdWYU>+`f]ew׉;Ƀ"+o-"1Σ4b |dgMqebMugOgerBAY =v2>JYe}NGV%K#5Ҹ@ 2#&| {<1ﶎA=&pYiG]'Im0R<sL^AQ+ou&Oug*5L+Uh&Xf^rYAOQ< x`%aCRG]vL]Lx24.y"QgkOUnRn] Ѿ X2^ K*(UK`aNJ<%8x^y>Ap}fz!z fOC&%:$g$Ia0vΑ8?Fg^|x# vxJOՂnϪUaq6qj@4.P\yh".BIVOקY | K҉0&*x׵ aM_Ys]^`p$R) iыΟqpfΖu5UBkE[5熆.g_s_+to9~ J)t+8ZYmf pXNL^8b=rx(s*A2IYIx쒃 gqkܘdVV)tcV.Y}F30TN ܞm%ۓvz ;>z^uDx Ib8 ]+JBslxAW;^Vw"BuNP7q]ב#R x.Ξrp:rc6R(R184qxA+-7xrPVn=|Ē79*)\RY9 'R` p6 K6"g5 7GxË́o͔H7b3BIFՊC[igr ?7ÏnS@S^rqᬃ3BjVr#7frx]O BBZڟD9g9t{_/e,f'p4H bP$MҸ WMWYW|q7,0Ҹh]*,'& 1Qbo1713:Q&:1a5_6/{@%KOn̹SN(ݘ5Ƭ(xyXgz ]qYVq VYF|+'nzP;! j Ϊ&5ToҸa=:S&u;5>hx.06pkN3գo'8 Z;-|o{{sYLǯx范3I7&U793=B4j71ZZnKz7_7nnU*~g\\1v [VV.S;3 T rV˅fFzdm/]b0Z@X+jΤ.L6Deа7^8 -uzqx|A83 nn2,8ݾW3 Dp Љ{r%LkX |W;2!9Ari ٝ9̇yP q]7]!f6c;3=&|?igvvLXTXS{3 '<Z'*;S:N 4ߪ$ϴLԚ \号XDYA2Xg(?Vx /@g #16w =CiXr\!ِb>2g9n h 2@S(\PE&Iu\ bz xlvsʪb8-Y=\V[rU}A&bh~o,A2׮Л'w&#W0^|.1vI7fyԢn׹^89\EyNƚj$ ӧ0ϔ˴wd!09 cNuݞU8ݛU+ɯ1k/Ijz:{N=Mb3CDp]7qdV\{,va,m^8D߳A&rpXjug6}!-"@-nO'qgn6+<X I%5xl5pI9L4lĔ8Z}"(= up2[du_:#"|3?7n?G<c'FpRbΤ}sbSD|R\\>쮃S&wl*PrrjOR1drxGO:LMLFMxv?4ZtLrzc\k=т7de.vjd91b]\37䔾+Ǜ) cW)"R p!'JHCOv ?Wp驟¥nUYɂtbq8ng]y ̜9Z qy><{pV$%Dt% hp:q{ 6$ I@ r$ J^FmeN"{DZ]XP0~Wp[`8:&&w-#v]pjk|iY)wGAFmj$*1N8puL{_1ӿ $y1h m\DpÃ-; $\hȾ']\i ;1NX%Yk]޻t{+:< U c Bmy3ƻx ŸWS*>|J0TZnx:p[_s[Tux'scSI+A=ΡI i&md% -6ᥧWasm- {*1D31ҡ3QBK'FB'IUSJj9&I\hpwG8&ŚB&+QT3?5O;,sx8[m!аe5؍&9MQMy2n̩- sc6(lGFp14čI7o2kzHKBEB Qh.5zqHG/|G4S5q8<ϸ/gYk ð = =i'/ÿx o_X'SA^21ĄQ"G&9<)1wgR29d&snJVr>rc[aHi˄l7 @ˤE}ݝ0vDEI,!,9*t~fxjsvױΩ)}7,cȅׁT>`' sx(xz@NeouۣF=Y9;K6|mR?U3iL*Ȅ{B[?#A5a XYVYAws 0j;o@\yzQ4U 1q 'la߷sVrE6 vW<1#h!iW^duP}x?0vVh:'wJe^Gyc)`i0:::۟\'e+| tӼWeŖ9i{Rsmm%@r2uoyUYމ}A#3.LቿHK+>XNp$UR}0k)7vcĉEs<]G5 r&`CL)6LQbuJdپ::֩ߏjM<`CnvKxn5CH[)"( yPtWVY68'WhV{j'i1婿ZKm ΉYd"Wx\D󁧮d-h`YOk ;xTЫAPV NݙKLD]Z:vԏWT]IA0K܀B{ j~өUgJBZΥ!:txÉzee/Q?wg,Jcqw mx@v$+qޞn0\vL \e~CZEl@vͳN÷W9#rcGqt[sݝ9<43pPTƺݠ>Z <4Kjpק72vEW~ D{~K$+qg1iPx@ʺ,geL?$*Ojc%r(<ȩƒ WfCn#%0Kӹ!^TpCS^pIݩq' R7T ιE;CM룵X3ܚ,drR|Hyl:< JVˆZ(FaIن.^+vrO acD?[,BYJTbŕ<̐5THqcwgvD+"2q|?J]焏(>x^%C6''px¤eRy0ؙu(kFbݶ`NG/Vi3K[HuC6ߦX y7 Ot%PD #)ngtpVaֳOېRu|Hqf3f e3QyJOw+-#vmVHVaR39< LVt]f@4N,;;9WCu3$GG!- t#3ٻiNnpw1\:;u~7}S"JGܝjݯ; iXޝSpWlW23F:ڥab rWV]k1Q+^ss<1Qg qwR(j|G`[K)kv%Lsx9A,T^8Ƹo,V=CZ̜f5WiDa{ n;i5 eM:c8QyúQ٨JnO:g *z ކ5w Nh&-Ӥ7i۩k'eBZR]tb>}qxj͍Mk;XNOS%;ǬN9Ϋb{>$ŚI^z^qؙoS e)Qº˄+Ѷ'W>|nqxCZ:5hv7Ub*Ly>h^d94=kijgǵ)>C>~HK] Vz*W{Me5|zX(~HrZO^p݉t Gx _[wFB͍M.=<xh)`(@-`F](r3LҲ٥Eta" eMvfw)ǪÓUi#Nm>NwP8~נó%[_$MZN&Bo>8؛YeMP+ulDcR`Z*-ӔPNz:.Ҥ,5+ewlǘML˒ʹB+0NlZ6PV%lC e'Sc=*I9 ÚuVd-VH;IO}V 0(Wf'.-&rxt"E/?5Tܙg ݻ&4wF eW͓AVj[Yٽ_ي>\Gka,w̎zO3|c'̕9%۫Fx_})1B9_[J,=0г5_w8<҂qxLd~1:lAj9 *K nZ+g䏮B8EQ<5,ձIAOWruxjT aȶxtX3K83;V(=nʜx̐;V>C!@)2y98n:onkŌTI)a-ނ׍' z ܾ*@מ_B0ɿ:N˰DB>s&cVrAF\2DJ!!-;_+'\3n=ȟݛʀ c~.d@P̜) ITCVxPܝhen8~? n+3aO-O7쮃O⧗džyҚWsa DI_ݸ^5Ef#jfrFǨ9/ZLtg qxqxtxiQk=t&SeUeO9̋qLI_{3y!->g]ZZEDcAff'*j̵@]F e_Yz;-ݯ'Og?' iLHkvI eMcŽJdح%$d 3/9*"/W/>H)^l[89x_^_Г>33%=ԥcVT55^M1I99,{g(yIr_ٛNO^HuB2쮪ó:jp_• . ǂȭhwz]ɘ{㷗@3_ɘaV eEF9<01 Cqw<_7#NοJ9ve&^⋤"t A?VP#ԣO:ec^H+|px敷S* 65@6 i!-"#ݩApz}eyx|BWG~qgBD`r6 D951TS- Ps'PtzK^ZY qa ã8֮NV$~tw{m!,)3Zz+|}ï%㡺̨9,X*v3_'(0mr~!-qwy✿tU[m xz`"z6tx۽q/&rx*}&VMޡÓl_Y>boK|Jݙ>pTμh86-WwHaS#+Z^Rx%޹Ӄ9os38<:vxɜ&)W6I(k{%rȴK-<ٞ wgVCQ TF8VbaH2Z]Vx/Q~̹'vx*r:휠P_tT%1dm<K7JGܝ@SCApj2 ΅U =3 &O=ЁLZG3i4i%-Quze3ziM< }C@qE?efXXNkOzV69<ÆSÓ i#{7 ةCΤP֌1G9IZnbtw 9<~ z:51jBFM;[j~ks4'wgXi>zZN1=xg g\|>/N|R%pDy !OKaPNO&ZQaI: Faa>k>zo|пnb[ B|N _]<⋯,#Ќ[ uO@&VfaeK!f ^E&94V \1rx$QyN '*4O96E wi w&; ey4Y]='"roRFQ"2:JC4=8ΣNt؎=j((Ȣ,eP UԾޛ7ofF?bXNDFDFfFfy73ĉ|F0tRDiq*<‰j?eVw$k.J]p'3JDS ;3 聄zn؏+/pg[zX*~%AMNkD|Ox0sU6-|VzTV w`F:#O89ڂ&-7y,*Logvje9n ;x8gNhf[)pqC9G9v³GLԄB>X0Mf7>Vkj3c>TSx>.Nq}vȋ xMd5yQzbL3O)ϢER4K2qpΝ"QVVf9f+5N[x<ÓNcj+4 ;3<ঢ়v:[E=uu t{[xz+wXK%AkSJ="N7 IDAT_Ӳ TJu'˧ƹHᙾd*ޛlJ6. ]8s35GM3ċI~5ae LJn' Zh烞gE(!-A2-11ةvʩ8BN,q+Gq;0 r%WsӁujmJӹg.X8qFS*[#Y,\$Ԥ{+S,˚j]wli `=Hʶ* ol,#pұID {'VVxV8 (NogZlS-0XgDyj9@4#. g][9k =k_q2IgCM͐s]ױQ)W 0>E [ |ol?F#G<NN.3~꺞xU qkBv"H Àia=0=`Ҳ5-L;El:P:(e_Ľiڔ&GXRqO. >'p]ż'5̿'FƯfP7H.a;5v^ f fx;JYɤ(F-VۻK+_ր%vz;ݞ=zxoHJvƵogv)BN9sTOw6??fM|QH* ?YgPP5)}G6|w3hZÚ6 6( 4STvPLnٿ[ëokB=vcҽ8x`_|0 ckPp/&ƕ=">jwf*v8<*HQ́+\錅YS&}*4@,^p&(Q"3 q(>YHFC ڪcZp3Aq6I̎sLO)yO[Q TjxOvb8tp7>+0~W[aЍ@ch) RHoQod` Q^ݡ :JM؛r#\I&ygj׽j0z] "a;԰޼q hߚ7}~5u7VLE*z5#eVKxD߻{8}_}rq[OF = Fi1߂QbIy ;K=^SVK%]Y /:Kfq+VNQNF2_MV 5,T)a5m?_M`qAMT* /T3⦄iِEq|Cg5@ejxXVT4sAuW |s]Bpʿm{> RW04fwR6kx,>[ؐn; Psǟ{z-EFwRI?O4&?OrY +haZSg@8{9͕gxNOQЁk.xpjmHPeLu!˛,t#,+Tzb}xHvJ5LʣVwS9_aPwؔ@|ć?+4U\= 5~. ֦ZMk5" 5 k5G 6^x8 {PlS3j3 <'L@i Vy{;mUƆ:6CW]j' \XH\tȡ%+4) uujR M|.@M}M6PB> W |ɧ`9t| /7qjQeggځb3b xM&3VI8/Qi%jS13N|+YbKTBg]EkN8z³-PO^e iLPE9 ej|Ͼ`x Bz ٽOⷣRER{_F' ׮ژBM&j| G 婉U{͹#,jMI *d3f;`kF Wx\0 wެ& =%ָ`+~JŇ3i,򀧿ٳDSZ2A w \ؿi`|[5Nhw`Fd]ۃϣ9[*+ug+BV[f#8)փ׵ޒ,fǝ7?InzJ&C&L>ĂlYʏ1XF`[y0ƾD!@FjG8~>9"vF׳n';&p꜅9l➯8zt0YXi?ܨC"eY ; shb!w#Z#!](!SN2jvrp! Igu~\9*Y++1s]ܭ3*R+T]K>?KBDq- { |JOp[&- yqc.)`9Ϯ?={W6{W|S,aQ3?Lj񠆻`c 5}|J$HGذe@ UԃrSkh``fM3ZKLR& jS?ROSŠ%ru/m ,zJ1O<(D ;T(I-6$[Ɇ-<{1-_yA8ZY8v›_) xRA4Sn\3W͉zrMO*!PW`bSc%VIuSt ~]ԝI;6P<ؔ=P] 8=?z6) |k۹/mFH Q~Ԩ|D)uiW^8}NZx1_{\ ZIH!8x(%Tf ',| 9 +6V!) jҙkG0bݻ܎#@Ƭ&)/o,\Ga!$ƃM4pvSk<a84W"i3ݧ>5hJ4kuG" r8,4WqCp>yGo3Ƒo-vA%倝-;{k]ܚt [xYcRJJJ !"j!W =RJEbF8~o¯ѧ>±gP#m5{ wp|!!6ûNZSjwliLZnIT#c1ЧUđLWlmUL4_nYAN4hR%>!edل%N3ȇHza4=愝6%λJY#'xǿhδo 6(lӓ"fSz"$z[[kZ[M2` FD3l  -l9P.ذsqN[w&inӪ@={$> OguTa}B3OV:^r[gtsHIs ):N*|䔅^/Z1@Z"ðI;IgԚI]whg핎P]i |̹5lllO`m;# $A~ ^2>;wM͖lBቛS)ZKK 'ptd[Ln#wD6cHS|*)iNY* ~ hӚ!bz^K |+` vSK(:z.VJpZ~#{‘Ӥ8 5B .YxPK$pCA 5!$L!$,! , !lHz[}9xl'psG,| Oӫ>]2X@r: G"Zjt 6a+6yن]FyO=ӄ 6C6ʼFE]v2>;g zw6emjΏ$ KצSݙb|IRW=*> x )dW %`Zڋ@v{dmoo(2;0,Ԥ}8 W9k{:a0t|kQYAHi[G珰/!tMco kY 6ʔ548k9 Jw3h{Wϔ-9 /a?]BG1 Lw7^Uv{03Gd+<\" Uzorn`LB´sf^B6ۧ:V3P3tn2 JJe ni X)`.)BI zHE;[[k:_0?Y?K@){_U'Mm5 ,;{7+e%xN  IDATBeI(·gC=K^W@ƒO7{[qcOvۋ cRgZYx*#p_ j\ƍI #`4,o@ gQo/aXzGXR:-O}rMYE-#C]81><3VXgک -߭vrb :ϟRte!t[xy z8΂&llVw`ga^'SjΟ5CiBvQEeYݮ 7e4C_9lŮ ŗd笱%ۙXe8#>'N0 t@ά;lњGշs,6yDՖc\~#j& Ί-ƁۮC𮏶q=fj!M"I7?juOz̀Q; sg t{6Ը,}&8/v%Q7-6u8»xU&UT+ȗ#ݵJDhH)o6vrus:U8^8ٟY[E)?ưsz`Y@(n4 :~MYCn1 iBJI9 gOvX$\wQ9pSQa!$|fτiZ9Pep{CӯkjamԂ»GU6ؙyIN"؉&)ΚTa l62mXpFgN := @Ye wX0?qKye8ș|s<5?M^C^CQC݁a85[¦%`vz0MiFw̭ݴ7`gYL1rF(LZ)" Ѐ(- D:ս]۳?΍³d^vȱoyt,q o<|R´(CR/</,Frz᎛? ڟ = "\]F5F WّP\`` 3 [*MDw׉86jM:Xp|[ȼd|oq]<:TʔY mM3k'#V|~7lBӗB*V_f1DTip _ k8艃B#gaϧ1=5u454u4uƀ5D|k@)7nw(밪t&->0[iWҩŲ-lO*SVM3EY f"ϴJs5tÿ% {& kLkΛYhD֞5ݷ#ˢK]\vX jܰnj5F ͆ 6fMGqPoMgYSkl MOJT8zA"Vkn[qPudI2nIٝ,3.W$'_QZ e`T7s"eKID3SGk.%ǟ'lCmZ 9QQx 9+niW z\I όz]ۭ55ڨRYLs`p!/.´(\x ~ډMؿw' CSilqQs׸j{LDgƃ 9]_JΧ,Tua;0]9]V^cQx1ePxsfg 2b,-Q>o,s <+lc ǝqyE^۴"T5ʮ[q׾V=~~@@V{]h:_q J1?|?nWkӰ?t2/HTU2sQ(kzMGc OVo uJc@@g 6d9v,kz@~08ԍLZY$x2(aF v&y2e } 1HK3!]V|ݤ'Ԭњ+Y^Z`ǯpG,\~yj V2ɐʦgA?߭57a :8Nc'sI簱kEYVah,$lָ&([*IIqI2eBቋܩN VJYGe!{3Ӎs}MHU]OڈZL ӐF^ Vzg,!3oq;~k7a9&,-창N=ejZt.K偝1/C+1&-NQJelevqh76w;(?`V5qSW}ttTdQ%t|]M rIv[:]%Z."_aWj<^ֱ KgYrRqM*}ø #OwݥVYMcyPtEȦa3E8.Nh/p͋5R@hKP3EˤĞ2E:Wx(^J4OhhHzǟ%5Cg@pn)8&5/xpV28#*bWuR<(XLY8n><O z jY5w~c z6; vLWށzIkh+ȸMʾbC v򘲦<|0zfh79AP*D6AO#1Ɖ"cagRu N[fUxQ9TO~ [_|okzx9u6FtQ\Ӏ7 V GO`'x\ّ Z(a `j1~ߘ4\;e%x}*;]^~KwݘB?|m>.,&b X\` ?uNk#Q? 1tJ;0<)>O>`X{\Ϝ;Xk[}u3`>9{\ȟYWus~`YBGE]K2i2θDR@ŴI:Q fw*Vx™GYmry〧2iMya ~C|3ϓLZ.Q;yșϪElJWm L?JKFo17{כ+܊Jtˋ/7=igEg{EwHqFM}LA_S+KRNV mќDy 7@a[ቯnGJ)#%1GPAʐKxm \y0y%ySS(2=cܟ'q=(8+bM]agp:_z9&>1^t[WYQ9<x< /g8?g4gWxzDT;5b4 M[@ ?.=I(,|,74;v^zH(/Q,)w9N1]ݳso OI ڬ !znJc ۮKWz߶r,Dn#g`h~׺(82rC&h1z]ׄE0=DG <)+zϲ{<"y XZ`WxXd0ur9'̌N6T\x׬ώRLYd+KP^389^\<#ІbQ0 #%6gKBofJ,)Y;^ɛ0SRa#ɍ Gi/0N xzsg;ST3_ͽ47 Uw=_cО(Tlwd)VF,&ȧd1u;~>-CF v j|.I6mq9-W]bOj-dp 9o|#])bLED V@J^ΔspM-CE]?S+<}7;};S#OwGDk KQeM%9SU728Rv݌N67ǗskxةZq(M;Ӳ%Vxʔ5+Oӹsk4T酫.59#[C5M9M KL>R+)TK'Zz(`Bف)i\0S}ԝ’ϝ(V)5 ޙ*<:0iƋ[Y,:+oM[ͯ>̌145{_{¯% EDhu }٭zcб}+~ vJ;PL lPsH"fLN!Rxfk漷jx |Lx/gd>ӍIZ8R#.ʴF(L/D #i/` 6iU31Ccޡ2LC5ZEconTz!4Y[/x7g#1ز&WV>VvƸIiDSFO.>5becת|Ҙbzֈ]'Vȸ^ &L9>՛M ppuQU84I2e w5xBS)8yIMGfv2v?Wx&XDT;&`e< vTKXgFC<<wZ0Nq y*W@Hr{>..M?Iy3iɏcfYu3-\T3Q g\+o?E hev P~LYhm[9Јn?9άQ(j ;fOmA_0X̂gD}9NL帬K3f-HrqqLYC^PZGkngmCb#o5qewo|  a#F\&9-}x܊>ӜiU3`,?ve Rx 𨝖z祬Ӳ|VM7wrUuyzPǩ(Æ0?w ' }* P;?c9m#ESVڗk JI^q=u9h7abkjW1pBx%^wWT$Uc s|&Hϣ ;q+6iIow, vfvtMI;蛴*RniMZm c!wȔy557\U/b"'ӽFX6KLy8"{@o`g`''E~ZiaVÖ(<)xNoỴpc]:Kz e~OYhFo KL6RKӀŅDAR vvREX vxi*!Φo(iz3/Cx ) X^0:^qkwݨh:H:Ay IDAT?/~f#ZI 3C)yo쿮1(6I# v4?^yEtVOpZLY xfm6YW,U:Hk0}ٌ, qc<ŅWfM0 bZo *BN;M Hg6tY*}* ߿ʔ5+ + عխŨ(*l5G-Gd#ZrNk 傝Pe $`T}%99ulV\ʔ5n!9P;㱈vqmag.PΙ E5 kxۛNdm٩55Jq*J'ڇ$6 . ;X<+ؙM#0TM'jE'=IkTp(7[}f&acscnF׊ ౞>"aZ@ޡᮛ8|صRǟ+8ɾQ`ƲU҅Wo%|IӉڤ|n跚#3܈M@#T 7RJnu' xvvM43HU^uG_|p38*UD4>,iQVX!D@IV3SCy.`;%kJ/\wzɇ6r#6F/8V d~A^X;tnㄞ4 I ֬tKj,?@x=ګCKgȹ'eIJa鲨U3};hq`{IQm;/H1 Snpsxv bg3R+I+ ASLN1$ԍS OgL]'m"3n_ ͱ皦aiqZ[*Jkg+Ң2:_w7o= ~4M '@E%`DW vKjp*3T@VnJ8(䃛ܜCn~: 4s <"M>H ,H-8c~xGcD}=CȗArZV|FU3I LiL ¿%rTnM{98s=hϤ겆;n +T t`_}x(ꌚ]`gvӾ@ vԧJ?>vvbC: كkc<36[7zS;a Ov3q" CxgrQc)ɌV;;-s ;nƼ$e`n|pqÍ+6pP@噇6&+<ΑG憗ޭ:ȿUKID&¤[G vb쇏+-Qr3tި,XԾ+)ܴ9CnŽ\xeI UDRg /Q/?Qڦ<1탗i,SδTiT]|5eXz ˇDžP: NZ7UݕCÀU_Α{wjx- pWi ,0vHu"#6(72& :<,aCY_ <d5xe`s P& 7 Q7|B2 JᙃvD< t4N+?xwB|m\p5Q91^8}!A‹t?VN;QK˦˲mFz1nXdPvh h*1Mѹ- p r9`CULn|s{pK)2RK,z5[g;3;TPX/}shMj5zt]?qp0DFް;Xn ԫgZ\ͼҬďBUTN۹Λ8z7MZ?ѱıTlV$@Ҵ(F}rL|aO;Q:p Ȗ7q$] (isn;.;F7Y]QZ-8YCj;kܰxjQwd xboz}Lkؙ}8du/oL.*gWϓ1RhKLD63@E ;vנ6%}RUn6qDzL0 f% n&n98f(iڥÉrƸv*!z-{(i憗soYo+_hx_Wo-RQcFiEƹ}+).J ?Αgas;sv(x.ETf%̯9 6n&wI77I+m'mbz9! [gZWl9L"eGpuu ND:ӟKvqzmI+\\KhL3 w1Eí"HnN7? V7aՆ& QŚ720@k:Z=" XviQ _vvvq} ?+\}sO|C{5,/r.k#wH h vI⠼ғǒpc&s㇘*0pdf(u㇛fAp3εOIlm;@''S~Oh ]wE _vt !O'{mީշ5qy`-)$BY`g*` gMYD9p#: m~lz777!?!e?Z*E{YW7=O"gR<3:=ŋS;F~pյ7>CAy>vwV8n^b@eVh'r\MV0Q$vDK4 ϏnT-+?ێʱ'th!9&'ߢ/bldQ<آ=kFxt]1eqۋ{%C%qLn/e@Cqϋ87Fx'3Km9psсMr9U/77~߫qn3k6 4P 7nՠYjD~4+BZM.Q7&@)醁ؽ]ث9y3٤ω)j+ؙ/eg,TݎQ)ֳc+ s];u8m'$ Iz3qkGLMnJ2籬D<:2ynă1l6$p3=.IDxۛx';t<øwcu(31QhY@)R~[佭gZzu1'\"i⨡8:Wk=pտ.Ѱ%>3J`tC˥+²_v u(^'<>Y)$RQkl>F-}Mi*{p =J'f\avʴ2X]{^ VRyaLǫv4=\ZqAI33vj~޾.\w*)S$Ys(>S7n6ܸf)nd@o|Vm/RSD[Q?7ry_/iKOyrҙ`"_Uf_SU:O 7-G9S7hG Ӕj# 7mA[ǟ5 MEL>G)x泎V<*ezu=ۥgʩgRxԊ+.?w6&NTͧ% yR`bX>eZԬK;9rn2l/!i~׸ 80&7՛p8n]c 4Y)98;*G6V)<7GgDmT3؉rMng(7TPn§Ip/K4Fq/J1}V橎VE+CXAL_ ZH"80M 搒׳<Íxp]Ѡ;pN>?)%&i(W:p`XpRfx:6%0淎V\P^>+Jxo2|~mRˎ ܔ'7R/80MDՂ8`t_3/Q+Mu C#7]inI%26L% *ކ'ݙy)= w;D&LRˈQK7 wG܌=yE(`ܛ)ls5"Wi94fێޭWz53ЫD\.A݆8e#7:tC, Z84jj%Io#?}Gn32k]4,uV9{ ?m\'qj9}ތȻ=sU v)M^-6Krũͤz"_s;}.#4Vj:ptŝ m&ct T_ja[|BnT?1soN=,p^N_nrnt]ﻗg쑛`J4 '7wwq;~bIPЏ%).w٢IE~e0ɰTd`*+SS- O(Kx+.mi#064ǭ\ji_*Z Gj?4c4~ Z*1?*gbV;Jv^5mF 0sj`f" O4JN IDAT才4 S!(ܴm#7Nw}`PYN&=rQ=aeZ֞NKdGz>gə0I;{#k*͚冮9,'IjOx 6v቗a{ؿ? R<6bK:NT|y[༺8 4nGJOuri ]iv4~"7Vv 7?5pw '}O R.YOd9ce^:Z 6J P%mț)M5 Y $39ßJuW5DD>OT%wP‹J+^GNFܼ\r3M`Ft#8 w,~W_)}Ԕ:.tbL45(B.ŁYf#;65FNC6lmhQx&PYz>); D| 5:f?e v[NCŐ{Umв>rV ٸ ;Q>ϡ:{iջO)U܆t"7NK,odSn.6Wv*uv/ qy/{޺$|[? bC 7Sl/ZFDx8n>k?g(,y&q`;I!7<3XjBH;.l'VX[n8Ï}_?oz =֑i}":S.ȍ 8twJ*lULMSJ)|D>o"g0Mon*u]==g Z6.f˞*F?C&7뛙/'uyz,{ֹg%g2Pk [n{O Ca^ 73B>MMF~RpvP7hLvZ5F 7 7% Xva23|>3:Ѣ!=q8/<dz%<}Cc ܙ~?oz'oi8w&7bJkLq'w#NOMGn^HyȲˍ!g~&Bw.g{xT;qŦ+8,0~7aL&k\G“>CJj' ${ޟ­>QS^>֦#rR?;'r#7j>GByˍyer9?rSȣؑLS4ȍ7-lzbljћJ&3rEt-’άsL+^W \7ËC%]m,v$!7pf @sLM4=em{'n-6v|??SPR)ʈ(z#7ΞWzdԑ3M &<< Lb_mVkjlyrj+7NTrx^Nff8ԨKj﹛aDEdhQxR8y&#<>giΜ4[ė/տU2DqM鍶#7NY\WWIv^Nn=nr9BBbBѼq'zf _n)Tnrq5W,u^༰f# 3=q*D~Q/noujMbݘ*R%n&"|m* ]" z&qS*Q*Q*`MM{h۾4Qo4Qoh4;7}K-C!rF~2>+FJ ?dDxVdSZYx;WK~.g) L-Z|ob~Y܄ו2MoQ*bc/5 _LhQ"7ziSSmۅ8S'wv)6F~wpE.b mbZ7I2Cҋl[W;?^m>1u`T6j75<~|f,4moK)77lnxrQDX@>oн ABq'jSȍqO; G}KqTK7X7ZLRksgrş(7O%-]jit]G)hX6MOp1 P[-jlD@@ mĝl3?'ȍ>(704,O);#<9<mq# ,<[t`KfiM-sm7YZNm`kqrc6lZ%lmYFBNٓ?z]>f~WyAL?fi!mSke'Qg3LҖ~]1XG³l8J}:}k/_qCLtVr%8£)M&fsk-kf EyrQ5PQSSMIf~&`RomXR|hע2ODQZ 3(Ϧw2w/U.\fmS&~EP츴7ʍWz!3Q,yrercmIyLӓįhbgjJj)mq-7rŧ3vYZIJc⼦} F=ˑݯfb{ua- Ϝgܶ쟰B~٭lGf{|]W6_(3uFLCqGm6emxy7^7^FnyKww+TTMg@nl/xk<ѷ4stJ%YmJDx"Gm!Qˌ\?qSJ{=)J)OxbM%\|nEj?.4qc◞-0JnȍˡT{SR[֖75U*ϙJ0/hawJJ NZFV۩o3 S~Gn6|ɍVRvՂڿ[Bˋ ).0³SY=RJ!)RViIs 3w/ l{+&aﻣ^n{AQJ 9l+6MX6JN ޜ*(WTjћV_4II_n&gZΊ%+}UI_gΔ+e? 'g~#d+&qS?TcϕGFwQ~LM)wbӗ loo`߶}ۛز6P*r#&.]\\u35ly/IJ^h~Bq 7;vA27VYi*NH]guʥw_rjŵol "x[M=>}f3#*;?Qm4ֳy/8]zB),ޅz WF M!~UpOnvPPT=7AM8CIaCT^OnHk!; _+83OE,\{vEd`Y ς藛ݩ򑋨e}mixyW[i 7M\[6fMRWM5L!~LA/78uI_/3py*,tTq=A,{Oc:}3*“H>}*⡧xrJO4j bo Nf~IIzob_nȍTz eOɲ'+>&<:ZP%:JE5݄<*Y"Qtmg68.>{QϡZklnwh$'q^ a(JWy(;Pv=Yθ률FT[gM(<吞[rqݘO}VopۍyݟrgTvd/xUZ#]#\neiQxHRV=\CI-F`߲^uT?ɍ=rc.<*NJ4B_센N")^Usj:Ze_oQgO<; Ge/bݗKXu6K\ƪI"<ٝ0'+ߵ?f!olZ.Hw8u ZvN0FI`OhPSe^Ί_u.JYrʕ6zx\T'n'!ᵾ# lY[;3wWUv2[u(02|?g@vѢdrynRI'#y0sFJMxV921a3W|.GͺMPx2-=Dϟo}mTVJSZ=iϰX,y%L'iusF~XYy%Z lM=j/jȇvaxRi@Z[WMy3~_/TVfT“aʕW[x5 齶^l+Zén=ǭC_Ӷe>F#'iYFIYQmd$λ!DT+u$*"n8p]C!Q+eemZMz6e#&ٻ&-?5Sv|WxTx]s]i ۾; L)=_wp\߃̯ExbJzv:nSV(;}GͧeGu8{ǩ`-p^PxB 2!Bpq Hֆ CHFe'G;TOkl=n+8\8)8pʕ³:eNa1ٶ_xc$qL֥q= Ϋ YZ~cS"/l?J4% {'U%ZzǾ"p^N!zs4i̤eg6)1CM;k%D Shex8+  V]l[B>7ӛ#2"1u3ΜhK.qĉC(<$!_yg …'v8Fٙq⎁3#"x>2~%PxH*|N6pձ9b ^FIYcK,3[lHB!S%7_đ:r3*ȒĄO-Pvdm43Jm1#<:V"pvJ{++SUUX@j4MB! [r)」8n}x*/2Eٙ ĩ$>H 5bI* PxrpC 8bl3q/ /[DZ%hegfw67el%q \Qqć Y8JYY[r -9hlL,ux LMQ9:T󆌭$Nè n!Ĥ˺>Ŕe {7NigV)|NxE2`"c+Spʕeɝ8vPFi1ePv:w*c_eA !2:9iΛ?$.oSa:J:3=“΃l2vB'87ǿQPnJ?YPح&RҒ5K~"'4˥寢]y[`&Pps%7\đ%hZֆ+B{4Q2rRG\! Y(jt QTn8Nٔk6)@pK< Yʕ^g8zPf0ϘeMS(bۃI< VXԲm m:qXI Y:Μ4p׭T KL"N3pӵTƔ9eg?fIoz .p/;ޝ)8PxH)Wʂ%>ıCoH`%< Qviwsp=* QK(8PxO7O5p쐎CvD8 mPv8;%IJBL.=_&ʼn cx@0V}x(:Ku8Ϊ *Nb燂C(WzҒ;εpR1ٸbLpMY%٩k u`{k[Tʠ{Pp!2sfw'&j9jڹvvUX]ס:RCSB, '8qz<є֪ ϊˎ[;KXB(9۫0@\.P$SV s, Q6SjɍMnᗇ(EYUyjzr~~~AUVRBwOaoqC 2!{rD,_?BC!Dhj8q9^cmooWf{'7.){ ݅rX-RcPP @^r/P`q8^帕(&pR0ʃ&c̈́*p(% G3Z@a+u,@!T:VADڣA10'JUY{nj*'ϩ:WէC\.ZBO@/ 1RIQ# Ki5|Y=.`㪎^.e1#:y5<33qLDFhaAPuD\e (X7Uc]Scאg|."wiZ!|Ey(HA:iNь:IwL,p{MB+V+ZMBH,X;uDڝXHQnQQ1@ KV(yA:{WT><[Vޕw&wUɵ5rDckZʺUDxz<KNG4b:jG"lvDŽ ]Ic< J! 8⣔r) G%5YTǴu{rXwi43(RЫ*[*?3[j9; ? G :.,o4dwGD'ESZ@6– '԰%7*$u}yhygc Pz>M jxQ gt1-ј8*(9T jjwl:VwgmnGrSΩ*E׊!Q*6Պ'#o36B4tZIy9K*\CaR5TUrD]bTj*o3*pSPG,w^s*bD½U|~ ^}͹;ճMՓZJ ݇P`"@BQ5:6qՅ1}]1p֏CKNS*ij~DNS1W6='ѫDeԿ :YN{X̐VE:B+ `nm!@i>~r@7Z yUrU*ռxUm!u_&MZKܑϪW {\G9 q@.\w SHzJ*(ˍe0(={.`hW(Bm#lX9R7rqj^XݥTG$5u5g/vE&.MW6-7JFt[)Q^-יpG#zQ{bC"%agc0'!\'ܢ J)ZyѶtatB ^pC#f'(f;͂u⚚sT-xyZӶ? ,ԗ^|ojom0W}VŶm )BU98Ta]yYF3o5b)u 5M"nF@ :0-Qi\|R{ 5 /L18n,ˡYN!_>S*k‡jo@SwۛOD-JO8۠)j*M&byDC̉E۱k˔bmx9Ib$66ǝGpE0~}1=7 :8 fXV娸E쮺w~M9)걧ROUwL;-QU&b:J'z\C>͒:!as M\4Zl5 X`ALjOaJ;eGKD#yqK54[ {9uk_!CϔM\pF,咵 =yaG9|慣G = wsҼaG< s%û^jujH,G~WWʧ>D{DPU>kM>]b&HWj &S Qգ2+sLf?o8IlN=AR'-ߖU%"<{[xK<س;g=#|8z:곲}V<B :gdފx3=4lK\0b[oZPa1$tY by )a(J"^.4^TX=zD%&f,P#]P 6tt#5+M0n$"(q 'Nz0W/ w걲䱼`8v~ X6̕//t {1oWqh:nA%6,4/ASnm!|J=hpIN%ux@,eU^JML HMR{I xpFyrpρ}Ųckvz[ |r"uh86rm#ʜt݉5O%5!,&\L[W2^R^|&eCa ^װ1wTZ]:MgOTTo<:١-)D-W"LnTD-&D.^fF!Šnh(PiTρ.'6=c]T1>?>{vYZmgyC<\q`Gx~ʢaqp.}K!WZzi\hX)H}>u&9n-Ty0jŤ78]4?ۮU1)T_]B>>`xDN 8P_íMll@|1<{`LBᤤllEcrO" ep!ҒDZc^[%mz :XG>1=j0(ˆ ˆV+CmbQr~ayph+Bp-. 8s1FVm +4\=NIc2Lbt͎kд(U>&d@ܠmeW r<^vQ&bb1OXPȑ}/JY0$ BZAH!z>zw!V8 YVwz_6 ^IҨAM}oSƠŘمs섭πBF/r֔ Z^ubJr[+ ՚~Pgcc{"Z{G 14V(T^W1",-_On+5fFv0 "U.9VG-/ᖃ҂P3.-DfR5 W\SGdɪMJc42hѹYϘXՋ8|8]aKD-rR@agUzXPm6ۍT}5wfӞKko~'ڮt{0Zbygؾ `lcɘb'$dIQӾ`9W:SDߚ}O0O32|'VRD#b{-STuFB<̏i\PݍNFM*2SnM@4@3A0o0ijZxPi3;OL[{TkQKҿMz Z(Q0jͶK3O k2+t@ڂ Ռ U}n)!f,SlO97 #x6wYPڵ^7T}2>5jLo.k^ dM OxR m4L R}5|@PH7m{N;|F1@ahTBV,/Lr/j's~> T"n(3ǩJoT AEFx"]%8/r>f#K3 sz>S3@R S5)TlTmcLJv>wKzmBd@]$$zr97vh Lp0 W\ƅ.ZDwpq:y(H3 Ur[LxdT/I\nZ8ᮃru9Vč5 Qp_e.DR Þ/VYڲ]a`e`PO 3Z Μ'&?ؿ$/K~BǞAfG2=Њ'ܴ}oY>e{gu [̺*۩y3AHL^Nq/#Q:1bW,.8fy4Bi0D*;BMӯo'M]()h췲{[!|oڛ%mW'1|IGՖ\ ZOp1ӻ$pPmXlرC@{$;D֢kno8/QZ76םRVצۂx& pyy^3l# #Bخ*Q+>5c3V}v"XCOtN2BDssCF=)g|y6fVV<;xR^XR7P8A""Dsl] =Lp ogsSP?m[&̤?D ɩ+$igJN/ݴVYH0T&Jh& p\D9|wi^D5 e^!g 0ι A8 wT3:LTU vvri7 fz'-3n=#߽ܐ<בo]Y &[U N*,]F.> }nPezvAT)QI!U-WmT'mc& pQVҟ}$?Aғ/jORI=; zx",l;U3m .?Z u];pm-!P &bEz>bnie3[=ZA5&N 4 xNf(>)j]EvHp;&M);~4EfT8p2*&YU"k-2z2"~U}׷LpƲ[fDHf19f e3YEJn|1Zs/:r|S[˕5KP.ȏ~~ T*ʥSY9* ߀wNj=gP +"QQe3Nj( @mҮ>=m[퉱I 7t/]PM˵+E% G - 0e)*4P?iG2:a$*2͖5&S0ABD#'L@qaڊF.ev-ِx%gV7"^vzQJu,y0s-yF[VD\_@a,KETַ n;UR@|KI00"TkYhis<1= h*!<pJ3\qj7l|mpg] Z\׼>szN9̒"s̼SYL$Of}]1I6 ͌y9erA k3|㶃n#P\?ԡrHB*lmod~u~$+ďuj ň^gi-*ܺf&FzJ W:e0^K =FPqyI?x%ï/ҹ}ɹkFPc:ȈӪm 7OAf\8)Or-'[Vo g#ghJan7c\N+Mj:`6K4E4mcf:5Y:I3cCJ9!7xsYbR1n9%^7Pĺav\g% հlY.\ yF<3@O_QIC+L>w1Ƙ6h^hS)c,9[ ` 1gJ {Aq#s;4OU0Ƽ{|KkEmTk8͢y'6-_E~6yAmuqB|7ijam<#`ȴبS-qr3\/rQ,޿Ygڣy`۝3zҶJ%# %iTo\Ff>I]`z(̐6:$F8"y9#󉢈-<[VHj/>w (feq:-Kla1:eif\gBG?tA+. \\ *iC9rq`NF ջ68qν4$aXj"V7"{.⥐=ԕ́;8yx\'Q(NNFZ@|rI0wwYfL)A$&)BO͘ "2pQi#[У߾At)U!q"W<~WЅ (t _wklVS-w y9{z cnOe][5}(Ų&bn;o~p7ۉ&ͭJ{]ɱv]>\R|ޏmzI`kJѢNM, %?'x&T ިmJߔe\nLj :WE݌9 ͔NW.>4o$!vF ])qnl+aq\L)}{da^ " s,.Y(Q*<07loخXA" vf)?sHbUdy/B n|?ϧB1$g&d8'hB3e~):ߵi H”%VqaT\few^޵vuoX^ Ke%*F*ΞL֠-V!|~3dz2q G&V&(rz^MY%z~m觙2]<{|mqVȥ9qvb { y?_ڢրx|#s+5j&]f2V,,8i#(NFSf҈:V2#44@81GU #7>T>2卽2#eyJG\[9yCnEB:YC(2tr:twORvgz@^j=f}w|.s>l!g2[-]}"\+,~ $rĆi1EF* O24#qN`n ")<ͷ9=}F\I(+;mi#`p.:.O.K&C?1[s={L912gm:f62@/SjB},, Q ˢd-iF(*`#:>8%@@_ٗ-5ơ:/^wC .lM4 stLk @49w8FNў8rwSI͎Œ?'HeAk͔|ܲ]t'_*QFKL?{v5rgunF y|rg0=F"ۑnyu2k7],p)1< s,/yn' w%?$3&Ep&q_%iQG i׷;.(PDd tLxjaN'vvwmcۅ-7A;u׾x*!.sL $ ӹ^xά;2n%X/f 1ST*-_YͯηAMRzΠbR1Y1 1*V3'BcC}ۮ9u&n2r7_xO`++=O@ KLA?IҮ/YeR0$@[4 G3gHE<żJ|k? H6턹3h׶v\06i痟:P߉YMrݑ)]aTˀM]napr^jڙ4s;@IWy >:|4NF,rNM'XLkݢ7h":2t﫟k?}r93"Aw[i͜ FnunыVi4#~5N쁤J{]yzY8lq\S_FtsI6 KI6̝^7>h 0lve].Kڮ Ih8ϟ^8ӎٺ5ez $M"gu'E "2utB3gΆ>{Tt xƕ8~6tnTq$5hѣe>#{gefћ躣 $ޮa/T4AD>1]9\XuIrJ?z!}MŶD[G$~BLv8K^? &^ =I/'it:X ͜4OH6wuݕlp-jn,1>:z: Tf ژڙF8878[}a`{]rg\Ƈ}{*{*TjN}FSHBge{.A7IJÉ*B*&wVVm(:hyZL3gޛdMzXA.eJQh0zFͶM08;1=5C IllljbvGU-%\SZڣ-P*T$DԊonnd1 xI$#O|%C$[Ϟ [{${TmgzچNZx!kMg <*Ӏ'P6;߻FV w5nAxY6n6f} "O&4ߧg/]y?syqH/ﯵzS$~v=[ xozݢQ;  #,OWh&hc(سܼ> *J3YWCɁFVKo9OAacےMgkդBHcIU}P3C0@qVhvK D8 3Nb%c̷3 9T*9*)H'HV\o(_?&Cn!DJ*ncnHcy7vIl{wGT6b]Z[w{8 M08 ؝of7!#oKc?>IhWmc X9AU:ywģ^Z˳^qO}]oπ0M!LmȠ>ܫU#ےpdOcxw>?ek֑Vi[s>H1`S:|@ W(^SϹW;ҁeW7y {U[ss'!V6iOcܠM^sޗrc_[Sl'wqH\HI jMGoE091g|Wݗ+߇ԃ+nj|j=@stxL*lUm~,3W2]cStѐɰ_T&K4+^)0'\5UlG5ZAwҸ @rt}\l~kfzV+ ҙ~Swyb!<s%Sv9fXGtϞ+w,`z?Kjc}F)]J:h*n%ǍssnCx;@mN9M脧*'0NMR^fv.}^hg}4Iy~;8y~+k-?k= RSNl@#COQx ߩ@c݊ XM$omL':6>6vصEo X. ύ38BUWg1嫕go>xOG;7^?.5+yª~w4ǑC $Q *Ƞh k^v36-цŮ1ɤR/}=gH 0ފ& f e^Mr#w>] \}6YΞsa'i|wsAsJ>NlPa4uKuќyyoGY[?\n-/b^L璣FoְFk]SUsm3DV*Y:LDTO6Nۀ9Vp`_o W*&B--IgcA3QE]eJRc_{rj= |'AoufEJ0}Oڳc{M]BI.Z\e.n#?to+rP WRou#BY7*#1?MkNz~M?ϛ_S w%`o!تGkJx5x@J ab?54UN:OYZf3`Rڝ]JaU1;h #>mu2Q׷'he :=l_ d95'+AB.s_|O[k7n`_T*!k\ƙs/] ]Zuq`P8(2.{i94BS;Ǯ Rb`FMUOPN6=}O<78L>$Os}^P"'.]̷|ڇ\[U?csBrq,9 CB`2ڿZi=rC쒻sPd{c'!sqP>1s'.}x?]2=Az{e/>p2|>#_xm8Y,%Pz8@̯Ӡʃ fˏge',CI1/?O5ou^Ŧ; n+8{9bRRm'nenzYX23xKS%WJiHJe_h3{$ d UܚN&06m*{vM1&hz>Uue+kCD]R>'f:Ecף$nE=I}gN]AIY?BRҍAt?, RgHtΦ<>Kj3gfД#(V  Po>kݫWɵAoG3qhK۞JSZ'oŌSJÛե}f7T*~>^fS["zܳyC 03f$阄&hui2l [[O?_ygR|K҈l{V a0>0IY ݱ#5 0 rr`dٽ@#Q8f/L :{_oy>[Jd_2Ҕc&I3kn*O_;YoCJY#"3 }MM#DW\eHSǀvQij*۟xD~/ݱ~c!`E|@BqdP`؟8˥76YfMutoF ТV5 51Q/Xk?gK7,T*N oY Bzzm@9 s> `%_! 0ǩU DW!RlKTs'|/ݰ ]yj~~gG-;4)L젵0{~h'*U҄da[ Z}FU?4ǁKz} {D#y'LE^4{R$Xl-nkڜb!P@)[Vhf'({mOk]=}M6#@4%!x#yWDK&W@k 1G;QvzBHh4T%Lק8fAzA>}~u"r×f3-]Fϼ!tC=iv\<>X>ǚkqPxGFf'D"y%:ICk=" DT{,ypKO}|).C1CዲYfh>,`!' H^"R ~"%gc;ƫ'VzPA'"XB?|7(0#xI("M"6u:%gpCڹʃkVG'dP5,4?8}B4Ӱ 4mHYD.P $ w%jWzw$@С {}>:^ghb6]9Op]k=MtԎfݲec G**\|@<$F"$ϑlFZ4 ]ܔ{7^r 'N ?$1>RǩTj穟R.i;Sr1P]#?۾4o`:O1G|?u[ cL8va?-xH^Za, t'w>ٚ7.QXQ'0gd{=C݀HW :Yޮ#K6UEcKrT)$|9""$H#K1u[8iú/*sve !MUIGz!${<$[|Kq(>s!u~Bp nd$#N-{y KQ)+p]wytIW*݇8W\04q  9 "G(k×'j9|&~htLmsǴmU9uO"P9urRxZT8ՑHtp_arjDg)Ȕll3%'ei_TJD"H&7?meQމbӗX,bX,bX,bX,RRIENDB`pybik-2.1/data/plugins/0000775000175000017500000000000012556245305015243 5ustar barccbarcc00000000000000pybik-2.1/data/plugins/150-spiegel.plugins0000664000175000017500000001241012507723016020573 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2011-2015 B. Clausius License: GPL-3+ 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 3 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, see . Model: Cube 3 Ref-Blocks: f l u b r d ################################ # Solution: pos=block …, moves # pos: position on the cube, e.g. "rf" for the front-right edge or "ufr" for # the uppper-front-right corner. The order does not matter, "ufr" is equal to "fur". # block: The block at the position. The order matters and depends on pos. # "fr|fl": "fr" or "fl" is allowed at the position # "!fru": every block except "fru" is allowed at the position # "*fru": a block in any rotation state of "fru" is allowed at the position (fru, ruf, ufr) # "!*fru": every block except all "fru" rotations is allowed at the position # "f?u": "?" can be every face # moves: The moves that should be applied to the cube if the conditions apply. # Spiegel is a german magazine Path: /Solvers/Spiegel Depends: /Solvers/Spiegel/Bottom corner orient Path: /Solvers/Spiegel/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved uf=uf ur=ur ub=ub ul=ul, @@solved # rf=uf, f- df=uf, f-f- fr=uf, u2fu2- fu=uf, fu2fu2- fd=uf, dl2d-l2- # lf=uf, f fl=uf, u2-f-u2 # dr=*uf, d- dl=*uf, d db=*uf, dd # br=uf, u2f-u2- rb=uf, u2u2fu2u2 bl=uf, u2-fu2 lb=uf, u2u2f-u2u2 # ur=*uf, r ub=*uf, b ul=*uf, l # , U Path: /Solvers/Spiegel/Top corners Depends: /Solvers/Spiegel/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # fld=ruf, r-dr fld=ufr, ddfd-f- #fld=fru, f-dffd-f- fld=fru, dr-drfd-d-f- # rfd=*fru, d- brd=*fru, dd lbd=*fru, d # fru=!fru fru=*fru, r-d-r rbu=*fru, b-d-d-b blu=*fru, bdb- lfu=*fru, f-df , U Path: /Solvers/Spiegel/Middle slice Depends: /Solvers/Spiegel/Top corners Solution: fr=fr rb=rb bl=bl lf=lf, @@solved fd=fr, d-r-drdfd-f- fd=fl, dld-l-d-f-df # rd=fr|fl, d- bd=fr|fl, dd ld=fr|fl, d # fd=*?d rd=*?d bd=*?d ld=*?d fr=!fr, d-r-drdfd-f- fd=*?d rd=*?d bd=*?d ld=*?d fl=!fl, dld-l-d-f-df , U Path: /Solvers/Spiegel/Bottom edge place Depends: /Solvers/Spiegel/Middle slice Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=*df dl=*dl db=*db dr=*dr, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=*uf ur=*ur ub=*ub ul=*ul, @@solved uf=!*uf ur=!*ur ub=!*ub ul=!*ul, u ul=*uf ur=*ur, ufrur-u-f- uf=*ul ub=*ub, ufrur-u-f- uf=*ub ub=*uf, ufrur-u-f- , U Path: /Solvers/Spiegel/Bottom edge orient Depends: /Solvers/Spiegel/Bottom edge place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=uf ur=ur ub=ub ul=ul, @@solved ur=?u, rd2rd2rd2rd2 # ub=?u, u uf=?u, u- ul=?u, uu # uf=ul, u uf=ur, u- uf=ub, uu Path: /Solvers/Spiegel/Bottom corner place Depends: /Solvers/Spiegel/Bottom edge orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=*dfl dlb=*dlb dbr=*dbr drf=*drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=*ufr urb=*urb ubl=*ubl ulf=*ulf, @@solved ufl=!*ufl ufr=!*ufr ubl=!*ubl ubr=!*ubr, fdffddffd-f-ufdffddffd-f-u- ubl=*ubl ufl=!*ufl, fdffddffd-f-ufdffddffd-f-u- , U Path: /Solvers/Spiegel/Bottom corner orient Depends: /Solvers/Spiegel/Bottom corner place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved ufr=!ufr ufr=!urb ufr=!ubl ufr=!ulf, rf-r-frf-r-f # urb=!ufr urb=!urb urb=!ubl urb=!ulf, u ulf=!ufr ulf=!urb ulf=!ubl ulf=!ulf, u- ubl=!ufr ubl=!urb ubl=!ubl ubl=!ulf, uu # uf=ul, u uf=ur, u- uf=ub, uu pybik-2.1/data/plugins/151-spiegel-improved.plugins0000664000175000017500000001641312507723012022422 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2011-2015 B. Clausius License: GPL-3+ 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 3 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, see . Model: Cube 3 Ref-Blocks: f l u b r d # Spiegel is a german magazine Path: /Solvers/Spiegel improved Depends: /Solvers/Spiegel improved/Bottom corner orient Path: /Solvers/Spiegel improved/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved uf=uf ur=ur ub=ub ul=ul, @@solved # Initial orientation of the top slice ur=uf ub=!ub ul=!ul, u uf=!uf ub=ur ul=!ul, u uf=!uf ur=!ur ul=ub, u uf=ul ur=!ur ub=!ub, u ur=!ur ub=!ub ul=uf, u- uf=ur ub=!ub ul=!ul, u- uf=!uf ur=ub ul=!ul, u- uf=!uf ur=!ur ub=ul, u- ur=!ur ub=uf ul=!ul, uu uf=!uf ub=!ub ul=ur, uu uf=ub ur=!ur ul=!ul, uu uf=!uf ur=ul ub=!ub, uu # uf is on top slice fu=uf, fu-ru ur=*uf, r- ub=*uf, b ul=*uf, l # uf is on middle slice fr=fu, f- fr=uf, u-ru fl=fu, f fl=uf, ul-u- br=fu, uubuu br=uf, u-r-u bl=fu, uub-uu bl=uf, ulu- # uf is on bottom slice fd=fu, ff fd=uf, f-u-ru dr=uf, d-ff dr=fu, rf-r- dl=uf, dff dl=fu, l-fl db=uf, ddff db=fu, u-d-ruf- # next edge ur=!ur, U ul=!ul, U- ub=!ub, UU Path: /Solvers/Spiegel improved/Top corners Depends: /Solvers/Spiegel improved/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # corner is one of front bottom frd=fur, r-d-r frd=rfu, fd-f-r-ddr frd=urf, fdf- fld=ruf, r-dr fld=fru, f-rfr-fd-f- fld=ufr, d # corner is one of back bottom brd=fru, d- brd=ufr, fd-f- brd=ruf, d- lbd=fru, fdf-r-d-r lbd=ufr, fddf- lbd=ruf, d # corner rotated #fru=fru, fru=ufr, r-dr fru=ruf, fd-f- # corner is one of upper front flu=rfu, ldl- flu=urf, ld-l- flu=fur, lr-dl-r # corner is one of upper back bru=rfu, b-d-b bru=urf, fb-d-f-b bru=fur, rdrrddr blu=fru, l-r-ddrl blu=ufr, l-dlr-ddr blu=ruf, l-fddf-l # Next corner bru=!bru, U flu=!flu, U- blu=!blu, UU Path: /Solvers/Spiegel improved/Middle slice Depends: /Solvers/Spiegel improved/Top corners Solution: fr=fr rb=rb bl=bl lf=lf, @@solved # Move edges from the bottom slice fd=fr, d- rd=fr, dd bd=fr, d ld=fr, r-drdfd-f- fd=fl, d rd=fl, ld-l-d-f-df bd=fl, d- ld=fl, dd # Next edge fd=rf|rb, U rd=rf|rb, U bd=rf|rb, U ld=rf|rb, U fd=lb|lf, U- rd=lb|lf, U- bd=lb|lf, U- ld=lb|lf, U- fd=br|bl, UU rd=br|bl, UU bd=br|bl, UU ld=br|bl, UU # If all above fails, move a wrong edge to the bottom slice fd=*?d rd=*?d bd=*?d ld=*?d fr=!fr, r-drdfd-f- fd=*?d rd=*?d bd=*?d ld=*?d fl=!fl, ld-l-d-f-df br=!br, U bl=!bl, U- Path: /Solvers/Spiegel improved/Bottom edge place Depends: /Solvers/Spiegel improved/Middle slice Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=*df dl=*dl db=*db dr=*dr, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=*uf ur=*ur ub=*ub ul=*ul, @@solved # Move the bottom slice is enough #uf=*uf ur=*ur ub=*ub ul=*ul, uf=*ul ur=*uf ub=*ur ul=*ub, u uf=*ub ur=*ul ub=*uf ul=*ur, uu uf=*ur ur=*ub ub=*ul ul=*uf, u- # Swap two edges is enough uf=*ul ur=*ur ub=*ub ul=*uf, ufrur-u-f- uf=*uf ur=*ul ub=*ur ul=*ub, uufrur-u-f- uf=*ub ur=*uf ub=*ul ul=*ur, u-frur-u-f- uf=*ur ur=*ub ub=*uf ul=*ul, frur-u-f- # More than two edges needs to be swapped uf=*ul ur=*ub ub=*ur ul=*uf, u-frur-u-f- uf=*uf ur=*ul ub=*ub ul=*ur, frur-u-f- uf=*ur ur=*uf ub=*ul ul=*ub, ufrur-u-f- uf=*ub ur=*ur ub=*uf ul=*ul, uufrur-u-f- # , U #TODO: Modify the previous paragraph so that this is not necessary Path: /Solvers/Spiegel improved/Bottom edge orient Depends: /Solvers/Spiegel improved/Bottom edge place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=uf ur=ur ub=ub ul=ul, @@solved # Turn edge ur=?u, rd2rd2rd2rd2 # Proceed to the next edge ub=?u, u uf=?u, u- ul=?u, uu # Done, only turn back the bottom slice uf=ul, u uf=ur, u- uf=ub, uu Path: /Solvers/Spiegel improved/Bottom corner place Depends: /Solvers/Spiegel improved/Bottom edge orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=*dfl dlb=*dlb dbr=*dbr drf=*drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=*ufr urb=*urb ubl=*ubl ulf=*ulf, @@solved ufl=*urf urf=*ulb ulb=*ufl ubr=*ubr, fdffddffd-f-u-fdffddffd-f-u ufl=*ubr urf=*ufl ulb=*ulb ubr=*urf, fdffddffd-f-ufdffddffd-f-u- ufl=*urf urf=*ufl ulb=*ubr ubr=*ulb, fdffddffd-f-uufdffddffd-f-uu ufl=*ubr urf=*ulb ulb=*urf ubr=*ufl, fdffddffd-f-ufdffddffd-f-u- # , U Path: /Solvers/Spiegel improved/Bottom corner orient Depends: /Solvers/Spiegel improved/Bottom corner place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # Turn corner ufr=?u?, rf-r-frf-r-f ufr=??u, f-rfr-f-rfr- # Proceed to the next corner urb=!u?? fr=!fr, u ulf=!u?? fr=!fr, u- ubl=!u?? fr=!fr, uu # Done, only turn back the bottom slice uf=ul ufr=u?? urb=u?? ulf=u?? ubl=u??, u uf=ur ufr=u?? urb=u?? ulf=u?? ubl=u??, u- uf=ub ufr=u?? urb=u?? ulf=u?? ubl=u??, uu # , U pybik-2.1/data/plugins/01-challenges.plugins0000664000175000017500000000340412556223565021176 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2012-2015 B. Clausius License: GPL-3+ 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 3 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, see . Model: * Path: /Challenges/Solve random puzzle Module: challenges.random, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/1 Module: challenges.random1, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/2 Module: challenges.random2, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/3 Module: challenges.random3, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/4 Module: challenges.random4, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/5 Module: challenges.random5, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/6 Module: challenges.random6, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/7 Module: challenges.random7, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/8 Module: challenges.random8, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/9 Module: challenges.random9, challenge Path: /Challenges/P_/Solve in {} move/Solve in {} moves/10 Module: challenges.random10, challenge pybik-2.1/data/plugins/20-2x2x2.plugins0000664000175000017500000000521712507722664017763 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2011-2015 B. Clausius License: GPL-3+ 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 3 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, see . Model: Cube 2 Path: /Solvers/2×2×2 Depends: /Solvers/2×2×2/Bottom corner orient Path: /Solvers/2×2×2/Top slice Solution: ufl=ufl ufr=ufr urb=urb ubl=ubl, @@solved ufl=ufl fld=ruf, r-dr ufl=ufl fld=ufr, ddfd-f- ufl=ufl fld=fru, dr-drfd-d-f- # ufl=ufl fdr=*ufr, d- ufl=ufl brd=*ufr, dd ufl=ufl lbd=*ufr, d # ufl=ufl ufr=!ufr ufr=*ufr, r-d-r ufl=ufl urb=*ufr, b-d-d-b ufl=ufl lub=*ufr, bdb- , U Path: /Solvers/2×2×2/Bottom corner place Depends: /Solvers/2×2×2/Top slice Solution: ufl=ufl ubr=ubr fld=*fld dlb=*dlb dbr=*dbr drf=*drf, @@solved ufl=ufl ubr=ubr fld=*rfd drf=*dfl, r-d-rfdf-r-drdd ufl=ufl ubr=ubr fld=*brd drf=*dlb, dd ufl=ufl ubr=ubr fld=*rfd drf=*dbr, d ufl=ufl ubr=ubr fld=*lbd drf=*dfl, d- ufl=ufl ubr=ubr fld=*fld dbr=*dbr, d , U Path: @Solvers/2×2×2/Bottom corner orient Depends: /Solvers/2×2×2/Bottom corner place Solution: ufl=ufl ldf=fld, lf-l-flf-l-f ufl=ufl dfl=fld, f-lfl-f-lfl- , @@solved Path: /Solvers/2×2×2/Bottom corner orient Depends: @Solvers/2×2×2/Bottom corner orient Solution: ufl=ufl dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved ufl=ufl dfl=!dfl dlb=dlb dbr=dbr drf=drf, @@unsolvable ufl=ufl dfl=dfl dlb=!dlb dbr=dbr drf=drf, @@unsolvable ufl=ufl dfl=dfl dlb=dlb dbr=!dbr drf=drf, @@unsolvable ufl=ufl dfl=dfl dlb=dlb dbr=dbr drf=!drf, @@unsolvable # rotate corner dfl=dfl dfr=frd, d-lf-l-flf-l-f dfl=dfl dfr=rdf, d-f-lfl-f-lfl- dfl=dfl dbl=bld, dlf-l-flf-l-f dfl=dfl dbl=ldb, df-lfl-f-lfl- dfl=dfl dbr=brd, ddf-lfl-f-lfl- dfl=dfl dbr=rdb, ddlf-l-flf-l-f # move solved bottom slice dfl=dfl ufl=urf, d- dfl=dfl ufl=ubr, dd dfl=dfl ufl=ulb, d pybik-2.1/data/plugins/80-pretty-patterns.plugins0000664000175000017500000001507412510213461022253 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2012-2015 B. Clausius License: GPL-3+ 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 3 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, see . #Pretty: Use something that is common in the Rubik scene in your language, sometimes it's just the equivalent of "patterns". Path: /Pretty patterns/Stripes Model: Brick k m n with k % 2 == n % 2 == 1 and m % 2 == 0 Module: pretty_patterns.play_stripes_Brick_nnn_2, append Path: /Pretty patterns/Stripes Model: Brick m n 1 with m % 4 == 1 and n % 2 == 1 Module: pretty_patterns.play_stripes_Brick_nn1_4, append Path: /Pretty patterns/Stripes Model: Brick 1 n m with m % 4 == 1 and n % 2 == 1 Module: pretty_patterns.play_stripes_Brick_1nn_4, append Path: /Pretty patterns/Stripes Model: Cube n with n % 2 == 0 Module: pretty_patterns.play_stripes_Cube_nnn_2, append Path: /Pretty patterns/Stripes Model: Tower k n with k % 2 == 0 Brick k m n with k % 2 == 0 and n % 2 == 0 Module: pretty_patterns.play_stripes_TowerBrick_nnn_2, append Path: /Pretty patterns/Stripes Model: Cube 3 Moves: rrffllrrffll Path: /Pretty patterns/Stripes Model: Tower 3 n Brick 3 m 3 Moves: rflrfl Path: /Pretty patterns/Criss-Cross Model: Cube Moves: rruullrruurr Path: /Pretty patterns/Criss-Cross Model: Tower Moves: ruulruur Path: /Pretty patterns/Fried Eggs Model: Cube n with n>=3 Moves: l2-f2-l2f2 Path: /Pretty patterns/Big Fried Eggs Model: Cube Moves: rl-fb-ud-rl- Path: /Pretty patterns/4 Fried Eggs Model: Cube 3 Moves: l2l2u2l2l2u2- Path: /Pretty patterns/4 Fried Eggs Model: Cube 4 Moves: l2l2l3l3u2u3l2l2l3l3u2-u3- Path: /Pretty patterns/2 Fried Eggs Model: Cube 4 Moves: ffr2r2ffl2l2ffr2r2ffl2l2ffr2r2ffl2l2 Path: /Pretty patterns/Chessboard Model: Cube n with n % 2 == 1 Tower w h with w % 2 == 1 Brick w h d with w % 2 + h % 2 + d % 2 >= 2 Module: pretty_patterns.play_chessboard, append Path: /Pretty patterns/Cross Model: Cube Moves: u-ffuul-rffuufflr-u- Path: /Pretty patterns/Zig Zag Model: Cube Moves: rlfbrlfbrlfb # T is the shape formed by the cube labels. T-Time is a pun (Tea Time) and not suitable for literal translation. Don't translate it or use something common or whatever you think makes sense. Path: /Pretty patterns/T-Time Model: Cube n with n%2 == 1 Module: pretty_patterns.play_t_time_Cube_odd, append Path: /Pretty patterns/T-Time Model: Cube 4 Moves: l2l2l3l3du-f2f2f3f3ud-l2l2l3l3duul2l2l3l3uul2l2l3l3d-l2l2l3l3uu Path: /Pretty patterns/T-Time Model: Cube n with n%2 == 0 Module: pretty_patterns.play_t_time_Cube_even, append Path: /Pretty patterns/T-Time Model: Tower m×n with m%2 == 1 Module: pretty_patterns.play_t_time_Tower_odd, append Path: /Pretty patterns/T-Time Model: Tower m×n with n == 4 Moves: l4l5du-f4f5ud-l4l5duul4l5uul4l5d-l4l5uu Path: /Pretty patterns/T-Time Model: Tower m×n with m%2 == 0 Module: pretty_patterns.play_t_time_Tower_even, append # C is the shape formed by the cube labels Path: /Pretty patterns/C Model: Cube Moves: uullr-b-rru-r-drfflr-fdlluu Path: /Pretty patterns/Cube in a Cube Model: Cube Moves: uur-ufu-r-uflfl-u-rfu-ru- Path: /Pretty patterns/Striped Cube in a Cube Model: Cube Moves: d-fd-lbddffurb-urrfd-rfuu Path: /Pretty patterns/Six square cuboids Model: Cube Moves: ffdffddllullu-llbddrr # Superflip may be not translated, because it has a special meaning in the mathematical theory behind the Rubik's Cube. Path: /Pretty patterns/Superflip Model: Cube Moves: urrfbrbbruulbbru-d-rrfr-lbbuuff Path: /Pretty patterns/Superflip easy Model: Cube 3 Moves: l2ul2ul2ul2uLDl2ul2ul2ul2uLDl2ul2ul2ul2uLD Path: /Pretty patterns/Green Mamba Model: Cube Moves: rdrfr-f-bdr-u-b-udd Path: /Pretty patterns/Anaconda Model: Cube Moves: lbbdrb-fd-l-rd-uf-rru- Path: /Pretty patterns/Duck Feet Model: Cube Moves: rrdu-ld-llrbrrubur-f-d-fu- Path: /Pretty patterns/Plus Model: Cube n with n % 2 == 1 and n > 2 Module: pretty_patterns.play_plus_Cube_odd, append Path: /Pretty patterns/Plus Model: Cube n with n % 2 == 0 and n > 2 Module: pretty_patterns.play_plus_Cube_even, append Path: /Pretty patterns/Plus Model: Tower k n with k % 2 == 1 and k > 2 and n > 2 Module: pretty_patterns.play_plus_Tower_on, append Path: /Pretty patterns/Plus Model: Tower k n with k % 2 == 0 and k > 2 and n > 2 Module: pretty_patterns.play_plus_Tower_en, append Path: /Pretty patterns/Plus Model: Brick k m n with k % 2 == 1 and n % 2 == 1 and k > 2 and m > 2 and n > 2 Module: pretty_patterns.play_plus_Brick_ono, append Path: /Pretty patterns/Plus Model: Brick k m n with k % 2 == 1 and n % 2 == 0 and k > 2 and m > 2 and n > 2 Module: pretty_patterns.play_plus_Brick_one, append Path: /Pretty patterns/Plus Model: Brick k m n with k % 2 == 0 and n % 2 == 1 and k > 2 and m > 2 and n > 2 Module: pretty_patterns.play_plus_Brick_eno, append Path: /Pretty patterns/Plus Model: Brick k m n with k % 2 == 0 and n % 2 == 0 and k > 2 and m > 2 and n > 2 Module: pretty_patterns.play_plus_Brick_ene, append Path: /Pretty patterns/Minus Model: Cube n with n % 2 == 1 and n > 2 Tower k n with n % 2 == 1 and n > 2 Module: pretty_patterns.play_minus_CubeTower_odd, append Path: /Pretty patterns/Minus Model: Cube n with n % 2 == 0 and n > 2 Tower k n with n % 2 == 0 and n > 2 Module: pretty_patterns.play_minus_CubeTower_even, append Path: /Pretty patterns/Minus Model: Brick k m n with m % 2 == 1 and m > 2 Module: pretty_patterns.play_minus_Brick_non, append Path: /Pretty patterns/Minus Model: Brick k m n with m % 2 == 0 and m > 2 Module: pretty_patterns.play_minus_Brick_nen, append Path: /Pretty patterns/Volcano Model: Tetrahedron 3 Moves: r2-d2-r2d2-r2-d2-r2d2-d3- Path: /Pretty patterns/Checkerboard (easy) Model: Tetrahedron 3 Moves: l2b2-l2-b2D-l2b2-l2-b2D-l2b2-l2-b2D-l2b2-l2-b2D-l2b2-l2-b2D-l2b2-l2-b2D-l2b2-l2-b2D-l2b2-l2-b2D-l2b2-l2-b2D-l2b2-l2-b2D- Path: /Pretty patterns/Checkerboard (fast) Model: Tetrahedron 3 Moves: r2b2-r2-b2-l2-b2-l2d2l2-d2l2d2l2-d2l2d2- Path: /Pretty patterns/Mixed Checkerboard Model: Tetrahedron 3 Moves: d2r2b2l2d2r2b2l2d2r2b2l2d2r2b2l2 Path: /Pretty patterns/Tipi Model: Tetrahedron 3 Moves: r2b2-r2-b2-l2-b2-l2 pybik-2.1/data/plugins/10-beginners.plugins0000664000175000017500000001501212507720071021031 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2015 B. Clausius License: GPL-3+ 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 3 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, see . Model: Cube 3 Ref-Blocks: f l u b r d ################################ # Solution: pos=block …, moves # pos: position on the cube, e.g. "rf" for the front-right edge or "ufr" for # the uppper-front-right corner. The order does not matter, "ufr" is equal to "fur". # block: The block at the position. The order matters and depends on pos. # "fr|fl": "fr" or "fl" is allowed at the position # "!fru": every block except "fru" is allowed at the position # "*fru": a block in any rotation state of "fru" is allowed at the position (fru, ruf, ufr) # "!*fru": every block except all "fru" rotations is allowed at the position # "f?u": "?" can be every face # moves: The moves that should be applied to the cube if the conditions apply. Path: /Solvers/Beginner's method Depends: /Solvers/Beginner's method/Bottom edge place Path: /Solvers/Beginner's method/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr, @@solved uf=uf ur=ur ub=ub ul=ul, @@solved # fr=*ur, r br=*ur, r- dr=*ur, rr df=*ur, d db=*ur, d- dl=*ur, dd uf=*ur, ff ub=*ur, bb ul=*ur, ll fl=*ur uf=uf, f-df fl=*ur, f-d bl=*ur ub=ub, bd-b- bl=*ur, bd- ur=ru, r-uf-u- # , D Path: /Solvers/Beginner's method/Top corners Depends: /Solvers/Beginner's method/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # ufr=ufr, D # fld=*ruf, d brd=*ruf, d- lbd=*ruf, dd rfd=*ruf, r-d-rd ufr=*ufr, r-d-rd ufr=*u??, r-d-r # , D Path: /Solvers/Beginner's method/Middle slice Depends: /Solvers/Beginner's method/Top corners Solution: fr=fr rb=rb bl=bl lf=lf, @@solved ufr=ufr urb=urb ubl=ubl ulf=ulf uf=uf ur=ur ub=ub ul=ul dr=!dr, RR ufr=ufr urb=urb ubl=ubl ulf=ulf uf=uf ur=ur ub=ub ul=ul db=!db, RR ufr=ufr urb=urb ubl=ubl ulf=ulf uf=uf ur=ur ub=ub ul=ul dl=!dl, RR ufr=ufr urb=urb ubl=ubl ulf=ulf uf=uf ur=ur ub=ub ul=ul df=!df, RR ufr=ufr urb=urb ubl=ubl ulf=ulf uf=uf ur=ur ub=ub ul=ul dfr=!dfr, RR ufr=ufr urb=urb ubl=ubl ulf=ulf uf=uf ur=ur ub=ub ul=ul dbr=!dbr, RR ufr=ufr urb=urb ubl=ubl ulf=ulf uf=uf ur=ur ub=ub ul=ul dbl=!dbl, RR ufr=ufr urb=urb ubl=ubl ulf=ulf uf=uf ur=ur ub=ub ul=ul dfl=!dfl, RR # fu=fr, uru-r-u-f-uf fu=fl, u-l-ulufu-f- # ru=fr|fl, u lu=fr|fl, u- bu=fr|fl, uu # fr=rf, uru-r-u-f-uf fl=lf, u-l-ulufu-f- # fu=*?u lu=*?u bu=*?u ru=*?u fr=!fr, uru-r-u-f-uf fu=*?u lu=*?u bu=*?u ru=*?u fl=!fl, u-l-ulufu-f- , D Path: /Solvers/Beginner's method/Bottom edge orient Depends: /Solvers/Beginner's method/Middle slice Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=d? dl=d? db=d? dr=d?, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, RR # uf=u? ur=u? ub=u? ul=u?, @@solved # uf=?u ur=?u ub=?u ul=?u, furu-r-f- # uf=u? ur=?u ub=?u ul=u?, U uf=?u ur=u? ub=u? ul=?u, U- uf=u? ur=u? ub=?u ul=?u, UU uf=?u ur=?u ub=u? ul=u?, furu-r-f- # uf=u? ur=?u ub=u? ul=?u, U- uf=?u ur=u? ub=?u ul=u?, frur-u-f- Path: /Solvers/Beginner's method/Bottom corner orient Depends: /Solvers/Beginner's method/Bottom edge orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=d? dl=d? db=d? dr=d? dfl=d?? dlb=d?? dbr=d?? drf=d??, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, RR # uf=u? ur=u? ub=u? ul=u? ufl=u?? ulb=u?? ubr=u?? urf=u??, @@solved # State 1: No Corner Cubes have upper color upside ufl=!u?? ulb=!u?? ubr=!u?? urf=??u, U ufl=?u? ulb=!u?? ubr=!u?? urf=!u??, U- ufl=??u ulb=!u?? ubr=!u?? urf=!u??, rur-uruur- # State 2: One Corner Cube has upper color upside ufl=!u?? ulb=!u?? ubr=!u?? urf=u??, U ufl=!u?? ulb=u?? ubr=!u?? urf=!u??, U- ufl=!u?? ulb=!u?? ubr=u?? urf=!u??, UU ufl=u?? ulb=!u?? ubr=!u?? urf=!u??, rur-uruur- # State 3: Two Corner Cubes have upper color upside urf=?u?, U ulb=?u?, U- ubr=?u?, UU ufl=?u?, rur-uruur- Path: /Solvers/Beginner's method/Bottom corner place Depends: /Solvers/Beginner's method/Bottom corner orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=d? dl=d? db=d? dr=d? dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # Two adjacent corners right urb=urb ubl=ubl, r-fr-bbrf-r-bbrru- ubl=ubl ulf=ulf, U ufr=ufr urb=urb, U- ufr=ufr ulf=ulf, UU # Two diagonal corners right ufr=ufr ubl=ubl, r-fr-bbrf-r-bbrru- urb=urb ulf=ulf, r-fr-bbrf-r-bbrru- # , u Path: /Solvers/Beginner's method/Bottom edge place Depends: /Solvers/Beginner's method/Bottom corner place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=uf ur=ur ub=ub ul=ul, @@solved # rotate 3 edges clockwise ub=ub, ffulr-ffl-ruff # ul=ul, U ur=ur, U- uf=uf, UU , ffulr-ffl-ruff pybik-2.1/data/plugins/95-transformations.plugins0000664000175000017500000000203312505506461022325 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2015 B. Clausius License: GPL-3+ 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 3 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, see . Model: * Path: /Move transformations/Invert move sequence Module: transformations.invert, replace Path: /Move transformations/Normalize cube rotations Module: transformations.normalize_complete_rotations, replace Path: /Move transformations/Normalize move sequence Module: transformations.normalize_moves, replace pybik-2.1/data/plugins/14-leyan-lo.plugins0000664000175000017500000001517612507722503020616 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2012-2015 B. Clausius License: GPL-3+ 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 3 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, see . Model: Cube 3 Ref-Blocks: f l u b r d Depends: /Solvers/Leyan Lo/Bottom edge place # Leyan Lo is the inventor of the solution Path: /Solvers/Leyan Lo Path: /Solvers/Leyan Lo/Top edges Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved uf=uf ur=ur ub=ub ul=ul, @@solved # rf=uf, f- df=uf, f-f- fr=uf, u2fu2- fu=uf, fu2fu2- fd=uf, dl2d-l2- # lf=uf, f fl=uf, u2-f-u2 # dr=*uf, d- dl=*uf, d db=*uf, dd # br=uf, u2f-u2- rb=uf, u2u2fu2u2 bl=uf, u2-fu2 lb=uf, u2u2f-u2u2 # ur=*uf, r ub=*uf, b ul=*uf, l # , U Depends: /Solvers/Leyan Lo/Top edges Path: /Solvers/Leyan Lo/Top corners Solution: df=df dl=dl db=db dr=dr dfl=dfl dlb=dlb dbr=dbr drf=drf fr=fr rb=rb bl=bl lf=lf, @@solved ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # fld=ruf, r-dr fld=ufr, ddfd-f- #fld=fru, f-dffd-f- fld=fru, dr-drfd-d-f- # rfd=*fru, d- brd=*fru, dd lbd=*fru, d # fru=!fru fru=*fru, r-d-r rbu=*fru, b-d-d-b blu=*fru, bdb- lfu=*fru, f-df , U Depends: /Solvers/Leyan Lo/Top corners Path: /Solvers/Leyan Lo/Middle slice Solution: fr=fr rb=rb bl=bl lf=lf, @@solved # solve front-right edge fd=fr, d-r-drdfd-f- rd=rf, dfd-f-d-r-dr # prepare front-right edge for solving fd=rf, d rd=fr, d- bd=rf|fr, d- ld=rf|fr, d # fd=*?d rd=*?d bd=*?d ld=*?d fr=!fr, d-r-drdfd-f- , U Depends: /Solvers/Leyan Lo/Middle slice Path: /Solvers/Leyan Lo/Bottom edge orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=d? dl=d? db=d? dr=d?, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # uf=u? ur=u? ub=u? ul=u?, @@solved ub=u? ul=u? uf=?u ur=?u, furu-r-f- ur=u? ul=u? uf=?u ub=?u, frur-u-f- uf=?u ur=?u ub=?u ul=?u, furu-r-f- # ul=u? uf=u? ur=?u ub=?u, U uf=u? ur=u? ub=?u ul=?u, UU ur=u? ub=u? ul=?u uf=?u, U- # uf=u? ub=u? ur=?u ul=?u, U Depends: /Solvers/Leyan Lo/Bottom edge orient Path: /Solvers/Leyan Lo/Bottom corner place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf dfr=*dfr drb=*drb dbl=*dbl dlf=*dlf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # solved (1/24) ufr=*ufr urb=*urb ubl=*ubl ulf=*ulf, @@solved # two adjacent corners need to be swapped (6/24) ulf=*ufr ufr=*ulf, U- ufr=*urb urb=*ufr, lu-r-ul-u-ruu urb=*ubl ubl=*urb, U ubl=*ulf ulf=*ubl, UU # two diagonal corners need to be swapped (3/24) ufr=*ubl ubl=*ufr, u urb=*ulf ulf=*urb, u- # rotate 3 corners ccw (4/16), four corners need to be moved ccw (1/16), rotate crosswise (2/16) ufr=*urb, u- ubl=*ulf, u- # rotate 3 corners cw (4/16), four corners need to be moved cw (1/16), rotate crosswise (2/16) ufr=*ulf, u ubl=*urb, u Depends: /Solvers/Leyan Lo/Bottom corner place Path: /Solvers/Leyan Lo/Bottom corner orient Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf dfr=dfr drb=drb dbl=dbl dlf=dlf, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # ufr=ufr urb=urb ubl=ubl ulf=ulf, @@solved # lub=lub rub=bru luf=flu ruf=ufr, r-u-ru-r-uuruu ful=ful bul=lbu fur=rfu bur=urb, U bur=bur fur=rfu bul=lbu ful=ulf, U- ruf=ruf luf=flu rub=bru lub=ubl, UU # ful=ful lub=blu rub=ubr ruf=fru, rur-uruur-uu ruf=ruf ful=lfu bul=ulb bur=rbu, U lub=lub bur=rbu fur=urf ful=lfu, U- bur=bur ruf=fru luf=ufl lub=blu, UU # bul=ulb bur=urb ful=ful fur=fur, r-u-ru-r-uuruu luf=ufl lub=ubl ruf=ruf rub=rub, U rub=ubr ruf=ufr lub=lub luf=luf, U- fur=urf ful=ulf bur=bur bul=bul, UU # ful=ulf bul=ulb fur=fur bur=bur, rur-uruur-uu ruf=ufr luf=ufl rub=rub lub=lub, U lub=ubl rub=ubr luf=luf ruf=ruf, U- bur=urb fur=urf bul=bul ful=ful, UU # rub=ubr luf=flu ruf=ruf lub=lub, rur-uruur-uu bul=ulb fur=rfu bur=bur ful=ful, U fur=urf bul=lbu ful=ful bur=bur, U- luf=ufl rub=bru lub=lub ruf=ruf, UU # lub=ubl rub=bru luf=ufl ruf=fru, r-u-ru-r-uuruu ful=ulf bul=lbu fur=urf bur=rbu, U bur=urb fur=rfu bul=ulb ful=lfu, U- ruf=ufr luf=flu rub=ubr lub=blu, UU # lub=ubl rub=ubr luf=ufl ruf=ufr, r-u-ru-r-uuruu lub=blu rub=bru luf=flu ruf=fru, U Depends: /Solvers/Leyan Lo/Bottom corner orient Path: /Solvers/Leyan Lo/Bottom edge place Solution: uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf df=df dr=dr db=db dl=dl, @@solved uf=uf ur=ur ub=ub ul=ul ufr=ufr urb=urb ubl=ubl ulf=ulf, FF # solved (1/12) uf=uf ur=ur ub=ub ul=ul, @@solved # rotate 3 edges clockwise (4/12) uf=ub ub=ur ru=fu ul=ul, rrufb-rrf-burr ur=ul ul=ub bu=ru uf=uf, U ul=ur ur=uf fu=lu ub=ub, U- ub=uf uf=ul lu=bu ur=ur, UU # rotate 3 edges counterclockwise (4/12) ru=bu uf=ur ub=uf ul=ul, rru-fb-rrf-bu-rr bu=lu ur=ub ul=ur uf=uf, U fu=ru ul=uf ur=ul ub=ub, U- lu=fu ub=ul uf=ub ur=ur, UU # swap pairwise opposite edges, (1/12) uf=ub ru=lu lu=ru ub=uf, rrufb-rrf-burr # swap pairwise adjacent edges, (2/12) ru=bu uf=ul ub=ur lu=fu, rrufb-rrf-burr bu=lu ur=uf ul=ub fu=ru, rrufb-rrf-burr pybik-2.1/data/plugins/90-library.plugins0000664000175000017500000000723312510222347020534 0ustar barccbarcc00000000000000Format: Pybik Plugins Collection - Version 2.0 Copyright: 2012-2015 B. Clausius License: GPL-3+ 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 3 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, see . Path: /Library/Swap edges/3 edges ⟳, top layer Model: Cube n with n >= 3 Moves: rrufb-rrf-burr Path: /Library/Swap edges/3 edges ⟲, top layer Model: Cube n with n >= 3 Moves: rru-fb-rrf-bu-rr Path: /Library/Swap edges/3 edges, middle layer Model: Cube 3 Moves: rrd2rrd2- Path: /Library/Swap edges/4 edges, front and right Model: Cube n with n >= 3 Moves: rrffrrffrrff Path: /Library/Swap edges/4 edges, front and back Model: Cube 3 Moves: ffr2r2ffr2r2 Path: /Library/Swap 2 edges and 2 corners, top layer Model: Cube n with n >= 3 Moves: ufrur-u-f- Path: /Library/Flip edges/4 edges Model: Cube 3 Moves: rd2rd2rd2rd2 Path: /Library/Flip edges/2 edges, top layer Model: Cube 3 Moves: rd2rd2rd2rd2u-rd2rd2rd2rd2u Path: /Library/Swap corners/2 corners, top layer Model: Cube 2 Moves: lu-r-ul-u-ruu Path: /Library/Swap corners/2 corners diagonal, top layer Model: Cube 2 Moves: ufrur-u-f- Path: /Library/Swap corners/3 corners ⟳, top layer Model: Cube n with n >= 3 Moves: fdffddffd-f-ufdffddffd-f-u- Path: /Library/Swap corners/3 corners ⟲, top layer Model: Cube n with n >= 3 Moves: ufdffddffd-f-u-fdffddffd-f- Path: /Library/Swap corners/4 corners, top layer Model: Cube n with n >= 3 Moves: fdffddffd-f-uufdffddffd-f-uu Path: /Library/Swap corners/2 corners, partial sequence, top layer Model: Cube n with n >= 3 Moves: fdffddffd-f- Path: /Library/Rotate corners/2 corners, top layer Model: Cube n with n >= 2 Moves: rf-r-frf-r-fuf-rfr-f-rfr-u- Path: /Library/Rotate corners/3 corners ⟳, top layer Model: Cube n with n >= 2 Moves: rf-r-frf-r-furf-r-frf-r-furf-r-frf-r-fuu Path: /Library/Rotate corners/1 corner ⟳, partial sequence, top layer Model: Cube n with n >= 2 Moves: rf-r-frf-r-f Path: /Library/Rotate corners/1 corner ⟲, partial sequence, top layer Model: Cube n with n >= 2 Moves: f-rfr-f-rfr- # 2 rotations of the center face in the upper layer Path: /Library/Rotate center/2×Up Model: Cube n with n >= 3 Moves: urluur-l-urluur-l- # Up clockwise and front clockwise Path: /Library/Rotate center/Up ⟳ and front ⟳ Model: Cube n with n >= 3 Moves: ufu-d-ffl-rfbuf-b-lr-ffd # Up clockwise and front counterclockwise Path: /Library/Rotate center/Up ⟳ and front ⟲ Model: Cube 3 Moves: r2f2r-f2-r2-f2rf2- Path: /Library/Swap center parts, up and front Model: Cube n with n >= 4 Moves: r2f2r-f2-r2-f2rf2- # Up clockwise and down counterclockwise Path: /Library/Rotate center/Up ⟳ and down ⟲ Model: Cube 3 Moves: urlf2f2r-l-u-rlf2f2r-l- #Back: Yields in a rotated back layer, but the sequence of moves does not touch the back layer Path: /Library/Misc/Back without back Model: Cube n with n >= 3 Moves: rrllffrruurrllddllf-rrllffrruurrllddllff Path: /Library/Misc/2×Back without back Model: Cube n with n >= 3 Moves: rrdduullffrrdduull Path: /Library/Misc/Back without back Model: Tower n,h with n >= 2 and h >= 2 Moves: rdduulfrdduul Path: /Library/Misc/Back without back Model: Brick x,y,z with x >= 2 and y >= 2 and z >= 2 Moves: rdulfrdul pybik-2.1/data/shaders/0000775000175000017500000000000012556245305015213 5ustar barccbarcc00000000000000pybik-2.1/data/shaders/normals.frag0000664000175000017500000000142312151517510017516 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // 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 3 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, see . varying vec3 normal; void main() { gl_FragColor = vec4(normal, 1.0); } pybik-2.1/data/shaders/pick.frag0000664000175000017500000000140612141740506016774 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // 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 3 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, see . varying vec4 color; void main() { gl_FragColor = color; } pybik-2.1/data/shaders/normals.vert0000664000175000017500000000223412142016006017552 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // 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 3 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, see . attribute vec4 vertex_attr; attribute vec3 normal_attr; varying vec3 normal; uniform mat4 projection; uniform mat4 modelview; uniform mat4 object; void main() { gl_Position = projection * (modelview * (object * vertex_attr)); // actually we need here the inverse transpose of the matrix (modelview*object), // but the mat3 parts are pure rotations, where the inverse is equal to the transpose normal = mat3(modelview) * (mat3(object) * normal_attr); } pybik-2.1/data/shaders/outline.frag0000664000175000017500000000237512434333361017535 0ustar barccbarcc00000000000000// Copyright © 2014 B. Clausius // // 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 3 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, see . varying vec3 barycentric; //#extension GL_OES_standard_derivatives : enable //float edgeFactor() //{ // vec3 d = fwidth(barycentric); // vec3 a3 = smoothstep(vec3(0.0), d*1.5, barycentric); // return min(min(a3.x, a3.y), a3.z); //} void main() { if (barycentric == vec3(0.)) discard; else if (any(lessThan(barycentric, vec3(0.04)))) gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); else gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0); //else // gl_FragColor = vec4(mix(vec3(1.0, 0.0, 0.0), vec3(0.5), edgeFactor()), 1.); } pybik-2.1/data/shaders/lighting.vert0000664000175000017500000000276212445620207017724 0ustar barccbarcc00000000000000// Copyright © 2013-2014 B. Clausius // // 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 3 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, see . attribute vec4 vertex_attr; attribute vec3 normal_attr; attribute vec3 color_attr; attribute vec2 texcoord_attr; attribute vec3 barycentric_attr; varying vec4 position; varying vec3 normal; varying vec3 color; varying vec2 texcoord; varying vec3 barycentric; uniform mat4 projection; uniform mat4 modelview; uniform mat4 object; const vec3 gamma = vec3(2.2); void main() { position = modelview * (object * vertex_attr); gl_Position = projection * position; // actually we need here the inverse transpose of the matrix (modelview*object), // but the mat3 parts are pure rotations, where the inverse is equal to the transpose normal = mat3(modelview) * (mat3(object) * normal_attr); color = pow(color_attr, gamma); texcoord = texcoord_attr; barycentric = barycentric_attr; } pybik-2.1/data/shaders/simple.vert0000664000175000017500000000224712445600625017410 0ustar barccbarcc00000000000000// Copyright © 2013-2014 B. Clausius // // 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 3 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, see . attribute vec4 vertex_attr; attribute vec3 color_attr; attribute vec2 texcoord_attr; attribute vec3 barycentric_attr; varying vec3 color; varying vec2 texcoord; varying vec3 barycentric; uniform mat4 projection; uniform mat4 modelview; uniform mat4 object; const vec3 gamma = vec3(2.2); void main() { gl_Position = projection * (modelview * (object * vertex_attr)); color = pow(color_attr, gamma); texcoord = texcoord_attr; barycentric = barycentric_attr; } pybik-2.1/data/shaders/outline.vert0000664000175000017500000000173612434304202017566 0ustar barccbarcc00000000000000// Copyright © 2014 B. Clausius // // 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 3 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, see . attribute vec4 vertex_attr; attribute vec3 barycentric_attr; varying vec3 barycentric; uniform mat4 projection; uniform mat4 modelview; uniform mat4 object; void main() { gl_Position = projection * (modelview * (object * vertex_attr)); barycentric = barycentric_attr; } pybik-2.1/data/shaders/simple.frag0000664000175000017500000000231412446006331017335 0ustar barccbarcc00000000000000// Copyright © 2013-2014 B. Clausius // // 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 3 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, see . uniform sampler2D tex; varying vec3 color; varying vec2 texcoord; varying vec3 barycentric; const vec3 bevel_color = vec3(pow(15./255., 2.2)); const vec3 invgamma = vec3(1./2.2); void main() { vec3 col_face; vec4 col_tex = texture2D(tex, texcoord); if (barycentric == vec3(0.)) { // unlabeled part col_face = bevel_color; } else { // the label col_face = mix(color.rgb, col_tex.rgb, col_tex.a); } gl_FragColor = vec4(pow(col_face, invgamma), 1.); } pybik-2.1/data/shaders/hud.frag0000777000175000017500000000000012445642424020416 2pick.fragustar barccbarcc00000000000000pybik-2.1/data/shaders/hud.vert0000664000175000017500000000153212445643560016700 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // 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 3 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, see . attribute vec4 vertex_attr; attribute vec4 color_attr; varying vec4 color; void main() { gl_Position = vertex_attr; color = color_attr; } pybik-2.1/data/shaders/label.frag0000664000175000017500000000145512446054625017141 0ustar barccbarcc00000000000000// Copyright © 2014 B. Clausius // // 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 3 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, see . varying vec4 color; void main() { if (color.a == 0) discard; gl_FragColor = color; } pybik-2.1/data/shaders/pick.vert0000664000175000017500000000170412142015766017042 0ustar barccbarcc00000000000000// Copyright © 2013 B. Clausius // // 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 3 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, see . attribute vec4 vertex_attr; attribute vec4 color_attr; varying vec4 color; uniform mat4 picking; uniform mat4 projection; uniform mat4 modelview; void main() { gl_Position = picking * projection * modelview * vertex_attr; color = color_attr; } pybik-2.1/data/shaders/label.vert0000664000175000017500000000204312446054630017170 0ustar barccbarcc00000000000000// Copyright © 2014 B. Clausius // // 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 3 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, see . attribute vec4 vertex_attr; attribute vec3 color_attr; attribute vec3 barycentric_attr; varying vec4 color; uniform mat4 projection; uniform mat4 modelview; uniform mat4 object; void main() { gl_Position = projection * (modelview * (object * vertex_attr)); color.rgb = color_attr; color.a = (barycentric_attr == vec3(0.)) ? 0 : 1; } pybik-2.1/data/shaders/lighting.frag0000664000175000017500000000474312510300272017652 0ustar barccbarcc00000000000000// Copyright © 2013-2015 B. Clausius // // 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 3 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, see . uniform sampler2D tex; varying vec4 position; varying vec3 normal; varying vec3 color; varying vec2 texcoord; varying vec3 barycentric; const vec3 bevel_color = vec3(pow(15./255., 2.2)); const vec3 pointlight = vec3(0., 0., 0.); // diffuse+ambient+specular is the maxintensity const float diffuse = 1.4; const float ambient = .3; const float shininess = 20.; const float attenuation = 0.001; const vec3 specular = vec3(5., 4.5, 3.) * .1; const vec3 invgamma = vec3(1./2.2); vec3 lighting(vec3 col_face) { vec3 norm = normalize(normal); vec3 lightvector = pointlight - position.xyz; vec3 dirtolight = normalize(lightvector); float cos_angle = dot(norm, dirtolight); cos_angle = clamp(cos_angle, 0, 1); // attenuation float light_distance_sqr = dot(lightvector, lightvector); float attenfactor = 1. / (1.0 + attenuation * light_distance_sqr); // combine color components vec3 col = ambient * col_face; col += specular * attenfactor * pow(cos_angle, shininess); col += diffuse * col_face * cos_angle; return col; } void main() { vec3 col; vec4 col_tex = texture2D(tex, texcoord); float bary_min = min(min(barycentric.x, barycentric.y), barycentric.z); float bary_width = fwidth(bary_min); if (barycentric == vec3(0.)) { // unlabeled part col = bevel_color; } else if (bary_min <= 0.02) { // frame around the label col = bevel_color; } else { // the label col = mix(color.rgb, col_tex.rgb, col_tex.a); bary_min = (bary_min - 0.02) / 1.1; if (bary_min < bary_width) { // smooth at the frame col = mix(bevel_color, col, bary_min / bary_width); } } col = lighting(col); gl_FragColor = vec4(pow(col, invgamma), 1.); } pybik-2.1/data/tests/0000775000175000017500000000000012556245305014724 5ustar barccbarcc00000000000000pybik-2.1/data/tests/rotation0000664000175000017500000000207512463155252016510 0ustar barccbarcc00000000000000Fields: rotationx = [324.0, 326.0, 328.0, 330.0, 332.0, 334.0, 336.0] rotationy = [29.0, 31.0, 33.0, 35.0, 37.0, 39.0, 41.0] Conditions: Limits: 324 < rotationx < 336 30 < rotationy < 40 Initial: State: rotationx=330.0, rotationy=39.0 Transition: action_reset_rotation State: rotationx=330.0, rotationy=39.0 Transition: drawingarea_key Qt.Key_Down Expression: rotationy = rotationy + 2 State: Transition: drawingarea_key Qt.Key_Left Expression: rotationx = rotationx - 2 State: Transition: drawingarea_key Qt.Key_Right Expression: rotationx = rotationx + 2 State: Transition: drawingarea_key Qt.Key_Up Expression: rotationy = rotationy - 2 State: Transition: drawingarea_mouse_move (10, 10), (10, 8), Qt.LeftButton Expression: rotationy = rotationy - 2 State: Transition: drawingarea_mouse_move (10, 10), (12, 12), Qt.LeftButton Expression: rotationx = rotationx + 2 Expression: rotationy = rotationy + 2 State: Transition: drawingarea_mouse_move (10, 10), (8, 10), Qt.LeftButton Expression: rotationx = rotationx - 2 State: pybik-2.1/data/tests/buttons-execute-clear0000664000175000017500000000141412463155253021070 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'ulf'] game_len = [0, 3] solved = [False, True] Conditions: solved == (game_len == 0) Limits: Initial: State: edit_text='', game_len=0, solved=True Transition: button_edit_clear_click Qt.LeftButton State: edit_text='', game_len=0, solved=True Transition: button_edit_exec_click Qt.LeftButton State: edit_text='', game_len=0, solved=True State: edit_text='', game_len=3, solved=False game_len=0, solved=True State: edit_text='ulf', game_len=0, solved=True game_len=3, solved=False State: edit_text='ulf', game_len=3, solved=False Transition: edit_moves_text '', False State: edit_text='' Transition: edit_moves_text 'ulf', False State: edit_text='ulf' pybik-2.1/data/tests/edit-navigate0000664000175000017500000001504012463155276017374 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'fl u-b- r2d2 f2-l2- FL U- B-'] edit_pos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28] game_len = [0, 12] Conditions: edit_pos <= len(edit_text) Limits: Initial: State: edit_text='', edit_pos=0, game_len=0 Transition: edit_moves_key (Qt.Key_Left, Qt.ControlModifier) State: edit_pos=0 State: edit_pos=1 edit_pos=0 State: edit_pos=2 edit_pos=1 State: edit_pos=3 edit_pos=1 State: edit_pos=4 edit_pos=3 State: edit_pos=5 edit_pos=3 State: edit_pos=6 edit_pos=5 State: edit_pos=7 edit_pos=5 State: edit_pos=8 edit_pos=5 State: edit_pos=9 edit_pos=8 State: edit_pos=10 edit_pos=8 State: edit_pos=11 edit_pos=10 State: edit_pos=12 edit_pos=10 State: edit_pos=13 edit_pos=10 State: edit_pos=14 edit_pos=13 State: edit_pos=15 edit_pos=13 State: edit_pos=16 edit_pos=13 State: edit_pos=17 edit_pos=16 State: edit_pos=18 edit_pos=16 State: edit_pos=19 edit_pos=16 State: edit_pos=20 edit_pos=16 State: edit_pos=21 edit_pos=20 State: edit_pos=22 edit_pos=21 State: edit_pos=23 edit_pos=21 State: edit_pos=24 edit_pos=23 State: edit_pos=25 edit_pos=23 State: edit_pos=26 edit_pos=23 State: edit_pos=27 edit_pos=26 State: edit_pos=28 edit_pos=26 Transition: edit_moves_key (Qt.Key_Right, Qt.ControlModifier) State: edit_text='', edit_pos=0 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=0 edit_pos=1 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=1 edit_pos=3 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=2 edit_pos=3 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=3 edit_pos=5 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=4 edit_pos=5 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=5 edit_pos=8 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=6 edit_pos=8 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=7 edit_pos=8 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=8 edit_pos=10 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=9 edit_pos=10 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=10 edit_pos=13 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=11 edit_pos=13 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=12 edit_pos=13 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=13 edit_pos=16 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=14 edit_pos=16 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=15 edit_pos=16 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=16 edit_pos=20 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=17 edit_pos=20 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=18 edit_pos=20 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=19 edit_pos=20 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=20 edit_pos=21 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=21 edit_pos=23 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=22 edit_pos=23 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=23 edit_pos=26 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=24 edit_pos=26 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=25 edit_pos=26 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=26 edit_pos=28 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=27 edit_pos=28 State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=28 Transition: edit_moves_key Qt.Key_Enter Expression: game_len = len(edit_text.translate({c:None for c in b' 2-'})) State: edit_pos=0 State: edit_pos=1 State: edit_pos=2 edit_pos=3 State: edit_pos=3 State: edit_pos=4 edit_pos=5 State: edit_pos=5 State: edit_pos=6 edit_pos=8 State: edit_pos=7 edit_pos=8 State: edit_pos=8 State: edit_pos=9 edit_pos=10 State: edit_pos=10 State: edit_pos=11 edit_pos=13 State: edit_pos=12 edit_pos=13 State: edit_pos=13 State: edit_pos=14 edit_pos=16 State: edit_pos=15 edit_pos=16 State: edit_pos=16 State: edit_pos=17 edit_pos=20 State: edit_pos=18 edit_pos=20 State: edit_pos=19 edit_pos=20 State: edit_pos=20 State: edit_pos=21 State: edit_pos=22 edit_pos=23 State: edit_pos=23 State: edit_pos=24 edit_pos=26 State: edit_pos=25 edit_pos=26 State: edit_pos=26 State: edit_pos=27 edit_pos=28 State: edit_pos=28 Transition: edit_moves_key Qt.Key_Left Expression: edit_pos = max(edit_pos - 1, 0) State: Transition: edit_moves_key Qt.Key_Right Expression: edit_pos = min(edit_pos + 1, len(edit_text)) State: Transition: edit_moves_text ('', False) State: edit_text='', edit_pos=0 Transition: edit_moves_text ('fl u-b- r2d2 f2-l2- FL U- B-', False) State: edit_text='fl u-b- r2d2 f2-l2- FL U- B-', edit_pos=28 pybik-2.1/data/tests/edit-navigate-alt0000664000175000017500000016061212463155407020154 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'fl l2-u- ', 'fl u-l2- ', 'fl2- lu- ', 'fl2- u-l ', 'fu- l2-l ', 'fu- ll2- ', 'l2-f lu- ', 'l2-f u-l ', 'l2-l fu- ', 'l2-l u-f ', 'l2-u- fl ', 'l2-u- lf ', 'lf l2-u- ', 'lf u-l2- ', 'll2- fu- ', 'll2- u-f ', 'lu- fl2- ', 'lu- l2-f ', 'u-f l2-l ', 'u-f ll2- ', 'u-l fl2- ', 'u-l l2-f ', 'u-l2- fl ', 'u-l2- lf '] edit_pos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Conditions: edit_pos <= len(edit_text) Limits: Initial: State: edit_text='', edit_pos=0 Transition: edit_moves_key (Qt.Key_Left, Qt.AltModifier) State: edit_text='', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=1 edit_text='lf l2-u- ', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=2 edit_text='lf l2-u- ', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=3 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=4 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=5 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=6 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fl l2-u- ', edit_pos=7 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fl l2-u- ', edit_pos=8 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fl l2-u- ', edit_pos=9 State: edit_text='fl u-l2- ', edit_pos=0 State: edit_text='fl u-l2- ', edit_pos=1 edit_text='lf u-l2- ', edit_pos=0 State: edit_text='fl u-l2- ', edit_pos=2 edit_text='lf u-l2- ', edit_pos=0 State: edit_text='fl u-l2- ', edit_pos=3 edit_text='fu- ll2- ', edit_pos=1 State: edit_text='fl u-l2- ', edit_pos=4 edit_text='fu- ll2- ', edit_pos=1 State: edit_text='fl u-l2- ', edit_pos=5 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=6 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=7 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=8 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=9 State: edit_text='fl2- lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=1 edit_text='l2-f lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=2 edit_text='l2-f lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=3 edit_text='l2-f lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=4 edit_text='l2-f lu- ', edit_pos=0 State: edit_text='fl2- lu- ', edit_pos=5 edit_text='fl l2-u- ', edit_pos=1 State: edit_text='fl2- lu- ', edit_pos=6 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fl2- lu- ', edit_pos=7 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fl2- lu- ', edit_pos=8 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fl2- lu- ', edit_pos=9 State: edit_text='fl2- u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=1 edit_text='l2-f u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=2 edit_text='l2-f u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=3 edit_text='l2-f u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=4 edit_text='l2-f u-l ', edit_pos=0 State: edit_text='fl2- u-l ', edit_pos=5 edit_text='fu- l2-l ', edit_pos=1 State: edit_text='fl2- u-l ', edit_pos=6 edit_text='fu- l2-l ', edit_pos=1 State: edit_text='fl2- u-l ', edit_pos=7 edit_text='fl2- lu- ', edit_pos=5 State: edit_text='fl2- u-l ', edit_pos=8 edit_text='fl2- lu- ', edit_pos=5 State: edit_text='fl2- u-l ', edit_pos=9 State: edit_text='fu- l2-l ', edit_pos=0 State: edit_text='fu- l2-l ', edit_pos=1 edit_text='u-f l2-l ', edit_pos=0 State: edit_text='fu- l2-l ', edit_pos=2 edit_text='u-f l2-l ', edit_pos=0 State: edit_text='fu- l2-l ', edit_pos=3 edit_text='u-f l2-l ', edit_pos=0 State: edit_text='fu- l2-l ', edit_pos=4 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='fu- l2-l ', edit_pos=5 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='fu- l2-l ', edit_pos=6 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='fu- l2-l ', edit_pos=7 edit_text='fu- ll2- ', edit_pos=4 State: edit_text='fu- l2-l ', edit_pos=8 edit_text='fu- ll2- ', edit_pos=4 State: edit_text='fu- l2-l ', edit_pos=9 State: edit_text='fu- ll2- ', edit_pos=0 State: edit_text='fu- ll2- ', edit_pos=1 edit_text='u-f ll2- ', edit_pos=0 State: edit_text='fu- ll2- ', edit_pos=2 edit_text='u-f ll2- ', edit_pos=0 State: edit_text='fu- ll2- ', edit_pos=3 edit_text='u-f ll2- ', edit_pos=0 State: edit_text='fu- ll2- ', edit_pos=4 edit_text='fl u-l2- ', edit_pos=1 State: edit_text='fu- ll2- ', edit_pos=5 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=6 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=7 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=8 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=9 State: edit_text='l2-f lu- ', edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=1 edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=2 edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=3 edit_text='fl2- lu- ', edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=4 edit_text='fl2- lu- ', edit_pos=0 State: edit_text='l2-f lu- ', edit_pos=5 edit_text='l2-l fu- ', edit_pos=3 State: edit_text='l2-f lu- ', edit_pos=6 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=7 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=8 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=9 State: edit_text='l2-f u-l ', edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=1 edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=2 edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=3 edit_text='fl2- u-l ', edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=4 edit_text='fl2- u-l ', edit_pos=0 State: edit_text='l2-f u-l ', edit_pos=5 edit_text='l2-u- fl ', edit_pos=3 State: edit_text='l2-f u-l ', edit_pos=6 edit_text='l2-u- fl ', edit_pos=3 State: edit_text='l2-f u-l ', edit_pos=7 edit_text='l2-f lu- ', edit_pos=5 State: edit_text='l2-f u-l ', edit_pos=8 edit_text='l2-f lu- ', edit_pos=5 State: edit_text='l2-f u-l ', edit_pos=9 State: edit_text='l2-l fu- ', edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=1 edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=2 edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=3 edit_text='ll2- fu- ', edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=4 edit_text='ll2- fu- ', edit_pos=0 State: edit_text='l2-l fu- ', edit_pos=5 edit_text='l2-f lu- ', edit_pos=3 State: edit_text='l2-l fu- ', edit_pos=6 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=7 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=8 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=9 State: edit_text='l2-l u-f ', edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=1 edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=2 edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=3 edit_text='ll2- u-f ', edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=4 edit_text='ll2- u-f ', edit_pos=0 State: edit_text='l2-l u-f ', edit_pos=5 edit_text='l2-u- lf ', edit_pos=3 State: edit_text='l2-l u-f ', edit_pos=6 edit_text='l2-u- lf ', edit_pos=3 State: edit_text='l2-l u-f ', edit_pos=7 edit_text='l2-l fu- ', edit_pos=5 State: edit_text='l2-l u-f ', edit_pos=8 edit_text='l2-l fu- ', edit_pos=5 State: edit_text='l2-l u-f ', edit_pos=9 State: edit_text='l2-u- fl ', edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=1 edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=2 edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=3 edit_text='u-l2- fl ', edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=4 edit_text='u-l2- fl ', edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=5 edit_text='u-l2- fl ', edit_pos=0 State: edit_text='l2-u- fl ', edit_pos=6 edit_text='l2-f u-l ', edit_pos=3 State: edit_text='l2-u- fl ', edit_pos=7 edit_text='l2-u- lf ', edit_pos=6 State: edit_text='l2-u- fl ', edit_pos=8 edit_text='l2-u- lf ', edit_pos=6 State: edit_text='l2-u- fl ', edit_pos=9 State: edit_text='l2-u- lf ', edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=1 edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=2 edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=3 edit_text='u-l2- lf ', edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=4 edit_text='u-l2- lf ', edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=5 edit_text='u-l2- lf ', edit_pos=0 State: edit_text='l2-u- lf ', edit_pos=6 edit_text='l2-l u-f ', edit_pos=3 State: edit_text='l2-u- lf ', edit_pos=7 edit_text='l2-u- fl ', edit_pos=6 State: edit_text='l2-u- lf ', edit_pos=8 edit_text='l2-u- fl ', edit_pos=6 State: edit_text='l2-u- lf ', edit_pos=9 State: edit_text='lf l2-u- ', edit_pos=0 State: edit_text='lf l2-u- ', edit_pos=1 edit_text='fl l2-u- ', edit_pos=0 State: edit_text='lf l2-u- ', edit_pos=2 edit_text='fl l2-u- ', edit_pos=0 State: edit_text='lf l2-u- ', edit_pos=3 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=4 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=5 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=6 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lf l2-u- ', edit_pos=7 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lf l2-u- ', edit_pos=8 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lf l2-u- ', edit_pos=9 State: edit_text='lf u-l2- ', edit_pos=0 State: edit_text='lf u-l2- ', edit_pos=1 edit_text='fl u-l2- ', edit_pos=0 State: edit_text='lf u-l2- ', edit_pos=2 edit_text='fl u-l2- ', edit_pos=0 State: edit_text='lf u-l2- ', edit_pos=3 edit_text='lu- fl2- ', edit_pos=1 State: edit_text='lf u-l2- ', edit_pos=4 edit_text='lu- fl2- ', edit_pos=1 State: edit_text='lf u-l2- ', edit_pos=5 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=6 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=7 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=8 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=9 State: edit_text='ll2- fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=1 edit_text='l2-l fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=2 edit_text='l2-l fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=3 edit_text='l2-l fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=4 edit_text='l2-l fu- ', edit_pos=0 State: edit_text='ll2- fu- ', edit_pos=5 edit_text='lf l2-u- ', edit_pos=1 State: edit_text='ll2- fu- ', edit_pos=6 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='ll2- fu- ', edit_pos=7 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='ll2- fu- ', edit_pos=8 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='ll2- fu- ', edit_pos=9 State: edit_text='ll2- u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=1 edit_text='l2-l u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=2 edit_text='l2-l u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=3 edit_text='l2-l u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=4 edit_text='l2-l u-f ', edit_pos=0 State: edit_text='ll2- u-f ', edit_pos=5 edit_text='lu- l2-f ', edit_pos=1 State: edit_text='ll2- u-f ', edit_pos=6 edit_text='lu- l2-f ', edit_pos=1 State: edit_text='ll2- u-f ', edit_pos=7 edit_text='ll2- fu- ', edit_pos=5 State: edit_text='ll2- u-f ', edit_pos=8 edit_text='ll2- fu- ', edit_pos=5 State: edit_text='ll2- u-f ', edit_pos=9 State: edit_text='lu- fl2- ', edit_pos=0 State: edit_text='lu- fl2- ', edit_pos=1 edit_text='u-l fl2- ', edit_pos=0 State: edit_text='lu- fl2- ', edit_pos=2 edit_text='u-l fl2- ', edit_pos=0 State: edit_text='lu- fl2- ', edit_pos=3 edit_text='u-l fl2- ', edit_pos=0 State: edit_text='lu- fl2- ', edit_pos=4 edit_text='lf u-l2- ', edit_pos=1 State: edit_text='lu- fl2- ', edit_pos=5 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=6 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=7 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=8 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=9 State: edit_text='lu- l2-f ', edit_pos=0 State: edit_text='lu- l2-f ', edit_pos=1 edit_text='u-l l2-f ', edit_pos=0 State: edit_text='lu- l2-f ', edit_pos=2 edit_text='u-l l2-f ', edit_pos=0 State: edit_text='lu- l2-f ', edit_pos=3 edit_text='u-l l2-f ', edit_pos=0 State: edit_text='lu- l2-f ', edit_pos=4 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='lu- l2-f ', edit_pos=5 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='lu- l2-f ', edit_pos=6 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='lu- l2-f ', edit_pos=7 edit_text='lu- fl2- ', edit_pos=4 State: edit_text='lu- l2-f ', edit_pos=8 edit_text='lu- fl2- ', edit_pos=4 State: edit_text='lu- l2-f ', edit_pos=9 State: edit_text='u-f l2-l ', edit_pos=0 State: edit_text='u-f l2-l ', edit_pos=1 edit_pos=0 State: edit_text='u-f l2-l ', edit_pos=2 edit_text='fu- l2-l ', edit_pos=0 State: edit_text='u-f l2-l ', edit_pos=3 edit_text='fu- l2-l ', edit_pos=0 State: edit_text='u-f l2-l ', edit_pos=4 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='u-f l2-l ', edit_pos=5 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='u-f l2-l ', edit_pos=6 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='u-f l2-l ', edit_pos=7 edit_text='u-f ll2- ', edit_pos=4 State: edit_text='u-f l2-l ', edit_pos=8 edit_text='u-f ll2- ', edit_pos=4 State: edit_text='u-f l2-l ', edit_pos=9 State: edit_text='u-f ll2- ', edit_pos=0 State: edit_text='u-f ll2- ', edit_pos=1 edit_pos=0 State: edit_text='u-f ll2- ', edit_pos=2 edit_text='fu- ll2- ', edit_pos=0 State: edit_text='u-f ll2- ', edit_pos=3 edit_text='fu- ll2- ', edit_pos=0 State: edit_text='u-f ll2- ', edit_pos=4 edit_text='u-l fl2- ', edit_pos=2 State: edit_text='u-f ll2- ', edit_pos=5 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=6 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=7 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=8 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=9 State: edit_text='u-l fl2- ', edit_pos=0 State: edit_text='u-l fl2- ', edit_pos=1 edit_pos=0 State: edit_text='u-l fl2- ', edit_pos=2 edit_text='lu- fl2- ', edit_pos=0 State: edit_text='u-l fl2- ', edit_pos=3 edit_text='lu- fl2- ', edit_pos=0 State: edit_text='u-l fl2- ', edit_pos=4 edit_text='u-f ll2- ', edit_pos=2 State: edit_text='u-l fl2- ', edit_pos=5 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=6 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=7 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=8 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=9 State: edit_text='u-l l2-f ', edit_pos=0 State: edit_text='u-l l2-f ', edit_pos=1 edit_pos=0 State: edit_text='u-l l2-f ', edit_pos=2 edit_text='lu- l2-f ', edit_pos=0 State: edit_text='u-l l2-f ', edit_pos=3 edit_text='lu- l2-f ', edit_pos=0 State: edit_text='u-l l2-f ', edit_pos=4 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='u-l l2-f ', edit_pos=5 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='u-l l2-f ', edit_pos=6 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='u-l l2-f ', edit_pos=7 edit_text='u-l fl2- ', edit_pos=4 State: edit_text='u-l l2-f ', edit_pos=8 edit_text='u-l fl2- ', edit_pos=4 State: edit_text='u-l l2-f ', edit_pos=9 State: edit_text='u-l2- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=1 edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=2 edit_text='l2-u- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=3 edit_text='l2-u- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=4 edit_text='l2-u- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=5 edit_text='l2-u- fl ', edit_pos=0 State: edit_text='u-l2- fl ', edit_pos=6 edit_text='u-f l2-l ', edit_pos=2 State: edit_text='u-l2- fl ', edit_pos=7 edit_text='u-l2- lf ', edit_pos=6 State: edit_text='u-l2- fl ', edit_pos=8 edit_text='u-l2- lf ', edit_pos=6 State: edit_text='u-l2- fl ', edit_pos=9 State: edit_text='u-l2- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=1 edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=2 edit_text='l2-u- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=3 edit_text='l2-u- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=4 edit_text='l2-u- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=5 edit_text='l2-u- lf ', edit_pos=0 State: edit_text='u-l2- lf ', edit_pos=6 edit_text='u-l l2-f ', edit_pos=2 State: edit_text='u-l2- lf ', edit_pos=7 edit_text='u-l2- fl ', edit_pos=6 State: edit_text='u-l2- lf ', edit_pos=8 edit_text='u-l2- fl ', edit_pos=6 State: edit_text='u-l2- lf ', edit_pos=9 Transition: edit_moves_key (Qt.Key_Right, Qt.AltModifier) State: edit_text='', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=0 edit_text='lf l2-u- ', edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=1 edit_text='fl2- lu- ', edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=2 edit_text='fl2- lu- ', edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=3 edit_text='fl u-l2- ', edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=4 edit_text='fl u-l2- ', edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=5 edit_text='fl u-l2- ' State: edit_text='fl l2-u- ', edit_pos=6 State: edit_text='fl l2-u- ', edit_pos=7 edit_pos=6 State: edit_text='fl l2-u- ', edit_pos=8 edit_pos=6 State: edit_text='fl l2-u- ', edit_pos=9 State: edit_text='fl u-l2- ', edit_pos=0 edit_text='lf u-l2- ', edit_pos=1 State: edit_text='fl u-l2- ', edit_pos=1 edit_text='fu- ll2- ', edit_pos=4 State: edit_text='fl u-l2- ', edit_pos=2 edit_text='fu- ll2- ', edit_pos=4 State: edit_text='fl u-l2- ', edit_pos=3 edit_text='fl l2-u- ', edit_pos=6 State: edit_text='fl u-l2- ', edit_pos=4 edit_text='fl l2-u- ', edit_pos=6 State: edit_text='fl u-l2- ', edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=6 edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=7 edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=8 edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=9 State: edit_text='fl2- lu- ', edit_pos=0 edit_text='l2-f lu- ', edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=1 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=2 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=3 edit_text='fl l2-u- ' State: edit_text='fl2- lu- ', edit_pos=4 edit_text='fl l2-u- ', edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=5 edit_text='fl2- u-l ', edit_pos=7 State: edit_text='fl2- lu- ', edit_pos=6 State: edit_text='fl2- lu- ', edit_pos=7 edit_pos=6 State: edit_text='fl2- lu- ', edit_pos=8 edit_pos=6 State: edit_text='fl2- lu- ', edit_pos=9 State: edit_text='fl2- u-l ', edit_pos=0 edit_text='l2-f u-l ', edit_pos=3 State: edit_text='fl2- u-l ', edit_pos=1 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fl2- u-l ', edit_pos=2 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fl2- u-l ', edit_pos=3 edit_text='fu- l2-l ', edit_pos=4 State: edit_text='fl2- u-l ', edit_pos=4 edit_text='fu- l2-l ' State: edit_text='fl2- u-l ', edit_pos=5 edit_text='fl2- lu- ', edit_pos=6 State: edit_text='fl2- u-l ', edit_pos=6 edit_text='fl2- lu- ' State: edit_text='fl2- u-l ', edit_pos=7 State: edit_text='fl2- u-l ', edit_pos=8 edit_pos=7 State: edit_text='fl2- u-l ', edit_pos=9 State: edit_text='fu- l2-l ', edit_pos=0 edit_text='u-f l2-l ', edit_pos=2 State: edit_text='fu- l2-l ', edit_pos=1 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=2 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=3 edit_text='fl2- u-l ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=4 edit_text='fu- ll2- ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=5 edit_text='fu- ll2- ' State: edit_text='fu- l2-l ', edit_pos=6 edit_text='fu- ll2- ', edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=7 State: edit_text='fu- l2-l ', edit_pos=8 edit_pos=7 State: edit_text='fu- l2-l ', edit_pos=9 State: edit_text='fu- ll2- ', edit_pos=0 edit_text='u-f ll2- ', edit_pos=2 State: edit_text='fu- ll2- ', edit_pos=1 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fu- ll2- ', edit_pos=2 edit_text='fl u-l2- ', edit_pos=3 State: edit_text='fu- ll2- ', edit_pos=3 edit_text='fl u-l2- ' State: edit_text='fu- ll2- ', edit_pos=4 edit_text='fu- l2-l ', edit_pos=7 State: edit_text='fu- ll2- ', edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=6 edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=7 edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=8 edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=9 State: edit_text='l2-f lu- ', edit_pos=0 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='l2-f lu- ', edit_pos=1 edit_text='fl2- lu- ' State: edit_text='l2-f lu- ', edit_pos=2 edit_text='fl2- lu- ', edit_pos=1 State: edit_text='l2-f lu- ', edit_pos=3 edit_text='l2-l fu- ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=4 edit_text='l2-l fu- ', edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=5 edit_text='l2-f u-l ', edit_pos=7 State: edit_text='l2-f lu- ', edit_pos=6 State: edit_text='l2-f lu- ', edit_pos=7 edit_pos=6 State: edit_text='l2-f lu- ', edit_pos=8 edit_pos=6 State: edit_text='l2-f lu- ', edit_pos=9 State: edit_text='l2-f u-l ', edit_pos=0 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='l2-f u-l ', edit_pos=1 edit_text='fl2- u-l ' State: edit_text='l2-f u-l ', edit_pos=2 edit_text='fl2- u-l ', edit_pos=1 State: edit_text='l2-f u-l ', edit_pos=3 edit_text='l2-u- fl ', edit_pos=6 State: edit_text='l2-f u-l ', edit_pos=4 edit_text='l2-u- fl ', edit_pos=6 State: edit_text='l2-f u-l ', edit_pos=5 edit_text='l2-f lu- ', edit_pos=6 State: edit_text='l2-f u-l ', edit_pos=6 edit_text='l2-f lu- ' State: edit_text='l2-f u-l ', edit_pos=7 State: edit_text='l2-f u-l ', edit_pos=8 edit_pos=7 State: edit_text='l2-f u-l ', edit_pos=9 State: edit_text='l2-l fu- ', edit_pos=0 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='l2-l fu- ', edit_pos=1 edit_text='ll2- fu- ' State: edit_text='l2-l fu- ', edit_pos=2 edit_text='ll2- fu- ', edit_pos=1 State: edit_text='l2-l fu- ', edit_pos=3 edit_text='l2-f lu- ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=4 edit_text='l2-f lu- ', edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=5 edit_text='l2-l u-f ', edit_pos=7 State: edit_text='l2-l fu- ', edit_pos=6 State: edit_text='l2-l fu- ', edit_pos=7 edit_pos=6 State: edit_text='l2-l fu- ', edit_pos=8 edit_pos=6 State: edit_text='l2-l fu- ', edit_pos=9 State: edit_text='l2-l u-f ', edit_pos=0 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='l2-l u-f ', edit_pos=1 edit_text='ll2- u-f ' State: edit_text='l2-l u-f ', edit_pos=2 edit_text='ll2- u-f ', edit_pos=1 State: edit_text='l2-l u-f ', edit_pos=3 edit_text='l2-u- lf ', edit_pos=6 State: edit_text='l2-l u-f ', edit_pos=4 edit_text='l2-u- lf ', edit_pos=6 State: edit_text='l2-l u-f ', edit_pos=5 edit_text='l2-l fu- ', edit_pos=6 State: edit_text='l2-l u-f ', edit_pos=6 edit_text='l2-l fu- ' State: edit_text='l2-l u-f ', edit_pos=7 State: edit_text='l2-l u-f ', edit_pos=8 edit_pos=7 State: edit_text='l2-l u-f ', edit_pos=9 State: edit_text='l2-u- fl ', edit_pos=0 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='l2-u- fl ', edit_pos=1 edit_text='u-l2- fl ', edit_pos=2 State: edit_text='l2-u- fl ', edit_pos=2 edit_text='u-l2- fl ' State: edit_text='l2-u- fl ', edit_pos=3 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-u- fl ', edit_pos=4 edit_text='l2-f u-l ', edit_pos=5 State: edit_text='l2-u- fl ', edit_pos=5 edit_text='l2-f u-l ' State: edit_text='l2-u- fl ', edit_pos=6 edit_text='l2-u- lf ', edit_pos=7 State: edit_text='l2-u- fl ', edit_pos=7 State: edit_text='l2-u- fl ', edit_pos=8 edit_pos=7 State: edit_text='l2-u- fl ', edit_pos=9 State: edit_text='l2-u- lf ', edit_pos=0 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='l2-u- lf ', edit_pos=1 edit_text='u-l2- lf ', edit_pos=2 State: edit_text='l2-u- lf ', edit_pos=2 edit_text='u-l2- lf ' State: edit_text='l2-u- lf ', edit_pos=3 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-u- lf ', edit_pos=4 edit_text='l2-l u-f ', edit_pos=5 State: edit_text='l2-u- lf ', edit_pos=5 edit_text='l2-l u-f ' State: edit_text='l2-u- lf ', edit_pos=6 edit_text='l2-u- fl ', edit_pos=7 State: edit_text='l2-u- lf ', edit_pos=7 State: edit_text='l2-u- lf ', edit_pos=8 edit_pos=7 State: edit_text='l2-u- lf ', edit_pos=9 State: edit_text='lf l2-u- ', edit_pos=0 edit_text='fl l2-u- ', edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=1 edit_text='ll2- fu- ', edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=2 edit_text='ll2- fu- ', edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=3 edit_text='lf u-l2- ', edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=4 edit_text='lf u-l2- ', edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=5 edit_text='lf u-l2- ' State: edit_text='lf l2-u- ', edit_pos=6 State: edit_text='lf l2-u- ', edit_pos=7 edit_pos=6 State: edit_text='lf l2-u- ', edit_pos=8 edit_pos=6 State: edit_text='lf l2-u- ', edit_pos=9 State: edit_text='lf u-l2- ', edit_pos=0 edit_text='fl u-l2- ', edit_pos=1 State: edit_text='lf u-l2- ', edit_pos=1 edit_text='lu- fl2- ', edit_pos=4 State: edit_text='lf u-l2- ', edit_pos=2 edit_text='lu- fl2- ', edit_pos=4 State: edit_text='lf u-l2- ', edit_pos=3 edit_text='lf l2-u- ', edit_pos=6 State: edit_text='lf u-l2- ', edit_pos=4 edit_text='lf l2-u- ', edit_pos=6 State: edit_text='lf u-l2- ', edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=6 edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=7 edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=8 edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=9 State: edit_text='ll2- fu- ', edit_pos=0 edit_text='l2-l fu- ', edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=1 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=2 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=3 edit_text='lf l2-u- ' State: edit_text='ll2- fu- ', edit_pos=4 edit_text='lf l2-u- ', edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=5 edit_text='ll2- u-f ', edit_pos=7 State: edit_text='ll2- fu- ', edit_pos=6 State: edit_text='ll2- fu- ', edit_pos=7 edit_pos=6 State: edit_text='ll2- fu- ', edit_pos=8 edit_pos=6 State: edit_text='ll2- fu- ', edit_pos=9 State: edit_text='ll2- u-f ', edit_pos=0 edit_text='l2-l u-f ', edit_pos=3 State: edit_text='ll2- u-f ', edit_pos=1 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='ll2- u-f ', edit_pos=2 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='ll2- u-f ', edit_pos=3 edit_text='lu- l2-f ', edit_pos=4 State: edit_text='ll2- u-f ', edit_pos=4 edit_text='lu- l2-f ' State: edit_text='ll2- u-f ', edit_pos=5 edit_text='ll2- fu- ', edit_pos=6 State: edit_text='ll2- u-f ', edit_pos=6 edit_text='ll2- fu- ' State: edit_text='ll2- u-f ', edit_pos=7 State: edit_text='ll2- u-f ', edit_pos=8 edit_pos=7 State: edit_text='ll2- u-f ', edit_pos=9 State: edit_text='lu- fl2- ', edit_pos=0 edit_text='u-l fl2- ', edit_pos=2 State: edit_text='lu- fl2- ', edit_pos=1 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lu- fl2- ', edit_pos=2 edit_text='lf u-l2- ', edit_pos=3 State: edit_text='lu- fl2- ', edit_pos=3 edit_text='lf u-l2- ' State: edit_text='lu- fl2- ', edit_pos=4 edit_text='lu- l2-f ', edit_pos=7 State: edit_text='lu- fl2- ', edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=6 edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=7 edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=8 edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=9 State: edit_text='lu- l2-f ', edit_pos=0 edit_text='u-l l2-f ', edit_pos=2 State: edit_text='lu- l2-f ', edit_pos=1 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=2 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=3 edit_text='ll2- u-f ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=4 edit_text='lu- fl2- ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=5 edit_text='lu- fl2- ' State: edit_text='lu- l2-f ', edit_pos=6 edit_text='lu- fl2- ', edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=7 State: edit_text='lu- l2-f ', edit_pos=8 edit_pos=7 State: edit_text='lu- l2-f ', edit_pos=9 State: edit_text='u-f l2-l ', edit_pos=0 edit_text='fu- l2-l ', edit_pos=1 State: edit_text='u-f l2-l ', edit_pos=1 edit_text='fu- l2-l ' State: edit_text='u-f l2-l ', edit_pos=2 edit_text='u-l2- fl ', edit_pos=6 State: edit_text='u-f l2-l ', edit_pos=3 edit_text='u-l2- fl ', edit_pos=6 State: edit_text='u-f l2-l ', edit_pos=4 edit_text='u-f ll2- ', edit_pos=5 State: edit_text='u-f l2-l ', edit_pos=5 edit_text='u-f ll2- ' State: edit_text='u-f l2-l ', edit_pos=6 edit_text='u-f ll2- ', edit_pos=5 State: edit_text='u-f l2-l ', edit_pos=7 State: edit_text='u-f l2-l ', edit_pos=8 edit_pos=7 State: edit_text='u-f l2-l ', edit_pos=9 State: edit_text='u-f ll2- ', edit_pos=0 edit_text='fu- ll2- ', edit_pos=1 State: edit_text='u-f ll2- ', edit_pos=1 edit_text='fu- ll2- ' State: edit_text='u-f ll2- ', edit_pos=2 edit_text='u-l fl2- ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=3 edit_text='u-l fl2- ', edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=4 edit_text='u-f l2-l ', edit_pos=7 State: edit_text='u-f ll2- ', edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=6 edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=7 edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=8 edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=9 State: edit_text='u-l fl2- ', edit_pos=0 edit_text='lu- fl2- ', edit_pos=1 State: edit_text='u-l fl2- ', edit_pos=1 edit_text='lu- fl2- ' State: edit_text='u-l fl2- ', edit_pos=2 edit_text='u-f ll2- ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=3 edit_text='u-f ll2- ', edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=4 edit_text='u-l l2-f ', edit_pos=7 State: edit_text='u-l fl2- ', edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=6 edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=7 edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=8 edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=9 State: edit_text='u-l l2-f ', edit_pos=0 edit_text='lu- l2-f ', edit_pos=1 State: edit_text='u-l l2-f ', edit_pos=1 edit_text='lu- l2-f ' State: edit_text='u-l l2-f ', edit_pos=2 edit_text='u-l2- lf ', edit_pos=6 State: edit_text='u-l l2-f ', edit_pos=3 edit_text='u-l2- lf ', edit_pos=6 State: edit_text='u-l l2-f ', edit_pos=4 edit_text='u-l fl2- ', edit_pos=5 State: edit_text='u-l l2-f ', edit_pos=5 edit_text='u-l fl2- ' State: edit_text='u-l l2-f ', edit_pos=6 edit_text='u-l fl2- ', edit_pos=5 State: edit_text='u-l l2-f ', edit_pos=7 State: edit_text='u-l l2-f ', edit_pos=8 edit_pos=7 State: edit_text='u-l l2-f ', edit_pos=9 State: edit_text='u-l2- fl ', edit_pos=0 edit_text='l2-u- fl ', edit_pos=3 State: edit_text='u-l2- fl ', edit_pos=1 edit_text='l2-u- fl ', edit_pos=3 State: edit_text='u-l2- fl ', edit_pos=2 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-l2- fl ', edit_pos=3 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-l2- fl ', edit_pos=4 edit_text='u-f l2-l ' State: edit_text='u-l2- fl ', edit_pos=5 edit_text='u-f l2-l ', edit_pos=4 State: edit_text='u-l2- fl ', edit_pos=6 edit_text='u-l2- lf ', edit_pos=7 State: edit_text='u-l2- fl ', edit_pos=7 State: edit_text='u-l2- fl ', edit_pos=8 edit_pos=7 State: edit_text='u-l2- fl ', edit_pos=9 State: edit_text='u-l2- lf ', edit_pos=0 edit_text='l2-u- lf ', edit_pos=3 State: edit_text='u-l2- lf ', edit_pos=1 edit_text='l2-u- lf ', edit_pos=3 State: edit_text='u-l2- lf ', edit_pos=2 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l2- lf ', edit_pos=3 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l2- lf ', edit_pos=4 edit_text='u-l l2-f ' State: edit_text='u-l2- lf ', edit_pos=5 edit_text='u-l l2-f ', edit_pos=4 State: edit_text='u-l2- lf ', edit_pos=6 edit_text='u-l2- fl ', edit_pos=7 State: edit_text='u-l2- lf ', edit_pos=7 State: edit_text='u-l2- lf ', edit_pos=8 edit_pos=7 State: edit_text='u-l2- lf ', edit_pos=9 Transition: edit_moves_key Qt.Key_Left State: edit_pos=0 State: edit_pos=1 edit_pos=0 State: edit_pos=2 edit_pos=1 State: edit_pos=3 edit_pos=2 State: edit_pos=4 edit_pos=3 State: edit_pos=5 edit_pos=4 State: edit_pos=6 edit_pos=5 State: edit_pos=7 edit_pos=6 State: edit_pos=8 edit_pos=7 State: edit_pos=9 edit_pos=8 Transition: edit_moves_key Qt.Key_Right State: edit_text='', edit_pos=0 State: edit_text='fl l2-u- ', edit_pos=0 edit_pos=1 State: edit_text='fl l2-u- ', edit_pos=1 edit_pos=2 State: edit_text='fl l2-u- ', edit_pos=2 edit_pos=3 State: edit_text='fl l2-u- ', edit_pos=3 edit_pos=4 State: edit_text='fl l2-u- ', edit_pos=4 edit_pos=5 State: edit_text='fl l2-u- ', edit_pos=5 edit_pos=6 State: edit_text='fl l2-u- ', edit_pos=6 edit_pos=7 State: edit_text='fl l2-u- ', edit_pos=7 edit_pos=8 State: edit_text='fl l2-u- ', edit_pos=8 edit_pos=9 State: edit_text='fl l2-u- ', edit_pos=9 State: edit_text='fl u-l2- ', edit_pos=0 edit_pos=1 State: edit_text='fl u-l2- ', edit_pos=1 edit_pos=2 State: edit_text='fl u-l2- ', edit_pos=2 edit_pos=3 State: edit_text='fl u-l2- ', edit_pos=3 edit_pos=4 State: edit_text='fl u-l2- ', edit_pos=4 edit_pos=5 State: edit_text='fl u-l2- ', edit_pos=5 edit_pos=6 State: edit_text='fl u-l2- ', edit_pos=6 edit_pos=7 State: edit_text='fl u-l2- ', edit_pos=7 edit_pos=8 State: edit_text='fl u-l2- ', edit_pos=8 edit_pos=9 State: edit_text='fl u-l2- ', edit_pos=9 State: edit_text='fl2- lu- ', edit_pos=0 edit_pos=1 State: edit_text='fl2- lu- ', edit_pos=1 edit_pos=2 State: edit_text='fl2- lu- ', edit_pos=2 edit_pos=3 State: edit_text='fl2- lu- ', edit_pos=3 edit_pos=4 State: edit_text='fl2- lu- ', edit_pos=4 edit_pos=5 State: edit_text='fl2- lu- ', edit_pos=5 edit_pos=6 State: edit_text='fl2- lu- ', edit_pos=6 edit_pos=7 State: edit_text='fl2- lu- ', edit_pos=7 edit_pos=8 State: edit_text='fl2- lu- ', edit_pos=8 edit_pos=9 State: edit_text='fl2- lu- ', edit_pos=9 State: edit_text='fl2- u-l ', edit_pos=0 edit_pos=1 State: edit_text='fl2- u-l ', edit_pos=1 edit_pos=2 State: edit_text='fl2- u-l ', edit_pos=2 edit_pos=3 State: edit_text='fl2- u-l ', edit_pos=3 edit_pos=4 State: edit_text='fl2- u-l ', edit_pos=4 edit_pos=5 State: edit_text='fl2- u-l ', edit_pos=5 edit_pos=6 State: edit_text='fl2- u-l ', edit_pos=6 edit_pos=7 State: edit_text='fl2- u-l ', edit_pos=7 edit_pos=8 State: edit_text='fl2- u-l ', edit_pos=8 edit_pos=9 State: edit_text='fl2- u-l ', edit_pos=9 State: edit_text='fu- l2-l ', edit_pos=0 edit_pos=1 State: edit_text='fu- l2-l ', edit_pos=1 edit_pos=2 State: edit_text='fu- l2-l ', edit_pos=2 edit_pos=3 State: edit_text='fu- l2-l ', edit_pos=3 edit_pos=4 State: edit_text='fu- l2-l ', edit_pos=4 edit_pos=5 State: edit_text='fu- l2-l ', edit_pos=5 edit_pos=6 State: edit_text='fu- l2-l ', edit_pos=6 edit_pos=7 State: edit_text='fu- l2-l ', edit_pos=7 edit_pos=8 State: edit_text='fu- l2-l ', edit_pos=8 edit_pos=9 State: edit_text='fu- l2-l ', edit_pos=9 State: edit_text='fu- ll2- ', edit_pos=0 edit_pos=1 State: edit_text='fu- ll2- ', edit_pos=1 edit_pos=2 State: edit_text='fu- ll2- ', edit_pos=2 edit_pos=3 State: edit_text='fu- ll2- ', edit_pos=3 edit_pos=4 State: edit_text='fu- ll2- ', edit_pos=4 edit_pos=5 State: edit_text='fu- ll2- ', edit_pos=5 edit_pos=6 State: edit_text='fu- ll2- ', edit_pos=6 edit_pos=7 State: edit_text='fu- ll2- ', edit_pos=7 edit_pos=8 State: edit_text='fu- ll2- ', edit_pos=8 edit_pos=9 State: edit_text='fu- ll2- ', edit_pos=9 State: edit_text='l2-f lu- ', edit_pos=0 edit_pos=1 State: edit_text='l2-f lu- ', edit_pos=1 edit_pos=2 State: edit_text='l2-f lu- ', edit_pos=2 edit_pos=3 State: edit_text='l2-f lu- ', edit_pos=3 edit_pos=4 State: edit_text='l2-f lu- ', edit_pos=4 edit_pos=5 State: edit_text='l2-f lu- ', edit_pos=5 edit_pos=6 State: edit_text='l2-f lu- ', edit_pos=6 edit_pos=7 State: edit_text='l2-f lu- ', edit_pos=7 edit_pos=8 State: edit_text='l2-f lu- ', edit_pos=8 edit_pos=9 State: edit_text='l2-f lu- ', edit_pos=9 State: edit_text='l2-f u-l ', edit_pos=0 edit_pos=1 State: edit_text='l2-f u-l ', edit_pos=1 edit_pos=2 State: edit_text='l2-f u-l ', edit_pos=2 edit_pos=3 State: edit_text='l2-f u-l ', edit_pos=3 edit_pos=4 State: edit_text='l2-f u-l ', edit_pos=4 edit_pos=5 State: edit_text='l2-f u-l ', edit_pos=5 edit_pos=6 State: edit_text='l2-f u-l ', edit_pos=6 edit_pos=7 State: edit_text='l2-f u-l ', edit_pos=7 edit_pos=8 State: edit_text='l2-f u-l ', edit_pos=8 edit_pos=9 State: edit_text='l2-f u-l ', edit_pos=9 State: edit_text='l2-l fu- ', edit_pos=0 edit_pos=1 State: edit_text='l2-l fu- ', edit_pos=1 edit_pos=2 State: edit_text='l2-l fu- ', edit_pos=2 edit_pos=3 State: edit_text='l2-l fu- ', edit_pos=3 edit_pos=4 State: edit_text='l2-l fu- ', edit_pos=4 edit_pos=5 State: edit_text='l2-l fu- ', edit_pos=5 edit_pos=6 State: edit_text='l2-l fu- ', edit_pos=6 edit_pos=7 State: edit_text='l2-l fu- ', edit_pos=7 edit_pos=8 State: edit_text='l2-l fu- ', edit_pos=8 edit_pos=9 State: edit_text='l2-l fu- ', edit_pos=9 State: edit_text='l2-l u-f ', edit_pos=0 edit_pos=1 State: edit_text='l2-l u-f ', edit_pos=1 edit_pos=2 State: edit_text='l2-l u-f ', edit_pos=2 edit_pos=3 State: edit_text='l2-l u-f ', edit_pos=3 edit_pos=4 State: edit_text='l2-l u-f ', edit_pos=4 edit_pos=5 State: edit_text='l2-l u-f ', edit_pos=5 edit_pos=6 State: edit_text='l2-l u-f ', edit_pos=6 edit_pos=7 State: edit_text='l2-l u-f ', edit_pos=7 edit_pos=8 State: edit_text='l2-l u-f ', edit_pos=8 edit_pos=9 State: edit_text='l2-l u-f ', edit_pos=9 State: edit_text='l2-u- fl ', edit_pos=0 edit_pos=1 State: edit_text='l2-u- fl ', edit_pos=1 edit_pos=2 State: edit_text='l2-u- fl ', edit_pos=2 edit_pos=3 State: edit_text='l2-u- fl ', edit_pos=3 edit_pos=4 State: edit_text='l2-u- fl ', edit_pos=4 edit_pos=5 State: edit_text='l2-u- fl ', edit_pos=5 edit_pos=6 State: edit_text='l2-u- fl ', edit_pos=6 edit_pos=7 State: edit_text='l2-u- fl ', edit_pos=7 edit_pos=8 State: edit_text='l2-u- fl ', edit_pos=8 edit_pos=9 State: edit_text='l2-u- fl ', edit_pos=9 State: edit_text='l2-u- lf ', edit_pos=0 edit_pos=1 State: edit_text='l2-u- lf ', edit_pos=1 edit_pos=2 State: edit_text='l2-u- lf ', edit_pos=2 edit_pos=3 State: edit_text='l2-u- lf ', edit_pos=3 edit_pos=4 State: edit_text='l2-u- lf ', edit_pos=4 edit_pos=5 State: edit_text='l2-u- lf ', edit_pos=5 edit_pos=6 State: edit_text='l2-u- lf ', edit_pos=6 edit_pos=7 State: edit_text='l2-u- lf ', edit_pos=7 edit_pos=8 State: edit_text='l2-u- lf ', edit_pos=8 edit_pos=9 State: edit_text='l2-u- lf ', edit_pos=9 State: edit_text='lf l2-u- ', edit_pos=0 edit_pos=1 State: edit_text='lf l2-u- ', edit_pos=1 edit_pos=2 State: edit_text='lf l2-u- ', edit_pos=2 edit_pos=3 State: edit_text='lf l2-u- ', edit_pos=3 edit_pos=4 State: edit_text='lf l2-u- ', edit_pos=4 edit_pos=5 State: edit_text='lf l2-u- ', edit_pos=5 edit_pos=6 State: edit_text='lf l2-u- ', edit_pos=6 edit_pos=7 State: edit_text='lf l2-u- ', edit_pos=7 edit_pos=8 State: edit_text='lf l2-u- ', edit_pos=8 edit_pos=9 State: edit_text='lf l2-u- ', edit_pos=9 State: edit_text='lf u-l2- ', edit_pos=0 edit_pos=1 State: edit_text='lf u-l2- ', edit_pos=1 edit_pos=2 State: edit_text='lf u-l2- ', edit_pos=2 edit_pos=3 State: edit_text='lf u-l2- ', edit_pos=3 edit_pos=4 State: edit_text='lf u-l2- ', edit_pos=4 edit_pos=5 State: edit_text='lf u-l2- ', edit_pos=5 edit_pos=6 State: edit_text='lf u-l2- ', edit_pos=6 edit_pos=7 State: edit_text='lf u-l2- ', edit_pos=7 edit_pos=8 State: edit_text='lf u-l2- ', edit_pos=8 edit_pos=9 State: edit_text='lf u-l2- ', edit_pos=9 State: edit_text='ll2- fu- ', edit_pos=0 edit_pos=1 State: edit_text='ll2- fu- ', edit_pos=1 edit_pos=2 State: edit_text='ll2- fu- ', edit_pos=2 edit_pos=3 State: edit_text='ll2- fu- ', edit_pos=3 edit_pos=4 State: edit_text='ll2- fu- ', edit_pos=4 edit_pos=5 State: edit_text='ll2- fu- ', edit_pos=5 edit_pos=6 State: edit_text='ll2- fu- ', edit_pos=6 edit_pos=7 State: edit_text='ll2- fu- ', edit_pos=7 edit_pos=8 State: edit_text='ll2- fu- ', edit_pos=8 edit_pos=9 State: edit_text='ll2- fu- ', edit_pos=9 State: edit_text='ll2- u-f ', edit_pos=0 edit_pos=1 State: edit_text='ll2- u-f ', edit_pos=1 edit_pos=2 State: edit_text='ll2- u-f ', edit_pos=2 edit_pos=3 State: edit_text='ll2- u-f ', edit_pos=3 edit_pos=4 State: edit_text='ll2- u-f ', edit_pos=4 edit_pos=5 State: edit_text='ll2- u-f ', edit_pos=5 edit_pos=6 State: edit_text='ll2- u-f ', edit_pos=6 edit_pos=7 State: edit_text='ll2- u-f ', edit_pos=7 edit_pos=8 State: edit_text='ll2- u-f ', edit_pos=8 edit_pos=9 State: edit_text='ll2- u-f ', edit_pos=9 State: edit_text='lu- fl2- ', edit_pos=0 edit_pos=1 State: edit_text='lu- fl2- ', edit_pos=1 edit_pos=2 State: edit_text='lu- fl2- ', edit_pos=2 edit_pos=3 State: edit_text='lu- fl2- ', edit_pos=3 edit_pos=4 State: edit_text='lu- fl2- ', edit_pos=4 edit_pos=5 State: edit_text='lu- fl2- ', edit_pos=5 edit_pos=6 State: edit_text='lu- fl2- ', edit_pos=6 edit_pos=7 State: edit_text='lu- fl2- ', edit_pos=7 edit_pos=8 State: edit_text='lu- fl2- ', edit_pos=8 edit_pos=9 State: edit_text='lu- fl2- ', edit_pos=9 State: edit_text='lu- l2-f ', edit_pos=0 edit_pos=1 State: edit_text='lu- l2-f ', edit_pos=1 edit_pos=2 State: edit_text='lu- l2-f ', edit_pos=2 edit_pos=3 State: edit_text='lu- l2-f ', edit_pos=3 edit_pos=4 State: edit_text='lu- l2-f ', edit_pos=4 edit_pos=5 State: edit_text='lu- l2-f ', edit_pos=5 edit_pos=6 State: edit_text='lu- l2-f ', edit_pos=6 edit_pos=7 State: edit_text='lu- l2-f ', edit_pos=7 edit_pos=8 State: edit_text='lu- l2-f ', edit_pos=8 edit_pos=9 State: edit_text='lu- l2-f ', edit_pos=9 State: edit_text='u-f l2-l ', edit_pos=0 edit_pos=1 State: edit_text='u-f l2-l ', edit_pos=1 edit_pos=2 State: edit_text='u-f l2-l ', edit_pos=2 edit_pos=3 State: edit_text='u-f l2-l ', edit_pos=3 edit_pos=4 State: edit_text='u-f l2-l ', edit_pos=4 edit_pos=5 State: edit_text='u-f l2-l ', edit_pos=5 edit_pos=6 State: edit_text='u-f l2-l ', edit_pos=6 edit_pos=7 State: edit_text='u-f l2-l ', edit_pos=7 edit_pos=8 State: edit_text='u-f l2-l ', edit_pos=8 edit_pos=9 State: edit_text='u-f l2-l ', edit_pos=9 State: edit_text='u-f ll2- ', edit_pos=0 edit_pos=1 State: edit_text='u-f ll2- ', edit_pos=1 edit_pos=2 State: edit_text='u-f ll2- ', edit_pos=2 edit_pos=3 State: edit_text='u-f ll2- ', edit_pos=3 edit_pos=4 State: edit_text='u-f ll2- ', edit_pos=4 edit_pos=5 State: edit_text='u-f ll2- ', edit_pos=5 edit_pos=6 State: edit_text='u-f ll2- ', edit_pos=6 edit_pos=7 State: edit_text='u-f ll2- ', edit_pos=7 edit_pos=8 State: edit_text='u-f ll2- ', edit_pos=8 edit_pos=9 State: edit_text='u-f ll2- ', edit_pos=9 State: edit_text='u-l fl2- ', edit_pos=0 edit_pos=1 State: edit_text='u-l fl2- ', edit_pos=1 edit_pos=2 State: edit_text='u-l fl2- ', edit_pos=2 edit_pos=3 State: edit_text='u-l fl2- ', edit_pos=3 edit_pos=4 State: edit_text='u-l fl2- ', edit_pos=4 edit_pos=5 State: edit_text='u-l fl2- ', edit_pos=5 edit_pos=6 State: edit_text='u-l fl2- ', edit_pos=6 edit_pos=7 State: edit_text='u-l fl2- ', edit_pos=7 edit_pos=8 State: edit_text='u-l fl2- ', edit_pos=8 edit_pos=9 State: edit_text='u-l fl2- ', edit_pos=9 State: edit_text='u-l l2-f ', edit_pos=0 edit_pos=1 State: edit_text='u-l l2-f ', edit_pos=1 edit_pos=2 State: edit_text='u-l l2-f ', edit_pos=2 edit_pos=3 State: edit_text='u-l l2-f ', edit_pos=3 edit_pos=4 State: edit_text='u-l l2-f ', edit_pos=4 edit_pos=5 State: edit_text='u-l l2-f ', edit_pos=5 edit_pos=6 State: edit_text='u-l l2-f ', edit_pos=6 edit_pos=7 State: edit_text='u-l l2-f ', edit_pos=7 edit_pos=8 State: edit_text='u-l l2-f ', edit_pos=8 edit_pos=9 State: edit_text='u-l l2-f ', edit_pos=9 State: edit_text='u-l2- fl ', edit_pos=0 edit_pos=1 State: edit_text='u-l2- fl ', edit_pos=1 edit_pos=2 State: edit_text='u-l2- fl ', edit_pos=2 edit_pos=3 State: edit_text='u-l2- fl ', edit_pos=3 edit_pos=4 State: edit_text='u-l2- fl ', edit_pos=4 edit_pos=5 State: edit_text='u-l2- fl ', edit_pos=5 edit_pos=6 State: edit_text='u-l2- fl ', edit_pos=6 edit_pos=7 State: edit_text='u-l2- fl ', edit_pos=7 edit_pos=8 State: edit_text='u-l2- fl ', edit_pos=8 edit_pos=9 State: edit_text='u-l2- fl ', edit_pos=9 State: edit_text='u-l2- lf ', edit_pos=0 edit_pos=1 State: edit_text='u-l2- lf ', edit_pos=1 edit_pos=2 State: edit_text='u-l2- lf ', edit_pos=2 edit_pos=3 State: edit_text='u-l2- lf ', edit_pos=3 edit_pos=4 State: edit_text='u-l2- lf ', edit_pos=4 edit_pos=5 State: edit_text='u-l2- lf ', edit_pos=5 edit_pos=6 State: edit_text='u-l2- lf ', edit_pos=6 edit_pos=7 State: edit_text='u-l2- lf ', edit_pos=7 edit_pos=8 State: edit_text='u-l2- lf ', edit_pos=8 edit_pos=9 State: edit_text='u-l2- lf ', edit_pos=9 Transition: edit_moves_text ('', False) State: edit_text='', edit_pos=0 Transition: edit_moves_text ('fl u-l2- ', False) State: edit_text='fl u-l2- ', edit_pos=9 pybik-2.1/data/tests/solved0000664000175000017500000000267512546513675016164 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'rrdduullffrrdduullbb', 'rrrr', 'ufu-d-ffl-rfbuf-b-lr-ffd', 'urluur-l-urluur-l-'] game_pos = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] game_len = [0, 4, 14, 18, 20] solved = [False, True] Conditions: game_len == len(edit_text.translate({c:None for c in b'-'})) game_pos <= game_len solved == (game_pos in [0, game_len]) Limits: Initial: State: edit_text='', game_pos=0, game_len=0, solved=True Transition: action_new_solved State: edit_text='', game_pos=0, game_len=0, solved=True Transition: edit_moves_key_enter (Qt.Key_Right, Qt.ControlModifier) Expression: game_pos = min(game_pos+1, game_len) Expression: solved = game_pos+1 >= game_len State: Transition: edit_moves_key_enter Qt.Key_Home State: game_pos=0, solved=True Transition: edit_moves_text '' State: edit_text='', game_pos=0, game_len=0, solved=True Transition: edit_moves_text 'rrdduullffrrdduullbb' State: edit_text='rrdduullffrrdduullbb', game_pos=20, game_len=20, solved=True Transition: edit_moves_text 'rrrr' State: edit_text='rrrr', game_pos=4, game_len=4, solved=True Transition: edit_moves_text 'ufu-d-ffl-rfbuf-b-lr-ffd' State: edit_text='ufu-d-ffl-rfbuf-b-lr-ffd', game_pos=18, game_len=18, solved=True Transition: edit_moves_text 'urluur-l-urluur-l-' State: edit_text='urluur-l-urluur-l-', game_pos=14, game_len=14, solved=True pybik-2.1/data/tests/mouse0000664000175000017500000001767512556223565016023 0ustar barccbarcc00000000000000Fields: edit_text = [''] Conditions: Limits: Initial: drawingarea_mouse_move_ 10, 10 State: edit_text='' Transition: drawingarea_mouse_click (240, 70), Qt.LeftButton edit_moves_text '' State: edit_text='b' edit_text='' Transition: drawingarea_mouse_click (240, 70), Qt.RightButton edit_moves_text '' State: edit_text='b-' edit_text='' Transition: drawingarea_mouse_click (290, 70), Qt.LeftButton edit_moves_text '' State: edit_text='l-' edit_text='' Transition: drawingarea_mouse_click (290, 70), Qt.RightButton edit_moves_text '' State: edit_text='l' edit_text='' Transition: drawingarea_mouse_click (370, 90), Qt.LeftButton edit_moves_text '' State: edit_text='l2-' edit_text='' Transition: drawingarea_mouse_click (370, 90), Qt.RightButton edit_moves_text '' State: edit_text='l2' edit_text='' Transition: drawingarea_mouse_click (450, 110), Qt.LeftButton edit_moves_text '' State: edit_text='r' edit_text='' Transition: drawingarea_mouse_click (450, 110), Qt.RightButton edit_moves_text '' State: edit_text='r-' edit_text='' Transition: drawingarea_mouse_click (480, 130), Qt.LeftButton edit_moves_text '' State: edit_text='b-' edit_text='' Transition: drawingarea_mouse_click (480, 130), Qt.RightButton edit_moves_text '' State: edit_text='b' edit_text='' Transition: drawingarea_mouse_click (210, 110), Qt.LeftButton edit_moves_text '' State: edit_text='b2' edit_text='' Transition: drawingarea_mouse_click (210, 110), Qt.RightButton edit_moves_text '' State: edit_text='b2-' edit_text='' Transition: drawingarea_mouse_click (310, 140), Qt.LeftButton edit_moves_text '' State: edit_text='u-' edit_text='' Transition: drawingarea_mouse_click (310, 140), Qt.RightButton edit_moves_text '' State: edit_text='u' edit_text='' Transition: drawingarea_mouse_click (420, 170), Qt.LeftButton edit_moves_text '' State: edit_text='b2-' edit_text='' Transition: drawingarea_mouse_click (420, 170), Qt.RightButton edit_moves_text '' State: edit_text='b2' edit_text='' Transition: drawingarea_mouse_click (130, 150), Qt.LeftButton edit_moves_text '' State: edit_text='f-' edit_text='' Transition: drawingarea_mouse_click (130, 150), Qt.RightButton edit_moves_text '' State: edit_text='f' edit_text='' Transition: drawingarea_mouse_click (140, 180), Qt.LeftButton edit_moves_text '' State: edit_text='l' edit_text='' Transition: drawingarea_mouse_click (140, 180), Qt.RightButton edit_moves_text '' State: edit_text='l-' edit_text='' Transition: drawingarea_mouse_click (240, 200), Qt.LeftButton edit_moves_text '' State: edit_text='l2' edit_text='' Transition: drawingarea_mouse_click (240, 200), Qt.RightButton edit_moves_text '' State: edit_text='l2-' edit_text='' Transition: drawingarea_mouse_click (330, 250), Qt.LeftButton edit_moves_text '' State: edit_text='r-' edit_text='' Transition: drawingarea_mouse_click (330, 250), Qt.RightButton edit_moves_text '' State: edit_text='r' edit_text='' Transition: drawingarea_mouse_click (390, 250), Qt.LeftButton edit_moves_text '' State: edit_text='f' edit_text='' Transition: drawingarea_mouse_click (390, 250), Qt.RightButton edit_moves_text '' State: edit_text='f-' edit_text='' Transition: drawingarea_mouse_click (90, 250), Qt.LeftButton edit_moves_text '' State: edit_text='u' edit_text='' Transition: drawingarea_mouse_click (90, 250), Qt.RightButton edit_moves_text '' State: edit_text='u-' edit_text='' Transition: drawingarea_mouse_click (120, 230), Qt.LeftButton edit_moves_text '' State: edit_text='l-' edit_text='' Transition: drawingarea_mouse_click (120, 230), Qt.RightButton edit_moves_text '' State: edit_text='l' edit_text='' Transition: drawingarea_mouse_click (210, 280), Qt.LeftButton edit_moves_text '' State: edit_text='l2-' edit_text='' Transition: drawingarea_mouse_click (210, 280), Qt.RightButton edit_moves_text '' State: edit_text='l2' edit_text='' Transition: drawingarea_mouse_click (310, 300), Qt.LeftButton edit_moves_text '' State: edit_text='r' edit_text='' Transition: drawingarea_mouse_click (310, 300), Qt.RightButton edit_moves_text '' State: edit_text='r-' edit_text='' Transition: drawingarea_mouse_click (340, 350), Qt.LeftButton edit_moves_text '' State: edit_text='u-' edit_text='' Transition: drawingarea_mouse_click (340, 350), Qt.RightButton edit_moves_text '' State: edit_text='u' edit_text='' Transition: drawingarea_mouse_click (120, 330), Qt.LeftButton edit_moves_text '' State: edit_text='d2-' edit_text='' Transition: drawingarea_mouse_click (120, 330), Qt.RightButton edit_moves_text '' State: edit_text='d2' edit_text='' Transition: drawingarea_mouse_click (220, 380), Qt.LeftButton edit_moves_text '' State: edit_text='f-' edit_text='' Transition: drawingarea_mouse_click (220, 380), Qt.RightButton edit_moves_text '' State: edit_text='f' edit_text='' Transition: drawingarea_mouse_click (330, 420), Qt.LeftButton edit_moves_text '' State: edit_text='d2' edit_text='' Transition: drawingarea_mouse_click (330, 420), Qt.RightButton edit_moves_text '' State: edit_text='d2-' edit_text='' Transition: drawingarea_mouse_click (120, 400), Qt.LeftButton edit_moves_text '' State: edit_text='d-' edit_text='' Transition: drawingarea_mouse_click (120, 400), Qt.RightButton edit_moves_text '' State: edit_text='d' edit_text='' Transition: drawingarea_mouse_click (140, 430), Qt.LeftButton edit_moves_text '' State: edit_text='l' edit_text='' Transition: drawingarea_mouse_click (140, 430), Qt.RightButton edit_moves_text '' State: edit_text='l-' edit_text='' Transition: drawingarea_mouse_click (220, 460), Qt.LeftButton edit_moves_text '' State: edit_text='l2' edit_text='' Transition: drawingarea_mouse_click (220, 460), Qt.RightButton edit_moves_text '' State: edit_text='l2-' edit_text='' Transition: drawingarea_mouse_click (310, 510), Qt.LeftButton edit_moves_text '' State: edit_text='r-' edit_text='' Transition: drawingarea_mouse_click (310, 510), Qt.RightButton edit_moves_text '' State: edit_text='r' edit_text='' Transition: drawingarea_mouse_click (350, 510), Qt.LeftButton edit_moves_text '' State: edit_text='d' edit_text='' Transition: drawingarea_mouse_click (350, 510), Qt.RightButton edit_moves_text '' State: edit_text='d-' edit_text='' pybik-2.1/data/tests/loadmodels.py0000775000175000017500000000514012556223565017430 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2015 B. Clausius # # 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 3 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, see . def lines(): template_1 = ''' Fields: solved = [True] type = ['Cube'] sizes = [(3, 3, 3)] selection_mode = ['quadrant', 'simple'] mirror_faces = [False, True] Conditions: Limits: Initial: State: solved=True, type='Cube', sizes=(3, 3, 3), selection_mode='simple', mirror_faces=False Transition: set_settings_draw 'selection_nick', 'quadrant' State: selection_mode='quadrant' Transition: set_settings_draw 'selection_nick', 'simple' State: selection_mode='simple' Transition: set_settings_draw 'mirror_faces', False State: mirror_faces=False Transition: set_settings_draw 'mirror_faces', True State: mirror_faces=True Transition: direct_selectmodel 'Cube', (3,) '''.strip() template_2 = ''' direct_selectmodel {!r}, {!r} '''.strip('\n') template_3 = ''' State: solved=True, type='Cube', sizes=(3, 3, 3) solved=True, type='Cube', sizes=(3, 3, 3) '''.strip('\n') template_4 = ''' type={!r}, sizes={!r} '''.strip('\n') from pybiklib.model import Model Model.load_index() tslist = [] for mtype, sizesdict in Model.cache_index['sizes'].items(): for normsizes, (internsizes, unused_file) in sizesdict.items(): tslist.append((mtype, normsizes, internsizes)) import random #tslist.sort() random.shuffle(tslist) tslist.append(('Cube', (3,), (3, 3, 3))) yield from template_1.splitlines() for mtype, normsizes, internsizes in tslist: yield from template_2.format(mtype, normsizes).splitlines() yield from template_3.splitlines() for mtype, normsizes, internsizes in tslist: yield from template_4.format(mtype, internsizes).splitlines() def main(): import sys sys.path.insert(0, '.') for line in lines(): print(line) if __name__ == '__main__': main() pybik-2.1/data/tests/moves-fl0000664000175000017500000005447612510350623016405 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'f', 'f ', 'f l', 'f l ', 'f-', 'f- ', 'fl', 'fl ', 'l', 'l ', 'l-', 'l- ', 'l- f-', 'l- f- ', 'l-f-', 'l-f- '] edit_pos = [0, 1, 2, 3, 4, 5, 6] game_len = [0, 1, 2] Conditions: edit_pos <= len(edit_text) edit_pos == len(edit_text) or edit_text[edit_pos] not in '- ' game_len == len(edit_text.translate({c:None for c in b' -'})) Limits: Initial: active_plugin_group_activate 4, 'Move transformations' State: edit_text='', edit_pos=0, game_len=0 edit_text='', edit_pos=0, game_len=0 Transition: action_add_mark State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 State: edit_text='f', edit_pos=1 edit_text='f ', edit_pos=2 State: edit_text='f ', edit_pos=0 State: edit_text='f ', edit_pos=2 State: edit_text='f l', edit_pos=0 State: edit_text='f l', edit_pos=2 State: edit_text='f l', edit_pos=3 edit_text='f l ', edit_pos=4 State: edit_text='f l ', edit_pos=0 State: edit_text='f l ', edit_pos=2 State: edit_text='f l ', edit_pos=4 State: edit_text='f-', edit_pos=0 State: edit_text='f-', edit_pos=2 edit_text='f- ', edit_pos=3 State: edit_text='f- ', edit_pos=0 State: edit_text='f- ', edit_pos=3 State: edit_text='fl', edit_pos=0 State: edit_text='fl', edit_pos=1 edit_text='f l', edit_pos=2 State: edit_text='fl', edit_pos=2 edit_text='fl ', edit_pos=3 State: edit_text='fl ', edit_pos=0 State: edit_text='fl ', edit_pos=1 edit_text='f l ', edit_pos=2 State: edit_text='fl ', edit_pos=3 State: edit_text='l', edit_pos=0 State: edit_text='l', edit_pos=1 edit_text='l ', edit_pos=2 State: edit_text='l ', edit_pos=0 State: edit_text='l ', edit_pos=2 State: edit_text='l-', edit_pos=0 State: edit_text='l-', edit_pos=2 edit_text='l- ', edit_pos=3 State: edit_text='l- ', edit_pos=0 State: edit_text='l- ', edit_pos=3 State: edit_text='l- f-', edit_pos=0 State: edit_text='l- f-', edit_pos=3 State: edit_text='l- f-', edit_pos=5 edit_text='l- f- ', edit_pos=6 State: edit_text='l- f- ', edit_pos=0 State: edit_text='l- f- ', edit_pos=3 State: edit_text='l- f- ', edit_pos=6 State: edit_text='l-f-', edit_pos=0 State: edit_text='l-f-', edit_pos=2 edit_text='l- f-', edit_pos=3 State: edit_text='l-f-', edit_pos=4 edit_text='l-f- ', edit_pos=5 State: edit_text='l-f- ', edit_pos=0 State: edit_text='l-f- ', edit_pos=2 edit_text='l- f- ', edit_pos=3 State: edit_text='l-f- ', edit_pos=5 Transition: action_forward State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 edit_pos=1 State: edit_text='f', edit_pos=1 State: edit_text='f ', edit_pos=0 edit_pos=2 State: edit_text='f ', edit_pos=2 State: edit_text='f l', edit_pos=0 edit_pos=2 State: edit_text='f l', edit_pos=2 edit_pos=3 State: edit_text='f l', edit_pos=3 State: edit_text='f l ', edit_pos=0 edit_pos=2 State: edit_text='f l ', edit_pos=2 edit_pos=4 State: edit_text='f l ', edit_pos=4 State: edit_text='f-', edit_pos=0 edit_pos=2 State: edit_text='f-', edit_pos=2 State: edit_text='f- ', edit_pos=0 edit_pos=3 State: edit_text='f- ', edit_pos=3 State: edit_text='fl', edit_pos=0 edit_pos=2 State: edit_text='fl', edit_pos=1 edit_pos=2 State: edit_text='fl', edit_pos=2 State: edit_text='fl ', edit_pos=0 edit_pos=3 State: edit_text='fl ', edit_pos=1 edit_pos=3 State: edit_text='fl ', edit_pos=3 State: edit_text='l', edit_pos=0 edit_pos=1 State: edit_text='l', edit_pos=1 State: edit_text='l ', edit_pos=0 edit_pos=2 State: edit_text='l ', edit_pos=2 State: edit_text='l-', edit_pos=0 edit_pos=2 State: edit_text='l-', edit_pos=2 State: edit_text='l- ', edit_pos=0 edit_pos=3 State: edit_text='l- ', edit_pos=3 State: edit_text='l- f-', edit_pos=0 edit_pos=3 State: edit_text='l- f-', edit_pos=3 edit_pos=5 State: edit_text='l- f-', edit_pos=5 State: edit_text='l- f- ', edit_pos=0 edit_pos=3 State: edit_text='l- f- ', edit_pos=3 edit_pos=6 State: edit_text='l- f- ', edit_pos=6 State: edit_text='l-f-', edit_pos=0 edit_pos=4 State: edit_text='l-f-', edit_pos=2 edit_pos=4 State: edit_text='l-f-', edit_pos=4 State: edit_text='l-f- ', edit_pos=0 edit_pos=5 State: edit_text='l-f- ', edit_pos=2 edit_pos=5 State: edit_text='l-f- ', edit_pos=5 Transition: action_initial_state Expression: edit_pos = 0 State: edit_text='', edit_pos=0, game_len=0 State: edit_text='f', edit_pos=0, game_len=1 State: edit_text='f', edit_pos=1, game_len=1 edit_text='', game_len=0 State: edit_text='f ', edit_pos=0, game_len=1 State: edit_text='f ', edit_pos=2, game_len=1 edit_text='', game_len=0 State: edit_text='f l', edit_pos=0, game_len=2 State: edit_text='f l', edit_pos=2, game_len=2 edit_text='l', game_len=1 State: edit_text='f l', edit_pos=3, game_len=2 edit_text='', game_len=0 State: edit_text='f l ', edit_pos=0, game_len=2 State: edit_text='f l ', edit_pos=2, game_len=2 edit_text='l ', game_len=1 State: edit_text='f l ', edit_pos=4, game_len=2 edit_text='', game_len=0 State: edit_text='f-', edit_pos=0, game_len=1 State: edit_text='f-', edit_pos=2, game_len=1 edit_text='', game_len=0 State: edit_text='f- ', edit_pos=0, game_len=1 State: edit_text='f- ', edit_pos=3, game_len=1 edit_text='', game_len=0 State: edit_text='fl', edit_pos=0, game_len=2 State: edit_text='fl', edit_pos=1, game_len=2 edit_text='l', game_len=1 State: edit_text='fl', edit_pos=2, game_len=2 edit_text='', game_len=0 State: edit_text='fl ', edit_pos=0, game_len=2 State: edit_text='fl ', edit_pos=1, game_len=2 edit_text='l ', game_len=1 State: edit_text='fl ', edit_pos=3, game_len=2 edit_text='', game_len=0 State: edit_text='l', edit_pos=0, game_len=1 State: edit_text='l', edit_pos=1, game_len=1 edit_text='', game_len=0 State: edit_text='l ', edit_pos=0, game_len=1 State: edit_text='l ', edit_pos=2, game_len=1 edit_text='', game_len=0 State: edit_text='l-', edit_pos=0, game_len=1 State: edit_text='l-', edit_pos=2, game_len=1 edit_text='', game_len=0 State: edit_text='l- ', edit_pos=0, game_len=1 State: edit_text='l- ', edit_pos=3, game_len=1 edit_text='', game_len=0 State: edit_text='l- f-', edit_pos=0, game_len=2 State: edit_text='l- f-', edit_pos=3, game_len=2 edit_text='f-', game_len=1 State: edit_text='l- f-', edit_pos=5, game_len=2 edit_text='', game_len=0 State: edit_text='l- f- ', edit_pos=0, game_len=2 State: edit_text='l- f- ', edit_pos=3, game_len=2 edit_text='f- ', game_len=1 State: edit_text='l- f- ', edit_pos=6, game_len=2 edit_text='', game_len=0 State: edit_text='l-f-', edit_pos=0, game_len=2 State: edit_text='l-f-', edit_pos=2, game_len=2 edit_text='f-', game_len=1 State: edit_text='l-f-', edit_pos=4, game_len=2 edit_text='', game_len=0 State: edit_text='l-f- ', edit_pos=0, game_len=2 State: edit_text='l-f- ', edit_pos=2, game_len=2 edit_text='f- ', game_len=1 State: edit_text='l-f- ', edit_pos=5, game_len=2 edit_text='', game_len=0 Transition: plugin_activate 'Move transformations', 'Invert move sequence' State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 edit_text='f-' State: edit_text='f', edit_pos=1 edit_text='f-', edit_pos=2 State: edit_text='f ', edit_pos=0 edit_text='f-' State: edit_text='f ', edit_pos=2 edit_text='f-' State: edit_text='f l', edit_pos=0 edit_text='l- f-' State: edit_text='f l', edit_pos=2 edit_text='l- f-', edit_pos=3 State: edit_text='f l', edit_pos=3 edit_text='l- f-', edit_pos=5 State: edit_text='f l ', edit_pos=0 edit_text='l- f-' State: edit_text='f l ', edit_pos=2 edit_text='l- f-', edit_pos=3 State: edit_text='f l ', edit_pos=4 edit_text='l- f-', edit_pos=5 State: edit_text='f-', edit_pos=0 edit_text='f' State: edit_text='f-', edit_pos=2 edit_text='f', edit_pos=1 State: edit_text='f- ', edit_pos=0 edit_text='f' State: edit_text='f- ', edit_pos=3 edit_text='f', edit_pos=1 State: edit_text='fl', edit_pos=0 edit_text='l-f-' State: edit_text='fl', edit_pos=1 edit_text='l-f-', edit_pos=2 State: edit_text='fl', edit_pos=2 edit_text='l-f-', edit_pos=4 State: edit_text='fl ', edit_pos=0 edit_text='l-f-' State: edit_text='fl ', edit_pos=1 edit_text='l-f-', edit_pos=2 State: edit_text='fl ', edit_pos=3 edit_text='l-f-', edit_pos=4 State: edit_text='l', edit_pos=0 edit_text='l-' State: edit_text='l', edit_pos=1 edit_text='l-', edit_pos=2 State: edit_text='l ', edit_pos=0 edit_text='l-' State: edit_text='l ', edit_pos=2 edit_text='l-' State: edit_text='l-', edit_pos=0 edit_text='l' State: edit_text='l-', edit_pos=2 edit_text='l', edit_pos=1 State: edit_text='l- ', edit_pos=0 edit_text='l' State: edit_text='l- ', edit_pos=3 edit_text='l', edit_pos=1 State: edit_text='l- f-', edit_pos=0 edit_text='f l' State: edit_text='l- f-', edit_pos=3 edit_text='f l', edit_pos=2 State: edit_text='l- f-', edit_pos=5 edit_text='f l', edit_pos=3 State: edit_text='l- f- ', edit_pos=0 edit_text='f l' State: edit_text='l- f- ', edit_pos=3 edit_text='f l', edit_pos=2 State: edit_text='l- f- ', edit_pos=6 edit_text='f l', edit_pos=3 State: edit_text='l-f-', edit_pos=0 edit_text='fl' State: edit_text='l-f-', edit_pos=2 edit_text='fl', edit_pos=1 State: edit_text='l-f-', edit_pos=4 edit_text='fl', edit_pos=2 State: edit_text='l-f- ', edit_pos=0 edit_text='fl' State: edit_text='l-f- ', edit_pos=2 edit_text='fl', edit_pos=1 State: edit_text='l-f- ', edit_pos=5 edit_text='fl', edit_pos=2 Transition: action_new State: edit_text='', edit_pos=0, game_len=0 Transition: action_new_solved State: edit_text='', edit_pos=0, game_len=0 Transition: action_next State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 edit_pos=1 State: edit_text='f', edit_pos=1 State: edit_text='f ', edit_pos=0 edit_pos=2 State: edit_text='f ', edit_pos=2 State: edit_text='f l', edit_pos=0 edit_pos=2 State: edit_text='f l', edit_pos=2 edit_pos=3 State: edit_text='f l', edit_pos=3 State: edit_text='f l ', edit_pos=0 edit_pos=2 State: edit_text='f l ', edit_pos=2 edit_pos=4 State: edit_text='f l ', edit_pos=4 State: edit_text='f-', edit_pos=0 edit_pos=2 State: edit_text='f-', edit_pos=2 State: edit_text='f- ', edit_pos=0 edit_pos=3 State: edit_text='f- ', edit_pos=3 State: edit_text='fl', edit_pos=0 edit_pos=1 State: edit_text='fl', edit_pos=1 edit_pos=2 State: edit_text='fl', edit_pos=2 State: edit_text='fl ', edit_pos=0 edit_pos=1 State: edit_text='fl ', edit_pos=1 edit_pos=3 State: edit_text='fl ', edit_pos=3 State: edit_text='l', edit_pos=0 edit_pos=1 State: edit_text='l', edit_pos=1 State: edit_text='l ', edit_pos=0 edit_pos=2 State: edit_text='l ', edit_pos=2 State: edit_text='l-', edit_pos=0 edit_pos=2 State: edit_text='l-', edit_pos=2 State: edit_text='l- ', edit_pos=0 edit_pos=3 State: edit_text='l- ', edit_pos=3 State: edit_text='l- f-', edit_pos=0 edit_pos=3 State: edit_text='l- f-', edit_pos=3 edit_pos=5 State: edit_text='l- f-', edit_pos=5 State: edit_text='l- f- ', edit_pos=0 edit_pos=3 State: edit_text='l- f- ', edit_pos=3 edit_pos=6 State: edit_text='l- f- ', edit_pos=6 State: edit_text='l-f-', edit_pos=0 edit_pos=2 State: edit_text='l-f-', edit_pos=2 edit_pos=4 State: edit_text='l-f-', edit_pos=4 State: edit_text='l-f- ', edit_pos=0 edit_pos=2 State: edit_text='l-f- ', edit_pos=2 edit_pos=5 State: edit_text='l-f- ', edit_pos=5 Transition: action_play State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 edit_pos=1 State: edit_text='f', edit_pos=1 State: edit_text='f ', edit_pos=0 edit_pos=2 State: edit_text='f ', edit_pos=2 State: edit_text='f l', edit_pos=0 edit_pos=3 State: edit_text='f l', edit_pos=2 edit_pos=3 State: edit_text='f l', edit_pos=3 State: edit_text='f l ', edit_pos=0 edit_pos=4 State: edit_text='f l ', edit_pos=2 edit_pos=4 State: edit_text='f l ', edit_pos=4 State: edit_text='f-', edit_pos=0 edit_pos=2 State: edit_text='f-', edit_pos=2 State: edit_text='f- ', edit_pos=0 edit_pos=3 State: edit_text='f- ', edit_pos=3 State: edit_text='fl', edit_pos=0 edit_pos=2 State: edit_text='fl', edit_pos=1 edit_pos=2 State: edit_text='fl', edit_pos=2 State: edit_text='fl ', edit_pos=0 edit_pos=3 State: edit_text='fl ', edit_pos=1 edit_pos=3 State: edit_text='fl ', edit_pos=3 State: edit_text='l', edit_pos=0 edit_pos=1 State: edit_text='l', edit_pos=1 State: edit_text='l ', edit_pos=0 edit_pos=2 State: edit_text='l ', edit_pos=2 State: edit_text='l-', edit_pos=0 edit_pos=2 State: edit_text='l-', edit_pos=2 State: edit_text='l- ', edit_pos=0 edit_pos=3 State: edit_text='l- ', edit_pos=3 State: edit_text='l- f-', edit_pos=0 edit_pos=5 State: edit_text='l- f-', edit_pos=3 edit_pos=5 State: edit_text='l- f-', edit_pos=5 State: edit_text='l- f- ', edit_pos=0 edit_pos=6 State: edit_text='l- f- ', edit_pos=3 edit_pos=6 State: edit_text='l- f- ', edit_pos=6 State: edit_text='l-f-', edit_pos=0 edit_pos=4 State: edit_text='l-f-', edit_pos=2 edit_pos=4 State: edit_text='l-f-', edit_pos=4 State: edit_text='l-f- ', edit_pos=0 edit_pos=5 State: edit_text='l-f- ', edit_pos=2 edit_pos=5 State: edit_text='l-f- ', edit_pos=5 Transition: action_previous State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 State: edit_text='f', edit_pos=1 edit_pos=0 State: edit_text='f ', edit_pos=0 State: edit_text='f ', edit_pos=2 edit_pos=0 State: edit_text='f l', edit_pos=0 State: edit_text='f l', edit_pos=2 edit_pos=0 State: edit_text='f l', edit_pos=3 edit_pos=2 State: edit_text='f l ', edit_pos=0 State: edit_text='f l ', edit_pos=2 edit_pos=0 State: edit_text='f l ', edit_pos=4 edit_pos=2 State: edit_text='f-', edit_pos=0 State: edit_text='f-', edit_pos=2 edit_pos=0 State: edit_text='f- ', edit_pos=0 State: edit_text='f- ', edit_pos=3 edit_pos=0 State: edit_text='fl', edit_pos=0 State: edit_text='fl', edit_pos=1 edit_pos=0 State: edit_text='fl', edit_pos=2 edit_pos=1 State: edit_text='fl ', edit_pos=0 State: edit_text='fl ', edit_pos=1 edit_pos=0 State: edit_text='fl ', edit_pos=3 edit_pos=1 State: edit_text='l', edit_pos=0 State: edit_text='l', edit_pos=1 edit_pos=0 State: edit_text='l ', edit_pos=0 State: edit_text='l ', edit_pos=2 edit_pos=0 State: edit_text='l-', edit_pos=0 State: edit_text='l-', edit_pos=2 edit_pos=0 State: edit_text='l- ', edit_pos=0 State: edit_text='l- ', edit_pos=3 edit_pos=0 State: edit_text='l- f-', edit_pos=0 State: edit_text='l- f-', edit_pos=3 edit_pos=0 State: edit_text='l- f-', edit_pos=5 edit_pos=3 State: edit_text='l- f- ', edit_pos=0 State: edit_text='l- f- ', edit_pos=3 edit_pos=0 State: edit_text='l- f- ', edit_pos=6 edit_pos=3 State: edit_text='l-f-', edit_pos=0 State: edit_text='l-f-', edit_pos=2 edit_pos=0 State: edit_text='l-f-', edit_pos=4 edit_pos=2 State: edit_text='l-f- ', edit_pos=0 State: edit_text='l-f- ', edit_pos=2 edit_pos=0 State: edit_text='l-f- ', edit_pos=5 edit_pos=2 Transition: action_remove_mark State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 State: edit_text='f', edit_pos=1 State: edit_text='f ', edit_pos=0 State: edit_text='f ', edit_pos=2 edit_text='f', edit_pos=1 State: edit_text='f l', edit_pos=0 State: edit_text='f l', edit_pos=2 edit_text='fl', edit_pos=1 State: edit_text='f l', edit_pos=3 State: edit_text='f l ', edit_pos=0 State: edit_text='f l ', edit_pos=2 edit_text='fl ', edit_pos=1 State: edit_text='f l ', edit_pos=4 edit_text='f l', edit_pos=3 State: edit_text='f-', edit_pos=0 State: edit_text='f-', edit_pos=2 State: edit_text='f- ', edit_pos=0 State: edit_text='f- ', edit_pos=3 edit_text='f-', edit_pos=2 State: edit_text='fl', edit_pos=0 State: edit_text='fl', edit_pos=1 State: edit_text='fl', edit_pos=2 State: edit_text='fl ', edit_pos=0 State: edit_text='fl ', edit_pos=1 State: edit_text='fl ', edit_pos=3 edit_text='fl', edit_pos=2 State: edit_text='l', edit_pos=0 State: edit_text='l', edit_pos=1 State: edit_text='l ', edit_pos=0 State: edit_text='l ', edit_pos=2 edit_text='l', edit_pos=1 State: edit_text='l-', edit_pos=0 State: edit_text='l-', edit_pos=2 State: edit_text='l- ', edit_pos=0 State: edit_text='l- ', edit_pos=3 edit_text='l-', edit_pos=2 State: edit_text='l- f-', edit_pos=0 State: edit_text='l- f-', edit_pos=3 edit_text='l-f-', edit_pos=2 State: edit_text='l- f-', edit_pos=5 State: edit_text='l- f- ', edit_pos=0 State: edit_text='l- f- ', edit_pos=3 edit_text='l-f- ', edit_pos=2 State: edit_text='l- f- ', edit_pos=6 edit_text='l- f-', edit_pos=5 State: edit_text='l-f-', edit_pos=0 State: edit_text='l-f-', edit_pos=2 State: edit_text='l-f-', edit_pos=4 State: edit_text='l-f- ', edit_pos=0 State: edit_text='l-f- ', edit_pos=2 State: edit_text='l-f- ', edit_pos=5 edit_text='l-f-', edit_pos=4 Transition: action_rewind State: edit_text='', edit_pos=0 State: edit_text='f', edit_pos=0 State: edit_text='f', edit_pos=1 edit_pos=0 State: edit_text='f ', edit_pos=0 State: edit_text='f ', edit_pos=2 edit_pos=0 State: edit_text='f l', edit_pos=0 State: edit_text='f l', edit_pos=2 edit_pos=0 State: edit_text='f l', edit_pos=3 edit_pos=2 State: edit_text='f l ', edit_pos=0 State: edit_text='f l ', edit_pos=2 edit_pos=0 State: edit_text='f l ', edit_pos=4 edit_pos=2 State: edit_text='f-', edit_pos=0 State: edit_text='f-', edit_pos=2 edit_pos=0 State: edit_text='f- ', edit_pos=0 State: edit_text='f- ', edit_pos=3 edit_pos=0 State: edit_text='fl', edit_pos=0 State: edit_text='fl', edit_pos=1 edit_pos=0 State: edit_text='fl', edit_pos=2 edit_pos=0 State: edit_text='fl ', edit_pos=0 State: edit_text='fl ', edit_pos=1 edit_pos=0 State: edit_text='fl ', edit_pos=3 edit_pos=0 State: edit_text='l', edit_pos=0 State: edit_text='l', edit_pos=1 edit_pos=0 State: edit_text='l ', edit_pos=0 State: edit_text='l ', edit_pos=2 edit_pos=0 State: edit_text='l-', edit_pos=0 State: edit_text='l-', edit_pos=2 edit_pos=0 State: edit_text='l- ', edit_pos=0 State: edit_text='l- ', edit_pos=3 edit_pos=0 State: edit_text='l- f-', edit_pos=0 State: edit_text='l- f-', edit_pos=3 edit_pos=0 State: edit_text='l- f-', edit_pos=5 edit_pos=3 State: edit_text='l- f- ', edit_pos=0 State: edit_text='l- f- ', edit_pos=3 edit_pos=0 State: edit_text='l- f- ', edit_pos=6 edit_pos=3 State: edit_text='l-f-', edit_pos=0 State: edit_text='l-f-', edit_pos=2 edit_pos=0 State: edit_text='l-f-', edit_pos=4 edit_pos=0 State: edit_text='l-f- ', edit_pos=0 State: edit_text='l-f- ', edit_pos=2 edit_pos=0 State: edit_text='l-f- ', edit_pos=5 edit_pos=0 Transition: edit_moves_text '' State: edit_text='', edit_pos=0, game_len=0 Transition: edit_moves_text 'fl' State: edit_text='fl', edit_pos=2, game_len=2 pybik-2.1/data/tests/solutions0000664000175000017500000000211712507720113016676 0ustar barccbarcc00000000000000Fields: plugingroup = [1] solved = [False] Conditions: Limits: Initial: active_plugin_group_activate 1, 'Solvers' action_new State: plugingroup=0, solved=True plugingroup=1, solved=True plugingroup=1, solved=False Transition: plugin_activate 'Solvers', "Beginner's method" button_edit_clear_click Qt.LeftButton State: plugingroup=1, solved=False plugingroup=1, solved=True plugingroup=1, solved=False Transition: plugin_activate 'Solvers', 'Leyan Lo' button_edit_clear_click Qt.LeftButton State: plugingroup=1, solved=False plugingroup=1, solved=True plugingroup=1, solved=False Transition: plugin_activate 'Solvers', 'Spiegel' button_edit_clear_click Qt.LeftButton State: plugingroup=1, solved=False plugingroup=1, solved=True plugingroup=1, solved=False Transition: plugin_activate 'Solvers', 'Spiegel improved' button_edit_clear_click Qt.LeftButton State: plugingroup=1, solved=False plugingroup=1, solved=True plugingroup=1, solved=False pybik-2.1/data/tests/show-hide-bars0000664000175000017500000000115512463156014017460 0ustar barccbarcc00000000000000Fields: view_editbar = [False, True] view_statusbar = [False, True] view_toolbar = [False, True] Conditions: Limits: Initial: State: view_editbar=True, view_statusbar=True, view_toolbar=True Transition: action_editbar State: view_editbar=False view_editbar=True State: view_editbar=True view_editbar=False Transition: action_statusbar State: view_statusbar=False view_statusbar=True State: view_statusbar=True view_statusbar=False Transition: action_toolbar State: view_toolbar=False view_toolbar=True State: view_toolbar=True view_toolbar=False pybik-2.1/data/tests/selectmodel0000664000175000017500000000701012556223565017151 0ustar barccbarcc00000000000000Constants: ctypes = 'Cube Tower Brick Tetrahedron Cube3Void Prism3 Prism3Complex Prism5 Prism5M'.split() csize = [(3,),(2,3),(4,2,3),(3,),(),(3,2),(3,2),(2,2),(2,2)] cdsize = [(s+(None,None,None))[:3] for s in csize] cpsizes = [(3, 3, 3), (2, 3, 2), (4, 2, 3), (3, 3, 3, 3), (3, 2, 3, 3), (2, 2, 2, 2, 2, 2)] cmodels1 = [i for i,s in enumerate(cdsize) if s[0] is not None] cmodels2 = [i for i,s in enumerate(cdsize) if s[1] is not None] cmodels3 = [i for i,s in enumerate(cdsize) if s[2] is not None] ctypesizes = {ctypes[ti]:cpsizes[si] for ti,si in enumerate([0,1,2,3,0,4,4,5,5])} Fields: selectdlg_exists = [True] selectdlg_visible = [False, True] solved = [True] type = ctypes sizes = cpsizes dlg_model = list(range(len(ctypes))) lblsize1 = [False, True] lblsize2 = [False, True] lblsize3 = [False, True] size1 = [None, 2, 3, 4] size2 = [None, 2, 3] size3 = [None, 3] Conditions: not selectdlg_exists or (lblsize1 == (size1 is not None) == (dlg_model in cmodels1)) not selectdlg_exists or (lblsize2 == (size2 is not None) == (dlg_model in cmodels2)) not selectdlg_exists or (lblsize3 == (size3 is not None) == (dlg_model in cmodels3)) not selectdlg_exists or (size1,size2,size3) == cdsize[dlg_model] sizes == ctypesizes[type] Limits: Initial: dialog_selectmodel State: selectdlg_exists=False, selectdlg_visible=False, solved=True, type='Cube', sizes=(3, 3, 3), dlg_model=None, lblsize1=None, lblsize2=None, lblsize3=None, size1=None, size2=None, size3=None selectdlg_exists=True, selectdlg_visible=True, dlg_model=0, lblsize1=True, lblsize2=False, lblsize3=False, size1=3, size2=None, size3=None Transition: action_selectmodel State: selectdlg_visible=True Transition: dialog_selectmodel_cancel State: selectdlg_visible=False Transition: dialog_selectmodel_changemodel Qt.Key_Down Expression: dlg_model = min(len(ctypes)-1, dlg_model+1) if selectdlg_visible else dlg_model Expression: size1 = cdsize[min(len(ctypes)-1, dlg_model+1)][0] if selectdlg_visible else size1 Expression: size2 = cdsize[min(len(ctypes)-1, dlg_model+1)][1] if selectdlg_visible else size2 Expression: size3 = cdsize[min(len(ctypes)-1, dlg_model+1)][2] if selectdlg_visible else size3 Expression: lblsize1 = cdsize[min(len(ctypes)-1, dlg_model+1)][0] is not None if selectdlg_visible else lblsize1 Expression: lblsize2 = cdsize[min(len(ctypes)-1, dlg_model+1)][1] is not None if selectdlg_visible else lblsize2 Expression: lblsize3 = cdsize[min(len(ctypes)-1, dlg_model+1)][2] is not None if selectdlg_visible else lblsize3 State: Transition: dialog_selectmodel_changemodel Qt.Key_Up Expression: dlg_model = max(0, dlg_model-1) if selectdlg_visible else dlg_model Expression: size1 = cdsize[max(0, dlg_model-1)][0] if selectdlg_visible else size1 Expression: size2 = cdsize[max(0, dlg_model-1)][1] if selectdlg_visible else size2 Expression: size3 = cdsize[max(0, dlg_model-1)][2] if selectdlg_visible else size3 Expression: lblsize1 = cdsize[max(0, dlg_model-1)][0] is not None if selectdlg_visible else lblsize1 Expression: lblsize2 = cdsize[max(0, dlg_model-1)][1] is not None if selectdlg_visible else lblsize2 Expression: lblsize3 = cdsize[max(0, dlg_model-1)][2] is not None if selectdlg_visible else lblsize3 State: Transition: dialog_selectmodel_ok Expression: type = ctypes[dlg_model] if selectdlg_visible else type Expression: sizes = ctypesizes[ctypes[dlg_model]] if selectdlg_visible else sizes State: selectdlg_visible=False pybik-2.1/data/tests/plugingroups0000664000175000017500000000105012510350677017400 0ustar barccbarcc00000000000000Fields: plugingroup = [0, 1, 2, 3, 4] Conditions: Limits: Initial: State: plugingroup=0 Transition: active_plugin_group_activate 0, 'Challenges' State: plugingroup=0 Transition: active_plugin_group_activate 1, 'Solvers' State: plugingroup=1 Transition: active_plugin_group_activate 2, 'Pretty patterns' State: plugingroup=2 Transition: active_plugin_group_activate 3, 'Library' State: plugingroup=3 Transition: active_plugin_group_activate 4, 'Move transformations' State: plugingroup=4 pybik-2.1/data/tests/min0000664000175000017500000000012512500614265015422 0ustar barccbarcc00000000000000Fields: Conditions: Limits: Initial: State: Transition: action_editbar State: pybik-2.1/data/tests/normalize0000664000175000017500000002160012510350652016636 0ustar barccbarcc00000000000000Fields: edit_text = ['', 'Bb', 'Bd', 'Bf', 'Bl', 'Br', 'Brrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Bu', 'Db', 'Dd', 'Df', 'Dl', 'Dr', 'Drrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Du', 'Fb', 'Fd', 'Ff', 'Fl', 'Fr', 'Frrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Fu', 'Lb', 'Ld', 'Lf', 'Ll', 'Lr', 'Lrrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Lu', 'Rb', 'Rd', 'Rf', 'Rl', 'Rr', 'Rrrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Ru', 'Ub', 'Ud', 'Uf', 'Ul', 'Ur', 'Urrllffrruurrllddllf-rrllffrruurrllddllffb-', 'Uu', 'bB', 'bD', 'bF', 'bL', 'bR', 'bU', 'bbffrrbbuubbffddffr-bbffrrbbuubbffddffrrl-U', 'dB', 'dD', 'dF', 'dL', 'dR', 'dU', 'dduuffddrrdduulluuf-dduuffddrrdduulluuffb-B', 'fB', 'fD', 'fF', 'fL', 'fR', 'fU', 'ffbbllffuuffbbddbbl-ffbbllffuuffbbddbbllr-D', 'lB', 'lD', 'lF', 'lL', 'lR', 'lU', 'rB', 'rD', 'rF', 'rL', 'rR', 'rU', 'rrllddrrffrrllbblld-rrllddrrffrrllbbllddu-R', 'rrlluurrbbrrllffllu-rrlluurrbbrrllfflluud-L', 'uB', 'uD', 'uF', 'uL', 'uR', 'uU', 'uuddffuulluuddrrddf-uuddffuulluuddrrddffb-F'] solved = [False, True] Conditions: solved == (len(edit_text) in [0, 43]) Limits: Initial: active_plugin_group_activate 4, 'Move transformations' State: edit_text='', solved=True edit_text='', solved=True Transition: plugin_activate 'Move transformations', 'Normalize cube rotations' State: edit_text='' State: edit_text='Bb' edit_text='bB' State: edit_text='Bd' edit_text='lB' State: edit_text='Bf' edit_text='fB' State: edit_text='Bl' edit_text='uB' State: edit_text='Br' edit_text='dB' State: edit_text='Brrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='dduuffddrrdduulluuf-dduuffddrrdduulluuffb-B' State: edit_text='Bu' edit_text='rB' State: edit_text='Db' edit_text='rD' State: edit_text='Dd' edit_text='dD' State: edit_text='Df' edit_text='lD' State: edit_text='Dl' edit_text='bD' State: edit_text='Dr' edit_text='fD' State: edit_text='Drrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='ffbbllffuuffbbddbbl-ffbbllffuuffbbddbbllr-D' State: edit_text='Du' edit_text='uD' State: edit_text='Fb' edit_text='bF' State: edit_text='Fd' edit_text='rF' State: edit_text='Ff' edit_text='fF' State: edit_text='Fl' edit_text='dF' State: edit_text='Fr' edit_text='uF' State: edit_text='Frrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='uuddffuulluuddrrddf-uuddffuulluuddrrddffb-F' State: edit_text='Fu' edit_text='lF' State: edit_text='Lb' edit_text='dL' State: edit_text='Ld' edit_text='fL' State: edit_text='Lf' edit_text='uL' State: edit_text='Ll' edit_text='lL' State: edit_text='Lr' edit_text='rL' State: edit_text='Lrrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='rrlluurrbbrrllffllu-rrlluurrbbrrllfflluud-L' State: edit_text='Lu' edit_text='bL' State: edit_text='Rb' edit_text='uR' State: edit_text='Rd' edit_text='bR' State: edit_text='Rf' edit_text='dR' State: edit_text='Rl' edit_text='lR' State: edit_text='Rr' edit_text='rR' State: edit_text='Rrrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='rrllddrrffrrllbblld-rrllddrrffrrllbbllddu-R' State: edit_text='Ru' edit_text='fR' State: edit_text='Ub' edit_text='lU' State: edit_text='Ud' edit_text='dU' State: edit_text='Uf' edit_text='rU' State: edit_text='Ul' edit_text='fU' State: edit_text='Ur' edit_text='bU' State: edit_text='Urrllffrruurrllddllf-rrllffrruurrllddllffb-' edit_text='bbffrrbbuubbffddffr-bbffrrbbuubbffddffrrl-U' State: edit_text='Uu' edit_text='uU' State: edit_text='bB' State: edit_text='bD' State: edit_text='bF' State: edit_text='bL' State: edit_text='bR' State: edit_text='bU' State: edit_text='bbffrrbbuubbffddffr-bbffrrbbuubbffddffrrl-U' State: edit_text='dB' State: edit_text='dD' State: edit_text='dF' State: edit_text='dL' State: edit_text='dR' State: edit_text='dU' State: edit_text='dduuffddrrdduulluuf-dduuffddrrdduulluuffb-B' State: edit_text='fB' State: edit_text='fD' State: edit_text='fF' State: edit_text='fL' State: edit_text='fR' State: edit_text='fU' State: edit_text='ffbbllffuuffbbddbbl-ffbbllffuuffbbddbbllr-D' State: edit_text='lB' State: edit_text='lD' State: edit_text='lF' State: edit_text='lL' State: edit_text='lR' State: edit_text='lU' State: edit_text='rB' State: edit_text='rD' State: edit_text='rF' State: edit_text='rL' State: edit_text='rR' State: edit_text='rU' State: edit_text='rrllddrrffrrllbblld-rrllddrrffrrllbbllddu-R' State: edit_text='rrlluurrbbrrllffllu-rrlluurrbbrrllfflluud-L' State: edit_text='uB' State: edit_text='uD' State: edit_text='uF' State: edit_text='uL' State: edit_text='uR' State: edit_text='uU' State: edit_text='uuddffuulluuddrrddf-uuddffuulluuddrrddffb-F' Transition: button_edit_clear_click Qt.LeftButton State: edit_text='', solved=True Transition: edit_moves_text 'Bb' State: edit_text='Bb', solved=False Transition: edit_moves_text 'Bd' State: edit_text='Bd', solved=False Transition: edit_moves_text 'Bf' State: edit_text='Bf', solved=False Transition: edit_moves_text 'Bl' State: edit_text='Bl', solved=False Transition: edit_moves_text 'Br' State: edit_text='Br', solved=False Transition: edit_moves_text 'Brrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Brrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Bu' State: edit_text='Bu', solved=False Transition: edit_moves_text 'Db' State: edit_text='Db', solved=False Transition: edit_moves_text 'Dd' State: edit_text='Dd', solved=False Transition: edit_moves_text 'Df' State: edit_text='Df', solved=False Transition: edit_moves_text 'Dl' State: edit_text='Dl', solved=False Transition: edit_moves_text 'Dr' State: edit_text='Dr', solved=False Transition: edit_moves_text 'Drrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Drrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Du' State: edit_text='Du', solved=False Transition: edit_moves_text 'Fb' State: edit_text='Fb', solved=False Transition: edit_moves_text 'Fd' State: edit_text='Fd', solved=False Transition: edit_moves_text 'Ff' State: edit_text='Ff', solved=False Transition: edit_moves_text 'Fl' State: edit_text='Fl', solved=False Transition: edit_moves_text 'Fr' State: edit_text='Fr', solved=False Transition: edit_moves_text 'Frrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Frrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Fu' State: edit_text='Fu', solved=False Transition: edit_moves_text 'Lb' State: edit_text='Lb', solved=False Transition: edit_moves_text 'Ld' State: edit_text='Ld', solved=False Transition: edit_moves_text 'Lf' State: edit_text='Lf', solved=False Transition: edit_moves_text 'Ll' State: edit_text='Ll', solved=False Transition: edit_moves_text 'Lr' State: edit_text='Lr', solved=False Transition: edit_moves_text 'Lrrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Lrrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Lu' State: edit_text='Lu', solved=False Transition: edit_moves_text 'Rb' State: edit_text='Rb', solved=False Transition: edit_moves_text 'Rd' State: edit_text='Rd', solved=False Transition: edit_moves_text 'Rf' State: edit_text='Rf', solved=False Transition: edit_moves_text 'Rl' State: edit_text='Rl', solved=False Transition: edit_moves_text 'Rr' State: edit_text='Rr', solved=False Transition: edit_moves_text 'Rrrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Rrrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Ru' State: edit_text='Ru', solved=False Transition: edit_moves_text 'Ub' State: edit_text='Ub', solved=False Transition: edit_moves_text 'Ud' State: edit_text='Ud', solved=False Transition: edit_moves_text 'Uf' State: edit_text='Uf', solved=False Transition: edit_moves_text 'Ul' State: edit_text='Ul', solved=False Transition: edit_moves_text 'Ur' State: edit_text='Ur', solved=False Transition: edit_moves_text 'Urrllffrruurrllddllf-rrllffrruurrllddllffb-' State: edit_text='Urrllffrruurrllddllf-rrllffrruurrllddllffb-', solved=True Transition: edit_moves_text 'Uu' State: edit_text='Uu', solved=False pybik-2.1/data/tests/preferences0000664000175000017500000000065112463156300017143 0ustar barccbarcc00000000000000Fields: preferencesdlg_exists = [True] preferencesdlg_visible = [False, True] Conditions: Limits: Initial: dialog_preferences State: preferencesdlg_exists=False, preferencesdlg_visible=False preferencesdlg_exists=True, preferencesdlg_visible=True Transition: action_preferences State: preferencesdlg_visible=True Transition: dialog_preferences_close State: preferencesdlg_visible=False pybik-2.1/data/applications/0000775000175000017500000000000012556245305016250 5ustar barccbarcc00000000000000pybik-2.1/data/applications/pybik.desktop0000664000175000017500000000506112556245305020763 0ustar barccbarcc00000000000000[Desktop Entry] Name=Pybik Name[ast]=Pybik Name[az]=Pybik Name[bg]=Рубик Name[bn]=Pybik Name[bs]=Pybik Name[cs]=Pybik Name[de]=Pybik Name[el]=Pybik Name[en_GB]=Pybik Name[es]=Pybik Name[fi]=Pybik Name[fr]=Pybik Name[gl]=Pybik Name[he]=Pybik Name[id]=Pybik Name[it]=Pybik Name[ja]=Pybik Name[km]=Pybik Name[ky]=Pybik Name[lo]=Pybik Name[ms]=Pybik Name[pl]=Pybik Name[pt_BR]=Pybik Name[ru]=Pybik Name[sr]=Питонова коцка Name[te]=పైబిక్ Name[tr]=Pybik Name[uk]=Pybik Name[uz]=Pybik Name[zh_CN]=Pybik Name[zh_TW]=Pybik Comment=Rubik's cube game Comment[az]=Rubik'in kub oyunu Comment[de]=Rubiks Zauberwürfelspiel Comment[en_GB]=Rubik's cube game Comment[es]=Juego del cubo Rubik´s Comment[fi]=Rubiikin kuutio -peli Comment[fr]=Rubik’s cube Comment[gl]=Xogo do cubo de Rubik Comment[he]=משחק הקובייה ההונגרית Comment[it]=Gioco del cubo di Rubik Comment[lo]=ເກມລູກບາດຂອງ Rubik Comment[ms]=Permainan kiub Rubik Comment[ru]=Кубик Рубика Comment[uk]=Гра з кубиком Рубіка Comment[uz]=Rubik'ning kubik o‘yini TryExec=pybik Exec=pybik Icon=pybik Type=Application Categories=Game;LogicGame; # Add whatever keywords you want in your language, separated by semicolons, last character must be a semicolon. These keywords are used when searching for applications in Unity, GNOME Shell, etc. Keywords=rubik;cube;puzzle;magic; Keywords[ast]=rubik;cubu;rompecabeces;máxicu; Keywords[bg]=Рубик;куб;пъзел;магия; Keywords[bs]=rubik;kocka;puzzle;slagalica;zagonetka; Keywords[cs]=rubik;kostka;hlavolam;kouzelný; Keywords[de]=rubik;cube;würfel;puzzle;zauberwürfel; Keywords[el]=ρούμπικ;ρουμπικ;κύβος;κυβος;γρίφος;γριφος;kybos;kivos;kyvos;kubos;kuvos;grifos; Keywords[en_GB]=rubik;cube;puzzle;magic; Keywords[es]=rubik;cubo;rompecabezas;mágico; Keywords[fi]=rubik;cube;puzzle;magic;rubikin;kuutio;pulma; Keywords[fr]=rubik;cube;casse-tête;magique;jeu;énigme; Keywords[gl]=rubik;cubo;crebacabezas;máxico; Keywords[he]=הונגרית;רוביק;תצרף;פאזל;פזל;קסם;טריק; Keywords[it]=rubik;cubo;rompicapo;magico; Keywords[ms]=rubik;kuib;teka-teki;magik; Keywords[pl]=rubik;kostka;puzzle;łamigłówka;magiczna; Keywords[ru]=Рубик;кубик;головоломка;магия; Keywords[uk]=rubik;cube;puzzle;magic;рубік;кубик;головоломка;загадка;гра; Keywords[uz]=rubik;kubik;boshqotirma;sehrli; Keywords[zh_TW]=rubik;cube;puzzle;magic;魔術;方塊;立方體;拼圖; StartupNotify=true X-Ubuntu-Gettext-Domain=pybik pybik-2.1/data/ui/0000775000175000017500000000000012556245305014177 5ustar barccbarcc00000000000000pybik-2.1/data/ui/qt/0000775000175000017500000000000012556245305014623 5ustar barccbarcc00000000000000pybik-2.1/data/ui/qt/about.ui0000664000175000017500000001713112472146700016273 0ustar barccbarcc00000000000000 AboutDialog Qt::ApplicationModal About Pybik icon Qt::AlignCenter 1 0 16 75 true appname Qt::PlainText Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 1 0 version Qt::PlainText description Qt::PlainText Qt::AlignCenter true 0 About copyright Qt::PlainText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter website Qt::RichText true Translators: Qt::PlainText false Feedback Qt::RichText Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop true true Translate Qt::RichText true true License true false false QTextEdit::NoWrap false true QDialogButtonBox::Close buttonBox accepted() AboutDialog accept() 248 254 157 274 buttonBox rejected() AboutDialog reject() 316 260 286 274 pybik-2.1/data/ui/qt/main.ui0000664000175000017500000002506112505452070016103 0ustar barccbarcc00000000000000 MainWindow Pybik 6 0 0 0 0 0 0 0 Qt::LeftToRight QFrame::StyledPanel QFrame::Raised 0 0 0 0 0 0 0 Qt::NoFocus true Qt::NoFocus true Qt::Horizontal 0 0 0 Qt::PlainText 0 0 0 0 0 &Game &Edit &View &Help Pybik Toolbar Qt::LeftToRight TopToolBarArea false &New Random Ctrl+N Ne&w Solved Ctrl+Shift+N &Quit Ctrl+Q &Select Puzzle … &Set as Initial State &Reset Rotation &Preferences … true true &Toolbar true true &Status Bar &Info … Rewind Go to the previous mark (or the beginning) of the sequence of moves Previous Make one step backwards Stop Stop Play Run forward through the sequence of moves Next Make one step forwards Forward Go to the next mark (or the end) of the sequence of moves Add Mark Mark the current place in the sequence of moves Remove Mark Remove the mark at the current place in the sequence of moves true true &Edit Bar &Help … F1 Help Help pybik-2.1/data/ui/qt/mousemode-quad.png0000664000175000017500000000316212130247775020261 0ustar barccbarcc00000000000000PNG  IHDRL\sRGB pHYs  tIME5ͯ[IDATx휱rLY4wIؙN0qFK_:TZ8J s$·= {B4M0ࢂ6Dee8<۶APUU gx||,9=}߶m]u]m{&7t1YnA,KQYv W28ܶm۶8wKC[R,3WnI|+7w'9Wb8H$I(aX䝆+RqV5TUUUu4Z-qNCbX.TUVF1N%RJ)9EQFQݖeBenF#EQsL3!RvPJzNWKzJX$UUِJe"L$R>,.]LrcAF:6!f3:"t1y8lEFc}gǦp_NngFk6^oٜN'?eNf0nw:sonWӴZtx DialogHelp 0 0 380 500 200 200 Help 2 2 2 2 false false pybik-2.1/data/ui/qt/mousemode-ext.png0000664000175000017500000000400012130247775020117 0ustar barccbarcc00000000000000PNG  IHDRL\sRGB pHYs  tIME4 :IDATx]=OLOUL*ZX4.eR]G\'8z"HTEOcLA| )NW{zL <<;;㙱$|dG6 H Bl D$IR) _V+˲~߷,kZE>7z\ nt!@5bl6$ɶmUU !)Ye#BzVCCIضy^)Ye$b2|@THc1MSQuME1M3dsE pj CM4MVq&S=8Օh@n FWWWRJ)dH|*BeUUa&Ȳ,2!nCUU/@5Qk fs-RSJwwwz@"apP[!uJ)|S8P=\zxI6@,kvqqɸ7mlG0hm;!-"a]BӓUEh8Η/_(4 Kq7\*yYr???2FDZ5Lz늢t:tZbFd'(zכL&e5Vzڶ =SUh<==mÍF2EpTPJ~J)ϻGmf3@ 4;Rzqq cv(ee{ʸBH~ ߄GPyvz]UխG:B8a| 1.K)@? !mxXx*RsU"[1- q@΂ H A|XB@' $n4Vv ̍#H8F,]G #oM㜝/˲^\\.a8ix<~xxv;;;nuݲq&Cez~Niȁ(r zLj-l۷f{E xppp||Wu曋a( d?? hV oNINg<뺮x DialogPreferences Preferences 0 Graphic Animation Speed: 1 100 Qt::Horizontal QSlider::TicksBelow 0 Mirror Distance: 0 0 0.100000000000000 Qt::Horizontal Quality: Lower antialiasing has better performance, higher antialiasing has better quality. Antialiasing: The program needs to be restarted for the changes to take effect. Qt::RichText true Qt::Vertical 20 108 Mouse 96 96 1 0 Four directions 96 96 1 0 Simplified, right button inverts move true Keys true Qt::Horizontal 40 20 Add Add Qt::ToolButtonIconOnly Remove Remove Qt::ToolButtonIconOnly Reset Reset Qt::ToolButtonIconOnly Appearance 0 0 Qt::ScrollBarAlwaysOff QAbstractItemView::NoEditTriggers Qt::ElideNone true Color: 0 0 Color Image File: 0 0 32 32 0 0 Tiled 0 0 Mosaic Background: 0 0 Color Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() DialogPreferences accept() 248 254 157 274 buttonBox rejected() DialogPreferences reject() 316 260 286 274 pybik-2.1/data/ui/qt/model.ui0000664000175000017500000000701012524301060016242 0ustar barccbarcc00000000000000 DialogSelectModel Qt::NonModal Select Puzzle 1 0 1 10 size1: size2: 1 0 1 10 size3: 1 0 1 10 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() DialogSelectModel accept() 248 254 157 274 buttonBox rejected() DialogSelectModel reject() 316 260 286 274 pybik-2.1/data/ui/cursors/0000775000175000017500000000000012556245305015677 5ustar barccbarcc00000000000000pybik-2.1/data/ui/cursors/mouse_ccw.png0000664000175000017500000000037012130247775020372 0ustar barccbarcc00000000000000PNG  IHDRabKGD pHYs  tIMET^IDAT8˭S10 v2;q@0 Tf #*]hEd"E3WV=vU2En3ȴ.72sz%wP"Ӕ͎RΟx-|} +sSFIENDB`pybik-2.1/data/ui/cursors/mouse_2.png0000664000175000017500000000250412130247775017760 0ustar barccbarcc00000000000000PNG  IHDR(-SPLTELLLiii۶mmmIII$$$AAA666,,,!!! kkkVVV@@@+++¡aaaAAA  ZZZKKK<<<---fffLLL333xxxTTT///̨___:::jjjEEEuuuPPP[[[eeȩ^^^:::ώtttOOOҮeeeßzzzߺqqqMMM(((uuuQQQ,,,zzzUUU111~~~ZZZ555^^^999===ײiiiEEEӮeeeΪʥš|||XXX333԰gggBBBvvvQQQ```ppp~~~Ыbbb>>>Š|||WWW޺qqqӯɤ⽽tttPPP+++Ȥ[[[666Ьccc>>>nnnIII%%%ɥ\\\777```<<<ԯfffBBBkkkFFF"""xxxSSS///ֲiiiDDDȣZZZ666ݹpppKKKvvvWWW:qtRNS|;IDATAoIENDB`pybik-2.1/data/ui/cursors/mouse_0.png0000664000175000017500000000250412130247775017756 0ustar barccbarcc00000000000000PNG  IHDR(-SPLTELLLiii۶mmmIII$$$AAA666,,,!!! kkkVVV@@@+++¡aaaAAA  ZZZKKK<<<---fffLLL333xxxTTT///̨___:::jjjEEEuuuPPP[[[eeȩ^^^:::ώtttOOOҮeeeßzzzߺqqqMMM(((uuuQQQ,,,zzzUUU111~~~ZZZ555^^^999===ײiiiEEEӮeeeΪʥš|||XXX333԰gggBBBvvvQQQ```ppp~~~Ыbbb>>>Š|||WWW޺qqqӯɤ⽽tttPPP+++Ȥ[[[666Ьccc>>>nnnIII%%%ɥ\\\777```<<<ԯfffBBBkkkFFF"""xxxSSS///ֲiiiDDDȣZZZ666ݹpppKKKvvvWWW:qtRNS|;IDATO OkIENDB`pybik-2.1/data/ui/cursors/mouse_1.png0000664000175000017500000000250412130247775017757 0ustar barccbarcc00000000000000PNG  IHDR(-SPLTELLLiii۶mmmIII$$$AAA666,,,!!! kkkVVV@@@+++¡aaaAAA  ZZZKKK<<<---fffLLL333xxxTTT///̨___:::jjjEEEuuuPPP[[[eeȩ^^^:::ώtttOOOҮeeeßzzzߺqqqMMM(((uuuQQQ,,,zzzUUU111~~~ZZZ555^^^999===ײiiiEEEӮeeeΪʥš|||XXX333԰gggBBBvvvQQQ```ppp~~~Ыbbb>>>Š|||WWW޺qqqӯɤ⽽tttPPP+++Ȥ[[[666Ьccc>>>nnnIII%%%ɥ\\\777```<<<ԯfffBBBkkkFFF"""xxxSSS///ֲiiiDDDȣZZZ666ݹpppKKKvvvWWW:qtRNS|;IDAT%IENDB`pybik-2.1/data/ui/images/0000775000175000017500000000000012556245305015444 5ustar barccbarcc00000000000000pybik-2.1/data/ui/images/SHAMROCK.png0000664000175000017500000001101012552273312017345 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>JIDATxyՙh@FEJB18 B$6j\3 $y1j܈(ɨAf*B*@Cwh֩:w~S|_gp8p8p8p8Ñ?I 0 zҍS6}JJYzR.;9LÚX|NwXLSF;ΥK;_ؔp }{7P~ӨZznD +YV{!Xܥ#]G1 ~^:(_OB{TӍ?Fͣ{`e ]LʥPdUHY/^,]5@oH2U"6eՓdvS?9Tr+]AM1s?E|}vߕ|fH+x| k| U12TFHW*IzwZNPfr!|+j)4|۴#|^S8(0t(-!0ZZ IyGTHj$-"\nL\aKK&) 0^Z@$.L2n}ؚYg%+e ? p gH HBw"󩛄8ŷ>9YZ@IH~48YZ@IHEKZ@IH}lRi IB$s'9O8 (-@CA%d' _ZBړ[hP#- $$@u_FQZ@IH_6H " FX.- 2.𾴀,D2=ici A$##-!J & mi p `ץDb`ݺ'&n:&-!\v'i %-@$LD$@RnP\]ӎ I򒴄P<#- 8O|u; եFr6i ȥg']UЪX^Y(Xr'o͓fGC1x٫Փax>5IUS(&j/["C9x8¹RHLx=$]% 񐷵7")Q\l| 6N* >EphhI[jyǙk  >u}b;A Jhk" pێV^=IhK7c *ʥ]v;LiwL-vEb Ҏ:Fe9MIX)b ZR&#Z },07KP+?>9Zw-|6:8XiM\Zi(Ccigla?Ka8g2JPIOJ ;vvլf3MּŸ<>[[S0RI%HGkS6T['qS!^_=w8 3'YKk wH]7\MQdx"NFsO^C^f3ȕy"9vWј1% 3gjxNghȩV%Ո1:6̀^\ǫC<ɉV_-&]}&yA 'H]÷MeANnMw8UCi"~cŏb^Evtd #}&+}!&9Dbvժ_CgOG [!*)R׭@2-g*ԫP):B}94J,)PqG[Y|ObC✙",;Q!rߪXb]J*f$X'{=b7;gM,f2C)>K \Sl^).v~)D܇%Ͼ ^1ӞB;çΩ勞&ﱌ@b>ŽRJ kh:T=vүݶ~fhq~fsmsK/nӁxڣ+:YkoJ{b_2i+-0sO]Ơ=1r  Pg qSKu؞{zѓ6^H-h[2x#dž9QAPbq&lZ@+q]\rDZok3=Bil6?Jee>մ4TsTm&F_tv{aq:6^f= \T-j2+fMW302 dlv^q.~< }&kT~e'lab3x9AeV똱՛R\5qNOb}JnQ1Cg=:r=WA6,kcr|Bj&HMJwfW2gMڶU[MߞB: ,ޮfNDo>Z o{B:m霓Ǽu[>JqO2mꟂSSF[Hr0zig2x\[VU7M|nF57" \+ ?['@icCiosaNt(](mEکvLs eb'Czr@ڱ6ОOŭ֤ ٨7q2OBZm暌=_^^z++)9y|pTP%a],fbZ;HpC{,V7"Rmynnl_I,gfrh-lY7>teҖȥM}к&@o3zy<:PN3)@7V 3s.ߊ׻Vj-4v`Fb!0x342MZ%x}ҺDNvo )ndf/4%pvn_(5LS?{m ?T?VlDuPfvx.X&c<ætHPJMajM|}L5Q bR1GdB[18dpO1Z#bI"b1wpn}h?ʽV]Fz 2߷BSjԜE̲k8V:Nkba C'lzn7>hgCr+NCcEV@qulru=r~oliڙ<{ґ{gfŪZ-cuXk7L5k60vƈl f<@6{5nCxcPch,: pyiC߶zyxl53+B,4JӤ^X8zclkrE 2~4 &Xs kDy%$d7xɹ`҃SO-[cYUq:ƪ- \0TЉԳjֳ"Tvp~hiސk_HrąW'-y`0u J_ߓ%Ia%՞. e9aҲd)[(^ eRH pHrCƗZaozҲ)[5Α切A> K s}?6^g,y `Y>7b}.z]֜^)?([ >}~_戃"672/-o9L6'JKsā LD0wvqO,-a$tii8;iiTZ+l8/|[9sry-)=ϩYf&-a?*. /Hsئs.f+ ۳_ p8p8p8p8p85ɧUN%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-2.1/data/ui/images/squares.png0000664000175000017500000000022512552272144017631 0ustar barccbarcc00000000000000PNG  IHDR@@PLTEgtRNS@fbKGDH pHYs  IDAT(c c8  13?IENDB`pybik-2.1/data/ui/images/ATOM SYMBOL.png0000664000175000017500000002142412552273312017676 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>"VIDATxy|IHN8RD$ `QZģjRJ*xkmb/Dԟ-*QA@9D9?k~E;3<1bĈ#F1bĈ#F1bĈ#F?ZdD@DhIO)g{XGT h`f)D=@GPbb-Za=P񓩄I4Za7x崕Q+# O7(Z0b_3#8)"q&U0,bCh !!5MuqbxCXoQo1@ȧMhGK!,bp&t/r lq|Rj Ì$rQ7|hiHpədQ9SM`~Wƀ.r R%4 ]R('Q;FKb?KR1jp0O)NgTpxE.ޗ)ufG][I8Qiq_ߑjI&+׌D]5Kюqp~01_R,&WE[Vؖ1*ʷ3ծeНQ1dq.;6|N&گoX&aCɾ*?-iyL.vWWcAG&mPL'KVn:ё\Znp'7)ys 塚,qk&3aMr7w1tiՐ"\hw%ڼ7d:c+mJ.l GP+J2qy)mOVŤ;_ņ;mo3]8[J߈Ըyȳ!SNp2q̾Ld/a2&u=rVco"Z?ZQb"SILJ.L rP`P OY(Rjrt,_0oa- :3C*C^`Q*gB Q*VMWB0*aOx g}k:y_{~ȳ\_oU_ h.T6WgI 1l$O.ОUEH#YypbXGOd2uU~̕X<TZw[t4V1J+.8dyM: :|RiK,:@PG0VFi;$^GNPL'TYXt$0 w~M]$/&ti2U2+'HLݲBy֛1S3|>o@ɧD*i)w;_Ty\Ep2 c;ٹ9ђ!1gSlQ,S *fl޷ȠV~9}t;BݐMdzZOc:5LI(p&eů=i3zH&'䍲iк4xxKVCgoj:8- yDP@%u!r5^B~E,S*m1E7 AϯC)IQT.j8nPY>uA=E &`g]{ӽdҐ; ;'T௖Vw6@):R' J5P^_YȮ 0ɐ#΂5`0n lK8JqS}9LzG]H3kghgjzƵr_!M$'ʽ< Or90XM-[4r[{gCnϚ,TO͓؍7#h"Tso˚گAXe41mKp?Lz6ϥӊ^7TqJ@0\m x%,nyWK?(U'8 Ktf\d)-#(r+M^: U?3:[(zKs+#Mz~:bݴ܁XNLǡkAs &|X6Kݾ #@sFbʱiDgdD K O'kkAEi` \]WV8Zpo/?Wxu~DZb旭 H:~NSC.ɼG-ǿcڵpp:˗f/Ϻ ggtCy)}qjN-623P=N;@\H-d<pE]]>W]-sn#GNԤ6Rvhj"q t U?h] -s/՜VCXix[f6"`oQЊ$809~ݻʗgN[a\%™FǍD̀z)D䃗>:+-kW_ua8D2"ّ9*Z]=su4JҔ:U`(Q~Ѣ+5RyE^7 {*@opC Jo oL-|yeb;!Q1\Wˮ% EP%}zxvdpBgBcdķ 6 1vǵW n5~,?%fK]?&6)S{4Gȩڵp6Tf2۹$tr=_MfҪҳe떣!R`UG yz5yBx8Dc=\z<"!< ;qk:.BzΖr$tH1$B54((V җna&*FEtCdG]$>?)찙;)Ŭ@K̳K!>$ä%O2bdrGty b|O?B %f0 xäq $w#_xXsa0l/G]TOL3#JF)C̻ok^ͨD =AAxBIB=O3"º Q;B}KH?p1)pd&~N{5BX x;>xpu񹏫S]q+(x:ϔ:ΰr|O t `e`5 q1x0qMKƏiZ|d;XŤ:ILREr$eV<.6ia.>%RT(|I UDFM4 S U<qR=lB*ԭVzFKɥ"VH]2Ip̅.|-2t]*eeKUK%T-Erko n-\?l*H I,^R?D߅qBqtlb%1W7eK}!rٿYBw'}K5iS.~ڧ37WI(vWkR.~NMLFh.h#ȳ< 5)g:Y2݊_ o q\.yfe;TP(˄LBim4)vM.A-\>d,gh; 6 TL@$&<&Hg0VZ' خTZ 3ESjn3\nF[t&0kL{@]e! bE'`), *wG/$f' ^D# @'Z4 q䄞`C}Vj{:^mA[i3,:JE7CH3 |kf12M"mJ}>*ټ.5 p_+=[ 3$wʄƽ&f( hlTXE# ӹN1P>gJ{ci9QX'XGMh$ݓˬpi\Dӫ)&Ӑ_v2& >7l8SY):?Ɠɓ12wU^ u-ޝn *CIY<.s9c} 3C ErUo1.GBs"}.$&ΚTKi:xSI6˙ LQe2NE$L[J\ɴG ֊;- |T2SFdD+$۲<%/Pm : 0bc'K-zZK6s#vTN8cU7%W9|E'+Xtr?ȩ#xMM<{( 3%v~i3ll&K58t<}*zwn|~2U1.1Җ623-MXFLiadL 9'Գk9?gzCa;@&Xm>e:3ޡtx123=˲xٶ+&H-jŒR 8)4%uJ 9ed]ޘt ]FהJ:s2r53sS7|jVl‫s8Ǹǥ Xa ?rH nvSA r!O>9ԵMm=2>G[~ pMZ`Vr*h@Ђ|iš =bi&tJVC# ucJpHN?["%̴UVwVfpթua8b; u+fvʽUpak9 Oi'ՉJba6~2Eoz+$,TvrhNzs/kAֲլs>BF{q(JK}HJB+#t =MW,c9XJJzg9t":RHӔ\r&JrRNզgopYuЪx\xR%!2%O 7:KGԇR&ȫJ';_ +qCb)wJi>i. \bqsrEa+(,HiV$k\ &kM&KZtX4YO}l -Q1ol݊)6TsE'hÝ6 V* L#TlL;6oqcYg{?tp XPB.hQt8%’ -.\O# Q'w r&}DZQ%?.#l1|0 LOcAdrMTiF|pB>UࡘDž2Y4H&lԤ*qCqZѝI~B Q^5+#jbĈ#F1bĈ#F1bĈ#F1bĈ#?IDATxyŵAE ƀyOƮ(.5.?]p>1nA2n("QMT@e?dfUCRԩTw:)))))))))))))))))))))))))))))))))<xO%rٴlwfͥ#iE+ZӒu+(SL1%G~;NW+e.fwSЄ^!nƇ̠wsMhH/R|1=ӂ< 2J)9њF]_lΦol4//{o[ʙ#,;ne_ߎDw^b2}|;PSe&gȷrF^qa*s6 wa-F( C{י+ 8ܜѓww2\P齳*`N2ybn[VsQ0Nw|;;is e;] V]|LWߎO#X3ىwEkF?/T%|ְJxf4ؙΞ 9O+ 0G+t2PQ_2xk=]ʾzxGCn4.s44\bo'q3-NH߳=-%i\3w3iXޖa>L@/6MS5G38/R<{tbvb#s?sO`kރ,?O|Nag1>OG(ЏC"h{o6s`u&"(E߾|7=;ݽFdWߞ q`"7&|xxgW73#8vUѺr/.ʥBĿe~dZLωnx]QF_ O, "7FEM"! WP&ut!¡i#;/s7R=BQ5ƀ4Η}x?gFǔ,gViP`r8Jz 9wvI|rI0kEm20@T*YpJ"$rkT'$>! @(9^8Vri}t}.J 7ɂ%w},2yrb{_j ʖXuG*pd.*ް pJ'-cբ(  sfuGD)@ LLՀgF&t1}D o$0o~OC쾠o3N}#e,,g4ZەoSl/2ve";j<'E 񫤿4(zoOmδk3{DsAALٟ!EBWQ ژQ[SuCɌ 4dF!r^KߞyzM^Ts{ lZJ~<Md挠$'$i#X7q i{&',* f @59;1)(iQo5_ 9Y;!}51uӶ"8`rʭ/H$BRAO{I$?gTO00Tz>CfV::cO+sʻ5oQ}j~1@Z^;2QqI16oVU:5Tv6uOk+ͻ:~ QpbS%Cy.nb0_)k -lf^5=حWDz1/1>* 9.T4/ %>ܧqwD6詎wxdݓ;ė}s5j]4* ]5ޑ315i<ɟ4jq6tp^5?)3<ӀgldȊ7|'=&_lz>X{Q1sgƼ-ք'މ%_?c0{f@OXYIaeJ@'6cFe! .5XZ1_,6R5v$U+_Rwg] EePeYoJ{\LyS8Suepa?)iܦm)aZPh}3@ie6_IR[Oʑ0ڏW8FZ:LBwB-SwK, qվru-Vv+衹&imG .azcr,IXɛWX[/^eCsǝ!UhzQ.|/Hc q~$79ZmZ^No-M*8-֋oO%8ˋ **JFd8V|)1 Fth_gh2S{j qϾG@5O_YY'J@&Cu,>,~o1'|>5珝7uL~7M7'Cekn %)7s`F,k': :~~:jn3 MD*D{Ϗ¥ۖE͌Pp6FZPVrC]66#Hp9IøY<^<љ7&k=e, tem-/:c"И"zi =2DxVSGhΫrNeYc ލq^ѼSgՠy `W樈4 51>pK2?{~@Id<>#44[JïN`udLd1)Z*h*p%D?פ]CkdpJ~єmDo9e*-XãК/Z: Q'| /, m(3ۼ뉟mR-\?[w ~ =[ְr_bK`-Z [_h[眻c;"{D;`cy޲]$?8+;&ak蝽* bd[-M+8()aŝ6^绳p(Upb\1amk%UZwP#c %s ajY' +9VtatAk C qM4( BpX94c$EF[xNҖw:.F&0TkkYXbBM3' Wb$v_ kHŢ*ș32<#ћ_N'C+U|XL&Iν̵bo2+ 4q?O3u8X,f1b)fգL7ѝ^֦aJw8*V:3?-ZҒFGGq>ĥw}Mgw\ʛLa |7=>A[ؓ9i`i6iLc }7I[h>;FyYe6sWfhHQitbwv hEkZєQ@#`luR JYbJ(OIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIóF1̂%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-2.1/data/ui/images/BEAMED EIGHTH NOTES.png0000664000175000017500000000464612552273312020676 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>IDATx}lUww>P Q22EpA48'&&:=C&#HdnmhȲIp1*vs:GKτy&(zgLx{$)^< ` ';0~3a_) oe@JR>gLP:S>dLP6J, u&(kτ.[ā3w _p~q%τvgBu"nƨ3j!,ƠYTsQjo3K"B"sP  Y@,q4S@7?"X̢H"F2"P@@LI_aD $@+ƨbI#ZD˙f:%"(2d"KDjYJ"KOu"]Z)PcLJW­( FTNJ]XF^؝:%"sR6@|HWv\7yulHV~08"X90>y Rr~. p /_J())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))M+I .8 jiVnqĿc?m?}9/R&Zyu ǽoZ iGCWiVVZ^CW*tUd_›rc[S|Hi@ձ)W7R~iy;Wv=oȬlȬFۯ2;fۯ2vWn0 X$}lc8E:әr3|x3ZLfLW̱ib@=:̴aJek0^5/*Z42NEh9Xkne{Ū^>I/]gw{)[8Qu'kb]K_uc|UAe~0]5 Ob@zf3fa|0p5V:9S+~ 0fa6z x8̙d>˛t5}<?fkk'LAzXWwllc|)I/֚ǟt)J/S \0ZzqWL0fSTQh?M&8ɧxd%NUV?9"yRf M5򃴛YC^ VV9l j L}Tϻs83VY>=`6ϴ0N.wvrX^~iOC2w}y,IDATxy|! JAvBQUȢ%`bER(~PL BVяTmŊlDe3 {^余{潙{fޜ͛{Ιfr.          >.`-r#FX@&stJ?]I^(~qKt*Ѝ[6Lo@&kތ|_XvQ3+yX@J|gsAe[Vw>>qЇ102| 2-sHqnjK.<~H0 d[X9nz Q!يLW+j%Z)2[q~ ^FwJKE6p up6 ;3+^;=@|sx'hR|4#@+nN_*{-/9},jKEq*Wd0یrnRSIRX3E/C2pK$q⸧[|x}Z-@kTX[ e^>U1a pK _[j1%zmXNnܤpHiǹ%ZM {}刕(Dn+[IJ#i}R70Sirt?Vǭ?ik67cE~EFo=i k Pއ![/؍2ҋ~>0G1/>ZN}RRxa;L QRRp'_O$^!]uG;q+pdBRxNz\L. _,$\o I0{-}Cm"5NDUq!MfJ;)m@s9 bu =Sd0\\@2y6,gH2[!``9#Ұ*1S_ ^ppX@YkCvGG/KdҗR < j63@+FSPd @φ:0R~#z!W[iJ?E%j\h[&3jns{1(0'׶4cw~ U.Hś4p2LV+C\ـ [`rTn{ V0Ɯ!Ʉ֍ƟM2,{ =Zl$EqLrq1IllbLyI.D~m\;is^),UOr~i?c _q1 !];imj8?ԘG${nw~#U5ɸ3&?x ڑbmrD't@mi9$.؇4nC[9X822z G[->#8(D>b/8Rl%?8s݃ dW'ȿźgpu?3\:t?wpuWV`X7z!nN#Qf= ?2F-)xJl 'ĜJ !RqNPC!PR㧟G_SQ]Ҿ0mR-PotWQ9pRܤ..Q7X9 9Ƈj WW>SHD<$lPY`ehVr?ҮK cEϸlh 49$s#wY̶ +8%Һ#+bEXtvb lN|zÙ;=dpj+MC/Lk"8@8G H #p$@8G H #p$@8'xhoy4[n+8*$֫>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-2.1/data/ui/images/YIN YANG.png0000664000175000017500000001256012552273312017327 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>IDATxyTŵ (" `H@5DDP|*桂Fܒ-&OM1ѧ]&=+ DǨȦ 38 0cP.]}۷wkSuNߥ9`X,bX,bX,bX,by [)$Оn3iG;ӖBRATPf6Q.XRB %lb+Yr~-0.b. s"EYûe.Iw?iA9 bR6{RfOMeHA  7Wjx1 /"L6=b"sD#2QIT 5};'Ж=B7:z<'CN8ihլb5Yfh1FJK_qdsC/;oaڵ8aʫlW%|%4lIlP일Tr=7v)9&&['J!Yr?Hvp)8&8CƱ&.J{)`eV[IKc(;S8"NV3%y j10 KeDec+bJI`SYp*#Zg$qw#b(T' ~aU?l㾄=j`/EF&BOMxٿ LgL`U1 F y`hGX.5Փ`>9HZ9m Nl޴/LZb\ٝ}id8&/DnLsraS%;KZ5\ȶN % N[YtV8y% ,rp$+|/WI+Lj>]_CiB}]`KfQ3rUO@gJf >$u*f|\;OX%Ҋa2oU̟S129+5>;Vpbz٧+.V$h .pb3|KD>.h-Vĸzq*V\ӱV+LCZ̸y <^ZIBZjc7?Cڮl(&OGޡZYi>etV+=#O'T*" ޛ}b_6 3<<==k&(I+e\JiyeRY->DJ1>J+< V*9,(=]Z|[JG|~iAisGJzI+dgT#$pOqJŀ@/u&'/Jń=#;;zs=J ibw3IĖx~j"Th V!%R8$Jqe_3gKH?V*RY` =\ZϳL|JpGV*jǿ)*ŘB>p @\bg0<$8RFKq$)> E졊*ֱK0f3\$)UgyBLci9M- OT#A'Oſ( O#YonuK%q]ZU|Tx,Qc0jsSU vwy&DCSLC`8S2{>cM+]^*1EЯB&,\ޔ 28l!QZ.孜 =?63'nof7~pȔp ye &-z?5}g'~cZH|uUxIwn >:7Z8&']v #5gplV5!m!q0}3\ߘJB< Q&[xJ<-q}Șf<:9y+?5I4뫀; 4 >jCu@2= ͨpl@f7k[>7<"m'LstYg?3Mݞ7tbUNi!by&]'9%v\ha_ Os 񸣟kgP||KҶ29~pgHqҶ2y r}x[M&5YxOG/JP|OѫMSRcdh2t*]"7\J[ǹ-Szjd߁u4=$cU v}^J5ph֭ *hσ 6ڙ+}ڱ~9>{r Oj3ѿ=W@Op aFeTŮxaQ=PP _b.VA3[\z`P(~2iɸGvm$ J)h6@"Wz\fIbzUDuJ9{8`g{iEW;+Q6` Ot` izd7Orc[w&2P/ dM{xt4Zs(Qc?w'/e0ϐ)^Vv pԋl>ST#%OI\VWM}F itfj8TjSS6uPRhJ|8H pJ|IM#4i;QN[_Vz8j5k_k@-2rki5@E 'V y; ܗทURq] [cguT>+M:JvSqL;?xNPRk CiԢmd& VSq:I</tYt9hN~`hl^ wVrn7Y|lҮ=E:RMr3\^vEҷPrf HOӺs[YfjPMM/C\º3[9P@6+O{HZOӰ4vhߦqXJk lw8~Wwvqg2n Z*u3^Gf:K 2ỳ@yϚS\i(9xOC%( iiEaӉ^LWZS0;?]m2X V|庭ӜZC^w}g2TQf~1Z'#%ڂ\dF$R=:azwӇL[FyO^\Zt9Xz(0KK_+~/[rj^ n\L@46FUy>#`:(3;)vi07AoeF`toʑ 0تyɦ8]\[t^.E1/}ItC-H87_jdg83i*;忁sQ DTWk AB -=<&Iqi`tCHm~cJQxl'":'0.ij%6 L,ޤ: ӽsƉ4hLHJ tn'!Qeeᔔoa¨TDވ< dOJ]e^M& [Wc6ࣾ_AaҌ& [;&ܮT7msX7Hsu3,7rk@2Շ:_22_[ZrҝQfgBJPA7Ҭ2,L3R86[dC4uҝ$% l6{3݇gM[vb7e<huL/ S԰;* >Yzi۳r^5(l[ 23DG<\0d Y*ֱdq9I/34_Z.å*biEGzE6V!%߃dRgR*n1E)'Q.EuL̟|^fzB5ߒyKVjmQa3/tf% &=9M$: )5͒RPi<bIwđl[h-2t='ܒAb9wkJ udI^cν*N\Z^w2^xͺqfݝwS'>SÑklargF1Vni2< F*|[pZ?}I2X3<[G)?0mf,-62$ʘ#it@rJF1)k4QùJ[[cĥl&q fєu6N8[=YK_|%E %}\P!7K!֊l6Mh)H0!G zew^tg1—ax:\v)ѓ Gp`GK!nRɤ!(x ky 0[XMIl61MOVpfye2U\(Po0&s+M\>a5~qo2}YYϴ '3 8rײLܼe7R`J%Paь<ҕyѹ#Or_3iٽy. g8r\6Iw=sН f0 %|.U}^petݬe+XJ5Nҍt:Ўvь"QH-a?5TQATPfH[,bX,bX,bX,bX,ŢّC%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-2.1/data/ui/images/WHITE SMILING FACE.png0000664000175000017500000001362212552273312020573 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>IDATxy|WŵYY$AUQK"ZDpJU[>wuAUqmQu V""Bʚ/#`̙{Ͻs|χr9Ν9s<x<x<x<r@Bt7;Q@#|ɥ*TR"XZiE17Crʘ,J)ak⠥u e{3.eWP'!s]GY f82o)żT>εQЃ (9}9o27(wH~@frvHW2yX>zvN&xMݴƵZ"}3K7LsvXKbϦwXv\ʼn1GNk'f.'&.%m#M'D ûΛL_fpkfy<%;qSt4UrHZkGa8odd6vf21-\j)?|lzSHOFҋSlJVVttz)RJP%ln1"O]R36ܫ:ap&PWre-3ȏY\F>P[.姮cY*&s;${ %)y'vL:dLȀO:q&l tt ҟ/"l>7׵ɵ̉*õq,6?O[y=U+9޵pu! qm@3 :sm@HhTHF~6 \-5<.շS7b\tJ> Z!]+nYrz SUe ߇p:7beuۿgk.xŜj4; տ_V[sXfJV;:B f-=fՙXjD68`kSd}'3u`W4uZ⛺.(d_f˂gi]-vߖldoM>2p=gV9aN )kV-kgfYw1u[MasZY|mqqյفuk͌ N ;oY:I'œ[{T<ByՎg d V͟Zktn\`5; S-wku7B{)`eK,2hm`l'?T- .V|nj'N׸VC3uk31Rjql= 8صp,_Rתf=zkUaZ QO߭y?1\em7"VKj.L6Coq<kaomR1\Pś]2COݨ7H)ؿCVxt\H-感 y:yՎOl Ɏ)RHzIJqu왴ɲf+|&0k,N2qbv%31/<% ɚ>BFxsu_2&c%#g MRMCE;-u앤XVWx@*|t[LoAwQ̉ 50#'SjԪ|Iw1,)|hL\!zƪ۽ٔ Иt9om;|d[!QrYEzs&$oJUǩڽ]D@l";`v5 cɂzƗ^bA*5f)Z>C#\A=' ;^4Z*PnPu6[R}Nh <H@lz:j\yόtOOFH>EKh||!̦H6wW0PG)%mS fҾQ(T_+i#hf&ʌ_kiNf(ApՀ {Zt>yeLWg&K9s1z,H]/'rV1%r)QFf/\ -x8|Yp\3e}>>7f 6i9u]hJ3%>ڇ&k^eTwYcn ] o-k詬ͯu;*sĢ=5~R]U٭_\ rV,<J1VUw媘ty%*YF,2 UY@[ғYή4'bofy_3L]\BgW1걙nNO 1pE1< ߽/&(PJ|=4*205wZ4Q5/'~\.cCF'{eT6VTlF&3U԰:p1/**$k^6ռh„ lmƖ1J)Ե'Z)fNS\{b>0-nkf" #͘#蓧)g gnS'm'āf+(ߍ$`NŜ:[=?bwcԘ%#̵7Z!k1H:@2zl1F~GsRs ;Ftzgtnr2N7=rF[N!`ɽb,[6aגP Л9]D\B1{h $Yiת՝!B.3(b=5-H!cgKy G *JMlq]J6[/x2-h՜mYgȵ2~84 #4ck6cʊǰچ$yxjG:S 6s`9:t?&ʬd䅳3"g%`){ *[q3)[v6&!jӔë /81VN֥9I K 1u'8 C0]Up+yLϸ |(m]JAPo0ibŇ΂O7Ԍ=ntelKg%29{Y9\xc@d|35*{2AŮ scaq<.TtG6LCwJ=[W$(FT͖e`˾NZ0 [*kYcR_ ,ϰpZ22 ;W9APIqX Rjr\!j++n^AKN@ BzT+9Ν\VRF||@uvbX&88nc|K݋C|> (]7WU"sPotc-\Mc;ֺnnvdɧ/DɃteN7[k5=#*$ xաqڡriT09+C(*LHC} (}2ˣszYjޒLQg&e~f$\ۈP] OU( ׆>OTWpH2:*Vrp@qllaYl_m-B~tcbQHCe!?VFi9Y6+Mɢp@]yiQ5sxdm8:.sCpZm݄ć CȌnX˨1\*PL>|E(z1.YC{&(nm,(TP \ȧ33Ywy1 TsG򖚾+,z-MRbc?Eq*If&kdY#bXo IB@6){ƴiB3۠2UߨG'B.\`šCq)Fi7Zf28ӿrɱzY>krϲ8e-yx{uu.4/7r2:,b}u8o*JFBLS ZtqK)ŷM؉b'(%~,J7}@ g*md 7~v]t" jf1:XS^gZ,[Ƴ͢<I/,n%,j-Ɇjjvry|$yNR?~q}#,}VmJhY|7q0扏=6 B&4Cde&DNi\o-/Y^ l2&$A!' oH};pumeq*;u. eNq.-'0Iƹy)V86qqG褋[:^ģe:0V4%upő,Ppah.ױRُk𫯗Etn)y%WJ&s=Ǩߝ[ȫjg Uqu7PB)%au:П"R@jWՖ@wM )TRA%lzDy3PHWzы^.ɼ¯Yc 1g,J>ofЉ{2*\iK.U Fҗ!oPi0&r4<~Ikf"2}RֱL`ae6c[2G󦴗9>5,-"jqvXK=ctvT,\˧^z{ "')}90*f*S PO?(bVW0xԸ6=*-4C0&O) բuzPDCoz)T)̢6)ZnؚN;>:~SHC*Y * SJj{<x<x<x<4r%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-2.1/data/ui/images/BLACK SMILING FACE.png0000664000175000017500000001116212552273312020524 0ustar barccbarcc00000000000000PNG  IHDR{`bKGD̿ pHYsHHFk>IDATx{tUՙ! <&H"ASQ "2C[UTGrmgMю:S:3beR@"J*Qy$ %!@$7P@{^{{[{sgobX,bX,bX,bX4i їBKީ$, Jm1h(2I,#xO#biwxC.TvIO :i5/igȔ>񚸃/up0[ŝ?7sϟ.vM=eԚTf JSFn,XZ~q1T0@?*(݉[@)髽d(ySg`>3XN4k^o^j\g g=4:e24/"m; t4)/mr1a= ΋c/舖ɝݑ\F+T7#aHEJ9H&yFkyCe`[3ث9,̅,%K]sjPnE UUL<"Td"Z+n p)G!!P!UcL$_[bntG*RD;70 o( Лw!퍔dkB-_l ! 85 0*2= > @;w?@uK1?׃Ȯg/#i`Ei-J_rjs~O. HȤ+5.fp'9JBSjGbb=?_lF^I۩\h,g(kXR&St/1dwƫfǼ8sFc~J]X ɨq|ŌhLgO>?7꥗ͅzUl؀>GݵfhFA^8v`'}FSgW/ _c?_C\Y363Ş5M m0d@M)~5z+ y4^M`7WJy.p *է{t]/ jg3S/]ܗ[l%-WbUhP0j$@w*hSamJZX>AOV¨O|%s p"DQ'nuA os5EմdnL`jJLLss)qA/ ` bH*2w kLTXֱJ~neܺh_Rp|1K_)9J* `>pj6W>Ndn>6U`aQr9_+{+JcK34r ϝ=]Hqcm=aag1挴{p%1-,A[DNXU hym}ݗ>w oU%*!bcgmU>QѾdh! U W,b3҃iv^&:y_/\ܼݝM/\]l q Ĩr۪=MFbt=yM}wW6|7[}'>^8}\WV#5ҹ#{]2ʌ4e^UV~k_{j@|sG\>`l#W]*RuQ8WL—$u~'h:Ќ큳WUkjONЦj+ĭc1'; ]J^%I(˹s̅zVcYUJIZ*4%5uN~`ަF6ս$exbXc>& Q4XC[41K3Lxzs&3cĨft\]2jc^IXFOKjO%6yFw;U8Ѳ̳;9wA5ht'mr7B+&&o<'(~clY*m ذKǨL7wAy=JcHn j3#]@]X:]ыwe6l&h놰N 3AĈR1@}RR0HIA^wE+D=լ͊=cӘXN;ؠ9=(rb|fQH1ŌDmŀT6#p!gx]Q>&q6ډA&Y$\rE2,,wmPGd #ըz6瞖F.5ԢiVݨAl ˋ$a:pյn7Ѫ!Q_} .ZO-3Sq:Wܮ6CTj\M-0;uyݳvv2+gJ'_վF; K.2_:xj#,Q9ҁSǍ U; rAS˴(95S;61d?"jĝ~.brx]ᖵJI/<#ʯ㞟4k v9&䀇clwzxdӒLcE-ZCeT+}N"xd-m4¼4uiLJĬ_*3a1#WM dOEv#Y.$}˥GPZfJ;6qH|(2uJi2 .,Jw|:^DRˢԝUuwdbY<(Oi“͗Y7Y ]=+u/,2ixA?)]v?}2(0f%I?'Ig"eLfYCT5T6=(ɑgJOkB3`I8`)fE28B=u"԰W$$oK ) &hIDATxwևe] I@1c@E(({sFr (zU>#̊"($ $I^ 1:tίNUp 2 2 2 2 2 2 2 2 4!T%lɡJW PiLcӀTT3{v ekYݔ  86!L]]2,(FztaQ^BB?K.ye?R傺Lf< $X p6Cb#_+XšXrESp(ia4uW3xOtCX %a,9jI&qXL)gJН.ȷx(:tQfRl8?讫8 ;QϹf| AwaEu2> @3OLƃrvDVDtOc4qЋ +h+jnGJ@d~vъWgS<^$?3[@-DTVoj%_b' WiZj WYK&0"xfGMh*F+w˟J.&[tt V)=&5-fi TWrZ%]- TdsO \")do+}((|6麙{tPְ'BG{•/!(`yyIJ`t+.hA0.鎼: IdB1Y2NN`e~JF `Hw}1 d3P1ZJCsw.3Fwvz*B(J%]`[>Y+]lwV bw20 GvJ'DK_ P(/Um 2@B8 4,}ȕD_)B!ǿ`tr1ђ_cUa.}eD9H ,B< 2.˲< 6U>*D| 0jI~ i$ PVvI=N% a%]2iZIW[ Obse3ړ#U| ~28 %Y*IkG@4폐O{'KrfJ9w}8^Jd-Ӥ{ӥte&4B6~Ub{r8otepӿ\JKٱ"C:RKm|_=/qJDzN9-/ K:or 9\B:WEwt/m;qhЄ&G(Q#ҝR(cU!jkɧ iBsZxr^&+@`!pG`ᷯ7xZP ,/MhB}R:KlWd9⯧lb#Ya+qR$ Eh4^; MV)6:WhkE,g #bk|xBzkV2cvpTe.z;3/?-|/T+J.X)4LX Y1@ ư񫏦B;e I"ΒrvXI_?&ntk+-6k. [Xy _OQS ]3Ҩ6;pxmu2Ss3mSXqEj%Wꉤ lS.Tأ˦-K"bW mM$icP?6}I ſķmyC&5:,d^*Icy:u9)b+ %Nh,o<[ I󎋧0{yr KV'{+3$b0E M65j$x*XHmMI9 aNm h-I J*GU^üTïKtJ|UQ1E0P051jI{6^"ܙUܥjׯ{YzE>RATq3l9o/1ANjirUs5RQz;Oq8)=Q'GU~wk#_峛FVWdyГX msrl1/t{Ycy}t2JvQz̢ _iF]vU#3SL^eK*D8]J1MEXּOG%Bm/Nـ<[kd+໔={#Kȭ2@)LQ@jZe÷m{irX0B*RV_LnwPG QEor" xvWUf.Rn.=ȵd雾^9,X"]%څ=cMFҰn=RRJC5]ubX. mKpT׭y_zB_R6e7@_:9rNQ(X`|B-$Ey5q;8'lH BΣ&KlI d:٘6')x%R-f/xTg2 VsׄRLrՕ3C [0g^A$w7.N(MV GQ,ein--]_Z\yu s=iVʱWg<-KO؄ CzEv-1D,jhKMH["/5Ęu-ê&S6d-aȕBL0ul2Σ$x/;f/)T󗥻yy`cl.7]fBq;+XrZbKu8ӕ.I쯙 cd凘?LLAd9 F 8Nm͝I3"5J!e:L?n r^-=u'5tpv d&scn)&I(WL ʕF?޴e?}٠$&- 7-IgR. )0. MztgcS] =r6䖈ђp%&%Q%[ wpcW[ћ$9,cfU18еp̐Gw].dZj;t-&۱q՜ߖJtegJUM a 5&Cr.3-EͨqCU˴ tOICdEW*yifEf_]_3 O*.ZMKGOY1w?9 VJƘX9Ślq&GтZTcv -E*W1D}E'EfgL}23M:Ğ55d7#>sJC ߘ\IGW:UZU6>Ɏ[ @o%eϕLFH+'q4@T&&xۖQ9v,piW'e'*-YI>"Iwmˢ/߹HF ^dڬ8F9JE^zN^v\y[5^iCwjXVfr58DAY\dq:>Fd#!$=lcZCT%Zs3R2PS o$*M te)զse3)%y$zr1U(C{ I´4TR[;hA&;BΑ@Ո(z`+:^*ѼNnjI J9wL㥥N7zhMrDÄG',Kޏ蚡IO -:pyr]=mn 1| ꭤ$mR9=y2ߣR6my\gs3[4@{ yHQfBbۨ3ظIiH7Cubgao⡓Mc01C 3w`tt/, F3*(b) C1tq=SpԊg}R&2 >L@eƄf Jrf5עعCa )gB%w 2cޏs9#y{qɺ5\cILV !jGjm"~2-g1`90بlN`Sd*& k 8 @g~TGD_~|F`c'q̽dBFM'NsDآ>WHOIMMe :Q?kqoHৠ 먒D"cQQ3 f"Z)l^.£tf;?T^vV2E'hysE@obp5 e+yneiԊQlXjwitlpO-V/ֹEO  hI"߁y^LmP0HSIDtqe RfQd:"Dܞ| UV+FLh׶Uݸ) 5#y?Pw3C+?sdl<9eg9EB,WӤ<1Y\T3 ,.CZu머n)HPw#:>ױ@KB QM x$,~?Er)cg?ibN&H[aMzxX'2|ڠOQ݌R&<\GEm턽JXcP8wE9B7EQ1N<ՆEb@3M2͟ep331n5.uSN|Cus z(|BÈ?hgz1Xc?C5.eXh|Ɲx]L8Guۗ~9hf2F;ݼO6-я#?h0B/3 @.sjgTX&iFOuɧ*졈"}ݘ͡}xAV`44Ak j |e)ͼooӘ͗-Ln l-ĨKts`/Ekn#<&[4Sx!^Y\-M^~?K.o*_cR)rF1=^8d!ƠBuRaקMnJ&3<*jr "ۥ{7+Aiļ{JyDN0׵/THVt'%H۔]1s4GSGkX`B'GI4%yWjiwy*UO'짣:2Ў&\WR ˪tܑGea:)yQIUY;]ٺFMdD%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-2.1/data/ui/images/diagonal-lines.png0000664000175000017500000000033112552272141021027 0ustar barccbarcc00000000000000PNG  IHDR@@PLTEgtRNS@fbKGDH pHYs  tIME&`ALIDAT(α  KGpG,S$C@.kIDATxyN?g0ÑttQҭDJ4(-R)ipSߢxR[R!T(C$2s<yΰ{y~߳k-0 `0 `0 `0 `0A SNx}{.#& ]0 pDzMVDSHM I4`z$DSHM I4`z$DSHM I4`z$DSHM Ii@=Ns n f kFSAL3_ȷj̠*&Fo9S9aөʔnq{pG@w [ؐ(.biNv(PW>7&]K(ORY2`6KޝM%btD&\H(Tڼ)}?(ѡź1^m˜?I| -s~0fϦ@_&MxlbϬb  j?!bxZ)R-A7M4#cW[p0236 htDY!aYAn|6 %+Fy#͂З RK#>g49,0\ŒEb^n/3*搄n+b»ITǜtHTsr2E;$/=M7GF.'v/HHjvt>[f mEKh6'8(] %A7~ZuHpvᥝ\dW ӫt&Opô~-ksW cl[c&ÒkajbO{y,/ z#>lnõXZGaBqS O{e&B<*%'W|sr-L{9b{arzB]^Q̈z2-\a~Y `,ɑiҕA?J@,+̯H"oJ۹$]}#Zq Rd^#xQJҞ׫"!{qƭʻwY4[?6];29 o~nZWEranYk_ =?hnqWplHȢCʒa}ps{A/l,#S&:- d[-,]g@=Vag>uyx‛񋋁<9E*2Zk<u)"Յ$ph8u$Vz{!V|Y1%>+qYAq][9r0S<ʌPX)!4%|(P3Ea1m$uU<E! #S,2~bkk_bX j-[j"x4J(n'k~ZEd-YCL*"|^-MVct!1OXOPBPMTD0S6=#D6dZGy%KNY"=ȻZ 3#Qq N|鵳{)̍K!j"8/qƶd*9@=A|Uܪ"h8Lm&W2IxĉrɧsR&ᏁSqw 3)P *NQp;Ya`^~=ط['($`5>O&s5YWR+{2~2 cXI'A qs:eeE1W'?.RNen<i??As-yH: +kyƕUD-N,ti+;k%ʹIKvP}؇ ,]X(;_6h]@<#G xI%j<*=$9J`oyK?'үj3h`)AN5ۆW2~,4e,LS?qz@[ÀGe ygJ^z*J SN'nܲ>bua8 G;\(*]) *ovaZ8\ ,ܲ  &S%fm:),LCLH#'5 gbĘ'*\.޼S ~3K,C%d%A2&v=#L+Tۏ9Tr0^5=HcŽDX_bX9;l'w93at G<TVmd|#*(al!F^O6N"PY8J)VcdJy y]`C 9&L#k?EPG gOڭ+?-' ZAyRC:>mTQ`xQsRTH1C.w+䶆5U4A kLj? B44#I򻃻JԱtwծFI#x)J;E䷇Nu^.1~<"S*(UkG f,[YW";8qsKr5ci-eYu̹ΜDep g[HԌƶds# <5MϩH6m" ' Ȧ[2_ZKwqYOax&v8,zCx% p㎔j dq5KWꐥYt}\ItfN 鹵"ȠƳ#TԌyerݤq\̠. (# ݓB7g¿\ )y}hʀlT t^Yv0slʀ]dyJ)tnry7]Gzqv Z =^2_rγ0.~6鱌RE|y˩hO \@J"v^ VX]z.4cv`%uOtK%Υf%kiGxZԇ ʀ/.OފS@E!&s,*|~ ~w-ՂNY`5+qφЊJM:# z j$b?~5#h_PIUƳ܏p33ōj>\:PǏr F=}E%r cJnFtK l2*~9$ VB? 8WX~dk+UTOJ^kTa3-7Ƽ`5D[[ͬm ~mՒaƗ@ 3"3ߢ(X¾|SZ.O/6GxzA~W{EcV*,g_h+X&o^ShPSZﻝyf»+nXE?lL)K+ mmhqo&}ň񮛁"7]H eů=o9laC4d(Oш'ɗLb7s#oWqKR!jM;O I(?9/l>45DM>V뻔6wme~]r{m\3Np +~F]Y#J4R1q7My<`#rHP!f)G@jҍ^+{dRc@#&* *+͡9 b9v-pGG%0G5y69tf P^8/GC VFk0eAWw>puԲ!`ǩp0Ggk%磬MWkL:s;Wp-dJ%^vIMrS‰M}OmAmaAK^ b_MBvF-M4Bz&rYv'֞`zb8$YSGD9@^x،mg0c  za i<Yuo0=%fgGku5Y?``~$r.c pE}IOU^<b1#\ud!x> @&z /}|z%/9 n(Q V8*1iy)"p_T7}AkN{ YF+4:WSk@-48zUe*:H*S$Qlm,O`D %K҈di=-n00ΕMNR^ߠ6V;fp;lSg 8 d"oj)% o[텿c!ڏt qI9ZyЉ{ [(BEQsxf3j2]9$"ԐڪA7ARQ*qVW᝟H ox[?tx{ܙT\iZdݻzOV~.rz\:Q)eÊJ<)q$܆tricC6 cHk[AiC)Ͱ֓xmbU`_"/<Ӂ0,^iwtD lIr0F+tOW3C JQXP[s?]ͥ*4I S!lF;Ԡ$j\l-GT(C̶=mA7suQDSيӘh I)$L$0=@h I)$L$0=@h I)$L$0=@h I) `0 `0 `0 `0 A;!(%tEXtdate:create2012-10-22T06:24:25+02:00)>%tEXtdate:modify2012-10-22T06:24:25+02:00X&IENDB`pybik-2.1/buildlib/0000775000175000017500000000000012556245305014437 5ustar barccbarcc00000000000000pybik-2.1/buildlib/create_docs.py0000775000175000017500000001564312556223565017304 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2015 B. Clausius # # 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 3 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, see . import sys, os sys.path.insert(0, '.') import re from textwrap import fill, wrap from pybiklib import config try: _ except NameError: import builtins builtins.__dict__['_'] = lambda s: s footnote_first_idx = 1 def underline(title, underline_char='='): return '{}\n{}'.format(title, underline_char*len(title)) def clean_links(text): global footnote_first_idx footnote_cur_idx = 0 footnotes = [] def add_footnote(match): nonlocal footnote_cur_idx if match.group(2) != '|': return match.group(0) elif match.group(1) != '': footnote = match.group(1) if footnote in footnotes: footnote_cur_idx = footnotes.index(footnote) + footnote_first_idx else: footnote_cur_idx = len(footnotes) + footnote_first_idx footnotes.append(footnote) return '' else: return ' [{}]'.format(footnote_cur_idx) text = re.sub(r'<(.*?)(\|?)>', add_footnote, text) footnotes = ['[{}] <{}>'.format(i+footnote_first_idx, footnote) for i, footnote in enumerate(footnotes)] footnote_first_idx += len(footnotes) return text, footnotes def wrap_deb(text): for line in text.splitlines(): if line: if line.startswith(('* ', ' ')): yield from wrap(line, width=78, initial_indent=' ', subsequent_indent=' ') else: yield from wrap(line, width=78) else: yield '.' class TemplateStr (str): __slots__ = () linefmt = None delimiters = None footnotes = [] mark = '' @classmethod def reset(cls): cls.linefmt = None cls.delimiters = None cls.footnotes.clear() cls.mark = '' def __format__(self, fmt): if fmt == 'line': text = self fmt = self.linefmt self.__class__.linefmt = None elif self == '#': self.__class__.linefmt = fmt return '' elif self == '#delimiters': delims = fmt.split() if delims: if len(delims) != 2: raise IndexError('wrong count of delimiters: '+fmt) self.__class__.delimiters = re.escape(delims[0]) + r'(.*?)' + re.escape(delims[1]), r'{\1}' else: self.__class__.delimiters = None return '' elif self == '#footnotes': if not self.footnotes: return '' text = '\n' + '\n'.join(self.footnotes) + '\n' self.__class__.footnotes.clear() return text elif self == '#mark': self.__class__.mark = fmt return '' else: text = getattr(config, self) if callable(text): text = text() if not fmt: return text for s in fmt.split('.'): if s == 'wrap': text = '\n\n'.join(fill(t, width=78) for t in text.split('\n\n')) elif s == 'wrap_deb': text = '\n '.join(wrap_deb(text)) elif s == 'links': text, footnotes = clean_links(text) self.__class__.footnotes += footnotes elif s == 'join': if isinstance(text, (tuple, list)): text = '\n'.join(text) else: text = text.replace('\n\n', ' ').replace('\n', ' ') else: raise ValueError('unknown format: ' + fmt) return text class TemplateKeyDict (dict): __slots__ = () def __getitem__(self, key): if key and key[0] in ["'", '"']: import ast return TemplateStr(ast.literal_eval(key)) return TemplateStr(key) def get_template_filename(templatename): if templatename == os.path.basename(templatename): templatename = os.path.join(config.appdata_dir, 'templates', templatename) templatename += '.in' return templatename def create_doc(templatename, filename=None, *, skip=None): global footnote_first_idx footnote_first_idx = 1 if not filename: filename = templatename templatename = get_template_filename(templatename) with open(templatename, 'rt', encoding='utf-8') as f: template = f.readlines() text = '' prev_linelen = None skipstate = 0 TemplateStr.reset() for lineno, line in enumerate(template): line = line.rstrip() if skip == line: skipstate = 1 continue elif skipstate == 3: skipstate = 0 elif skipstate: skipstate = 1 if line else skipstate+1 continue if prev_linelen is not None and 3 <= len(line) == line.count(line[0]): line = line[0] * prev_linelen else: if TemplateStr.delimiters is not None: line = line.replace('{','{{').replace('}','}}') pattern, replace = TemplateStr.delimiters line = re.sub(pattern, replace, line) try: line = line.format_map(TemplateKeyDict()) line = format(TemplateStr(line), 'line') except Exception as e: print('{}:{}: {}'.format(templatename, lineno+1, e)) print(' ', line, end='') raise prev_linelen = len(line) if skip == TemplateStr.mark: continue text += line + '\n' with open(filename, 'wt', encoding='utf-8') as f: f.write(text) def main(): skip = None args = sys.argv[1:] if not args: print('usage: {} [--skip=PARAGRAPH] template[=filename]'.format(os.path.basename(sys.argv[0]))) sys.exit(1) for arg in args: if arg.startswith('--skip='): skip = arg.split('=', 1)[1] elif not arg.startswith('--'): fileinfo = arg.split('=', 1) create_doc(*fileinfo, skip=skip) else: print('Unknown Option:', arg) sys.exit(1) if __name__ == '__main__': try: _ except NameError: __builtins__._ = lambda text: text main() pybik-2.1/buildlib/utils.py0000664000175000017500000000303112515123203016131 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2013-2015 B. Clausius # # 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 3 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, see . import os def po_isempty(pofilename, *, verbose=True): try: import polib except ImportError: if verbose: print('polib not found, assuming the file %s contains translations' % pofilename) return False for entry in polib.pofile(pofilename): if entry.translated() and entry.msgid != entry.msgstr: return False return True def modify_file(filename, subs): import re print('modifying', filename) with open(filename, 'rt', encoding='utf-8') as f: text = f.read() for pattern, repl in subs: text = re.sub(pattern, repl, text, count=1, flags=re.MULTILINE) # filename may be a hardlink, do not modify the original file os.remove(filename) with open(filename, 'xt', encoding='utf-8') as f: f.write(text) pybik-2.1/buildlib/modeldef.py0000664000175000017500000003005512556223565016577 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2015 B. Clausius # # 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 3 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, see . from math import sqrt from pybiklib.debug import DEBUG_INVISIBLE from pybiklib.modelcommon import epsilon from .geom import Vector, Polyhedron, Plane, distance_axis_vert, distance_axis_edge, Face N_ = lambda t: t class ModelBase: bevel_width = 0.1 def __init__(self): self.facekeys = [fn.replace(' ', '_') for fn in self.facenames] self.cell = self.create_single_cell() self.axes = self.create_axes() self.normals = {hf.face.id: hf.normal() for hf in self.cell.halffaces} def create_axes(self): hf_by_id = {hf.face.id: hf for hf in self.cell.halffaces} return [hf_by_id[s].center().normalised() for s in self.symbols] def scale_cell(self, polys, sizes): saxes = (a*s for a, s in zip(self.axes, sizes)) scale1 = (sqrt(sum(f*f for f in a)) for a in zip(*self.axes)) scaleS = (sqrt(sum(f*f for f in a)) for a in zip(*saxes)) scale = tuple(s/s1 for s, s1 in zip(scaleS, scale1)) polys.scale(scale) def split_cell(self, polys, sizes): slice_centers = [] cuts = {} for iaxis, (axis, size) in enumerate(zip(self.axes, sizes)): slice_centers_axis = [] axis = Vector(axis) plane = Plane(axis) split_low, split_high = self.splits(iaxis, size, [0, size]) for plane.distance in self.splits(iaxis, size, range(1, size)): slice_centers_axis.append((split_low+plane.distance)/2) split_low = plane.distance split_id = polys.split_plane(plane, iaxis) cuts[split_id] = axis slice_centers_axis.append((split_low+split_high)/2) if split_low < split_high: slice_centers_axis.reverse() slice_centers.append(slice_centers_axis) return cuts, slice_centers @staticmethod def mark_invisible_faces(polys, cuts): for split_id, axis in cuts.items(): visible_limit = 10000 for cell in polys.cells: for hf in cell.halffaces: if hf.face.type == 'face': for he in hf.halfedges: other_face = he.other.halfface.face if other_face.type == 'cut' and other_face.id == split_id: dist_ae = distance_axis_edge(axis, he.verts) if dist_ae < visible_limit: visible_limit = dist_ae # mark all faces whose verts are within visible_limit around axis for face in polys.faces: if face.type == 'cut' and face.id == split_id: for vert in face.verts: dav = distance_axis_vert(axis, vert) if dav > visible_limit - epsilon: break else: face.type += '_removed' @classmethod def remove_cells(self, polys, cuts): self.mark_invisible_faces(polys, cuts) if DEBUG_INVISIBLE: return polys.remove_cells(lambda c: all(f.type.endswith('_removed') for f in c.faces)) def create_cells(self, sizes): self.cell.indices = (0,) * len(sizes) polys = Polyhedron() polys.cells = [self.cell] polys = polys.clone() self.scale_cell(polys, sizes) cuts, slice_centers = self.split_cell(polys, sizes) self.remove_cells(polys, cuts) return polys, slice_centers class BrickModel (ModelBase): type = 'Brick' fileclass = 'b' name = N_('Brick') mformat = N_('{0}×{1}×{2}-Brick') sizenames = (N_('Width:'), N_('Height:'), N_('Depth:')) defaultsize = (4, 2, 3) symmetries = 2, 2, 2 symbols = 'LDB' symbolsI = 'RUF' faces = 'UDLRFB' facenames = (N_('Up'), N_('Down'), N_('Left'), N_('Right'), N_('Front'), N_('Back')) default_rotation = (-30.,39.) @classmethod def norm_sizes(cls, size): y, z, x = sorted(size) return (x, y, z), (x, y, z) @staticmethod def create_single_cell(): # standard # orientation face symbols # *------* +---+ # |\ |\ y | U | # | *------* | +---+---+---+---+ # | | | | o--x | L | F | R | B | # *-|----* | \ +---+---+---+---+ # \| \| z | D | # *------* +---+ up = Face.polygon((-1., -1.), 4, ids='FRBL') cell = up.extrude_y(1., -1., ids='UD') return cell def splits(self, iaxis, size, isplits): return ((size - 2.*i) for i in isplits) class TowerModel (BrickModel): type = 'Tower' name = N_('Tower') mformat = N_('{0}×{1}-Tower') sizenames = (N_('Basis:'), N_('Height:')) defaultsize = (2, 3) symmetries = 2, 4, 2 @classmethod def norm_sizes(cls, size): x, y = size return (x, y), (x, y, x) class CubeModel (BrickModel): type = 'Cube' name = N_('Cube') mformat = N_('{0}×{0}×{0}-Cube') sizenames = (N_('Size:'),) defaultsize = (3,) symmetries = 4, 4, 4 @classmethod def norm_sizes(cls, size): x, = size return (x,), (x, x, x) class VoidCubeModel (BrickModel): type = 'Cube3Void' name = N_('Void Cube') mformat = N_('Void Cube') sizenames = () defaultsize = () symmetries = 4, 4, 4 @classmethod def norm_sizes(cls, unused_size): return (), (3, 3, 3) @classmethod def remove_cells(self, polys, cuts): polys.remove_cells(lambda c: sum(int(i==1) for i in c.indices) >= 2) class TetrahedronModel (ModelBase): type = 'Tetrahedron' fileclass = 't' name = N_('Tetrahedron') mformat = N_('{0}-Tetrahedron') sizenames = (N_('Size:'),) defaultsize = (3,) symmetries = 3, 3, 3, 3 symbols = 'LDBR' symbolsI = 'WXYZ' faces = 'DLRB' facenames = (N_('Down'), N_('Left'), N_('Right'), N_('Back')) default_rotation = (-10.,39.) @classmethod def norm_sizes(cls, size): x, = size return (x,), (x, x, x, x) _redge = sqrt(3/2) _itriangle = sqrt(2) / 2 _rtriangle = sqrt(2) _itetrahedron = 1 / 2 _rtetrahedron = 3 / 2 _verts = [Vector((-_redge, -_itetrahedron, -_itriangle)), Vector(( _redge, -_itetrahedron, -_itriangle)), Vector(( 0., _rtetrahedron, 0.)), Vector(( 0., -_itetrahedron, _rtriangle))] @classmethod def create_single_cell(self): # vertex standard # indices orientation face symbols # 2 # | y # | | +-----+ # | o--x /L|B\ R/ # 0------1 \ +---+---+ # \ z |D/ # 3 + down = Face.polygon((0., -self._rtriangle), 3, ids='LBR') cell = down.pyramid(1.5, -.5, id='D') return cell def splits(self, iaxis, size, isplits): return ((i*2 - self._rtetrahedron*size) for i in isplits) class TriangularPrism (ModelBase): type = 'Prism3' fileclass = 't' name = N_('Triangular Prism') mformat = N_('{0}×{1} Triangular Prism') sizenames = (N_('Basis:'), N_('Height:')) defaultsize = (3, 2) symmetries = 2, 3, 2, 2 symbols = 'LDBR' symbolsI = 'XUYZ' faces = 'UDLRB' facenames = (N_('Up'), N_('Down'), N_('Left'), N_('Right'), N_('Back')) default_rotation = (-4.,39.) @classmethod def norm_sizes(cls, size): b, h = size if b > 6 or h > 6: return None, None return (b, h), (b, h, b, b) _rtriangle = sqrt(2) _itriangle = _rtriangle / 2 @classmethod def create_single_cell(self): # standard polygon # orientation orientation # *------* # |\ /| y y # | * | | | # | | | o--x | # *--|---* \ o-----x # \ | / z # * up = Face.polygon((0., -self._rtriangle), 3, ids='RBL') cell = up.extrude_y(1., -1., ids='UD') return cell split_arg = 0 def splits(self, iaxis, size, isplits): if iaxis == 1: return ((i*2. - size) for i in isplits) else: low = self._rtriangle*size d = (self._itriangle + self._rtriangle) * (size/(size+self.split_arg)) return ((i*d - low) for i in isplits) class TriangularPrismComplex (TriangularPrism): type = 'Prism3Complex' fileclass = 't' name = N_('Triangular Prism (complex)') mformat = N_('{0}×{1} Triangular Prism (complex)') sizenames = (N_('Basis:'), N_('Height:')) defaultsize = (3, 2) split_arg = -1/3 class PentagonalPrism (ModelBase): type = 'Prism5' fileclass = 'p' name = N_('Pentagonal Prism') mformat = N_('{0}×{1} Pentagonal Prism') sizenames = (N_('Basis:'), N_('Height:')) defaultsize = (2, 2) symmetries = 2, 5, 2, 2, 2, 2 symbols = 'AUBCDE' symbolsI = 'GLHIJK' faces = 'ULABCDE' facenames = (N_('Up'), N_('Down'), N_('Front Right'), N_('Right'), N_('Back'), N_('Left'), N_('Front Left')) default_rotation = (-4.,39.) @classmethod def norm_sizes(cls, size): b, h = size if b > 6 or h > 6: return None, None return (b, h), (b, h, b, b, b, b) def create_single_cell(self): up = Face.polygon(Vector((0, -1.4)), 5, ids='ABCDE') self._ipentagon = up.halffaces[0].halfedge.center().length() upverts = iter(up.halffaces[0].verts) v1, unused, v3 = next(upverts), next(upverts), next(upverts) d3pentagon = (v1.point + v3.point).length() / 2 self._hpentagon = (self._ipentagon - d3pentagon)/2 cell = up.extrude_y(1., -1., ids='UL') return cell side_center = 0 def splits(self, iaxis, size, isplits): if iaxis == 1: return ((i*2. - size) for i in isplits) else: dpentagon = self._ipentagon - self._hpentagon d = dpentagon*size/max(size-1+self.side_center, 1) low = self._hpentagon*size - (1-self.side_center)*d # values for i==0 is the same as for i==size. # its on the wrong side of the prism, but then most faces # have only 4 directions in quadrant mode return ((i*d + low if i>0 else size*self._ipentagon) for i in isplits) class PentagonalPrismM (PentagonalPrism): type = 'Prism5M' fileclass = 'p' name = N_('Pentagonal Prism (stretched)') mformat = N_('{0}×{1} Pentagonal Prism (stretched)') side_center = 0.2 modeldefs = [CubeModel, TowerModel, BrickModel, TetrahedronModel, VoidCubeModel, TriangularPrism, TriangularPrismComplex, PentagonalPrism, PentagonalPrismM, ] pybik-2.1/buildlib/__init__.py0000664000175000017500000000000012130757601016531 0ustar barccbarcc00000000000000pybik-2.1/buildlib/geom.py0000775000175000017500000010511212556223565015747 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2013-2015 B. Clausius # # 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 3 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, see . from collections import deque, OrderedDict from math import atan2, sin, cos, pi import pybiklib.modelcommon from pybiklib.modelcommon import epsdigits, epsilon def roundeps(val): return round(val, epsdigits+1) class Vector (pybiklib.modelcommon.Vector): def rounded(self): return self.__class__(roundeps(s) for s in self) def scaled(self, vector): return self.__class__(s*v for s,v in zip(self, vector)) def equalfuzzy(self, other): return (self-other).length_squared() < epsilon def inversfuzzy(self, other): return (self+other).length_squared() < epsilon def distance_axis_vert(axis, vert): ''' axis: vector that defines a line through (0,0,0) return: the shortest distance between axis and vert ''' axis = Vector(axis) base_point = axis * vert.point.dot(axis) / axis.dot(axis) return (vert.point - base_point).length() def distance_axis_edge(axis, verts): ''' axis: vector that defines a line through (0,0,0) verts: two points that define a line segment return: the shortest distance between axis and edge ''' vec_axis = axis # S1.P1 - S1.P0, S1.P0 == (0,0,0) vec_edge = verts[1].point - verts[0].point # S2.P1 - S2.P0 vec_vert0 = -verts[0].point # S1.P0 - S2.P0 a = vec_axis.dot(vec_axis) # always >= 0 b = vec_axis.dot(vec_edge) c = vec_edge.dot(vec_edge) # always >= 0 d = vec_axis.dot(vec_vert0) e = vec_edge.dot(vec_vert0) D = a*c - b*b # always >= 0 sD = D # sc = sN / sD, default sD = D >= 0 tD = D # tc = tN / tD, default tD = D >= 0 # compute the line parameters of the two closest points if D < epsilon: # the lines are almost parallel sN = 0.0 # force using point P0 on segment S1 sD = 1.0 # to prevent possible division by 0.0 later tN = e tD = c else: # get the closest points on the infinite lines sN = b*e - c*d tN = a*e - b*d if tN < 0.0: # tc < 0 => the t=0 edge is visible tN = 0.0 # recompute sc for this edge sN = -d sD = a elif tN > tD: # tc > 1 => the t=1 edge is visible tN = tD # recompute sc for this edge sN = (-d + b) sD = a # finally do the division to get sc and tc sc = 0.0 if abs(sN) < epsilon else sN / sD tc = 0.0 if abs(tN) < epsilon else tN / tD # get the difference of the two closest points dP = vec_vert0 + (vec_axis * sc) - (vec_edge * tc) # = S1(sc) - S2(tc) return dP.length() # return the closest distance class Plane: def __init__(self, normal): self.normal = Vector(normal) self.distance = 0 def __repr__(self): return '{0}({1.normal}, {1.distance})'.format(self.__class__.__name__, self) def signed_distance(self, point): return self.normal.dot(point) - self.distance def intersect_segment(self, p, q): pvalue = self.signed_distance(p.point) qvalue = self.signed_distance(q.point) if abs(pvalue - qvalue) < epsilon: return -1, None if abs(pvalue) < epsilon: return 0, p if abs(qvalue) < epsilon: return 0, q if pvalue < 0 < qvalue or qvalue < 0 < pvalue: d = pvalue / (pvalue - qvalue) return 1, Vert(p.point + (q.point - p.point) * d) else: return -1, None class GeomBase: def __repr__(self): def args(): for attr in self.fields_arg: yield str(list(getattr(self, attr))) for attr in self.fields_kwarg: yield '{}={!r}'.format(attr, getattr(self, attr)) return '{}({})'.format(self.__class__.__name__, ', '.join(args())) def __euler(self): objnames = ['verts', 'edges', 'faces', 'cells'] strx = '' euler = 0 for i, objname in zip(range(self.dim), objnames): count = sum(1 for obj in getattr(self, objname)) strx += ' {}={}'.format(objname[0], count) euler += -count if i % 2 else count euler += -1 if self.dim % 2 else 1 return 'x={}{} {}=1'.format(euler, strx, objnames[self.dim][0]) def __genstr(self, indent=''): def args(): for attr in self.fields_kwarg: yield '{}={!r}'.format(attr, getattr(self, attr)) yield '{}{}: {} {}'.format(indent, self.__class__.__name__, ' '.join(args()), self.__euler()) for attr in self.fields_arg: for v in getattr(self, attr): yield from v.__genstr(indent+' ') def __str__(self): return '\n'.join(self.__genstr()) def clone(self, clone_data): if id(self) in clone_data: return obj = clone_data[id(self)] = self.__class__() vals = [(attr, getattr(self, attr)) for attr in reversed(self.fields_geom)] def func(clone_data): for attr in self.fields_kwarg: if attr not in self.fields_geom: setattr(obj, attr, getattr(self, attr)) for attr, val in vals: newval = [clone_data[id(o)] for o in val] if isinstance(val, list) else clone_data[id(val)] setattr(obj, attr, newval) for attr, val in vals: if isinstance(val, list): for o in val: yield o.clone else: yield val.clone yield func def center(self): c = Vector() for i, v in enumerate(self.verts): c += v.point return c / (i+1) class Vert (GeomBase): dim = 0 fields_arg = () fields_kwarg = 'point', 'id', fields_geom = () def __init__(self, point=None, *, id=None): self.point = Vector() if point is None else Vector(point) self.id = id def assert_valid(self): import numbers assert len(self.point) == 3 assert all(isinstance(i, numbers.Number) for i in self.point) return True class HalfEdge (GeomBase): dim = 1 fields_arg = 'verts', fields_kwarg = 'edge', fields_geom = 'verts', 'edge', '_nextatface', 'other', 'halfface' def __init__(self, verts=None, edge=None): if verts is None and edge is None: return self.verts = list(verts) self.edge = edge if edge is not None: edge.halfedges.append(self) self._nextatface = None self.other = None # other halfedge of edge in the same cell self.halfface = None @classmethod def from_other(cls, halfedge): he = cls(reversed(halfedge.verts), halfedge.edge) halfedge.other = he he.other = halfedge return he def assert_valid(self): assert all(isinstance(v, Vert) for v in self.verts) assert isinstance(self.edge, Edge) assert isinstance(self._nextatface, self.__class__) assert isinstance(self.other, self.__class__), self.other.__class__ assert isinstance(self.halfface, HalfFace) assert all(v.assert_valid() for v in self.verts) assert len(self.verts) == 2 assert self.edge.assert_valid() assert self._nextatface is not None assert self._nextatface is not self # len > 1 assert self._nextatface._nextatface is not self # len > 2 assert self._nextatface.edge is not self.edge assert self.verts[1] is self._nextatface.verts[0] assert self.other.other == self assert self.halfface is self._nextatface.halfface return True def __iter__(self): for v in self.verts: yield v @property def prevatface(self): he = self while he._nextatface != self: he = he._nextatface return he def addtoface(self, halfedge, next=None): halfedge._nextatface = next or self._nextatface halfedge.halfface = self.halfface self._nextatface = halfedge def bevel_point(self, dist): ''' >>> poly = Polyhedron() >>> poly.set_verts([0.,0.,0.], [1.,0.,0.], [1., 2.,0.]) >>> poly.set_edges([0,1], [1,2], [2,0]) >>> poly.set_faces([1,2,3]) >>> poly.edges[0].halfedges[0].bevel_point(.1) Vert(0.9, 0.1, 0.0) ''' vert1, vert2 = self.verts vert3 = self._nextatface.verts[1] nd1 = (vert1.point - vert2.point).normalised() nd2 = (vert3.point - vert2.point).normalised() return vert2.point + (nd1 + nd2) * dist / nd1.cross(nd2).length() class Edge (GeomBase): fields_arg = () fields_kwarg = 'id', fields_geom = 'halfedges', def __init__(self, *, id=None): self.halfedges = [] self.id = id def assert_valid(self): assert all(isinstance(he, HalfEdge) for he in self.halfedges) assert len(self.halfedges) > 0 assert all(isinstance(he, HalfEdge) for he in self.halfedges) assert all(he.edge is self for he in self.halfedges) assert all(he._nextatface is not None for he in self.halfedges) return True def __str__(self): verts = len(self.halfedges) euler = verts - 1 return 'χ={} v={} e=1'.format(euler, verts) def split(self, vert): verts = self.halfedges[0].verts edge2 = self.__class__() for he1 in self.halfedges: if he1.verts[0] == verts[0]: he2 = HalfEdge([vert, he1.verts[1]], edge2) he1.verts[1] = vert he1.addtoface(he2) he2_other = he1.other.prevatface else: assert he1.verts[1] == verts[0], (he1.verts, verts) he2 = HalfEdge([he1.verts[0], vert], edge2) he1.verts[0] = vert he1.prevatface.addtoface(he2) he2_other = he1.other._nextatface if he2_other.edge is edge2: he2.other = he2_other he2_other.other = he2 class HalfFace (GeomBase): dim = 2 fields_arg = 'halfedges', fields_kwarg = 'face', fields_geom = 'halfedge', '_nextatcell', 'face' def __init__(self, *, halfedges=None, face=None): if face is not None: self.face = face self.face.halffaces.append(self) if halfedges: self.set_halfedges(halfedges) else: self.halfedge = None self._nextatcell = None def assert_valid(self): assert isinstance(self.face, Face) assert self.face.assert_valid() assert isinstance(self._nextatcell, self.__class__) assert self._nextatcell is not None assert self.halfedge.halfface is self assert all(isinstance(he, HalfEdge) for he in self.halfedges) assert all(he.assert_valid() for he in self.halfedges) return True def __iter__(self): if self.halfedge is None: return he = self.halfedge while True: yield he he = he._nextatface if he is self.halfedge: return halfedges = property(__iter__) def halfedges2(self): if self.halfedge is None: return he = self.halfedge while True: yield he, he._nextatface he = he._nextatface if he is self.halfedge: return @property def edges(self): for he in self.halfedges: yield he.edge @property def verts(self): for he in self.halfedges: yield he.verts[0] def set_halfedges(self, halfedges): ithalfedges = iter(halfedges) self.halfedge = phe = next(ithalfedges) for he in ithalfedges: phe._nextatface = he phe.halfface = self phe = he phe._nextatface = self.halfedge phe.halfface = self def normal(self): verts = self.verts try: v1 = next(verts).point v2 = next(verts).point v3 = next(verts).point except StopIteration: raise ValueError('Too few vertices') return (v2-v1).cross(v3-v1).normalised() @staticmethod def _sorted_halfedges(halfedges): try: current = halfedges.pop(0) except IndexError: return halfedges halfedges_new = [current] unused, prev_vert = current.verts while halfedges: for i, he in enumerate(halfedges): if prev_vert not in he.verts: continue current = halfedges.pop(i) assert current is he vert1, vert2 = he.verts if prev_vert is vert2: current.verts = [vert2, vert1] prev_vert = vert1 else: prev_vert = vert2 halfedges_new.append(current) break else: assert False halfedges[:] = halfedges_new return halfedges def reverse(self): halfedges = list(self.halfedges) for he in halfedges: he.verts = list(reversed(he.verts)) self._sorted_halfedges(halfedges) self.set_halfedges(halfedges) class Face (GeomBase): fields_arg = () fields_kwarg = 'type', 'id' fields_geom = 'halffaces', def __init__(self, *, type=None, id=None): self.halffaces = [] self.type = type self.id = id def assert_valid(self): assert all(isinstance(f, HalfFace) for f in self.halffaces) assert all(hf.face is self for hf in self.halffaces) assert 1 <= len(self.halffaces) <= 2 lenhf0 = len(list(self.halffaces[0].halfedges)) assert all(lenhf0 == len(list(hf.halfedges)) for hf in self.halffaces) return True def __str__(self): verts = len(list(self.verts())) edges = len(list(self.edges())) euler = verts - edges + 1 return 'χ={} v={} e={} f=1'.format(euler, verts, edges) @property def edges(self): return self.halffaces[0].edges @property def verts(self): return self.halffaces[0].verts def remove_all_edges(self): for hf in self.halffaces: hf.halfedge = None def split(self, split_verts): assert len(split_verts) == 2, len(split_verts) edge = Edge() newface = Face(type=self.type, id=self.id) edgef1 = None for halfface in self.halffaces: he = halfface.halfedge # make sure to start on the same edge for all halffaces if edgef1 is None: edgef1 = he.edge else: while he.edge is not edgef1: he = he._nextatface halfface.halfedge = he # proceed to the end of the old halfface while he.verts[1] not in split_verts: he = he._nextatface hedge1f1 = he he = he._nextatface hedge1f2 = he # create a new halfface newhalfface = HalfFace(face=newface) newhalfface.halfedge = he newhalfface._nextatcell = halfface._nextatcell halfface._nextatcell = newhalfface # proceed to the end of the new halfface while he.verts[1] not in split_verts: he.halfface = newhalfface he = he._nextatface he.halfface = newhalfface hedge2f2 = he he = he._nextatface hedge2f1 = he # insert a new halfedge between the splitted halfface hedge1 = HalfEdge(split_verts, edge) hedge2 = HalfEdge([split_verts[1], split_verts[0]], edge) hedge1.other = hedge2 hedge2.other = hedge1 if hedge1f1.verts[1] is split_verts[1]: hedge1, hedge2 = hedge2, hedge1 hedge1f1.addtoface(hedge1, hedge2f1) hedge2f2.addtoface(hedge2, hedge1f2) return edge @classmethod def polygon(cls, point, n, ids=None): x0, y0 = point vert0 = Vert(point) r = vert0.point.length() angle_v0 = atan2(y0, x0) angle_diff = 2 * pi / n vertp = vert0 halfedges = [] for k in range(1, n): angle = k * angle_diff + angle_v0 vertc = Vert((r * cos(angle), r * sin(angle))) edge = Edge() if ids is None else Edge(id=ids[k-1]) halfedges.append(HalfEdge((vertp, vertc), edge)) vertp = vertc edge = Edge() if ids is None else Edge(id=ids[n-1]) halfedges.append(HalfEdge((vertp, vert0), edge)) return HalfFace(halfedges=halfedges, face=Face()).face def extrude_y(self, upy, downy, ids=None): assert len(self.halffaces) == 1 halfface_up = self.halffaces[0] halfedges_down = [] halffaces = [halfface_up] def extrude_vert(vert_up, upy, downy): x1, y1 = vert_up.point vert_up.point = Vector((x1, upy, -y1)) vert_down = Vert((x1, downy, -y1)) return vert_up, vert_down vp_down = None for he_up in halfface_up.halfedges: # vertices vc_up, vc_down = extrude_vert(he_up.verts[1], upy, downy) # edges e_down = Edge() ec_side = Edge() if vp_down is None: v1_up, v1_down = vc_up, vc_down e0_down = e_down e1_side = ec_side else: # down halfedge halfedges_down.append(HalfEdge([vc_down, vp_down], e_down)) # side face he1 = HalfEdge([vp_down, vc_down], e_down) he2 = HalfEdge([vc_down, vc_up], ec_side) he3 = HalfEdge([vc_up, vp_up], he_up.edge) he4 = HalfEdge([vp_up, vp_down], ep_side) halfface_side = HalfFace(halfedges=[he1, he2, he3, he4], face=Face(type='face', id=he_up.edge.id)) halffaces.append(halfface_side) # next vp_up, vp_down = vc_up, vc_down ep_side = ec_side he_up = halfface_up.halfedge # joining down halfedge halfedges_down.append(HalfEdge([v1_down, vp_down], e0_down)) # joining side face he1 = HalfEdge([vp_down, v1_down], e0_down) he2 = HalfEdge([v1_down, v1_up], e1_side) he3 = HalfEdge([v1_up, vp_up], he_up.edge) he4 = HalfEdge([vp_up, vp_down], ep_side) halfface_side = HalfFace(halfedges=[he1, he2, he3, he4], face=Face(type='face', id=he_up.edge.id)) halffaces.append(halfface_side) # up and down faces face_down = Face() if ids is not None: self.type = face_down.type = 'face' self.id, face_down.id = ids halfface_down = HalfFace(halfedges=reversed(halfedges_down), face=face_down) halffaces.append(halfface_down) return Cell(halffaces=halffaces) def pyramid(self, upy, downy, id=None): self.assert_valid() assert len(self.halffaces) == 1 halfface_down = self.halffaces[0] halffaces = [halfface_down] vert_up = Vert((0., upy, 0.)) def change_vert(vert_down, downy): x1, y1 = vert_down.point vert_down.point = Vector((-x1, downy, -y1)) return vert_down vp_down = None for he in halfface_down.halfedges: # vertices vc_down = change_vert(he.verts[1], downy) # edges ec_side = Edge() if vp_down is None: v1_down = vc_down e1_side = ec_side else: # side face he1 = HalfEdge([vc_down, vp_down], he.edge) he2 = HalfEdge([vp_down, vert_up], ep_side) he3 = HalfEdge([vert_up, vc_down], ec_side) halfface_side = HalfFace(halfedges=[he1, he2, he3], face=Face(type='face', id=he.edge.id)) halffaces.append(halfface_side) # next vp_down = vc_down ep_side = ec_side he = halfface_down.halfedge # joining side face he1 = HalfEdge([v1_down, vp_down], he.edge) he2 = HalfEdge([vp_down, vert_up], ep_side) he3 = HalfEdge([vert_up, v1_down], e1_side) halfface_side = HalfFace(halfedges=[he1, he2, he3], face=Face(type='face', id=he.edge.id)) halffaces.append(halfface_side) # down face if id is not None: self.type = 'face' self.id = id return Cell(halffaces=halffaces) class Cell (GeomBase): dim = 3 fields_arg = 'halffaces', fields_kwarg = 'indices', fields_geom = 'halfface', def __init__(self, *, halffaces=None): if halffaces is not None: phf = halffaces[-1] for hf in halffaces: phf._nextatcell = hf phf = hf for he in hf.halfedges: if len(he.edge.halfedges) == 2: #XXX: he.edge.halfedges[0].other = he.edge.halfedges[1] he.edge.halfedges[1].other = he.edge.halfedges[0] self.halfface = halffaces[0] self.indices = None def assert_valid(self): assert all(isinstance(f, HalfFace) for f in self.halffaces) assert all(hf.assert_valid() for hf in self.halffaces) assert self.halfface is not None # len > 0 assert self.halfface is not self # len > 1 assert self.halfface._nextatcell is not self # len > 2 assert self.halfface._nextatcell._nextatcell is not self # len > 3 assert len(list(self.edges)) > 3 assert len(list(self.verts)) > 3 assert all(hf.halfedge.other.halfface in self.halffaces for hf in self.halffaces) return True def __iter__(self): if self.halfface is None: return hf = self.halfface while True: yield hf hf = hf._nextatcell if hf is self.halfface: return halffaces = property(__iter__) @property def faces(self): for hf in self.halffaces: yield hf.face @property def edges(self): cache = [] for f in self.faces: for e in f.edges: if e not in cache: cache.append(e) yield e @property def verts(self): cache = [] for hf in self.halffaces: for v in hf.verts: if v not in cache: cache.append(v) yield v def add(self, halfface): halfface._nextatcell = self.halfface._nextatcell self.halfface._nextatcell = halfface def split(self, split_edges, id=None): halffaces, halffaces1, halffaces2 = [self.halfface], [self.halfface], [] halfedges1, halfedges2 = [], [] while halffaces: for he in halffaces.pop().halfedges: hf = he.other.halfface if he.edge in split_edges: halfedges1.append(HalfEdge.from_other(he)) if hf not in halffaces2: halffaces2.append(hf) else: if hf not in halffaces1: halffaces.append(hf) halffaces1.append(hf) assert len(halfedges1) > 2 halffaces = halffaces2[:] while halffaces: for he in halffaces.pop().halfedges: if he.edge in split_edges: halfedges2.append(HalfEdge.from_other(he)) else: hf = he.other.halfface if hf not in halffaces2: halffaces.append(hf) halffaces2.append(hf) assert len(halfedges2) > 2 # new face face = Face(type='cut', id=id) halfface1 = HalfFace(halfedges=HalfFace._sorted_halfedges(halfedges1), face=face) halfface2 = HalfFace(halfedges=HalfFace._sorted_halfedges(halfedges2), face=face) # update cell phf = halfface1 for hf in halffaces1: phf._nextatcell = hf phf = hf phf._nextatcell = halfface1 # new cell halffaces2.append(halfface2) new_cell = Cell(halffaces=halffaces2) return new_cell class Polyhedron: def __init__(self): self._cells = [] def clone(self): clone_data = {} obj = self.__class__() funcs = deque(f for o in self._cells for f in o.clone(clone_data)) obj._cells = [clone_data[id(o)] for o in self._cells] while funcs: f = funcs.popleft() r = f(clone_data) if r is not None: funcs.extendleft(reversed(list(r))) return obj def assert_valid(self): import itertools assert all(isinstance(c, Cell) and c.assert_valid() for c in self.cells) assert all(isinstance(f, Face) and f.assert_valid() for f in self.faces) assert all(isinstance(e, Edge) and e.assert_valid() for e in self.edges) assert all(isinstance(v, Vert) and v.assert_valid() for v in self.verts) assert all(not v1.equalfuzzy(v2) for v1, v2 in itertools.combinations(self.verts, 2)), self.verts return True def __str__(self): verts = len(self.verts) edges = len(self.edges) faces = len(self.faces) cells = len(self.cells) euler = verts - edges + faces - cells return 'χ={} v={} e={} f={} c={}'.format(euler, verts, edges, faces, cells) def verts_string(self, verts): return '-'.join(str(self.verts.index(v)) for v in verts) @property def cells(self): return self._cells @cells.setter def cells(self, cells): self._cells = cells @property def faces(self): cache = [] for c in self.cells: for f in c.faces: if f not in cache: cache.append(f) return cache @property def edges(self): cache = [] for f in self.faces: for e in f.edges: if e not in cache: cache.append(e) return cache @property def verts(self): cache = [] for f in self.faces: for v in f.verts: if v not in cache: cache.append(v) return cache def set_verts(self, *args): self._polytopes = [Vert(arg) for arg in args] def set_edges(self, *args): halfedges = [] for arg in args: verts = [self._polytopes[i] for i in arg] halfedges.append(HalfEdge(verts=verts, edge=Edge())) self._polytopes = halfedges def set_faces(self, *args, ids=None): halffaces = [] if ids is None: faces = [Face() for unused in args] else: assert len(args) == len(ids) faces = [Face(type='face', id=fid) for fid in ids] for arg, face in zip(args, faces): halfedges = [] for i in arg: # this only works if args describe one closed cell if i > 0: he = self._polytopes[i-1] elif i < 0: he = HalfEdge.from_other(self._polytopes[-i-1]) else: raise ValueError() halfedges.append(he) halfface = HalfFace(halfedges=halfedges, face=face) halffaces.append(halfface) del self._polytopes self._cells = [Cell(halffaces=halffaces)] _next_split_id = 0 def split_plane(self, plane, indexpos=None): # split intersected edges new_verts = [] for edge in self.edges[:]: pos, vert = plane.intersect_segment(*edge.halfedges[0].verts) if pos > 0: edge.split(vert) new_verts.append(vert) elif pos == 0 and vert not in new_verts: new_verts.append(vert) # split intersected faces new_edges = [] for face in self.faces[:]: split_verts = [v for v in face.verts for nv in new_verts if nv is v] assert 0 <= len(split_verts) <= 2, split_verts if len(split_verts) == 2: for he in face.halffaces[0].halfedges: if he.verts == split_verts or he.verts == [split_verts[1], split_verts[0]]: new_edges.append(he.edge) break else: new_edge = face.split(split_verts) new_edges.append(new_edge) # split cells split_id = self._next_split_id self.__class__._next_split_id += 1 for cell in self.cells[:]: split_edges = [e for e in cell.edges if e in new_edges] if len(split_edges) > 2: new_cell = cell.split(split_edges, split_id) self.cells.append(new_cell) else: new_cell = None if indexpos is not None: for hf in cell.halffaces: for he in hf.halfedges: if he.edge not in split_edges: sd1 = -plane.signed_distance(he.verts[0].point) # the verts of the edge e cannot be both in range epsilon to the plane, # otherwise e would be in split_edges, so only test one vert for epsilon if sd1 > epsilon or sd1 >= -epsilon and plane.signed_distance(he.verts[1].point) < 0: if new_cell is not None: new_cell.indices = cell.indices new_cell = cell elif new_cell is None: break indices = list(cell.indices) indices[indexpos] += 1 new_cell.indices = tuple(indices) break else: continue break return split_id def scale(self, value): for v in self.verts: v.point = v.point.scaled(value) def bevel(self, width): faces = self.faces f_vverts_eedges = {} for f in faces: vverts = {id(he.verts[1]): Vert(he.bevel_point(width), id=f.id) for he in f.halffaces[0].halfedges} eedges = {id(e): Edge() for e in f.edges} f_vverts_eedges[f] = (vverts, eedges) for c in self.cells: # create the faces that replace the old edges vhalfedges = OrderedDict() # for reproducible build for he1 in (he for hf in c.halffaces for he in hf.halfedges): if he1.halfface.face.type == 'bevel': continue he3 = he1.other if he3.halfface.face.type == 'bevel': continue vverts1, eedges1 = f_vverts_eedges[he1.halfface.face] vverts3, eedges3 = f_vverts_eedges[he3.halfface.face] idhe1v2 = id(he1.verts[1]) idhe3v2 = id(he3.verts[1]) # new halfedges for the adjacent vertex-faces he2 = HalfEdge([], edge=Edge()) he4 = HalfEdge([], edge=Edge()) vhalfedges.setdefault(idhe1v2, []).append(he2) vhalfedges.setdefault(idhe3v2, []).append(he4) # update halfedges for the adjacent faces ide = id(he1.edge) edge = eedges1[ide] he1.edge = edge edge.halfedges.append(he1) edge = eedges3[ide] he3.edge = edge edge.halfedges.append(he3) # replace the adjacent verts vert1 = vverts1[idhe3v2] vert2 = vverts1[idhe1v2] vert3 = vverts3[idhe1v2] vert4 = vverts3[idhe3v2] he1.verts[:] = [vert1, vert2] he2.verts[:] = [vert2, vert3] he3.verts[:] = [vert3, vert4] he4.verts[:] = [vert4, vert1] # new halfedges for the new face he1 = HalfEdge.from_other(he1) he2 = HalfEdge.from_other(he2) he3 = HalfEdge.from_other(he3) he4 = HalfEdge.from_other(he4) c.add(HalfFace(halfedges=[he4, he3, he2, he1], face=Face(type='bevel'))) # create the faces that replace the old verts for halfedges in vhalfedges.values(): c.add(HalfFace(halfedges=HalfFace._sorted_halfedges(halfedges), face=Face(type='bevel'))) def remove_faces(self, func): for cell in self.cells: halffaces = list(cell.halffaces) phf = halffaces[-1] for hf in halffaces: if func(hf.face): phf._nextatcell = hf._nextatcell hf._nextatcell = None hf.face.halffaces.remove(hf) hf.face = None if hf is cell.halfface: cell.halfface = phf._nextatcell else: phf = hf def remove_cells(self, func): self._cells = [c for c in self._cells if not func(c)] pybik-2.1/buildlib/py2pyx.py0000775000175000017500000001154712437372417016302 0ustar barccbarcc00000000000000#!/usr/bin/python3 #-*- coding:utf-8 -*- # Copyright © 2009, 2011-2014 B. Clausius # # 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 3 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, see . import sys, os, re class Py2pyxParseError (Exception): pass def main(argv): if not (1 < len(argv) <= 4): print('usage:', os.path.basename(__file__), 'python-file [pyx-filename [pxd-filename]]', file=sys.stderr) return 1 arg_src = argv[1] arg_dst = argv[2] if len(argv) > 2 else None arg_pxd = argv[3] if len(argv) > 3 else None if not os.path.exists(arg_src): print('error:', arg_src, 'does not exist', file=sys.stderr) return 1 create_pyx(arg_src, arg_dst, arg_pxd) return 0 def create_pyx(src_path, dst_path, pxd_path): errors = 0 openr = lambda path: open(path, 'rt', encoding='utf-8') openw = lambda path: open(path, 'wt', encoding='utf-8') if path else sys.stdout next_cntlines, next_pyxpat, next_pxdpat = 0, None, None # key: px command # value: # pattern for pyx-file or None (copy line), # pattern for pxd-file or None (skip line), # count next lines or "count" (use px argument), # next lines replace pattern for pyx-file or None, # next lines replace pattern for pxd-file or None fdict = { None: (None, None, 0, None, None), '+': (r'\1\5\6 \2\n', r'\1\5', 0, None, None), '-': (r'\1#\2\5\6\n', None, 1, r'\1#\2\5\6\n', r'\1\5'), ':': (r'\1#\2\5\6\n', None, '*', r'\1#\2\5\6\n', r'\1\5'), '.': (r'\1#\2\5\6\n', None, 0, None, None), '/': (r'\1\5\6 \2\n', r'\1\5', 1, r'\1#\2\5\6\n', None), '>': (r'\1#\2\5\6\n', r'\1\5', 0, None, None), } fdict['#'] = fdict['>'] # groups in match objects and patterns # 1: leading space # 2: px command # 3: pxd flag # 4: px key # 5: px argument # 6: trailing ":" pxd_flag = False with openr(src_path) as srcf, openw(dst_path) as dstf, openw(pxd_path) as pxdf: pxdf.write('#file: {}\n\n'.format(src_path)) for lineno, line in enumerate(srcf): try: match = re.match(r'^( *)(#px *(d?)(.)|)(.*?)(:?)\n$', line) if match.group(2): if next_cntlines == 0: pxd_flag = match.group(3) == 'd' elif next_cntlines == 1: raise Py2pyxParseError('#px-command found, normal line expected') elif next_cntlines == '*': if match.group(4) != '.': raise Py2pyxParseError('closing #px-command or normal line expected') else: assert False pyxpat, pxdpat, next_cntlines, next_pyxpat, next_pxdpat = fdict[match.group(4)] elif next_cntlines == 0: pyxpat, pxdpat, next_cntlines, next_pyxpat, next_pxdpat = fdict[match.group(4)] elif next_cntlines == 1: pyxpat = next_pyxpat pxdpat = next_pxdpat next_cntlines = 0 elif next_cntlines == '*': pyxpat = next_pyxpat pxdpat = next_pxdpat except Exception as e: print('%s:%d:'%(src_path, lineno+1), e, file=sys.stderr) print(' Invalid line:', line, file=sys.stderr, end='') pyxpat = None pxdpat = None next_cntlines = 0 errors += 1 finally: pyxline = line if pyxpat is None else match.expand(pyxpat) pxdline = pxdpat and match.expand(pxdpat) dstf.write(pyxline) if pxd_flag and pxdline is not None: pxdline = pxdline.rstrip() + ' #line {}\n'.format(lineno+1) pxdf.write(pxdline) if errors: raise Py2pyxParseError('create_pyx failed with %s errors' % errors) if __name__ == '__main__': sys.exit(main(sys.argv)) pybik-2.1/buildlib/translation_from_ui.py0000775000175000017500000001137012556223565021100 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2013-2015 B. Clausius # # 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 3 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, see . import sys, os import itertools from collections import OrderedDict from xml.etree import ElementTree def get_string(prop): string = prop.find('string') if string is None or string.attrib.get('notr') == 'true': return None return string.text def parse_file(filename): tree = ElementTree.parse(filename) root = tree.getroot() window = root.find('widget') widgets = OrderedDict() child_items = [] for prop in window.findall('property'): text = get_string(prop) if text is not None: child_items.append(('window', prop.attrib['name'], text)) for tag in window: for widget in itertools.chain(tag.iter('widget'), tag.iter('action')): if widget.tag == 'widget': widget_class = widget.attrib['class'] else: widget_class = 'QAction' widget_name = widget.attrib['name'] for prop in itertools.chain(widget.findall('property'), widget.findall('attribute')): itemtype = prop.tag prop_name = prop.attrib['name'] text = get_string(prop) if text is None: continue if itemtype == 'property': child_items.append((itemtype, widget_class, widget_name, prop_name, text)) if itemtype == 'attribute': parent = window.find(".//*[@name='%s']/.." % widget_name) if parent and parent.attrib.get('class') == 'QTabWidget': parent_name = parent.attrib['name'] widgets.setdefault(parent_name, 'QTabWidget') child_items.append(('QTabWidget', parent_name, widget_name, text)) else: child_items.append((itemtype, widget_class, widget_name, prop_name, text)) if widget_class.startswith('Q'): widgets.setdefault(widget_name, widget_class) return window.attrib['class'], widgets, child_items def write_file(window_class, widgets, child_items, file): print( '''# -*- coding: utf-8 -*- # auto-generated file from PyQt5.QtWidgets import {} def retranslate(window):'''.format(', '.join(sorted(set(widgets.values())))), file=file) print(' class UI:', file=file) print(' __slots__ = ()', file=file) for widget_name, widget_class in widgets.items(): print(' {1} = window.findChild({0}, {1!r})'.format(widget_class, widget_name), file=file) print(' ui = UI()\n', file=file) for itemtype, *itemargs in child_items: if itemtype == 'window': prop_name, text = itemargs prop_name = ''.join(('set', prop_name[0].upper(), prop_name[1:])) print(' window.{}(_({!r}))'.format(prop_name, text), file=file) elif itemtype == 'property': widget_class, *itemargs = itemargs print(' ui.{0}.setProperty({1!r}, _({2!r}))'.format(*itemargs), file=file) if widget_class == 'QAction': print(' window.addAction(ui.{0})'.format(*itemargs), file=file) elif itemtype == 'QTabWidget': print(' ui.{0}.setTabText(ui.{0}.indexOf(ui.{1}), _({2!r}))'.format(*itemargs), file=file) else: print(' #unknown:', itemtype, *itemargs) print('\n return ui\n', file=file) def usage(exitcode): print('usage:') print(' ', os.path.basename(__file__), '-h|--help') print(' ', os.path.basename(__file__), 'uifilename') print(' ', os.path.basename(__file__), 'uifilename', 'pyfilename') sys.exit(exitcode) def main(): args = sys.argv[1:] if not args: usage(1) if args[0] in ['-h', '--help']: usage(0) windowinfo = parse_file(args[0]) args = args[1:] if args: with open(args[0], 'wt', encoding='utf-8') as file: write_file(*windowinfo, file=file) else: write_file(*windowinfo, file=sys.stdout) if __name__ == '__main__': main() pybik-2.1/buildlib/modeldata.py0000775000175000017500000006472712556223565016772 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2015 B. Clausius # # 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 3 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, see . import sys, os sys.path.insert(0, '.') import pickletools from multiprocessing import Pool, cpu_count from collections import defaultdict, OrderedDict from bisect import bisect_left from array import array from itertools import chain from math import sin, cos, pi from pybiklib.debug import DEBUG, DEBUG_MSG, DEBUG_NOLABEL, DEBUG_NOBEVEL, DEBUG_INVISIBLE, DEBUG_INDEXONLY from pybiklib.modelcommon import epsilon, filebyteorder, get_texcoords_range # executable script needs absolute imports from buildlib.geom import roundeps, Vector from buildlib.modeldef import modeldefs dumps = None def make_dumps(reproducible): global dumps import io import pickle if not reproducible: dumps = pickle.dumps return try: class _Pickler (pickle._Pickler): def save_dict(self, obj): if self.bin: self.write(pickle.EMPTY_DICT) else: # proto 0 -- can't use EMPTY_DICT self.write(pickle.MARK + pickle.DICT) self.memoize(obj) self._batch_setitems(sorted(obj.items())) pickle._Pickler.dispatch[dict] = save_dict def _dumps(obj, protocol=None, *, fix_imports=True): f = io.BytesIO() try: _Pickler(f, protocol, fix_imports=fix_imports).dump(obj) return f.getvalue() except Exception: print('warning: using undocumented interface in module pickle failed, models will not be reproducible:') sys.excepthook(*sys.exc_info()) return pickle.dumps(obj, protocol, fix_imports=fix_imports) _dumps({1:2, 3:4}) except Exception: print('warning: using undocumented interface in module pickle failed, models will not be reproducible:') sys.excepthook(*sys.exc_info()) _dumps = pickle.dumps dumps = _dumps def equal_vector_fuzzy(v1, v2): for v1k, v2k in zip(v1, v2): if abs(v1k - v2k) > epsilon: return False return True class VectorData: __slots__ = 'vectors indices sorted cnts dups toindex'.split() def __init__(self, fast): self.vectors = [] self.indices = [] self.sorted = [] self.cnts = 0 self.dups = 0 self.toindex = self.toindex_fast if fast else self.toindex_dedup def toindex_dedup(self, vector): vector = vector.rounded() vector = [(0. if v == 0. else v) for v in vector] # 0.0 == -0.0 self.cnts += 1 si = bisect_left(self.sorted, vector) i = len(self.vectors) if si < i and self.sorted[si] == vector: self.dups += 1 return self.indices[si] self.vectors.append(vector) self.sorted.insert(si, vector) self.indices.insert(si, i) return i def toindex_fast(self, vector): vector = vector.rounded() i = len(self.vectors) self.vectors.append(vector) return i class ModelFactory: mtype_attributes = ( 'name', 'mformat', 'sizenames', 'defaultsize', 'symmetries', 'axes', 'symbols', 'symbolsI', 'faces', 'facekeys', 'normal_rotation_symbols', 'rotation_symbols', 'rotation_matrices', 'face_permutations', 'default_rotation') def __init__(self, modeldef): self.modeldef = modeldef() self.create_rotations() def __getattr__(self, attrname): return getattr(self.modeldef, attrname) @staticmethod def _matrix_equal(m1, m2): for line1, line2 in zip(m1, m2): for value1, value2 in zip(line1, line2): if abs(value1 - value2) > epsilon: return False return True @staticmethod def _mult_matrix_vector3(matrix, vector): return Vector(sum(matrix[i][k]*vector[k] for k in range(3)) for i in range(3)) @staticmethod def _mult_matrix(matrix1, matrix2): return [[sum(matrix1[i][k]*matrix2[k][j] for k in range(4)) for j in range(4)] for i in range(4)] @staticmethod def _create_rotation(axis, angle): angle = angle / 180. * pi sa = sin(angle) ca = cos(angle) e_ca = 1 - ca n1 = axis[0] n2 = axis[1] n3 = axis[2] m = [ [n1*n1*e_ca + ca, n1*n2*e_ca - n3*sa, n1*n3*e_ca + n2*sa, 0.], [n2*n1*e_ca + n3*sa, n2*n2*e_ca + ca, n2*n3*e_ca - n1*sa, 0.], [n3*n1*e_ca - n2*sa, n3*n2*e_ca + n1*sa, n3*n3*e_ca + ca, 0.], [0., 0., 0., 1.], ] #XXX: try to keep the matrix clean for y, line in enumerate(m): for x, value in enumerate(line): if abs(value) < epsilon: m[y][x] = 0. return m def _create_permutation(self, matrix): permutation = {} for sym1, symI1, axis1 in zip(self.symbols, self.symbolsI, self.axes): for sym2, symI2, axis2 in zip(self.symbols, self.symbolsI, self.axes): axisR = self._mult_matrix_vector3(matrix, axis1) if axisR.equalfuzzy(axis2): permutation[sym2] = sym1 permutation[symI2] = symI1 elif axisR.inversfuzzy(axis2): permutation[symI2] = sym1 permutation[sym2] = symI1 return permutation def create_rotations(self): prim = [] for axis, sym, symI, symmetry in zip(self.axes, self.symbols, self.symbolsI, self.symmetries): angle = 360. / symmetry # for some models (towers, bricks) rotations are equal to the invers rotations, # but the symbols are different prim.append((sym, self._create_rotation(axis, angle))) prim.append((symI, self._create_rotation(axis, -angle))) self.normal_rotation_symbols = {'': ''} transform = [['', [[1.,0.,0.,0.],[0.,1.,0.,0.],[0.,0.,1.,0.],[0.,0.,0.,1.]]]] for sp, p in prim: transform.append([sp, p]) for sm, m in transform: for sp, p in prim: n = self._mult_matrix(m, p) sn = sm + sp for st, t in transform: if self._matrix_equal(t, n): self.normal_rotation_symbols[sn] = st break else: self.normal_rotation_symbols[sn] = sn transform.append([sn, n]) self.rotation_symbols = [s for s, m in transform] self.rotation_matrices = [m for s, m in transform] self.face_permutations = {s: self._create_permutation(m) for s, m in transform} def get_rotated_position(self, cells): rotated_position = {} centers = [c.center() for c in cells] for b, center in enumerate(centers): for sym, rotation in zip(self.rotation_symbols, self.rotation_matrices): coords = self._mult_matrix_vector3(rotation, center) for p, center2 in enumerate(centers): if equal_vector_fuzzy(center2, coords): if sym not in rotated_position: rotated_position[sym] = [0] * len(cells) rotated_position[sym][p] = b break else: assert False, 'not a permutation' return rotated_position @staticmethod def mark_invisible_faces_bevel(polys): for cell in polys.cells: for other in ['cut', 'bevel']: for hf in cell.halffaces: if hf.face.type != 'bevel': continue other_removed = False for he in hf.halfedges: face_ = he.other.halfface.face if face_.type == 'face': break if face_.type == other: break if face_.type.endswith('_removed'): other_removed = True else: if other_removed: hf.face.type += '_removed' def get_data(self, sizes, vectordata): polys, slice_centers = self.create_cells(sizes) normals_polys = OrderedDict() # for reproducible build for cell in polys.cells: for hf in cell.halffaces: key = (cell.indices, hf.face.id) normals_polys[key] = self.normals[hf.face.id] if hf.face.type == 'face' else hf.normal() data_cells_visible_faces = [[f.id for f in cell.faces if f.type == 'face'] for cell in polys.cells] normals = [self.normals[sym] for sym in self.faces] polys_verts = [v.point for v in polys.verts] data_texranges_mosaic = [list(get_texcoords_range(polys_verts, normal)) for normal in normals] data_normals = [vectordata.toindex(normal) for normal in normals] data_rotated_position = self.get_rotated_position(polys.cells) data_cell_indices = [cell.indices for cell in polys.cells] data_pick_polygons = list(self.gl_pick_polygons(polys.cells, vectordata)) # beveled cells normals_polys = {k: vectordata.toindex(n) for k, n in normals_polys.items()} polys_beveled = polys polys_beveled.bevel(self.bevel_width) self.mark_invisible_faces_bevel(polys_beveled) if DEBUG_INVISIBLE: for face in polys_beveled.faces: if face.type.endswith('_removed'): face.type = face.type.rsplit('_', 1)[0] else: face.type += '_removed' polys_beveled.remove_faces(lambda f: f.type.endswith('_removed')) data_block_polygons = [[list(self.gl_label_polygons(cell, vectordata)), list(self.gl_black_polygons(cell, normals_polys, vectordata))] for cell in polys_beveled.cells] return { 'rotated_position': data_rotated_position, 'cell_indices': data_cell_indices, 'cells_visible_faces': data_cells_visible_faces, 'texranges_mosaic': data_texranges_mosaic, 'normals': data_normals, 'block_polygons': data_block_polygons, 'pick_polygons': data_pick_polygons, 'slice_centers': slice_centers, } def gl_label_polygons(self, cell, vectordata): if DEBUG: if DEBUG_NOLABEL: return for halfface in cell.halffaces: if halfface.face.type != 'face': continue symbol = halfface.face.id faceno = self.faces.index(symbol) cell_vertices = [vectordata.toindex(he.verts[0].point) for he in halfface.halfedges] cell_vertices.append(faceno) yield cell_vertices @staticmethod def gl_black_polygons(cell, inormals, vectordata): if DEBUG: if DEBUG_NOBEVEL: return for halfface in cell.halffaces: if halfface.face.type == 'face': continue vertices = [he.verts[0] for he in halfface.halfedges] if halfface.face.type == 'cut': inormal = inormals[(cell.indices, halfface.face.id)] vnit = ((vectordata.toindex(v.point), inormal) for v in vertices) yield list(chain(*vnit)) elif halfface.face.type == 'bevel': vnit = ((vectordata.toindex(v.point), inormals[(cell.indices, v.id)]) for v in vertices) yield list(chain(*vnit)) def gl_pick_polygons(self, cells, vectordata): for cellidx, cell in enumerate(cells): for halfface in cell.halffaces: if halfface.face.type != 'face': continue symbol = halfface.face.id face = self.faces.index(symbol) visible_face_indices = [i for i, he in enumerate(halfface.halfedges) if he.other.halfface.face.type == 'face'] edges_iverts = [vectordata.toindex(he.verts[0].point) for he in halfface.halfedges] if len(visible_face_indices) == 0: picktype = 0 elif len(visible_face_indices) == 1: if len(edges_iverts) == 3: picktype = 1 elif len(edges_iverts) == 4: picktype = 2 elif len(edges_iverts) == 6: picktype = 4 else: assert False, len(edges_iverts) i = visible_face_indices[0] edges_iverts = edges_iverts[i:] + edges_iverts[:i] elif len(visible_face_indices) == 2: assert 3 <= len(edges_iverts) <= 5, len(edges_iverts) i = visible_face_indices[0] if len(edges_iverts) < 5: picktype = 3 else: picktype = 5 if i+1 == visible_face_indices[1]: edges_iverts = edges_iverts[i:] + edges_iverts[:i] elif visible_face_indices == [0, len(edges_iverts)-1]: i = visible_face_indices[1] edges_iverts = edges_iverts[i:] + edges_iverts[:i] else: picktype = -1 else: picktype = -1 yield [cellidx, [face, picktype], edges_iverts] class Dedup: def __init__(self): self.dedup_data = defaultdict(list) self.cnt_dups = 0 self.cnt_values = 0 def _float(self, value): self.cnt_values += 1 dddlt = self.dedup_data['f'] value = roundeps(value) if value == 0.0: # 0.0 == -0.0 value = 0.0 # for reproducible build didx = bisect_left(dddlt, value) if didx < len(dddlt) and dddlt[didx] == value: self.cnt_dups += 1 return dddlt[didx], True, 'f' else: dddlt.insert(didx, value) return value, False, 'f' def _recursion(self, value, iterable): dedup = True vtypes = [] for k, v in iterable: v, d, t = self.dedup(v) dedup = dedup and d vtypes.append(t) value[k] = v return dedup, '('+''.join(vtypes)+')' def _replace(self, value, dedup, vtype): self.cnt_values += 1 dddlt = self.dedup_data[vtype] try: return self._replace_bisect(dddlt, value, dedup, vtype) except TypeError: return self._replace_index(dddlt, value, dedup, vtype) def _replace_index(self, dddlt, value, dedup, vtype): if not dedup: #assert value not in dddlt dddlt.append(value) return value, False, vtype try: didx = dddlt.index(value) except ValueError: dddlt.append(value) return value, False, vtype else: dvalue = dddlt[didx] self.cnt_dups += 1 return dvalue, True, vtype def _replace_bisect(self, dddlt, value, unused_dedup, vtype): didx = bisect_left(dddlt, value) try: dvalue = dddlt[didx] except IndexError: dddlt.append(value) return value, False, vtype if value == dvalue: self.cnt_dups += 1 return dvalue, True, vtype else: dddlt.insert(didx, value) return value, False, vtype def dedup(self, value): if isinstance(value, dict): value = {(sys.intern(k) if type(k) is str else k):v for k,v in value.items()} dedup, vtype = self._recursion(value, value.items()) return self._replace(value, dedup, 'd' + vtype) elif isinstance(value, list): dedup, vtype = self._recursion(value, enumerate(value)) return self._replace(tuple(value), dedup, 'a' + vtype) elif isinstance(value, tuple): value = list(value) dedup, vtype = self._recursion(value, enumerate(value)) return self._replace(tuple(value), dedup, 'a' + vtype) elif isinstance(value, float): return self._float(value) elif isinstance(value, int): return value, True, 'i' elif isinstance(value, str): return sys.intern(value), True, 's' elif isinstance(value, type(None)): return value, True, 'n' else: assert False, type(value) def pool_functions(parallel, reproducible): pool = None if reproducible: print('warning: using undocumented interface in module pickle for reproducible build') try: if parallel > 1: pool = Pool(processes=parallel, initializer=make_dumps, initargs=[reproducible]) except OSError as e: print('process pool not available ({}):'.format(e)) print(' deactivating multiprocessing') sys.stdout.flush() # when Pool(…) fails this line is if pool is not None: return pool.imap_unordered else: make_dumps(reproducible) return map #XXX: speedup parallel builds, longer jobs first fileorder = 'b111 b101 b000 p111111 b010 p101111 b100 b110 p010000 p000000 b011 t1111 b001 t0000 t1011 t0100'.split() def get_datafilename(fileclass, sizes, fast): if fast: return fileclass + ''.join(str(s-1) for s in sizes) else: sizes = fileclass + ''.join(str((s-1)%2) for s in sizes) try: priority = fileorder.index(sizes) + 1 except ValueError: priority = 99 return '{:02}'.format(priority) + sizes def enum_modelfiles(fast, maxsize, Factory): if isinstance(maxsize, tuple): minsize, maxsize = maxsize else: minsize = 1 maxsize += 1 def tuples(maxlen, part=()): if maxlen == len(part): yield part else: for i in range(minsize, maxsize): yield from tuples(maxlen, part+(i,)) for size in tuples(len(Factory.sizenames)): norm_size, sizes = Factory.norm_sizes(size) if sizes is None: continue filename = get_datafilename(Factory.fileclass, sizes, fast) yield filename, sizes, size, norm_size def pool_enum_modelfiles(dirname, testfunc, fast, maxsize): ignored = [] modelfiles = [] for Factory in modeldefs: for filename, *unused in enum_modelfiles(fast, maxsize, Factory): filename = os.path.join(dirname, filename) if filename in modelfiles or filename in ignored: continue if testfunc(filename): modelfiles.append(filename) else: ignored.append(filename) if modelfiles: for filename in sorted(ignored): print('skipping', filename) return sorted(modelfiles) def pool_create_modelfiledata(path, fast, maxsize): filename = os.path.basename(path) savedata = {} vectordata = VectorData(fast) for Factory in modeldefs: sizes_list = [] factory = None for _filename, sizes, *unused in enum_modelfiles(fast, maxsize, Factory): if _filename != filename: continue if sizes in sizes_list: continue sizes_list.append(sizes) if factory is None: factory = ModelFactory(Factory) savedata.setdefault(factory.type, {})[sizes] = factory.get_data(sizes, vectordata) vectors = array('f', chain.from_iterable(vectordata.vectors)) return savedata, vectors, vectordata.cnts, vectordata.dups def format_seconds(seconds): if seconds > 60: return '{:.0f}m {:.2f}s'.format(*divmod(seconds, 60)) else: return '{:.2f}s'.format(seconds) def pool_create_modelfile(filename, fast, pickle_protocol, maxsize): import time seconds = time.process_time() savedata, vectors, cnt_vectors, dup_vectors = pool_create_modelfiledata(filename, fast, maxsize) vals = dups = '' if not fast: dedup = Dedup() savedata = dedup.dedup(savedata)[0] if DEBUG_MSG: vals = '\n vals: %6s vec: %6s' % (dedup.cnt_values, cnt_vectors) dups = '\n dups: %6s %6s' % (dedup.cnt_dups, dup_vectors) savedata = dumps(savedata, pickle_protocol) datasize = ['{:.1f} kb'.format(len(savedata) / 1000), '---'] vectorssize = '{:.1f} kb'.format(len(vectors) * vectors.itemsize / 1000) if not fast: savedata = pickletools.optimize(savedata) datasize[1] = '{:.1f} kb'.format(len(savedata) / 1000) seconds = time.process_time() - seconds vlen = array('I', [len(vectors)]) if sys.byteorder != filebyteorder: vlen.byteswap() vectors.byteswap() with open(filename, 'wb') as datafile: datafile.write(savedata) vlen.tofile(datafile) vectors.tofile(datafile) return filename, seconds, 'generated {}, ({}, {}), {}, {} vectors {}{}{}'.format( filename, datasize[0], datasize[1], format_seconds(seconds), len(vectors) / 3, vectorssize, vals, dups) def pool_create_indexdata(fast, maxsize): savedata_type = {} savedata_types = [] savedata_size = {} savedata_sizes = {} savedata_facenames = [] savedata = {'type': savedata_type, 'types': savedata_types, 'normsize': savedata_size, 'sizes': savedata_sizes, 'facenames': savedata_facenames, } facekeys = [] for Factory in modeldefs: factory = ModelFactory(Factory) savedata_type[factory.type] = {attr: getattr(factory, attr) for attr in factory.mtype_attributes} savedata_types.append(factory.type) savedata_size_type = {} savedata_sizes_type = {} savedata_size[factory.type] = savedata_size_type savedata_sizes[factory.type] = savedata_sizes_type for facekey, facename in zip(factory.facekeys, factory.facenames): if facekey not in facekeys: facekeys.append(facekey) savedata_facenames.append((facekey, facename)) for filename, sizes, size, norm_size in enum_modelfiles(fast, maxsize, Factory): savedata_size_type[size] = norm_size if norm_size in savedata_sizes_type: assert [sizes, filename] == savedata_sizes_type[norm_size] else: savedata_sizes_type[norm_size] = [sizes, filename] size_range = ((min(vals), max(vals)) for vals in zip(*savedata_size_type.keys())) defaultsize = savedata_type[factory.type]['defaultsize'] defaultsize = tuple(max(smin, min(s, smax)) for s, (smin, smax) in zip(defaultsize, size_range)) savedata_type[factory.type]['defaultsize'] = defaultsize return savedata def pool_create_indexfile(filename, fast, pickle_protocol, maxsize): import time seconds = time.process_time() savedata = pool_create_indexdata(fast, maxsize) vals = dups = '' if not fast: dedup = Dedup() savedata = dedup.dedup(savedata)[0] if DEBUG_MSG: vals = '\n vals: %6s' % dedup.cnt_values dups = '\n dups: %6s' % dedup.cnt_dups savedata = dumps(savedata, pickle_protocol) datasize = ['{:.1f} kb'.format(len(savedata) / 1000), '---'] if not fast: savedata = pickletools.optimize(savedata) datasize[1] = '{:.1f} kb'.format(len(savedata) / 1000) seconds = time.process_time() - seconds with open(filename, 'wb') as datafile: datafile.write(savedata) return filename, seconds, 'generated {}, ({}, {}), {}{}{}'.format( filename, datasize[0], datasize[1], format_seconds(seconds), vals, dups) def pool_run(args): func, *args = args return func(*args) def get_indexfilename(dirname): return os.path.join(dirname, 'index') def create_modeldata(dirname, testfunc=None, parallel=1, fast=False, pickle_protocol=-1, maxsize=10, reproducible=False): # prepare jobs if testfunc is None: testfunc = lambda arg: True if DEBUG_INDEXONLY: modelfiles = [] else: modelfiles = pool_enum_modelfiles(dirname, testfunc, fast, maxsize) jobs = [(pool_create_modelfile, m, fast, pickle_protocol, maxsize) for m in modelfiles] indexfilename = get_indexfilename(dirname) jobs.append((pool_create_indexfile, indexfilename, fast, pickle_protocol, maxsize)) # run jobs if parallel is True: parallel = cpu_count() if not parallel or parallel < 1: parallel = 1 realparallel = min(parallel, len(jobs)) print('using {} / {} processes'.format(realparallel, parallel)) imap_model = pool_functions(realparallel, reproducible) result = [] for filename, seconds, lines in imap_model(pool_run, jobs): result.append((filename, seconds)) print(lines) sys.stdout.flush() if DEBUG_MSG and not fast: result.sort(key=lambda fs: fs[1], reverse=True) if result != sorted(result, key=lambda fs: fs[0]): print('warning: reorder jobs to optimize parallel build') for filename, seconds in result: print(' ', os.path.basename(filename), format_seconds(seconds)) if __name__ == '__main__': create_modeldata('data/models', maxsize=(1,6)) pybik-2.1/setup.py0000775000175000017500000012247412556223565014404 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2009, 2011-2015 B. Clausius # # 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 3 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, see . # pylint: disable=W0201 from glob import glob import os import sys use_setuptools = not os.getenv('PYBIK_NO_SETUPTOOLS') if use_setuptools: try: import setuptools except ImportError: use_setuptools = False if not use_setuptools: from distutils.core import setup from distutils.cmd import Command from distutils.extension import Extension from distutils import dist from distutils.command.install import install as install_orig else: print('using setuptools') from setuptools import setup from setuptools import Command from setuptools import Extension from setuptools import dist from setuptools.command.install import install as install_orig from distutils.dir_util import remove_tree from distutils.file_util import move_file from distutils.dep_util import newer, newer_group from distutils.log import warn, info, error, debug import distutils.command.build import distutils.command.build_ext import distutils.command.build_scripts import distutils.command.build_py import distutils.command.install_data import distutils.command.install_lib import distutils.command.clean import distutils.command.sdist #from Cython.Distutils import build_ext #print('using', 'setuptools' if use_setuptools else 'distutils') # the clean command should leave a clean tree sys.dont_write_bytecode = True os.environ['PYTHONDONTWRITEBYTECODE'] = '1' from pybiklib import config class Distribution (distutils.dist.Distribution): def __init__(self, attrs=None): self.bug_contact = None self.qt_ui_files = None self.desktop_templates = None #XXX: Mangle alpha/beta/rc versions to PEP440 version scheme for setuptools, pip, pypi ... version = attrs['version'] pep440 = version.replace('~alpha', 'a').replace('~beta', 'b').replace('~rc', 'rc') attrs['version'] = pep440 distutils.dist.Distribution.__init__(self, attrs=attrs) if version != pep440: self.metadata.version = version class build(distutils.command.build.build): """Adds extra commands to the build target.""" user_options = distutils.command.build.build.user_options + [ ('inplace', 'i', 'ignore build-lib and put compiled modules into the source directory'), #XXX: In Python 3.5 distutils.command.build.build has a parallel option ('parallel=', None, 'number of parallel build jobs or "True"'), ('arch-only', None, 'Build only architecture dependent files'), ('indep-only', None, 'Build only architecture independent files'), ('fast', None, 'Build models without optimization'), ('pickle-protocol=', None, 'Pickle protocol for modeldata (default: highest protocol)'), ('maxsize=', None, 'Maximum model size (default: 10)'), ('reproducible', None, 'Build modeldata reproducible (experimental)'), ] boolean_options = distutils.command.build.build.boolean_options + [ 'inplace', 'arch-only', 'indep-only', 'fast', 'reproducible', ] def has_pure_modules(self): return self.indep_only and distutils.command.build.build.has_pure_modules(self) _commands_dict = dict(distutils.command.build.build.sub_commands) # pylint: disable=W0212 sub_commands = [('build_py', has_pure_modules), ('build_ext', lambda self: self.arch_only and self._commands_dict['build_ext'](self)), ('build_scripts', lambda self: self.indep_only and self._commands_dict['build_scripts'](self)), ('build_models', lambda self: self.indep_only), ('build_i18n', lambda self: self.indep_only), ('build_desktop', lambda self: self.indep_only), ('build_man', lambda self: self.indep_only and not self.inplace), ] # pylint: enable=W0212 def initialize_options(self): distutils.command.build.build.initialize_options(self) self.inplace = 0 self.parallel = None self.arch_only = False self.indep_only = False self.fast = False self.pickle_protocol = '-1' self.maxsize = None self.reproducible = False def finalize_options(self): # In Python 3.5 distutils.command.build.build has a parallel option # convert 'true' to True before the base class fails if isinstance(self.parallel, str) and self.parallel.lower() == 'true': self.parallel = True distutils.command.build.build.finalize_options(self) if not self.arch_only and not self.indep_only: self.arch_only = self.indep_only = True class build_csrc (distutils.command.build_ext.build_ext): description = 'build C source code with py2pyx and cython' user_options = distutils.command.build_ext.build_ext.user_options + [ ('cython-opts=', None, 'Cython options'), ('gles=', None, 'Build for GLES (experimental)'), ] def initialize_options(self): distutils.command.build_ext.build_ext.initialize_options(self) self.inplace = None self.cython_opts = '' self.gles = None def finalize_options(self): # deactivate parallel build in Python 3.5, does not work with this command self.parallel = 1 distutils.command.build_ext.build_ext.finalize_options(self) self.set_undefined_options('build', ('inplace', 'inplace'), ) self.cython_opts = self.cython_opts.split() def compare_file(self, filename1, filename2): if self.force or not os.path.exists(filename2): return False with open(filename1, 'rb') as file1, open(filename2, 'rb') as file2: return file1.read() == file2.read() @staticmethod def run_py2pyx(py_file, pyx_file, pxd_file): info('py2pyx: %s --> %s, %s' % (py_file, pyx_file, pxd_file)) from buildlib.py2pyx import create_pyx, Py2pyxParseError try: create_pyx(py_file, pyx_file, pxd_file) except Py2pyxParseError as e: error("error: %s", e) sys.exit(1) identifier_translate = bytes((i if bytes([i]).isalnum() else ord('_')) for i in range(256)) @classmethod def replace_cwd(cls, filename): with open(filename, 'rb') as f: text = f.read() cwdb_esc = bytes(ord(c) for c in os.getcwd()[:32] if ord(c)<128).translate(cls.identifier_translate) text = text.replace(os.getcwdb(), b'/tmp').replace(cwdb_esc, b'_tmp') with open(filename, 'wb') as f: f.write(text) def run_cython(self, cython_opts, infile, outfile): from Cython.Compiler.CmdLine import parse_command_line from Cython.Compiler.Main import compile info('cython: %s --> %s' % (infile, outfile)) args = ['-3', '-o', outfile] + cython_opts + [infile] options, unused_sources = parse_command_line(args) try: result = compile([infile], options) except Exception as e: error("error: %s", e) sys.exit(1) if result.num_errors > 0: sys.exit(1) self.replace_cwd(outfile) def build_pyx(self, py_file, pyx_file, pxd_file): pxd_file_tmp = pxd_file + '.tmp' self.mkpath(os.path.dirname(pyx_file)) self.make_file([py_file], pyx_file, self.run_py2pyx, (py_file, pyx_file, pxd_file_tmp)) if os.path.exists(pxd_file_tmp): if self.compare_file(pxd_file_tmp, pxd_file): os.remove(pxd_file_tmp) info("unchanged file '%s'", pxd_file) else: if os.path.exists(pxd_file): os.remove(pxd_file) move_file(pxd_file_tmp, pxd_file) def build_extension(self, extension): sources = extension.sources depends = sources + extension.depends # generate pxd- and pyx-files from py-files with #px annotations pyx_files = [] pyx_files_dep = [] for in_file in depends: base, ext = os.path.splitext(in_file) if ext == '.py': base = os.path.join(self.build_temp, os.path.splitext(in_file)[0]) basename = os.path.basename(base) dirname = os.path.dirname(base) pyx_file = os.path.join(dirname, '_%s.pyx' % basename) pxd_file = os.path.join(dirname, '_%s.pxd' % basename) self.build_pyx(in_file, pyx_file, pxd_file) if in_file in extension.sources: pyx_files.append(pyx_file) pyx_files_dep.append(pxd_file) if self.gles is not None: info('Changing source for GLES %s', self.gles) with open(pyx_file, 'rt', encoding='utf-8') as f: text = f.read() text = text.replace("DEF SOURCEGLVERSION = 'GL'", "DEF SOURCEGLVERSION = 'GLES%s'" % self.gles) with open(pyx_file, 'wt', encoding='utf-8') as f: f.write(text) elif ext in ('.pxi','.pxd'): out_file = os.path.join(self.build_temp, in_file) self.mkpath(os.path.dirname(out_file)) self.copy_file(in_file, out_file) pyx_files_dep.append(out_file) else: if in_file in extension.sources: pyx_files.append(in_file) else: pyx_files_dep.append(in_file) # generate C-files with cython if extension.language == 'c++': c_file_ext = '.cpp' cython_opts = ['--cplus'] + self.cython_opts else: c_file_ext = '.c' cython_opts = self.cython_opts c_files = [] for in_file in pyx_files: base, ext = os.path.splitext(in_file) if ext == '.pyx': out_file = base + c_file_ext inplace_file = os.path.join('csrc', os.path.basename(out_file)) if os.path.exists(inplace_file) and not self.force: self.mkpath(os.path.dirname(out_file)) self.copy_file(inplace_file, out_file) else: self.make_file(pyx_files+pyx_files_dep, out_file, self.run_cython, (cython_opts, in_file, out_file)) c_files.append(out_file) else: c_files.append(in_file) # exclude Cython-files from dependencies c_files_dep = [] for in_file in pyx_files_dep: base, ext = os.path.splitext(in_file) if ext not in ('.pxi', '.pxd'): c_files_dep.append(in_file) extension.depends = c_files_dep extension.sources = c_files class build_ext (build_csrc): description = distutils.command.build_ext.build_ext.description def build_extension(self, extension): if self.gles == '2': extension.libraries[:] = ['GLESv2'] sources = extension.sources ext_path = self.get_ext_fullpath(extension.name) depends = sources + extension.depends if self.force or newer_group(depends, ext_path, 'newer'): info('building C-Code for %r extension', extension.name) else: debug('skipping %r extension (up-to-date)', extension.name) return # build C-code build_csrc.build_extension(self, extension) # build extension module from C-code distutils.command.build_ext.build_ext.build_extension(self, extension) #HACK: Due to build_csrc.compare_file the C compiler may not run, even though # the dependencies expect this. Therefore update the timestamp manually. ext_path = self.get_ext_fullpath(extension.name) try: os.utime(ext_path, None) except OSError: pass class build_scripts (distutils.command.build_scripts.build_scripts): user_options = distutils.command.build_scripts.build_scripts.user_options + [ ('inplace', 'i', 'ignore build-lib and put compiled modules into the source directory'), ('build-temp=', 't', "temporary build directory"), ] boolean_options = distutils.command.build.build.boolean_options + ['inplace'] def initialize_options(self): distutils.command.build_scripts.build_scripts.initialize_options(self) self.inplace = None self.build_temp = None def finalize_options(self): distutils.command.build_scripts.build_scripts.finalize_options(self) self.set_undefined_options('build', ('inplace', 'inplace'), ('build_temp', 'build_temp'), ) def run(self): build_dir = self.build_dir self.build_dir = self.build_temp distutils.command.build_scripts.build_scripts.run(self) self.build_dir = build_dir for script in self.scripts: outfile = os.path.basename(script) script = os.path.join(self.build_temp, outfile) if not os.path.exists(script): continue if not self.inplace: self.mkpath(self.build_dir) outfile = os.path.join(self.build_dir, outfile) outfile, ext = os.path.splitext(outfile) if ext != '.py': outfile += ext self.copy_file(script, outfile) class build_py(distutils.command.build_py.build_py): description = 'build pure Python modules' user_options = distutils.command.build_py.build_py.user_options + [ ('inplace', 'i', 'ignore build-lib and put compiled UI modules into the source ' 'directory alongside your pure Python modules'), ] boolean_options = distutils.command.build_py.build_py.boolean_options + [ 'inplace'] def initialize_options(self): distutils.command.build_py.build_py.initialize_options(self) self.qt_ui_files = None self.inplace = None def finalize_options(self): distutils.command.build_py.build_py.finalize_options(self) self.qt_ui_files = self.distribution.qt_ui_files self.set_undefined_options('build', ('inplace', 'inplace'), ) def compile_ui(self, ui_file, py_file): from buildlib import translation_from_ui windowinfo = translation_from_ui.parse_file(ui_file) with open(py_file, 'wt', encoding='utf-8') as file: translation_from_ui.write_file(*windowinfo, file=file) def find_package_modules(self, package, package_dir): if package not in self.qt_ui_files: return distutils.command.build_py.build_py.find_package_modules(self, package, package_dir) modules = [] for ui_file in self.qt_ui_files[package]: module = os.path.splitext(os.path.basename(ui_file))[0] modules.append((package, module, ui_file)) return modules def build_module(self, module, infile, package): if infile and infile.endswith('.py'): return distutils.command.build_py.build_py.build_module(self, module, infile, package) if self.inplace: package_dir = self.get_package_dir(package) py_file = os.path.join(package_dir, module) + '.py' else: package = package.split('.') py_file = self.get_module_outfile(self.build_lib, package, module) self.mkpath(os.path.dirname(py_file)) self.make_file(infile, py_file, self.compile_ui, [infile, py_file]) class build_models(Command): description = 'build data for Pybik models' user_options = [ ('inplace', 'i', 'ignore build-lib and put compiled UI modules into the source ' 'directory alongside your pure Python modules'), ('force', 'f', 'forcibly build everything (ignore file timestamps)'), ('parallel=', None,'number of parallel build jobs or "True"'), ('fast', None,'Build models without optimization'), ('pickle-protocol=', None, 'Pickle protocol for modeldata (default: highest protocol)'), ('maxsize=', None, 'Maximum model size (default: 10)'), ('reproducible', None, 'Build modeldata reproducible (experimental)'), ('debug=', None, 'Comma-separated list of debug flags'), ] boolean_options = ['inplace', 'force', 'fast', 'reproducible'] def initialize_options(self): self.build_base = None self.inplace = None self.force = None self.parallel = None self.fast = None self.pickle_protocol = None self.maxsize = None self.reproducible = None self.debug = None def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base'), ('inplace', 'inplace'), ('force', 'force'), ('parallel', 'parallel'), ('fast', 'fast'), ('pickle_protocol', 'pickle_protocol'), ('maxsize', 'maxsize'), ('reproducible', 'reproducible'), ) if isinstance(self.parallel, str): if self.parallel.lower() == 'true': self.parallel = True else: self.parallel = int(self.parallel) self.pickle_protocol = -1 if self.pickle_protocol is None else int(self.pickle_protocol) if self.maxsize is None: self.maxsize = 10 else: from ast import literal_eval self.maxsize = literal_eval(self.maxsize) self.reproducible = False if self.reproducible is None else bool(self.reproducible) if self.debug is not None: import pybiklib.debug known_debug_flags = [d[6:].lower() for d in pybiklib.debug.__all__ if d.startswith('DEBUG_')] debug_flags = [] for d in self.debug.split(','): if d not in known_debug_flags: print('unknown debug option:', d) elif d: debug_flags.append(d) pybiklib.debug.set_flags(debug_flags) print('debug flags:', ' '.join(debug_flags)) def run(self): from buildlib import modeldata modeldir = os.path.join('data' if self.inplace else self.build_base, 'models') self.mkpath(modeldir) if self.force and not self.dry_run: for filename in os.listdir(modeldir): filename = os.path.join(modeldir, filename) os.remove(filename) if self.force: testfunc = None else: testfunc = lambda filename: (any(newer(os.path.join('buildlib', f), filename) for f in ('modeldata.py', 'modeldef.py', 'geom.py'))) if testfunc is None or testfunc(modeldata.get_indexfilename(modeldir)): message = 'generating model data, this may take some time' def create_modeldata(): modeldata.create_modeldata(modeldir, testfunc, self.parallel, self.fast, self.pickle_protocol, self.maxsize, self.reproducible) self.execute(create_modeldata, [], msg=message) data_files = self.distribution.data_files if self.dry_run: return for filename in os.listdir(modeldir): sourcepath = os.path.join(modeldir, filename) data_files.append(('share/pybik/models', (sourcepath,))) class build_i18n(Command): description = 'compile message catalog to binary format' user_options = [ ('inplace', 'i', 'ignore build-lib and put compiled UI modules into the source ' 'directory alongside your pure Python modules'), ('force', 'f', 'forcibly build everything (ignore file timestamps)'), ] boolean_options = ['inplace', 'force'] def initialize_options(self): self.build_base = None self.inplace = None self.force = None def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base'), ('inplace', 'inplace'), ('force', 'force'), ) def run(self): """Compile message catalog to binary format""" from buildlib.utils import po_isempty if self.inplace: mo_dir = 'data/locale' else: mo_dir = os.path.join(self.build_base, 'mo') data_files = self.distribution.data_files domain = self.distribution.metadata.name for po_file in glob('po/*.po'): if po_isempty(po_file, verbose=False): print('skipping empty po file', po_file) continue lang = os.path.splitext(os.path.basename(po_file))[0] mo_dir_lang = os.path.join(mo_dir, lang, "LC_MESSAGES") mo_file = os.path.join(mo_dir_lang, "%s.mo" % domain) self.mkpath(mo_dir_lang) def msgfmt(po_file, mo_file): self.spawn(["msgfmt", po_file, "-o", mo_file]) self.make_file([po_file], mo_file, msgfmt, [po_file, mo_file]) targetpath = os.path.join("share/locale", lang, "LC_MESSAGES") data_files.append((targetpath, (mo_file,))) class build_desktop(Command): description = 'build translated desktop files' user_options = [ ('inplace', 'i', 'ignore build-lib and put compiled UI modules into the source ' 'directory alongside your pure Python modules'), ('force', 'f', 'forcibly build everything (ignore file timestamps)'), ] boolean_options = ['inplace', 'force'] def initialize_options(self): self.build_base = None self.inplace = None self.force = None def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base'), ('inplace', 'inplace'), ('force', 'force'), ) self.desktop_dir = os.path.join('data' if self.inplace else self.build_base, 'applications') def run(self): from buildlib import create_docs if self.distribution.desktop_templates is None: return data_files = self.distribution.data_files self.mkpath(self.desktop_dir) # merge .desktop.in with translation targetpath, templates = self.distribution.desktop_templates targetfiles = [] for template in templates: templatefile = create_docs.get_template_filename(template) tmpfile = os.path.join(self.desktop_dir, os.path.basename(templatefile)) dstfile = os.path.join(self.desktop_dir, os.path.basename(template)) if not dstfile.endswith('.desktop'): self.warn('Skipping %s, seems not to be a desktop file template.' % templatefile) continue def make_translated_desktopfile(src, tmp, dst): create_docs.create_doc(src, tmp, skip='deb') self.spawn(["intltool-merge", '-d', 'po', tmp, dst]) os.remove(tmp) self.make_file(glob('po/*.po') + [templatefile], dstfile, make_translated_desktopfile, [template, tmpfile, dstfile]) targetfiles.append(dstfile) data_files.append((targetpath, targetfiles)) class build_man (Command): description = 'build the manpage' user_options = [ ('force', 'f', 'forcibly build everything (ignore file timestamps)'), ] def initialize_options(self): self.force = None self.build_base = None def finalize_options(self): self.set_undefined_options('build', ('build_base', 'build_base'), ('force', 'force'), ) def run(self): def create_manpage(script_file, section, man_file): import re from buildlib.utils import modify_file os.environ['PYTHONPATH'] = '.' self.spawn(['help2man', '--name', config.SHORT_DESCRIPTION, '--section', section, '--output', man_file, '--no-info', script_file]) modify_file(man_file, [ (r'^(?a)(\.TH\s+\S+\s+\S+\s+)".+?"(.*)$', r'\1"{}"\2'.format(re.escape(config.RELEASE_DATE)))]) man_dir = os.path.join(self.build_base, 'man') self.mkpath(man_dir) if '.' not in sys.path: sys.path.insert(0, '.') section = '6' if self.dry_run: return for script_file in self.get_finalized_command('build_scripts').scripts: script, ext = os.path.splitext(os.path.basename(script_file)) man_file = os.path.join(man_dir, '.'.join((script, section))) self.make_file(['pybiklib/config.py', script_file], man_file, create_manpage, [script_file, section, man_file]) self.distribution.data_files.append(('share/man/man'+section, [man_file])) class build_doc (Command): description = "build documentation files" user_options = [ ('inplace', 'i', 'ignore build-lib and put compiled UI modules into the source ' 'directory alongside your pure Python modules'), ] boolean_options = ['inplace'] def initialize_options(self): self.inplace = None self.build_base = None self.doc_files = [] def finalize_options(self): self.set_undefined_options('build', ('inplace', 'inplace'), ('build_base', 'build_base')) def run(self): from buildlib import create_docs info('generating documentation files') self.mkpath(os.path.join(self.build_base, 'doc')) for basename, skip in [ ('copyright', 'deb'), ('README', None), ('INSTALL', None), ]: filename = None if self.inplace else os.path.join(self.build_base, 'doc', basename) info('generating file: %r', filename or basename) create_docs.create_doc(basename, filename, skip=skip) if filename: self.doc_files.append(filename) class install_lib (distutils.command.install_lib.install_lib): user_options = distutils.command.install_lib.install_lib.user_options + [ ('arch-only', None, 'Install only architecture dependent files'), ('indep-only', None, 'Install only architecture independent files'), ] boolean_options = ['arch-only', 'indep-only'] def initialize_options(self): distutils.command.install_lib.install_lib.initialize_options(self) self.data_dir = None self.arch_only = None self.indep_only = None def finalize_options(self): distutils.command.install_lib.install_lib.finalize_options(self) self.set_undefined_options('install', ('arch_only', 'arch_only'), ('indep_only', 'indep_only'), ) if not self.arch_only and not self.indep_only: self.arch_only = self.indep_only = True def build(self): if not self.skip_build: if self.distribution.has_pure_modules() and self.indep_only: self.run_command('build_py') if self.distribution.has_ext_modules() and self.arch_only: self.run_command('build_ext') class install_desktop(Command): description = 'install desktop files' user_options = [('ask', None, 'Ask before installation'),] boolean_options = ['ask'] def initialize_options(self): self.ask = False def finalize_options(self): pass def run(self): if self.ask: try: answer = input('\nInstall desktop file? [Yn]: ') except EOFError: print() return if answer.lower() not in ['y', '']: return self.run_command('build_desktop') desktop_dir = self.get_finalized_command('build_desktop').desktop_dir target_dir = os.path.join(config.get_data_home(), 'applications') def keyabspath(line, key, file=None): key += '=' if line.startswith(key): if file is None: file = line.split('=', 1)[1].rstrip() line = key + os.path.abspath(file) + '\n' return line self.mkpath(target_dir) for fnin in glob('%s/*.desktop' % desktop_dir): fnout = os.path.join(target_dir, os.path.basename(fnin)) info('installing desktop file to: %s', fnout) with open(fnin, 'rt', encoding='utf-8') as fin, open(fnout, 'wt', encoding='utf-8') as fout: for line in fin: line = keyabspath(line, 'TryExec') line = keyabspath(line, 'Exec') line = keyabspath(line, 'Icon', config.APPICON192_FILE) fout.write(line) class install (install_orig): user_options = install_orig.user_options + [ ('data-dir=', 't', 'Directory where the application will find the data'), ('arch-only', None, 'Install only architecture dependent files'), ('indep-only', None, 'Install only architecture independent files'), ] boolean_options = ['arch-only', 'indep-only'] def initialize_options(self): install_orig.initialize_options(self) self.data_dir = None self.arch_only = False self.indep_only = False def finalize_options(self): install_orig.finalize_options(self) if self.data_dir is None: self.data_dir = os.path.join(self.install_data, 'share') if not self.arch_only and not self.indep_only: self.arch_only = self.indep_only = True if not self.indep_only: self.__class__.sub_commands = [(cmd, func) for cmd, func in install_orig.sub_commands if cmd == 'install_lib'] def run(self): if not self.skip_build: # install_orig.run() will run build, but we need # to modify a file between build and install build_cmd = self.distribution.get_command_obj('build') build_cmd.arch_only = self.arch_only build_cmd.indep_only = self.indep_only self.run_command('build') self.skip_build = True filename = os.path.join(self.build_lib, 'pybiklib', 'config.py') app_data_dir = os.path.join(self.data_dir, 'pybik') if self.indep_only: from buildlib.utils import modify_file modify_file(filename, [ (r'^(data_dir\s*=\s*).*$', r'\1' + repr(self.data_dir)), (r'^(appdata_dir\s*=\s*).*$', r'\1' + repr(app_data_dir)),]) install_orig.run(self) class clean (distutils.command.clean.clean): user_options = distutils.command.clean.clean.user_options + [ ('inplace', 'i', 'clean up files in the source directory'), ] boolean_options = distutils.command.clean.clean.boolean_options + [ 'inplace', ] def initialize_options(self): distutils.command.clean.clean.initialize_options(self) self.inplace = None def finalize_options(self): distutils.command.clean.clean.finalize_options(self) self.set_undefined_options('build', ('inplace', 'inplace'), ) def run(self): def remove_tree_(directory): if os.path.exists(directory): remove_tree(directory, dry_run=self.dry_run, verbose=self.verbose) else: warn("%r does not exist -- can't clean it", directory) def remove_file(filename): if os.path.exists(filename): info('removing %r', filename) if not self.dry_run: os.remove(filename) else: warn("%r does not exist -- can't clean it", filename) if self.all: for _dir in ['applications', 'doc', 'man', 'mo', 'models']: remove_tree_(os.path.join(self.build_base, _dir)) distutils.command.clean.clean.run(self) remove_file('MANIFEST') if self.inplace: for dirname in ('buildlib/', 'pybiklib/', 'pybiklib/plugins/', 'pybiklib/ui/', 'pybiktest/', 'tools/'): remove_tree_(dirname + '__pycache__') if self.all: dirnames = ['data/applications', 'data/locale', 'data/models'] for dirname in dirnames: remove_tree_(dirname) for filename in glob('pybiklib/*.so'): remove_file(filename) for filename in glob('pybiklib/ui/*.py'): if filename != 'pybiklib/ui/__init__.py': remove_file(filename) for filename in ['copyright', 'INSTALL', 'README', 'pybik']: remove_file(filename) class sdist(distutils.command.sdist.sdist): user_options = distutils.command.sdist.sdist.user_options + [ ('debian-names', None, 'Create archive files with Debian names'), ] boolean_options = distutils.command.sdist.sdist.boolean_options + [ 'debian-names' ] def initialize_options(self): distutils.command.sdist.sdist.initialize_options(self) self.debian_names = False self.desktop_dir = None def finalize_options(self): distutils.command.sdist.sdist.finalize_options(self) self.set_undefined_options('build_desktop', ('desktop_dir', 'desktop_dir')) def run(self): self.run_command('build_doc') self.run_command('build_csrc') self.run_command('build_desktop') distutils.command.sdist.sdist.run(self) for archive_file in self.archive_files: if self.debian_names: debian_file = archive_file.replace('-', '_', 1).replace('.tar', '.orig.tar', 1) os.rename(archive_file, debian_file) def get_file_list(self): from buildlib.utils import po_isempty for f in glob('po/*.po'): if po_isempty(f): print('skipping empty po file', f) else: self.filelist.files.append(f) distutils.command.sdist.sdist.get_file_list(self) def make_release_tree(self, base_dir, files): distutils.command.sdist.sdist.make_release_tree(self, base_dir, files) # Release date from datetime import date from buildlib.utils import modify_file modify_file(os.path.join(base_dir, 'pybiklib', 'config.py'),[ (r'^(RELEASE_DATE\s*=\s*).*$', r'\1' + repr(date.today().isoformat())), ]) # doc files for filename in self.get_finalized_command('build_doc').doc_files: self.copy_file(filename, base_dir) # csrc dst_dir = os.path.join(base_dir, 'csrc') self.mkpath(dst_dir) extensions = self.get_finalized_command('build_csrc').extensions for extension in extensions: for src in extension.sources: self.copy_file(src, dst_dir) # desktop files dst_dir = os.path.join(base_dir, 'data', 'applications') self.mkpath(dst_dir) for template in self.distribution.desktop_templates[1]: src = os.path.join(self.desktop_dir, template) self.copy_file(src, dst_dir) setup( # Metadata name=config.PACKAGE, version=config.VERSION, author=config.AUTHOR, author_email=config.CONTACT_EMAIL, url=config.WEBSITE, download_url=config.DOWNLOADS, description=config.SHORT_DESCRIPTION, long_description='\n'.join(config.LONG_DESCRIPTION), classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: X11 Applications :: Qt', 'Intended Audience :: End Users/Desktop', 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', 'Operating System :: POSIX', 'Operating System :: POSIX :: Linux', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Cython', #TODO: 'Programming Language :: OpenGL Shading Language', 'Topic :: Games/Entertainment :: Puzzle Games', ], keywords='rubik cube puzzle game', license=config.LICENSE_NAME, # Metadata added in overloaded Distribution bug_contact=config.CONTACT_FILEBUG, # Files scripts=['pybiklib/pybik.py'], data_files=[ ('share/pixmaps', ['data/icons/pybik.png']), ('share/pybik/icons', ['data/icons/pybik-64.png']), ('share/pybik/icons', ['data/icons/pybik-192.png']), ('share/pybik/ui/cursors', glob('data/ui/cursors/*')), ('share/pybik/ui/images', glob('data/ui/images/*')), ('share/pybik/ui/qt', glob('data/ui/qt/*')), ('share/pybik/plugins', glob('data/plugins/*')), ('share/pybik/shaders', glob('data/shaders/*')), ('share/pybik/tests', glob('data/tests/*')), ('share/pybik/', ['data/GPL-3']), ], desktop_templates=('share/applications', ['pybik.desktop']), ext_modules=[ Extension('pybiklib/_gldraw', ['pybiklib/gldraw.py'], depends=['pybiklib/gl.pxd'], libraries=['GL'], define_macros=[('GL_GLEXT_PROTOTYPES', None)]), Extension('pybiklib/_glarea', ["pybiklib/glarea.py"], depends=['pybiklib/gl.pxd', 'pybiklib/gldraw.py'], libraries=['GL'], define_macros=[('GL_GLEXT_PROTOTYPES', None)]), ], packages=['pybiklib', 'pybiklib.plugins', 'pybiklib.ui', 'pybiktest'], qt_ui_files={'pybiklib.ui': glob('data/ui/qt/*.ui')+['pybiklib/ui/__init__.py']}, # setup classes distclass=Distribution, cmdclass={ 'build': build, 'build_csrc': build_csrc, 'build_ext': build_ext, 'build_scripts': build_scripts, 'build_py': build_py, 'build_models': build_models, 'build_i18n': build_i18n, 'build_desktop': build_desktop, 'build_man': build_man, 'build_doc': build_doc, 'install_data': distutils.command.install_data.install_data, 'install_lib': install_lib, 'install_desktop': install_desktop, 'install': install, 'clean': clean, 'sdist': sdist, }, ) pybik-2.1/pybiklib/0000775000175000017500000000000012556245305014456 5ustar barccbarcc00000000000000pybik-2.1/pybiklib/main.py0000664000175000017500000002647712556223565016000 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009, 2011-2015 B. Clausius # # 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 3 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, see . import sys, os from . import debug, config N_ = lambda s: s class Tee2(object): class Tee(object): def __init__(self, file1, file2): self.file1 = file1 self.file2 = file2 def write(self, data): self.file1.write(data) self.file2.write(data) def flush(self): self.file1.flush() self.file2.flush() def __init__(self, name='pybik.log', mode='w'): self.file = open(name, mode) self.stdout = sys.stdout self.stderr = sys.stderr sys.stdout = self.Tee(self.file, self.stdout) sys.stderr = self.Tee(self.file, self.stderr) def __del__(self): sys.stdout = self.stdout sys.stderr = self.stderr self.file.close() class Options: debug_level_names = [__a[6:].lower() for __a in debug.__all__ if __a.startswith('DEBUG_')] test_arg_names = ['write-y', 'write-yes', 'write-n', 'write-no', 'write-e', 'write-error', 'log-widgets', 'notime'] arg_info = [ (None, None, '\n'.join(config.LONG_DESCRIPTION).replace('ő', 'o')), #XXX: help2man cannot handle unicode (None, None, 'Pybik can be fully controlled and configured via the graphical user interface.' ' The options listed here are intended primarily for testing and debugging.'), (None, None, 'Options:'), (['-h', '--help'], lambda self, value: self.print_usage(), 'Show help message and exit'), (['--version'], lambda self, value: self.print_version(), 'Show version number and exit'), (['--config-file='], lambda self, value: self.__dict__.update(config_file=value), 'Specify the configuration filename'), (['--defaultconfig'], lambda self, value: self.__dict__.update(defaultconfig=True), 'Print default settings to stdout and exit'), (['--games-file='], lambda self, value: self.__dict__.update(games_file=value), 'Specify the filename for saved games'), (['--log'], lambda self, value: self.tee(), 'Write logfile'), (['--list-tests'], lambda self, value: self.print_tests(), 'List tests'), (['--test'], lambda self, value: self.select_all_tests(), 'Run all tests'), (['--test='], lambda self, value: self.__dict__.setdefault('test', []).append(value), 'Run test T, can be used multiple times, ' 'use T=n where n is a number to run test T multiple times'), (['--test-args='], lambda self, value: self.__dict__['test_args'].extend(a for a in value.split(',') if a), 'T is a comma-separated list of test arguments:\n{}' .format(' '.join(test_arg_names))), (['--debug='], lambda self, value: self.set_debug_flags(value), 'D is a comma-separated list of debug flags:\n{0}' .format(' '.join(debug_level_names))), (None, None, 'Qt-Options, for a full list refer to the Qt-Reference,' ' but not all options make sense for this application:'), (['-qwindowgeometry G', '-geometry G'], None, 'Specifies window geometry for the main window using the X11-syntax.' ' For example: 100x100+50+50'), (['-reverse'], None, 'Sets the application layout direction to left-to-right'), (['-widgetcount'], None, 'Prints debug message at the end about number of widgets left' ' undestroyed and maximum number of widgets existed at the same time'), ] def __init__(self): self.config_file = config.USER_SETTINGS_FILE self.defaultconfig = False self.games_file = config.USER_GAMES_FILE self.pure_python = False self.test = [] self.test_args = [] self.ui_args = [] self.systemdenable = False @staticmethod def format_opts(args): args = ((a + a.strip('--')[0].upper() if a.endswith('=') else a) for a in args) return ' ' + ', '.join(args) @staticmethod def format_help(text, indent=0): try: width = int(os.environ['COLUMNS']) - 2 except (KeyError, ValueError): width = 78 width -= indent def split(text): lines = text.split('\n') for line in lines: res = None words = line.split(' ') for word in words: if res is None: res = word elif len(res + word) + 1 <= width: res = ' '.join((res, word)) else: yield res res = word yield res return '\n'.ljust(indent+1).join(split(text)) @classmethod def print_usage(cls): print('Usage:', sys.argv[0], '[options]') for args, unused_func, text in cls.arg_info: if args is None: print() print(cls.format_help(text)) else: opts = cls.format_opts(args) if len(opts) > 18: text = '\n' + text else: opts = opts.ljust(20) text = cls.format_help(text, 20) print(opts + text) sys.exit(0) @staticmethod def print_version(): from textwrap import fill print(config.APPNAME, config.VERSION) print() print(config.COPYRIGHT.replace('©', '(C)')) #XXX: help2man cannot handle unicode print() print('\n\n'.join(fill(text, width=78) for text in config.LICENSE_INFO.split('\n\n'))) print() print(fill(config.LICENSE_NOT_FOUND, width=78)) sys.exit(0) def tee(self): self._tee = Tee2() @staticmethod def print_tests(): for filename in config.get_testdatafiles(): print(filename) sys.exit(0) def select_all_tests(self): self.__dict__.setdefault('test', []).extend(config.get_testdatafiles()) def set_debug_flags(self, value): if not debug.DEBUG: print(config.APPNAME, config.VERSION) debug_flags = [f for f in value.split(',') if f] for d in debug_flags: if d not in self.debug_level_names: print('unknown debug option:', d) sys.exit(1) debug.set_flags(debug_flags) print('debug flags:', *debug_flags) def parse(self, args): arg_functs = {o: f for opts, f, h in self.arg_info for o in opts or [] if f is not None} for arg in args: try: index = arg.index('=') except ValueError: value = None else: arg, value = arg[:index+1], arg[index+1:] try: func = arg_functs[arg] except KeyError: self.ui_args.append(arg) else: func(self, value) for a in self.test_args: if a not in self.test_arg_names: print('unknown test argument:', a) sys.exit(1) def create_app(root_dir, args): import gettext from PyQt5.QtCore import QLocale, QTranslator, Qt from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QPalette, QColor # initialize QApplication QApplication.setAttribute(Qt.AA_X11InitThreads) app = QApplication(args) args = app.arguments()[1:] if args: print('Unknown arguments:', ' '.join(args)) sys.exit(1) app.setOrganizationName(config.PACKAGE) app.setApplicationName(config.APPNAME) app.setApplicationVersion(config.VERSION) # Workaround for whatsThis-Text (white text on light background) palette = app.palette() colorfg = palette.color(QPalette.Active, QPalette.ToolTipText) colorbg = palette.color(QPalette.Active, QPalette.ToolTipBase) valuefg = colorfg.value() valuebg = (valuefg + 255) // 2 if valuefg < 128 else valuefg // 2 colorbg = QColor.fromHsv(colorbg.hue(), colorbg.saturation(), valuebg) palette.setColor(QPalette.Active, QPalette.ToolTipBase, colorbg) app.setPalette(palette) # initialize translation language = QLocale.system().name() # standard Qt translation, used for e.g. standard buttons and shortcut names translator = QTranslator() translator.load('qt_' + language, config.QT_LOCALE_DIR) app.installTranslator(translator) # the rest of the app use gettext for translation if root_dir == sys.prefix: # normal installation LOCALEDIR = None else: # different root, e.g. /usr/local, source directory LOCALEDIR = config.LOCALE_DIR t = gettext.translation(config.PACKAGE, LOCALEDIR, languages=[language], fallback=True) t.install(names=['ngettext']) return app, translator def create_window(opts): # create main window # The application module must be imported after a QApplication object is created from .application import MainWindow return MainWindow(opts) def run(root_dir=None): opts = Options() opts.parse(sys.argv) debug.debug('Qt args:', opts.ui_args) if opts.systemdenable: print('systemde: nable') try: import PyQt5.QtCore import PyQt5.QtGui import PyQt5.QtWidgets except ImportError as e: print('This program needs PyQt5:', e) sys.exit(1) if opts.defaultconfig: # settings needs Qt from .settings import settings settings.load('') settings.keystore.dump(sys.stdout, all=True) sys.exit(0) app, translator = create_app(root_dir, opts.ui_args) # keep the translator object for the lifetime of the app object, so that the translation works if opts.test: from pybiktest.runner import TestRunner for test in TestRunner.wrap(config.TESTDATA_DIR, opts.test, opts.test_args): opts.config_file = test.settings_file opts.games_file = test.games_file window = create_window(opts) test.run(window) app.exec() else: window = create_window(opts) app.exec() if opts.systemdenable: print('systemdi: sable') pybik-2.1/pybiklib/settings.py0000664000175000017500000003216312556223565016701 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009, 2011-2015 B. Clausius # # 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 3 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, see . import os from ast import literal_eval from io import StringIO from PyQt5.QtCore import QObject, QTimer from PyQt5.QtCore import pyqtSignal as Signal try: from .debug import debug except ImportError: debug = print from . import config current_settings_version = 2 class KeyStore (QObject): changed = Signal(str) error = Signal(str) def __init__(self): super().__init__() self.schema = None self.filename = None self.keystore = {} def clone_key(self, keyfrom, keyto): self.schema[keyto] = self.schema[keyfrom] if keyfrom in self.keystore and keyto not in self.keystore: self.keystore[keyto] = self.keystore[keyfrom] def get_default(self, key): return self.schema[key][0] def get_validator(self, key): return self.schema[key][1] def get_range(self, key): validator = self.get_validator(key) if not isinstance(validator, (tuple, list)): raise ValueError('{} is not a range'.format(key)) return validator def get_value(self, key): try: return self.keystore[key] except KeyError: return self.get_default(key) def get_nick(self, key): value = self.get_value(key) validator = self.get_validator(key) if not isinstance(validator, list): raise ValueError('{} is not an enum'.format(key)) return validator[value] def set_value(self, key, value): self.keystore[key] = value self.changed.emit(key) def set_nick(self, key, nick): validator = self.get_validator(key) if not isinstance(validator, list): raise ValueError('{} is not an enum'.format(key)) value = validator.index(nick) return self.set_value(key, value) def del_value(self, key): try: del self.keystore[key] except KeyError: pass # already the default value self.changed.emit(key) def find_match(self, key): def match(key, pattern): key = key.split('.') pattern = pattern.split('.') for k, p in zip(key, pattern): if k != p != '*': return False return True for pattern in self.schema.keys(): if match(key, pattern): return pattern return None def read_settings(self, filename): from .schema import schema, deprecated self.schema = schema self.filename = filename if not self.filename: return dirname = os.path.dirname(self.filename) if dirname and not os.path.exists(dirname): os.makedirs(dirname) # read settings try: with open(self.filename, 'rt', encoding='utf-8') as settings_file: lines = settings_file.readlines() except FileNotFoundError: lines = [] for line in lines: # parse the line, discard invalid keys try: key, strvalue = line.split('=', 1) except ValueError: continue key = key.strip() strvalue = strvalue.strip() pattern = self.find_match(key) if pattern is None: continue self.schema[key] = self.schema[pattern] try: value = literal_eval(strvalue) except (ValueError, SyntaxError): continue # translate enums and validate values validator = self.get_validator(key) if validator is deprecated: pass elif isinstance(validator, list): try: value = validator.index(value) except ValueError: continue elif isinstance(validator, tuple): if not validator[0] <= value <= validator[1]: continue elif validator is not None: if not validator(value): continue self.keystore[key] = value def dump(self, file, all=False): # pylint: disable=W0622 keydict = self.schema if all else self.keystore for key in sorted(keydict.keys()): if '*' in key: continue try: # translate enums value = self.get_nick(key) except ValueError: value = self.get_value(key) print(key, '=', repr(value), file=file) def write_settings(self): if not self.filename: return buf = StringIO() self.dump(buf) try: with open(self.filename, 'wt', encoding='utf-8') as settings_file: settings_file.write(buf.getvalue()) except OSError as e: error_message = _('Settings can not be written to file: ' '{error_message}').format(error_message=e) debug(error_message) self.error.emit(error_message) class Values: def __init__(self, key): object.__setattr__(self, '_key', key) object.__setattr__(self, '_subkeys_nodes', []) object.__setattr__(self, '_subkeys_leaves', []) def clone(self, key): values = Values(key) for subkey in self._subkeys_nodes: values._add_attr(subkey, self[subkey].clone(key+subkey+'.')) for subkey in self._subkeys_leaves: settings.keystore.clone_key(self._key + subkey, key + subkey) values._add_key(subkey) return values def sync(self, glob=None): glob2 = self['*'] if '*' in self._subkeys_nodes else None for subkey in self._subkeys_nodes: if subkey == '*': # glob2 == self[subkey] glob2.sync() else: self[subkey].sync(glob2) if glob is not None and subkey in glob._subkeys_nodes: self[subkey].sync(glob[subkey]) if glob is not None: for subkey in glob._subkeys_nodes: if subkey not in self._subkeys_nodes: self._add_attr(subkey, glob[subkey].clone(self._key+subkey+'.')) for subkey in glob._subkeys_leaves: if subkey not in self._subkeys_leaves: settings.keystore.clone_key(glob._key + subkey, self._key + subkey) self._add_key(subkey) def __getattr__(self, key): if '.' in key: value = self subkeys = key.split('.') for subkey in subkeys: value = value[subkey] return value if key and key[0] == '_': return super().__getattribute__(key) if key.endswith('_nick'): fullkey = self._key + key[:-5] return settings.keystore.get_nick(fullkey) if key.endswith('_range'): fullkey = self._key + key[:-6] return settings.keystore.get_range(fullkey) if key in self._subkeys_leaves: fullkey = self._key + key return settings.keystore.get_value(fullkey) if key in self._subkeys_nodes: return super().__getattribute__(key) if '*' in self._subkeys_leaves: fullkey = self._key + key settings.keystore.clone_key(self._key+'*', fullkey) self._add_key(key) return settings.keystore.get_value(fullkey) if '*' in self._subkeys_nodes: value = super().__getattribute__('*') value = value.clone(self._key+key+'.') self._add_attr(key, value) return value raise AttributeError('Unknown attribute "%s" in %s' % (key, self._key)) def __setattr__(self, key, value): if '.' in key: val = self *subkeys, key = key.split('.') for subkey in subkeys: val = val[subkey] return val.__setattr__(key, value) if key.endswith('_nick'): fullkey = self._key + key[:-5] func = settings.keystore.set_nick elif key in self._subkeys_leaves: fullkey = self._key + key func = settings.keystore.set_value elif '*' in self._subkeys_leaves: fullkey = self._key + key settings.keystore.clone_key(self._key+'*', fullkey) self._add_key(key) func = settings.keystore.set_value else: raise AttributeError('unknown attribute {!r} in {!r}'.format(key, self._key)) func(fullkey, value) if not settings._write_timer.isActive(): settings._write_timer.start() def __delattr__(self, key): if '.' in key: value = self *subkeys, key = key.split('.') for subkey in subkeys: value = value[subkey] return value.__delattr__(key) if key in self._subkeys_leaves: fullkey = self._key + key settings.keystore.del_value(fullkey) if not settings._write_timer.isActive(): settings._write_timer.start() else: raise AttributeError('unknown attribute "%s"' % key) def __getitem__(self, key): if type(key) is int: key = str(key) elif type(key) is tuple: key = '_'.join(str(v) for v in key) return getattr(self, key) def __setitem__(self, key, value): return setattr(self, str(key), value) def _add_attr(self, key, value): assert key not in self._subkeys_nodes assert key not in self._subkeys_leaves self._subkeys_nodes.append(key) super().__setattr__(key, value) def _add_key(self, key): assert key not in self._subkeys_nodes assert key not in self._subkeys_leaves self._subkeys_leaves.append(key) class Settings: keystore = KeyStore() def __init__(self, key=''): object.__setattr__(self, '_key', key) object.__setattr__(self, '_array_len', 0) object.__setattr__(self, '_values', Values('')) object.__setattr__(self, '_write_timer', QTimer()) self._write_timer.setSingleShot(True) self._write_timer.setInterval(5000) self._write_timer.timeout.connect(self.on_write_timer_timeout) def reset(self): self._write_timer.stop() self._write_timer.timeout.disconnect(self.on_write_timer_timeout) self.keystore.keystore.clear() self.__init__() def load(self, filename): self.keystore.read_settings(filename) keys = list(self.keystore.schema.keys()) for key in keys: subkeys = key.split('.') settings_parent = self._values for subkey in subkeys[:-1]: if subkey.isdigit(): subkey = str(int(subkey)) try: settings_child = getattr(settings_parent, subkey) except (KeyError, AttributeError): settings_child = Values(settings_parent._key + subkey + '.') settings_parent._add_attr(subkey, settings_child) assert isinstance(settings_child, Values), settings_child settings_parent = settings_child else: if subkeys[-1] not in settings_parent._subkeys_leaves: settings_parent._add_key(subkeys[-1]) self._values.sync() version = settings.version if version != current_settings_version: settings.version = current_settings_version return version def on_write_timer_timeout(self): self.keystore.write_settings() def disconnect(self): self.keystore.changed.disconnect() self.keystore.error.disconnect() self._write_timer.stop() def flush(self): self.keystore.write_settings() def __getattr__(self, key): return getattr(self._values, key) def __setattr__(self, key, value): setattr(self._values, key, value) def __delattr__(self, key): delattr(self._values, key) def __getitem__(self, key): return self._values[key] settings = Settings() pybik-2.1/pybiklib/config.py0000664000175000017500000001243512556245305016302 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009, 2011-2015 B. Clausius # # 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 3 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, see . import os, sys N_ = lambda s: s AUTHOR = 'B. Clausius' CONTACT_EMAIL = 'barcc@gmx.de' CONTACT_WEB = 'https://answers.launchpad.net/pybik' COPYRIGHT = 'Copyright © 2009-2015, B. Clausius' LICENSE_NAME = 'GPL-3+' PACKAGE = 'pybik' # Name of the application, probably should not be translated. APPNAME = N_('Pybik') VERSION = '2.1' WEBSITE = 'https://launchpad.net/pybik/' DOWNLOADS = 'https://launchpad.net/pybik/+download' BUG_DATABASE = 'https://bugs.launchpad.net/pybik' CONTACT_FILEBUG = BUG_DATABASE + '/+filebug' # The following two lines are replaced by "setup.py install" data_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data') appdata_dir = data_dir # The following line is replaced by "setup.py sdist" RELEASE_DATE = '2015-07-29' LOCALE_DIR = os.path.join(data_dir, 'locale') QT_LOCALE_DIR = os.path.join(sys.prefix, 'share', 'qt5', 'translations') APPICON_FILE = os.path.join(appdata_dir, 'icons', 'pybik-64.png') APPICON192_FILE = os.path.join(appdata_dir, 'icons', 'pybik-192.png') LICENSE_FILE = os.path.join(appdata_dir, 'GPL-3') MODELS_DIR = os.path.join(appdata_dir, 'models') PLUGINS_DIR = os.path.join(appdata_dir, 'plugins') UI_DIR = os.path.join(appdata_dir, 'ui') TESTDATA_DIR = os.path.join(appdata_dir, 'tests') SHADER_DIR = os.path.join(appdata_dir, 'shaders') def get_testdatafiles(): return [f for f in os.listdir(TESTDATA_DIR) if not f.endswith('~')] def get_config_home(): return os.environ.get('XDG_CONFIG_HOME', '') or os.path.expanduser("~/.config") def get_data_home(): return os.environ.get('XDG_DATA_HOME', '') or os.path.expanduser("~/.local/share") USER_CONFIG_DIR = os.path.join(get_config_home(), PACKAGE) USER_DATA_DIR = os.path.join(get_data_home(), PACKAGE) USER_SETTINGS_FILE = os.path.join(USER_CONFIG_DIR, 'settings.conf') USER_PLUGINS_DIR = os.path.join(USER_DATA_DIR, 'plugins') USER_GAMES_FILE = os.path.join(USER_DATA_DIR, 'games') SHORT_DESCRIPTION = N_("Rubik's cube game") LONG_DESCRIPTION = ( # The next 7 lines belong together and form the long description N_('Pybik is a 3D puzzle game about the cube invented by Ernő Rubik.'), N_('* Different 3D puzzles - up to 10x10x10:'), N_(' cubes, towers, bricks, tetrahedra and prisms'), N_('* Solvers for some puzzles'), N_('* Pretty patterns'), N_('* Editor for move sequences'), N_('* Changeable colors and images'), ) LICENSE_INFO = N_( '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 3 of the License, or ' '(at your option) any later version.\n\n' '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.') LICENSE_FURTHER = N_( # Text between "<" and ">" is expanded to a link by the program and should not be modified. # Text between "" and "<|>" is the translatable text for the link. 'Read the full text of the GNU General Public License' '<|> or see .') LICENSE_NOT_FOUND = N_( 'You should have received a copy of the GNU General Public License' ' along with this program. If not, see .') def get_filebug_text(): return _( # "Wishlist" is used on Launchpad for Importance, so this word should probably not be translated 'If you find any bugs in Pybik or have a suggestion for an improvement then please ' 'submit a <{CONTACT_FILEBUG}|>bug report<|>. ' 'In the latter case you can mark the bug report as "Wishlist".' ).format(CONTACT_FILEBUG=CONTACT_FILEBUG) TRANSLATION_TEXT = N_( 'Translations are managed by the ' '' 'Launchpad translation group<|>.\n\n' 'If you want help to translate Pybik to your language you can do it through ' 'the web interface<|>.\n\n' 'Read more about "Translating with Launchpad"<|> ' 'and "Starting to translate"<|>.') REPOSITORY_SHORT = 'lp:pybik' REPOSITORY_URL = 'https://code.launchpad.net/~barcc/pybik/trunk' REPOSITORY_BROWSE = 'https://bazaar.launchpad.net/~barcc/pybik/trunk/files' pybik-2.1/pybiklib/translators.py0000664000175000017500000001167612556242630017415 0ustar barccbarcc00000000000000# generated with: ./merge-translators.sh translators = ( [ ('Asturian', 'ast', [ ('Xuacu Saturio', 'https://launchpad.net/~xuacusk8'), ('ivarela', 'https://launchpad.net/~ivarela'), ]), ('Azerbaijani', 'az', [ ('Emin Mastizada', 'https://launchpad.net/~emin25'), ('Rashid Aliyev', 'https://launchpad.net/~rashid'), ]), ('Bengali', 'bn', [ ('Iftekhar Mohammad', 'https://launchpad.net/~iftekhar'), ]), ('Bosnian', 'bs', [ ('Kenan Dervišević', 'https://launchpad.net/~kenan3008'), ]), ('Brazilian Portuguese', 'pt_BR', [ ('Fábio Nogueira', 'https://launchpad.net/~fnogueira'), ('Julio Alexander Sieg', 'https://launchpad.net/~julio-sieg'), ('Rafael Neri', 'https://launchpad.net/~rafepel'), ('Rodrigo Borges Freitas', 'https://launchpad.net/~rodrigo-borges-freitas'), ]), ('Bulgarian', 'bg', [ ('Atanas Kovachki', 'https://launchpad.net/~zdar'), ]), ('Chinese (Simplified)', 'zh_CN', [ ('Xiaoxing Ye', 'https://launchpad.net/~xiaoxing'), ]), ('Chinese (Traditional)', 'zh_TW', [ ('Po-Chun Huang', 'https://launchpad.net/~aphroteus'), ]), ('Czech', 'cs', [ ('Tadeáš Pařík', 'https://launchpad.net/~pariktadeas'), ]), ('English (United Kingdom)', 'en_GB', [ ('Andi Chandler', 'https://launchpad.net/~bing'), ('Anthony Harrington', 'https://launchpad.net/~untaintableangel'), ('B. Clausius', 'https://launchpad.net/~barcc'), ('James Tait', 'https://launchpad.net/~jamestait'), ]), ('Finnish', 'fi', [ ('Jiri Grönroos', 'https://launchpad.net/~jiri-gronroos'), ]), ('French', 'fr', [ ('Aurélien Ribeiro', 'https://launchpad.net/~aurel-koala'), ('Baptiste Fontaine', 'https://launchpad.net/~bfontaine'), ('Célestin Taramarcaz', 'https://launchpad.net/~celestin'), ('Havok Novak', 'https://launchpad.net/~havok-novak-deactivatedaccount'), ('Jean-Marc', 'https://launchpad.net/~m-balthazar'), ('Nicolas Delvaux', 'https://launchpad.net/~malizor'), ('Pierre Soulat', 'https://launchpad.net/~pierre-soulat'), ('Sylvie Gallet', 'https://launchpad.net/~sylvie-gallet'), ('lann', 'https://launchpad.net/~lann'), ('Éfrit', 'https://launchpad.net/~efrit'), ]), ('Galician', 'gl', [ ('Miguel Anxo Bouzada', 'https://launchpad.net/~mbouzada'), ]), ('German', 'de', [ ('B. Clausius', 'https://launchpad.net/~barcc'), ]), ('Greek', 'el', [ ('George Christofis', 'https://launchpad.net/~geochr'), ('mara sdr', 'https://launchpad.net/~paren8esis'), ]), ('Hebrew', 'he', [ ('Yaron', 'https://launchpad.net/~sh-yaron'), ]), ('Indonesian', 'id', [ ('Rahman Yusri Aftian', 'https://launchpad.net/~aftian'), ('Trisno Pamuji', 'https://launchpad.net/~tri.snowman'), ]), ('Italian', 'it', [ ('Alfio Missaglia', 'https://launchpad.net/~missaglialfio'), ('Claudio Arseni', 'https://launchpad.net/~claudio.arseni'), ('Francesco Muriana', 'https://launchpad.net/~f-muriana'), ('Gianfranco Frisani', 'https://launchpad.net/~gfrisani'), ]), ('Japanese', 'ja', [ ('José Lou Chang', 'https://launchpad.net/~obake'), ('epii', 'https://launchpad.net/~epii'), ]), ('Khmer', 'km', [ ('Rockworld', 'https://launchpad.net/~rockrock2222222'), ]), ('Kirghiz', 'ky', [ ('SimpleLeon', 'https://launchpad.net/~simpleleon'), ]), ('Lao', 'lo', [ ('Rockworld', 'https://launchpad.net/~rockrock2222222'), ]), ('Malay', 'ms', [ ('abuyop', 'https://launchpad.net/~abuyop'), ]), ('Polish', 'pl', [ ('Michał Rzepiński', 'https://launchpad.net/~micou8'), ('Szymon Nieznański', 'https://launchpad.net/~isamu715'), ]), ('Russian', 'ru', [ ('Aleksey Kabanov', 'https://launchpad.net/~ak099'), ('Oleg Koptev', 'https://launchpad.net/~koptev-oleg'), ('Rashid Aliyev', 'https://launchpad.net/~rashid'), ('scientistnik', 'https://launchpad.net/~nozdrin-plotnitsky'), ('☠Jay ZDLin☠', 'https://launchpad.net/~black-buddha666'), ]), ('Serbian', 'sr', [ ('Мирослав Николић', 'https://launchpad.net/~lipek'), ]), ('Spanish', 'es', [ ('Aaron Farias', 'https://launchpad.net/~timido'), ('Adolfo Jayme', 'https://launchpad.net/~fitojb'), ('Dante Díaz', 'https://launchpad.net/~dante'), ('Eduardo Alberto Calvo', 'https://launchpad.net/~edu5800'), ('José Lou Chang', 'https://launchpad.net/~obake'), ('Oscar Fabian Prieto Gonzalez', 'https://launchpad.net/~ofpprieto'), ('Paco Molinero', 'https://launchpad.net/~franciscomol'), ]), ('Telugu', 'te', [ ('Praveen Illa', 'https://launchpad.net/~telugulinux'), ]), ('Thai', 'th', [ ('Rockworld', 'https://launchpad.net/~rockrock2222222'), ]), ('Turkish', 'tr', [ ('Muhammet Kara', 'https://launchpad.net/~muhammet-k'), ('Şâkir Aşçı', 'https://launchpad.net/~sakirasci'), ]), ('Ukrainian', 'uk', [ ('Yuri Chornoivan', 'https://launchpad.net/~yurchor-gmail'), ]), ('Uzbek', 'uz', [ ('Akmal Xushvaqov', 'https://launchpad.net/~uzadmin'), ]), ] ) pybik-2.1/pybiklib/glarea.py0000664000175000017500000005606212552077606016277 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # cython: profile=False # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . # although this file is compiled with Python3 syntax, Cython needs at least division from __future__ from __future__ import print_function, division # This line makes cython happy global __name__, __package__ # pylint: disable=W0604 #px/__compiled = True __compiled = False #px/from libc.math cimport cos, sin, tan, atan2, M_PI from math import cos, sin, tan, atan2, pi as M_PI # pylint: disable=W0614,W0401 #px/from gl cimport * from OpenGL.GL import * #px- from OpenGL.GL.ARB.vertex_shader import glGetActiveAttribARB as glGetActiveAttrib #px/from _gldraw cimport * from .gldraw import * # pylint: enable=W0614,W0401 from .debug import debug, DEBUG, DEBUG_DRAW, DEBUG_PICK, DEBUG_MSG, DEBUG_NOVSHADER, DEBUG_NOFSHADER, DEBUG_NOSHADER #px/DEF SOURCEGLVERSION = 'GL' SOURCEGLVERSION = 'GL' if DEBUG: debug('Importing module:', __name__) debug(' from package:', __package__) debug(' compiled:', __compiled) debug(' GL/GLES:', SOURCEGLVERSION) #px/cdef struct Terrain: class terrain: pass # pylint: disable=W0232, C0321, R0903 #px+float red #px+float green #px+float blue #px+int width #px+int height #px+cdef Terrain terrain #px/cdef struct Frustum: class frustum: #px+float fovy_angle # field of view angle #px+float fovy_radius #px+float fovy_radius_zoom #px+double bounding_sphere_radius #px+bint multisample #px/mat4 modelview_matrix modelview_matrix = mat4() #px/mat4 projection_matrix projection_matrix = mat4() #px/mat4 picking_matrix picking_matrix = mat4() #px+cdef Frustum frustum #px/cdef struct Program: class program: pass #px+GLuint prog_render #px+GLuint projection_location #px+GLuint modelview_location #px+GLuint prog_hud # only used if DEBUG_DRAW #px+GLuint prog_pick #px+GLuint picking_location #px+GLuint projection_pick_location #px+GLuint modelview_pick_location #px+cdef Program program #px/cdef struct SelectionDebugPoints: class selection_debug_points: #px/float modelview1[3] modelview1 = [0.] * 3 #px/float modelview2[3] modelview2 = [0.] * 3 #px/int viewport1[2] viewport1 = [0] * 2 #px/int viewport2[2] viewport2 = [0] * 2 #px+cdef SelectionDebugPoints selection_debug_points ### module state def init_module(): terrain.red = 0.0 terrain.green = 0.0 terrain.blue = 0.0 terrain.width = 1 terrain.height = 1 frustum.fovy_angle = 33.0 # field of view angle frustum.fovy_radius = 1 / tan(frustum.fovy_angle * M_PI / 360.0) frustum.fovy_radius_zoom = frustum.fovy_radius # zoom == 1. frustum.bounding_sphere_radius = 1. frustum.multisample = 0 # fill modelview_matrix matrix_set_identity(frustum.modelview_matrix) _update_modelview_matrix_translation() # fill projection_matrix, see doc of _glFrustum matrix_set_identity(frustum.projection_matrix) frustum.projection_matrix[2][3] = -1. frustum.projection_matrix[3][3] = 0. _update_projection_matrix() # fill picking_matrix matrix_set_identity(frustum.picking_matrix) program.prog_render = 0 program.prog_hud = 0 program.prog_pick = 0 #px/cdef void _update_modelview_matrix_translation(): def _update_modelview_matrix_translation(): frustum.modelview_matrix[3][2] = -frustum.bounding_sphere_radius * (frustum.fovy_radius_zoom + 1.) #px/cdef void _set_modelview_matrix_rotation(float radiansx, float radiansy): def _set_modelview_matrix_rotation(radiansx, radiansy): #px+cdef vec4 *M #px+cdef float sx, sy, cx, cy #px+cdef float m00, m11, m12, m20 #px/M = &frustum.modelview_matrix[0][0] M = frustum.modelview_matrix sx = sin(radiansx/2) sy = sin(radiansy/2) cx = cos(radiansx/2) cy = cos(radiansy/2) m00 = 2*cx*cx - 1. m11 = 2*cy*cy - 1. m12 = 2*sy*cy m20 = 2*sx*cx # pylint: disable=C0321,C0326 M[0][0] = m00; M[1][0] = 0.; M[2][0] = m20 M[0][1] = m12 * m20; M[1][1] = m11; M[2][1] = -m00 * m12 M[0][2] = -m11 * m20; M[1][2] = m12; M[2][2] = m00 * m11 #px/cdef void _update_projection_matrix(): def _update_projection_matrix(): if terrain.width < terrain.height: aspectx = 1. aspecty = terrain.height / terrain.width else: aspectx = terrain.width / terrain.height aspecty = 1. # see doc of _glFrustum frustum.projection_matrix[0][0] = frustum.fovy_radius / aspectx frustum.projection_matrix[1][1] = frustum.fovy_radius / aspecty frustum.projection_matrix[2][2] = -(frustum.fovy_radius_zoom + 1.) frustum.projection_matrix[3][2] = -(frustum.fovy_radius_zoom + 2. ) * frustum.bounding_sphere_radius * frustum.fovy_radius_zoom #px/cdef void _set_picking_matrix(int x, int y): def _set_picking_matrix(x, y): # Set picking matrix, restrict drawing to one pixel of the viewport # same as: _glLoadIdentity() # _gluPickMatrix(x, y, 1, 1, viewport) # same as: _glLoadIdentity() # _glTranslatef(terrain.width - 2*x, terrain.height - 2*y, 0.) # _glScalef(terrain.width, terrain.height, 1.0) frustum.picking_matrix[3][0] = terrain.width - 2*x frustum.picking_matrix[3][1] = terrain.height - 2*y frustum.picking_matrix[0][0] = terrain.width frustum.picking_matrix[1][1] = terrain.height #px/cdef void _set_picking_matrix_identity(): def _set_picking_matrix_identity(): frustum.picking_matrix[3][0] = 0. frustum.picking_matrix[3][1] = 0. frustum.picking_matrix[0][0] = 1. frustum.picking_matrix[1][1] = 1. def set_frustum(bounding_sphere_radius, zoom): if bounding_sphere_radius > 0: frustum.bounding_sphere_radius = bounding_sphere_radius frustum.fovy_radius_zoom = frustum.fovy_radius / zoom _update_modelview_matrix_translation() _update_projection_matrix() def set_background_color(red, green, blue): terrain.red = red terrain.green = green terrain.blue = blue def set_antialiasing(multisample): frustum.multisample = multisample def set_rotation_xy(x, y): x %= 360 # pylint: disable=C0321 if y < -90: y = -90 elif y > 90: y = 90 _set_modelview_matrix_rotation(M_PI * x / 180.0, M_PI * y / 180.0) return x, y ### GL state #px/cdef void _gl_print_string(msg, GLenum name): def _gl_print_string(msg, name): #px/print(msg, glGetString(name)) print(msg, glGetString(name)) #px/cdef void _gl_print_float(msg, GLenum name): def _gl_print_float(msg, name): #px+cdef GLfloat i #px/glGetFloatv(name, &i) i = glGetFloatv(name) print(msg, i) #px/cdef void _gl_print_integer(msg, GLenum name): def _gl_print_integer(msg, name): #px+cdef GLint i #px/glGetIntegerv(name, &i) i = glGetIntegerv(name) print(msg, i) #px/cdef void _gl_print_bool(msg, GLenum name): def _gl_print_bool(msg, name): #px+cdef GLboolean i #px/glGetBooleanv(name, &i) i = glGetBooleanv(name) print(msg, i) def gl_init(): if DEBUG_MSG: print('GL Strings:') _gl_print_string(' GL Vendor:', GL_VENDOR) _gl_print_string(' GL Renderer:', GL_RENDERER) _gl_print_string(' GL Version:', GL_VERSION) _gl_print_string(' GL Shading Language Version:', GL_SHADING_LANGUAGE_VERSION) #_gl_print_string(' GL Extensions:', GL_EXTENSIONS) _gl_print_integer(' GL_SAMPLE_BUFFERS:', GL_SAMPLE_BUFFERS) _gl_print_float(' GL_SAMPLE_COVERAGE_VALUE:', GL_SAMPLE_COVERAGE_VALUE) _gl_print_bool(' GL_SAMPLE_COVERAGE_INVERT:', GL_SAMPLE_COVERAGE_INVERT) _gl_print_integer(' GL_SAMPLES:', GL_SAMPLES) #px/IF SOURCEGLVERSION == 'GL': if True: print(' GL_MULTISAMPLE:', glIsEnabled(GL_MULTISAMPLE)) print(' GL_SAMPLE_ALPHA_TO_COVERAGE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE)) #print(' GL_SAMPLE_ALPHA_TO_ONE:', glIsEnabled(GL_SAMPLE_ALPHA_TO_ONE)) print(' GL_SAMPLE_COVERAGE:', glIsEnabled(GL_SAMPLE_COVERAGE)) _gl_print_integer(' GL_MAX_VERTEX_ATTRIBS:', GL_MAX_VERTEX_ATTRIBS) glClearColor(0., 0., 0., 1.) glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) glCullFace(GL_BACK) glFrontFace(GL_CCW) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) gl_init_buffers() def gl_exit(): gl_delete_buffers() #px+cdef GLuint prog for prog in [program.prog_render, program.prog_hud, program.prog_pick]: if prog > 0: glDeleteProgram(prog) program.prog_render = 0 program.prog_hud = 0 program.prog_pick = 0 def gl_resize(width, height): terrain.width = width terrain.height = height glViewport(0, 0, terrain.width, terrain.height) _update_projection_matrix() ### render functions #px/cdef void _gl_set_matrix(GLint location, mat4 &matrix): def _gl_set_matrix(location, matrix): #px/glUniformMatrix4fv(location, 1, GL_FALSE, &matrix[0][0]) glUniformMatrix4fv(location, 1, GL_FALSE, matrix) def gl_render(): if DEBUG_PICK: _set_picking_matrix_identity() _gl_render_pick() else: glUseProgram(program.prog_render) #px/IF SOURCEGLVERSION == 'GL': if True: if frustum.multisample: glEnable(GL_MULTISAMPLE) else: glDisable(GL_MULTISAMPLE) glClearColor(terrain.red, terrain.green, terrain.blue, 1.) _gl_set_matrix(program.projection_location, frustum.projection_matrix) _gl_set_matrix(program.modelview_location, frustum.modelview_matrix) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) gl_draw_cube() if DEBUG_DRAW: gl_draw_cube_debug() def gl_render_select_debug(): #px/cdef GLfloat selectdata[12] selectdata = [0.] * 12 selectdata[0] = selection_debug_points.modelview1[0] selectdata[1] = selection_debug_points.modelview1[1] selectdata[2] = selection_debug_points.modelview1[2] selectdata[3] = selection_debug_points.modelview2[0] selectdata[4] = selection_debug_points.modelview2[1] selectdata[5] = selection_debug_points.modelview2[2] selectdata[6] = selection_debug_points.viewport1[0] / terrain.width * 2 - 1 selectdata[7] = selection_debug_points.viewport1[1] / terrain.height * 2 - 1 selectdata[8] = 0 selectdata[9] = selection_debug_points.viewport2[0] / terrain.width * 2 - 1 selectdata[10] = selection_debug_points.viewport2[1] / terrain.height * 2 - 1 selectdata[11] = 0 #px/gl_draw_select_debug(&selectdata[0], sizeof(selectdata), program.prog_hud) gl_draw_select_debug(selectdata, 0, program.prog_hud) ### picking functions #px/cdef void _gl_render_pick(): def _gl_render_pick(): glUseProgram(program.prog_pick) #px/IF SOURCEGLVERSION == 'GL': if True: glDisable(GL_MULTISAMPLE) glClearColor(0., 0., 0., 1.) _gl_set_matrix(program.picking_location, frustum.picking_matrix) _gl_set_matrix(program.projection_pick_location, frustum.projection_matrix) _gl_set_matrix(program.modelview_pick_location, frustum.modelview_matrix) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) gl_pick_cube() #px/cpdef gl_pick_polygons(int x, int y): def gl_pick_polygons(x, y): #px+cdef unsigned char pixel[3] if not (0 <= x < terrain.width and 0 <= y < terrain.height): return 0 _set_picking_matrix(x, y) _gl_render_pick() #px/glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel) pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, [[[0, 0, 0]]])[0][0] index = pixel[0]<<4 | pixel[1] | pixel[2]>>4 return index #px/cdef void _modelview_to_viewport(float *vvect, int *mvect): def _modelview_to_viewport(vvect, mvect): #px+cdef vec4 *M #px+cdef vec4 *P #px+cdef float u0, u1, u2, v0, v1, v3 #px/M = &frustum.modelview_matrix[0][0] M = frustum.modelview_matrix #px/P = &frustum.projection_matrix[0][0] P = frustum.projection_matrix # u = M^T * vvect #assert M[1][0] == 0 u0 = M[0][0]*vvect[0] + M[1][0]*vvect[1] + M[2][0]*vvect[2] + M[3][0] u1 = M[0][1]*vvect[0] + M[1][1]*vvect[1] + M[2][1]*vvect[2] + M[3][1] u2 = M[0][2]*vvect[0] + M[1][2]*vvect[1] + M[2][2]*vvect[2] + M[3][2] #u3 = 1. # v = P * u v0 = P[0][0] * u0 + P[1][0] * u1 + P[2][0] * u2 + P[3][0] #* u3 v1 = P[0][1] * u0 + P[1][1] * u1 + P[2][1] * u2 + P[3][1] #* u3 #v2 = P[0][2] * u0 + P[1][2] * u1 + P[2][2] * u2 + P[3][2] * u3 v3 = P[0][3] * u0 + P[1][3] * u1 + P[2][3] * u2 + P[3][3] #* u3 mvect[0] = int((v0 / v3 + 1) / 2 * terrain.width) mvect[1] = int((v1 / v3 + 1) / 2 * terrain.height) #px/cdef void _viewport_to_modelview(int *vvect, float *mvect): def _viewport_to_modelview(vvect, mvect): #px+cdef vec4 *MT #px+cdef vec4 *P #px+cdef float u0, u1, u2, u3, v0, v1, v2 v0 = vvect[0] / terrain.width * 2 - 1 v1 = vvect[1] / terrain.height * 2 - 1 v2 = 0 #v3 = 1 # P * P^-1 = I # a 0 0 0 A 0 0 0 aA 0 0 0 E = -eD/c # 0 b 0 0 * 0 B 0 0 = 0 bB 0 0 , # 0 0 e c 0 0 0 D 0 0 cC 0 # 0 0 d 0 0 0 C E 0 0 0 dD #px/P = &frustum.projection_matrix[0][0] P = frustum.projection_matrix # u = P^-1 * v u0 = 1 / P[0][0] * v0 u1 = 1 / P[1][1] * v1 u2 = 1 / P[2][3] #assert u2 == -1 u3 = - P[2][2] / P[3][2] / P[2][3] # MT * MT^-1 = I # a b c 0 a 0 f 0 1 0 0 0 U = -cz # 0 d e 0 * b d g 0 = 0 1 0 0, V = -ez # f g h 0 c e h 0 0 0 1 0 W = -hz # 0 0 z 1 U V W 1 0 0 0 1 #px/MT = &frustum.modelview_matrix[0][0] MT = frustum.modelview_matrix # v = M^-1 * u v0 = MT[0][0]*u0 + MT[0][1]*u1 + MT[0][2]*u2 - MT[0][2] * MT[3][2]*u3 v1 = MT[1][0]*u0 + MT[1][1]*u1 + MT[1][2]*u2 - MT[1][2] * MT[3][2]*u3 v2 = MT[2][0]*u0 + MT[2][1]*u1 + MT[2][2]*u2 - MT[2][2] * MT[3][2]*u3 #v3 = u3 mvect[0] = v0 / u3 mvect[1] = v1 / u3 mvect[2] = v2 / u3 def get_cursor_angle(xi, yi, d): #px+cdef float angle #px+cdef int i #px+cdef float x, y selection_debug_points.viewport1[0] = xi selection_debug_points.viewport1[1] = yi _viewport_to_modelview(selection_debug_points.viewport1, selection_debug_points.modelview1) for i in range(3): selection_debug_points.modelview2[i] = d[i] + selection_debug_points.modelview1[i] _modelview_to_viewport(selection_debug_points.modelview2, selection_debug_points.viewport2) x = selection_debug_points.viewport1[0] - selection_debug_points.viewport2[0] y = selection_debug_points.viewport1[1] - selection_debug_points.viewport2[1] angle = atan2(x, y) * 180.0 / M_PI return angle ### shader functions #px/cdef void _gl_print_shader_log(GLuint shader): def _gl_print_shader_log(shader): #px+cdef GLint log_len #px+cdef GLsizei length #px+cdef char log[1024] #px/glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len) log_len = glGetShaderiv(shader, GL_INFO_LOG_LENGTH) if log_len > 0: print('==== Error compiling shader:') #px/glGetShaderInfoLog(shader, 1023, &length, log) log = glGetShaderInfoLog(shader) print(log.decode('utf-8').rstrip()) print('====') else: print('==== Error compiling shader (no log)') #px/cdef void _gl_print_program_log(GLuint program): def _gl_print_program_log(program): #px+cdef GLint log_len #px+cdef GLsizei length #px+cdef char log[1024] #px/glGetProgramiv(program, GL_INFO_LOG_LENGTH, &log_len) log_len = glGetProgramiv(program, GL_INFO_LOG_LENGTH) if log_len > 0: print('==== Error linking shader program:') #px/glGetProgramInfoLog(program, 1023, &length, log) log = glGetProgramInfoLog(program) print(log.decode('utf-8').rstrip()) print('====') else: print('==== Error linking shader program (no log)') #px/cdef GLuint _gl_create_compiled_shader(GLenum shadertype, bytes source): def _gl_create_compiled_shader(shadertype, source): #px+cdef GLuint shader #px+cdef const_GLchar_ptr pchar #px+cdef GLint compile_status shader = glCreateShader(shadertype) if shader == 0: print('Failed to create shader') return 0 #px+pchar = source #px/glShaderSource(shader, 1, &pchar, NULL) glShaderSource(shader, source.decode('utf-8')) # PyOpenGL needs str currently glCompileShader(shader) #px/glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status) compile_status = glGetShaderiv(shader, GL_COMPILE_STATUS) if not compile_status: _gl_print_shader_log(shader) return 0 return shader #px/cdef void _gl_print_program_info(GLuint program): def _gl_print_program_info(program): #px+cdef GLint param #px+cdef int i #px+cdef GLsizei alength #px+cdef GLint asize, location #px+cdef GLenum atype #px+cdef char aname[1024] print('shader program info', program) glValidateProgram(program) program_info = {} for msg, pname in [('delete status', GL_DELETE_STATUS), ('link status', GL_LINK_STATUS), ('validate status', GL_VALIDATE_STATUS), ('info log length', GL_INFO_LOG_LENGTH), ('attached shaders', GL_ATTACHED_SHADERS), ('active attributes', GL_ACTIVE_ATTRIBUTES), ('active attribute max length', GL_ACTIVE_ATTRIBUTE_MAX_LENGTH), ('active uniforms', GL_ACTIVE_UNIFORMS), ('active uniform max length', GL_ACTIVE_UNIFORM_MAX_LENGTH)]: #px/glGetProgramiv(program, pname, ¶m) param = glGetProgramiv(program, pname) program_info[pname] = param print(' ', msg, param) print('active attributes:') for i in range(program_info[GL_ACTIVE_ATTRIBUTES]): #px/glGetActiveAttrib(program, i, 1023, &alength, &asize, &atype, aname) aname, asize, atype = glGetActiveAttrib(program, i); alength = len(aname) location = glGetAttribLocation(program, aname) print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) print('active uniforms:') for i in range(program_info[GL_ACTIVE_UNIFORMS]): #px/glGetActiveUniform(program, i, 1023, &alength, &asize, &atype, aname) aname, asize, atype = glGetActiveUniform(program, i); alength = len(aname) location = glGetUniformLocation(program, aname) print(' {}, {}: length={} size={} type={} location={}'.format(i, aname, alength, asize, atype, location)) #px/cdef GLuint _gl_create_program(bytes vertex_source, bytes fragment_source, int attrib_location, list attributes): def _gl_create_program(vertex_source, fragment_source, attrib_location, attributes): #px+cdef GLuint vertex_shader = 0, fragment_shader = 0 #px+cdef GLuint program #px+cdef GLint link_status if DEBUG_NOSHADER: return 0 program = glCreateProgram() if not DEBUG_NOVSHADER: debug(' creating vertex shader') vertex_shader = _gl_create_compiled_shader(GL_VERTEX_SHADER, vertex_source) if vertex_shader: glAttachShader(program, vertex_shader) else: print('error: no vertex shader') if not DEBUG_NOFSHADER: debug(' creating fragment shader') fragment_shader = _gl_create_compiled_shader(GL_FRAGMENT_SHADER, fragment_source) if fragment_shader: glAttachShader(program, fragment_shader) else: print('error: no fragment shader') for index, name in enumerate(attributes): if name is not None: glBindAttribLocation(program, attrib_location+index, name) glLinkProgram(program) #px/glGetProgramiv(program, GL_LINK_STATUS, &link_status) link_status = glGetProgramiv(program, GL_LINK_STATUS) if not link_status: _gl_print_program_log(program) return 0 if DEBUG_MSG: _gl_print_program_info(program) glDetachShader(program, vertex_shader) glDetachShader(program, fragment_shader) glDeleteShader(vertex_shader) glDeleteShader(fragment_shader) return program #px/def gl_create_render_program(bytes vertex_source, bytes fragment_source): def gl_create_render_program(vertex_source, fragment_source): #px+cdef GLint location if program.prog_render > 0: glDeleteProgram(program.prog_render) attributes = [ b'vertex_attr', b'normal_attr', b'color_attr', b'texcoord_attr', b'barycentric_attr', ] program.prog_render = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) if program.prog_render > 0: glUseProgram(program.prog_render) location = glGetUniformLocation(program.prog_render, b'tex') glUniform1i(location, 0) # 0 is the texture unit (-> glActiveTexture) program.modelview_location = glGetUniformLocation(program.prog_render, b'modelview') program.projection_location = glGetUniformLocation(program.prog_render, b'projection') location = glGetUniformLocation(program.prog_render, b'object') gl_init_object_location(location) #px/def gl_create_hud_program(bytes vertex_source, bytes fragment_source): def gl_create_hud_program(vertex_source, fragment_source): #px+cdef GLint location if program.prog_hud > 0: glDeleteProgram(program.prog_hud) attributes = [b'vertex_attr', None, b'color_attr'] program.prog_hud = _gl_create_program(vertex_source, fragment_source, ATTRIB_LOCATION, attributes) if program.prog_hud > 0: glUseProgram(program.prog_hud) #px/def gl_create_pick_program(bytes vertex_source, bytes fragment_source): def gl_create_pick_program(vertex_source, fragment_source): if program.prog_pick > 0: glDeleteProgram(program.prog_pick) attributes = [b'vertex_attr', b'color_attr'] program.prog_pick = _gl_create_program(vertex_source, fragment_source, PICKATTRIB_LOCATION, attributes) if program.prog_pick > 0: glUseProgram(program.prog_pick) program.picking_location = glGetUniformLocation(program.prog_pick, b'picking') program.projection_pick_location = glGetUniformLocation(program.prog_pick, b'projection') program.modelview_pick_location = glGetUniformLocation(program.prog_pick, b'modelview') pybik-2.1/pybiklib/plugins/0000775000175000017500000000000012556245305016137 5ustar barccbarcc00000000000000pybik-2.1/pybiklib/plugins/challenges.py0000664000175000017500000000217012510216165020606 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2013 B. Clausius # # 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 3 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, see . random = lambda game: game.random() random1 = lambda game: game.random(1) random2 = lambda game: game.random(2) random3 = lambda game: game.random(3) random4 = lambda game: game.random(4) random5 = lambda game: game.random(5) random6 = lambda game: game.random(6) random7 = lambda game: game.random(7) random8 = lambda game: game.random(8) random9 = lambda game: game.random(9) random10 = lambda game: game.random(10) pybik-2.1/pybiklib/plugins/pretty_patterns.py0000664000175000017500000002226212556223565021770 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . # pylint: disable=C0321 def play_stripes_Brick_nnn_2(game): size = game.current_state.model.sizes for unused_j in 0, 1: for i in range(size[1]-1, size[1]//2-1, -1): game.add_moves([(1, i, 0)]) for i in range(1, size[0], 2): game.add_moves([(0, i, 0)]) for i in range(1, size[2], 2): game.add_moves([(2, i, 0)]) def play_stripes_Brick_nn1_4(game): size = game.current_state.model.sizes for i in range(1, size[0], 2): game.add_moves([(0, i, 0)]) for i in range(size[1]-1, size[1]//2, -1): game.add_moves([(1, i, 0)]) for i in range(1, size[0] // 2, 2): game.add_moves([(0, i, 0)]) game.add_moves([(1, size[1]//2, 0)]) for i in range(size[0]//2+1, size[0], 2): game.add_moves([(0, i, 0)]) for i in range(size[1]-1, size[1]//2-1, -1): game.add_moves([(1, i, 0)]) def play_stripes_Brick_1nn_4(game): size = game.current_state.model.sizes for i in range(1, size[2], 2): game.add_moves([(2, i, 0)]) for i in range(size[1]-1, size[1]//2, -1): game.add_moves([(1, i, 0)]) for i in range(1, size[2] // 2, 2): game.add_moves([(2, i, 0)]) game.add_moves([(1, size[1]//2, 0)]) for i in range(size[2]//2+1, size[2], 2): game.add_moves([(2, i, 0)]) for i in range(size[1]-1, size[1]//2-1, -1): game.add_moves([(1, i, 0)]) def play_stripes_Cube_nnn_2(game): size = game.current_state.model.sizes for i in range(0, size[0], 2): game.add_moves([(0, i, 0)] * 2) for i in range(0, size[2], 2): game.add_moves([(2, i, 0)] * 2) for i in range(0, size[0], 2): game.add_moves([(0, i, 0)] * 2) def play_stripes_TowerBrick_nnn_2(game): size = game.current_state.model.sizes for i in range(0, size[0], 2): game.add_moves([(0, i, 0)]) for i in range(0, size[2], 2): game.add_moves([(2, i, 0)]) for i in range(0, size[0], 2): game.add_moves([(0, i, 0)]) def play_chessboard(game): model = game.current_state.model size = model.sizes dups = [s//2 for s in model.symmetries] # Moves are 3-Tuples (axis, slice, dir) axis=0,1,2 slice=0,...,size-1 dir=0,1 if size[0] % 2 == size[1] % 2 == 1: moves = [(0, i, 0) for i in range(1, size[0], 2)] moves += [(1, i, 0) for i in range(1, size[1], 2)] moves += [(2, i, 0) for i in range(1, size[2], 2)] elif size[1] % 2 == size[2] % 2 == 1: moves = [(1, i, 0) for i in range(1, size[1], 2)] moves += [(2, i, 0) for i in range(1, size[2], 2)] moves += [(0, i, 0) for i in range(1, size[0], 2)] elif size[2] % 2 == size[0] % 2 == 1: moves = [(2, i, 0) for i in range(1, size[2], 2)] moves += [(0, i, 0) for i in range(1, size[0], 2)] moves += [(1, i, 0) for i in range(1, size[1], 2)] for move in moves: game.add_moves([move] * dups[move[0]]) def play_t_time_Cube_odd(game): size = game.current_state.model.sizes ll = 'l{0}l{0}'.format(size[0] // 2 + 1) ff = 'f{0}f{0}'.format(size[0] // 2 + 1) game.add_code("{0}du-{1}ud-{0}duu{0}uu{0}d-{0}uu".format(ll, ff)) def play_t_time_Cube_even(game): size = game.current_state.model.sizes ll = 'l{0}l{0}l{1}l{1}'.format(size[0] // 2, size[0] // 2 + 1) ff = 'f{0}f{0}f{1}f{1}'.format(size[0] // 2, size[0] // 2 + 1) game.add_code("{0}dd2u-u2-{1}uu2d-d2-{0}dd2uuu2u2{0}uuu2u2{0}d-d2-{0}uuu2u2".format(ll, ff)) def play_t_time_Tower_odd(game): size = game.current_state.model.sizes ll = 'l{0}'.format(size[0] // 2 + 1) ff = 'f{0}'.format(size[0] // 2 + 1) game.add_code("{0}du-{1}ud-{0}duu{0}uu{0}d-{0}uu".format(ll, ff)) def play_t_time_Tower_even(game): size = game.current_state.model.sizes ll = 'l{0}l{1}'.format(size[0] // 2, size[0] // 2 + 1) ff = 'f{0}f{1}'.format(size[0] // 2, size[0] // 2 + 1) game.add_code("{0}dd2u-u2-{1}uu2d-d2-{0}dd2uuu2u2{0}uuu2u2{0}d-d2-{0}uuu2u2".format(ll, ff)) def play_plus_Cube_odd(game): size = game.current_state.model.sizes for i in range(0, (size[1]-1) // 2): game.add_moves([(1, size[1] - 1 - i, 0)] * 2) game.add_moves([(0, size[0] // 2, 0)] * 2) game.add_moves([(2, size[2] // 2, 0)] * 2) for i in range(0, (size[1]-1) // 2): game.add_moves([(1, i, 0)] * 2) game.add_moves([(0, size[0] // 2, 0)] * 2) game.add_moves([(2, size[2] // 2, 0)] * 2) def play_plus_Cube_even(game): size = game.current_state.model.sizes for i in range(0, (size[1]-1) // 2): game.add_moves([(1, size[1] - 1 - i, 0)] * 2) game.add_moves([(0, size[0] // 2 - 1, 0)] * 2) game.add_moves([(0, size[0] // 2, 0)] * 2) game.add_moves([(2, size[2] // 2, 0)] * 2) game.add_moves([(2, size[2] // 2 - 1, 0)] * 2) for i in range(0, (size[1]-1) // 2): game.add_moves([(1, i, 0)] * 2) game.add_moves([(0, size[0] // 2 - 1, 0)] * 2) game.add_moves([(0, size[0] // 2, 0)] * 2) game.add_moves([(2, size[2] // 2, 0)] * 2) game.add_moves([(2, size[2] // 2 - 1, 0)] * 2) def play_plus_Tower_on(game): size = game.current_state.model.sizes for i in range(0, (size[1]-1) // 2): game.add_moves([(1, size[1] - 1 - i, 0)] * 2) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) for i in range(0, (size[1]-1) // 2): game.add_moves([(1, i, 0)] * 2) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) def play_plus_Tower_en(game): size = game.current_state.model.sizes for i in range(0, (size[1]-1) // 2): game.add_moves([(1, size[1] - 1 - i, 0)] * 2) game.add_moves([(0, size[0] // 2 - 1, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) game.add_moves([(2, size[2] // 2 - 1, 0)]) for i in range(0, (size[1]-1) // 2): game.add_moves([(1, i, 0)] * 2) game.add_moves([(0, size[0] // 2 - 1, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) game.add_moves([(2, size[2] // 2 - 1, 0)]) def play_plus_Brick_ono(game): size = game.current_state.model.sizes for i in range(0, (size[1]-1) // 2): game.add_moves([(1, size[1] - 1 - i, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) for i in range(0, (size[1]-1) // 2): game.add_moves([(1, i, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) def play_plus_Brick_one(game): size = game.current_state.model.sizes for i in range(0, (size[1]-1) // 2): game.add_moves([(1, size[1] - 1 - i, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) game.add_moves([(2, size[2] // 2 - 1, 0)]) for i in range(0, (size[1]-1) // 2): game.add_moves([(1, i, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) game.add_moves([(2, size[2] // 2 - 1, 0)]) def play_plus_Brick_eno(game): size = game.current_state.model.sizes for i in range(0, (size[1]-1) // 2): game.add_moves([(1, size[1] - 1 - i, 0)]) game.add_moves([(0, size[0] // 2 - 1, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) for i in range(0, (size[1]-1) // 2): game.add_moves([(1, i, 0)]) game.add_moves([(0, size[0] // 2 - 1, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) def play_plus_Brick_ene(game): size = game.current_state.model.sizes for i in range(0, (size[1]-1) // 2): game.add_moves([(1, size[1] - 1 - i, 0)]) game.add_moves([(0, size[0] // 2 - 1, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) game.add_moves([(2, size[2] // 2 - 1, 0)]) for i in range(0, (size[1]-1) // 2): game.add_moves([(1, i, 0)]) game.add_moves([(0, size[0] // 2 - 1, 0)]) game.add_moves([(0, size[0] // 2, 0)]) game.add_moves([(2, size[2] // 2, 0)]) game.add_moves([(2, size[2] // 2 - 1, 0)]) def play_minus_CubeTower_odd(game): size = game.current_state.model.sizes game.add_moves([(1, size[1] // 2, 0)] * 2) def play_minus_CubeTower_even(game): size = game.current_state.model.sizes game.add_moves([(1, size[1] // 2, 0)] * 2) game.add_moves([(1, size[1] // 2 - 1, 0)] * 2) def play_minus_Brick_non(game): size = game.current_state.model.sizes game.add_moves([(1, size[1] // 2, 0)]) def play_minus_Brick_nen(game): size = game.current_state.model.sizes game.add_moves([(1, size[1] // 2, 0)]) game.add_moves([(1, size[1] // 2 - 1, 0)]) pybik-2.1/pybiklib/plugins/__init__.py0000664000175000017500000000000012451001717020225 0ustar barccbarcc00000000000000pybik-2.1/pybiklib/plugins/transformations.py0000664000175000017500000000210612454504502021733 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2015 B. Clausius # # 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 3 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, see . def invert(game): game.move_sequence.invert() game.recalc_current_state() def normalize_complete_rotations(game): game.move_sequence.normalize_complete_rotations(game.initial_state.model) game.recalc_current_state() def normalize_moves(game): game.move_sequence.normalize_moves(game.initial_state.model) game.recalc_current_state() pybik-2.1/pybiklib/gl.pxd0000664000175000017500000001303012556223565015576 0ustar barccbarcc00000000000000# pybiklib/gl.pxd # generated with: ./tools/create-gl-pxd.py gl pybiklib/gl.pxd pybiklib/glarea.py pybiklib/gldraw.py pybiklib/gl.pxd from libc.stddef cimport ptrdiff_t from libc.stdint cimport int32_t, intptr_t, int8_t, uint8_t # from /usr/include/GL/gl.h: cdef extern from 'GL/gl.h': enum: GL_FALSE enum: GL_TRUE enum: GL_UNSIGNED_BYTE enum: GL_FLOAT enum: GL_POINTS enum: GL_LINES enum: GL_TRIANGLES enum: GL_CCW enum: GL_BACK enum: GL_CULL_FACE enum: GL_DEPTH_TEST enum: GL_RGB enum: GL_RGBA enum: GL_TEXTURE_2D enum: GL_VENDOR enum: GL_RENDERER enum: GL_VERSION enum: GL_EXTENSIONS enum: GL_DEPTH_BUFFER_BIT enum: GL_COLOR_BUFFER_BIT enum: GL_MULTISAMPLE enum: GL_SAMPLE_ALPHA_TO_COVERAGE enum: GL_SAMPLE_ALPHA_TO_ONE enum: GL_SAMPLE_COVERAGE enum: GL_SAMPLE_BUFFERS enum: GL_SAMPLES enum: GL_SAMPLE_COVERAGE_VALUE enum: GL_SAMPLE_COVERAGE_INVERT # from /usr/include/GL/glext.h: cdef extern from 'GL/glext.h': enum: GL_ARRAY_BUFFER enum: GL_STATIC_DRAW enum: GL_MAX_VERTEX_ATTRIBS enum: GL_FRAGMENT_SHADER enum: GL_VERTEX_SHADER enum: GL_DELETE_STATUS enum: GL_COMPILE_STATUS enum: GL_LINK_STATUS enum: GL_VALIDATE_STATUS enum: GL_INFO_LOG_LENGTH enum: GL_ATTACHED_SHADERS enum: GL_ACTIVE_UNIFORMS enum: GL_ACTIVE_UNIFORM_MAX_LENGTH enum: GL_ACTIVE_ATTRIBUTES enum: GL_ACTIVE_ATTRIBUTE_MAX_LENGTH enum: GL_SHADING_LANGUAGE_VERSION # from /usr/include/GL/gl.h: ctypedef unsigned int GLenum ctypedef unsigned char GLboolean ctypedef unsigned int GLbitfield ctypedef void GLvoid ctypedef int GLint ctypedef unsigned char GLubyte ctypedef unsigned int GLuint ctypedef int GLsizei ctypedef float GLfloat ctypedef float GLclampf # from /usr/include/GL/glext.h: ctypedef ptrdiff_t GLsizeiptr ctypedef ptrdiff_t GLintptr ctypedef char GLchar cdef extern from *: ctypedef GLchar* const_GLchar_ptr "const GLchar*" # from /usr/include/GL/gl.h with: cdef extern from 'GL/gl.h': cdef void glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) cdef void glClear( GLbitfield mask ) cdef void glCullFace( GLenum mode ) cdef void glFrontFace( GLenum mode ) cdef void glEnable( GLenum cap ) cdef void glDisable( GLenum cap ) cdef GLboolean glIsEnabled( GLenum cap ) cdef void glGetBooleanv( GLenum pname, GLboolean *params ) cdef void glGetFloatv( GLenum pname, GLfloat *params ) cdef void glGetIntegerv( GLenum pname, GLint *params ) cdef GLubyte * glGetString( GLenum name ) cdef void glViewport( GLint x, GLint y, GLsizei width, GLsizei height ) cdef void glDrawArrays( GLenum mode, GLint first, GLsizei count ) cdef void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) cdef void glTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) cdef void glActiveTexture( GLenum texture ) # from /usr/include/GL/glext.h with: cdef extern from 'GL/glext.h': cdef void glBindBuffer (GLenum target, GLuint buffer) cdef void glDeleteBuffers (GLsizei n, GLuint *buffers) cdef void glGenBuffers (GLsizei n, GLuint *buffers) cdef void glBufferData (GLenum target, GLsizeiptr size, void *data, GLenum usage) cdef void glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data) cdef void glAttachShader (GLuint program, GLuint shader) cdef void glBindAttribLocation (GLuint program, GLuint index, GLchar *name) cdef void glCompileShader (GLuint shader) cdef GLuint glCreateProgram () cdef GLuint glCreateShader (GLenum type) cdef void glDeleteProgram (GLuint program) cdef void glDeleteShader (GLuint shader) cdef void glDetachShader (GLuint program, GLuint shader) cdef void glEnableVertexAttribArray (GLuint index) cdef void glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) cdef void glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) cdef GLint glGetAttribLocation (GLuint program, GLchar *name) cdef void glGetProgramiv (GLuint program, GLenum pname, GLint *params) cdef void glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) cdef void glGetShaderiv (GLuint shader, GLenum pname, GLint *params) cdef void glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) cdef GLint glGetUniformLocation (GLuint program, GLchar *name) cdef void glLinkProgram (GLuint program) cdef void glShaderSource (GLuint shader, GLsizei count, GLchar **string, GLint *length) cdef void glUseProgram (GLuint program) cdef void glUniform1i (GLint location, GLint v0) cdef void glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, GLfloat *value) cdef void glValidateProgram (GLuint program) cdef void glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, void *pointer) # GL version 2.0 needed pybik-2.1/pybiklib/pybik.py0000775000175000017500000000165412517255513016156 0ustar barccbarcc00000000000000#!/usr/bin/python3 #-*- coding:utf-8 -*- # Copyright © 2009, 2011-2015 B. Clausius # # 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 3 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, see . import os import pybiklib.main root_dir = os.path.dirname(os.path.realpath(os.path.dirname(__file__))) def main(): pybiklib.main.run(root_dir) if __name__ == '__main__': main() pybik-2.1/pybiklib/schema.py0000664000175000017500000001653612556223565016307 0ustar barccbarcc00000000000000# -*- coding: utf-8 -*- # Copyright © 2013-2015 B. Clausius # # 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 3 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, see . from .debug import DEBUG_SHADER N_ = lambda s: s if DEBUG_SHADER: import os from . import config def shaders(names): for filename in os.listdir(config.SHADER_DIR): name = os.path.splitext(filename)[0] if name not in names: names.append(name) return names else: shaders = lambda s: s def tuple_validator(minlen, maxlen, itemtype, value, valuerange=None): if type(value) is not tuple: return False if not (minlen <= len(value) <= maxlen): return False for v in value: if type(v) is not itemtype: return False if valuerange is not None and not valuerange[0] <= v <= valuerange[1]: return False return True def validate_mtype(v): from .model import Model return v in Model.cache_index['types'] def validate_draw_accels(v): if type(v) is not list: return False for t in v: if type(t) is not tuple or len(t) != 2: return False if type(t[0]) is not str or type(t[1]) is not str: return False return True deprecated = type('DeprecatedType', (), {}) def migrate_game_size_blocks_moves_position(settings): mtype = settings.game.type size = settings.game.size blocks = settings.game.blocks moves = settings.game.moves position = settings.game.position if not tuple_validator(3, 100, int, size, (1, 10)): return from .model import Model defaultsize = Model.cache_index['type'][mtype]['defaultsize'] if len(size) < len(defaultsize): return if len(size) > len(defaultsize): size = size[:len(defaultsize)] try: size = Model.cache_index['normsize'][mtype][size] except KeyError: return settings.games[mtype].size = size if type(blocks) is not str: return if type(moves) is not str: moves = '' if type(position) is not int or position < 0: position = 0 return mtype, size, blocks, moves, position def migrate_theme_face_N_color_image_mode(settings): mtype = settings.game.type facenames = ('Up', 'Down', 'Left', 'Right', 'Front', 'Back') for i, facename in enumerate(facenames): color = settings.theme.face[i].color image = settings.theme.face[i].image mode = settings.theme.face[i].mode if type(color) is str: settings.theme.faces[facename].color = color if type(image) is str: settings.theme.faces[facename].image = image if type(mode) in ['tiled', 'mosaic']: settings.theme.faces[facename].mode = mode schema = { # key: (default, range/enum/validator) # None: value without restriction # tuple: contains two values (min, max) # list: contains strings for the enum text, # the index is the enum value # function: returns True, if value is valid 'version': (1, lambda v: type(v) is int), 'window.size': ((850, 650),lambda v: tuple_validator(2, 2, int, v, (10,10000))), 'window.divider': (620, (0, 10000)), 'window.toolbar': (True, lambda v: type(v) is bool), 'window.editbar': (True, lambda v: type(v) is bool), 'window.statusbar': (True, lambda v: type(v) is bool), #TODO: reintroduce it, but per game.type #'draw.default_rotation':((-30.,39.),lambda v: tuple_validator(2, 2, float, v)), #TODO: deprecated 'draw.lighting': (True, lambda v: type(v) is bool), 'draw.shader': (1, shaders(['simple', 'lighting'])), 'draw.selection': (1, ['quadrant', 'simple']), 'draw.speed': (30, (1, 100)), 'game.type': ('Cube', validate_mtype), 'game.size': (None, deprecated), 'game.blocks': (None, deprecated), 'game.moves': (None, deprecated), 'game.position': (None, deprecated), 'games.*.size': (None, lambda v: tuple_validator(0, 10, int, v, (1, 10))), 'theme.face.*.color': (None, deprecated), 'theme.face.*.image': (None, deprecated), 'theme.face.*.mode': (None, deprecated), 'theme.faces.Up.color': ('#a81407', lambda v: type(v) is str), 'theme.faces.Down.color': ('#d94b1c', lambda v: type(v) is str), 'theme.faces.Left.color': ('#f0c829', lambda v: type(v) is str), 'theme.faces.Right.color': ('#e3e3e3', lambda v: type(v) is str), 'theme.faces.Front.color': ('#1d6311', lambda v: type(v) is str), 'theme.faces.Back.color': ('#00275e', lambda v: type(v) is str), 'theme.faces.Front_Left.color': ('#1d6311', lambda v: type(v) is str), 'theme.faces.Front_Right.color':('#9431a8', lambda v: type(v) is str), 'theme.faces.*.image': ('', lambda v: type(v) is str), 'theme.faces.*.mode': (0, ['tiled', 'mosaic']), 'theme.bgcolor': ('#B9a177', lambda v: type(v) is str), 'draw.accels': ([('r', 'KP+6'), ('r-', 'Shift+KP+Right'), ('l', 'KP+4'), ('l-', 'Shift+KP+Left'), ('u', 'KP+8'), ('u-', 'Shift+KP+Up'), ('d', 'KP+2'), ('d-', 'Shift+KP+Down'), ('f', 'KP+5'), ('f-', 'Shift+KP+Clear'), ('b', 'KP+0'), ('b-', 'Shift+KP+Ins'), ('R', 'Ctrl+KP+8'), ('L', 'Ctrl+KP+2'), ('U', 'Ctrl+KP+4'), ('D', 'Ctrl+KP+6'), ('F', 'Ctrl+KP+5'), ('B', 'Ctrl+KP+0'), ], validate_draw_accels), 'draw.zoom': (1.4, (0.1, 100.0)), # The following 6 words are for the antialiasing levels: disabled, ugly, low, medium, high, higher 'draw.samples': (3, [N_('disabled'), N_('ugly'), N_('low'), N_('medium'), N_('high'), N_('higher')]), 'draw.mirror_faces': (False, lambda v: type(v) is bool), 'draw.mirror_distance': (2.1, (0.1, 10.0)), 'action.edit_moves': ('Ctrl+L', lambda v: type(v) is str), 'action.edit_cube': ('', lambda v: type(v) is str), 'action.selectmodel': ('Ctrl+M', lambda v: type(v) is str), 'action.initial_state': ('', lambda v: type(v) is str), 'action.reset_rotation':('Ctrl+R', lambda v: type(v) is str), 'action.preferences': ('Ctrl+P', lambda v: type(v) is str), } pybik-2.1/pybiklib/modelcommon.py0000664000175000017500000001153612556223565017353 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2014-2015 B. Clausius # # 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 3 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, see . from math import sqrt, atan2 epsdigits = 5 epsilon = 10**-epsdigits filebyteorder = 'little' def get_texcoords_range(verts, normal): texcoords = [vert.rotationyx_normal(normal) for vert in verts] minx = min(x for x, y in texcoords) maxx = max(x for x, y in texcoords) miny = min(y for x, y in texcoords) maxy = max(y for x, y in texcoords) return minx, maxx, miny, maxy class Coords (tuple): def __new__(cls, args=(0,0,0)): return tuple.__new__(cls, args) def __add__(self, other): return self.__class__(s+o for s, o in zip(self, other)) def __sub__(self, other): return self.__class__(s-o for s, o in zip(self, other)) def __repr__(self): return '{}({})'.format(self.__class__.__name__, super().__repr__()) def __str__(self): return str(list(self)) class Vector(Coords): def __neg__(self): return self.__class__(-s for s in self) def __mul__(self, value): return self.__class__(s*value for s in self) def __truediv__(self, value): return self.__class__(s/value for s in self) def cross(self, other): return self.__class__(( self[1] * other[2] - other[1] * self[2], self[2] * other[0] - other[2] * self[0], self[0] * other[1] - other[0] * self[1])) def dot(self, other): return sum(s*o for s, o in zip(self, other)) def length_squared(self): return self.dot(self) def length(self): return sqrt(self.length_squared()) def normalised(self): return self / self.length() def angle(self, other): sina = self.cross(other).length() cosa = self.dot(other) return atan2(sina, cosa) def angle_plane(self, other, plane_normal): cross = self.cross(other) sina = cross.length() cosa = self.dot(other) angle = atan2(sina, cosa) if cross.dot(plane_normal) < 0: return - angle return angle def anglex(self): sina = -self[1] cosa = -self[2] if sina*sina + cosa*cosa < epsilon: cosa, sina = 1, 0 return cosa, sina def angley(self): sina = -self[0] cosa = self[2] if sina*sina + cosa*cosa < epsilon: cosa, sina = 1, 0 return cosa, sina def rotationx(self, cosa, sina): return self.__class__((self[0], cosa*self[1] - sina*self[2], sina*self[1] + cosa*self[2])) def rotationy(self, cosa, sina): return self.__class__((cosa*self[0] + sina*self[2], self[1], cosa*self[2] - sina*self[0])) def angleyx(self): ''' Same as: cosay, sinay = self.angley() cosax, sinax = self.rotationy(cosay, sinay).anglex() return cosay, sinay, cosax, sinax ''' x, y, z = self xx = x*x zz = z*z xx_zz = xx + zz if xx_zz < epsilon: if y*y + zz < epsilon: return 1, 0, 1, 0 else: return 1, 0, -z, -y else: if y*y + xx_zz*xx_zz < epsilon: return z, -x, 1, 0 else: return z, -x, -xx_zz, -y def rotationyx(self, cosay, sinay, cosax, sinax): x, y, z = self x, z = cosay*x + sinay*z, cosay*z - sinay*x y, z = cosax*y - sinax*z, sinax*y + cosax*z return self.__class__((x, y, z)) def rotationyx_normal(self, normal): ''' Same as: self.rotationyx(*normal.angleyx()) ''' vx, vy, vz = self nx, ny, nz = normal nxx = nx*nx nzz = nz*nz nxx_zz = nxx + nzz if nxx_zz < epsilon: if ny*ny + nzz < epsilon: pass else: vy = ny*vz - nz*vy else: if ny*ny + nxx_zz*nxx_zz < epsilon: vx = nz*vx - nx*vz else: vy = ny*(nz*vz + nx*vx) - nxx_zz*vy vx = nz*vx - nx*vz return vx, vy pybik-2.1/pybiklib/__init__.py0000664000175000017500000000000012130757601016550 0ustar barccbarcc00000000000000pybik-2.1/pybiklib/debug.py0000664000175000017500000001013412556223565016121 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . # This line is not really needed, but leave it until glarea and gldraw are compiled with cython3 from __future__ import print_function, division import sys DEBUG = False DEBUG_FUNC = DEBUG_MSG = DEBUG_RAND = DEBUG_ROTATE = False DEBUG_DRAW = DEBUG_ALG = DEBUG_KEYS = DEBUG_PICK = DEBUG_MOUSEPOS = False DEBUG_FPS = DEBUG_VFPS = DEBUG_NOLABEL = DEBUG_NOBEVEL = DEBUG_INVISIBLE = False DEBUG_SHADER = DEBUG_NOVSHADER = DEBUG_NOFSHADER = DEBUG_NOSHADER = False DEBUG_PUREPYTHON = DEBUG_INDEXONLY = DEBUG_LIVESHADER = False DEBUG_LOG = DEBUG_LOGDEBUG = DEBUG_LOGGL = False DEBUG_LIVEPLUGINS = False __all__ = ['error', 'debug', 'debug_func', 'DEBUG', ] + [__n for __n in dir(sys.modules[__name__]) if __n.startswith('DEBUG_')] def error(*args, **kwargs): print('ERROR:', *args, **kwargs) debug = lambda *args, **kwargs: None debug_func = lambda x: x def set_flags(debug_flags): module = sys.modules[__name__] module.DEBUG = True for flag in debug_flags: setattr(module, 'DEBUG_' + flag.upper(), True) if module.DEBUG_LOGDEBUG or module.DEBUG_LOGGL: module.DEBUG_LOG = True if module.DEBUG_LOG: import logging logging.basicConfig(filename='pybik.log', level=logging.DEBUG if module.DEBUG_LOGDEBUG else logging.INFO) if module.DEBUG_VFPS: module.DEBUG_FPS = True if module.DEBUG_FUNC: def _debug_pre_func(func, *args, **kwargs): def short_arg(arg): arg = str(arg) maxlen = 80 - debug_func.indent * 3 - 2 if len(arg) > maxlen: return arg[:maxlen] return arg try: func_name = func.__name__ except AttributeError: func_name = func.__name__ print('%s--%s' % (' |'*debug_func.indent, func_name)) debug_func.indent += 1 for arg in args: try: print('%s: %s' % (' |'*debug_func.indent, short_arg(arg))) except Exception: pass for kw, arg in kwargs: try: print('%s: %s=%s' % (' |'*debug_func.indent, kw, short_arg(arg))) except Exception: pass def debug_func(func): def ret_func(*args, **kwargs): _debug_pre_func(func, *args, **kwargs) try: return func(*args, **kwargs) except Exception as e: if debug_func.last_exc != e: print(' X'*debug_func.indent) debug_func.last_exc = e raise finally: debug_func.indent -= 1 print(' |'*debug_func.indent + "--'") try: ret_func.__dict__ = func.__dict__ except AttributeError: pass ret_func.__doc__ = func.__doc__ ret_func.__module__ = func.__module__ ret_func.__name__ = func.__name__ try: ret_func.__defaults__ = func.__defaults__ except AttributeError: pass return ret_func debug_func.indent = 0 debug_func.last_exc = None module.debug_func = debug_func if module.DEBUG_MSG: module.debug = print pybik-2.1/pybiklib/gldraw.py0000664000175000017500000002546712556223565016332 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # cython: profile=False # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . # although this file is compiled with Python3 syntax, Cython needs at least division from __future__ from __future__ import print_function, division # This line makes cython happy global __name__, __package__ # pylint: disable=W0604 #px/__compiled = True __compiled = False __all__ = ['ATTRIB_LOCATION', 'PICKATTRIB_LOCATION', 'matrix_set_identity', 'mat4', 'gl_draw_cube', 'gl_pick_cube', 'gl_init_buffers', 'gl_delete_buffers', 'gl_draw_cube_debug', 'gl_draw_select_debug', 'gl_init_object_location'] #px/from libc.math cimport M_PI, cos, sin from math import radians, cos, sin #pxd/from gl cimport * from OpenGL.GL import * # pylint: disable=W0614,W0401 #px: import ctypes from ctypes import sizeof from OpenGL.raw.GL.VERSION.GL_2_0 import glVertexAttribPointer #px. from .debug import debug, DEBUG if DEBUG: debug('Importing module:', __name__) debug(' from package:', __package__) debug(' compiled:', __compiled) #pxd/cdef enum: # if True: MAX_TRANSFORMATIONS = 24 MAX_BLOCKS = 1000 #pxd: ATTRIB_LOCATION = 0 PICKATTRIB_LOCATION = 5 #px. #pxd>ctypedef float vec4[4] #pxd>ctypedef vec4 mat4[4] #px- mat4 = lambda: [[0.]*4 for _i in range(4)] #pxd/cdef matrix_set_identity(mat4& matrix): def matrix_set_identity(matrix): matrix[0][0] = 1.; matrix[0][1] = 0.; matrix[0][2] = 0.; matrix[0][3] = 0. matrix[1][0] = 0.; matrix[1][1] = 1.; matrix[1][2] = 0.; matrix[1][3] = 0. matrix[2][0] = 0.; matrix[2][1] = 0.; matrix[2][2] = 1.; matrix[2][3] = 0. matrix[3][0] = 0.; matrix[3][1] = 0.; matrix[3][2] = 0.; matrix[3][3] = 1. #px/cdef struct Block: class Block: # pylint: disable=R0903 #px- def __init__(self): #px/vec4 *transformation self.transformation = None #px/bint in_motion self.in_motion = None #px/int idx_triangles self.idx_triangles = None #px/int cnt_triangles self.cnt_triangles = None #px/cdef struct Cube: class cube: # pylint: disable=W0232, R0903 #px/mat4 transformations[MAX_TRANSFORMATIONS] transformations = [[[None]*4, [None]*4, [None]*4, [None]*4] for __t in range(MAX_TRANSFORMATIONS)] #px+unsigned int number_blocks #px/Block blocks[MAX_BLOCKS] blocks = [Block() for __block in range(MAX_BLOCKS)] #px+int cnt_pick #px+int idx_debug #px+GLuint object_location #px+GLuint glbuffer #px+cdef Cube cube #px/cdef struct Animation_Struct: class animation: #px+float angle, angle_max #px+float rotation_x, rotation_y, rotation_z #px/mat4 rotation_matrix rotation_matrix = mat4() #px+cdef Animation_Struct animation def init_module(): #px+cdef int i cube.number_blocks = 0 #cube.blocks cube.cnt_pick = 0 cube.idx_debug = 0 animation.angle = animation.angle_max = 0 def set_transformations(blocks): #px+cdef unsigned int i, b for i, b in enumerate(blocks): cube.blocks[i].transformation = cube.transformations[b] cube.blocks[i].in_motion = False #px/cpdef gl_set_atlas_texture(int x, int w, int h, bytes data): def gl_set_atlas_texture(x, w, h, data): #px/glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data) glTexSubImage2D(GL_TEXTURE_2D, 0, x, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data) #px/cpdef set_animation_start(blocks, float angle_max, float axisx, float axisy, float axisz): def set_animation_start(blocks, angle_max, axisx, axisy, axisz): animation.angle = 0.0 animation.angle_max = angle_max animation.rotation_x, animation.rotation_y, animation.rotation_z = axisx, axisy, axisz matrix_set_identity(animation.rotation_matrix) #px+cdef int block_id #px+cdef bint selected for block_id, unused_block in blocks: cube.blocks[block_id].in_motion = True #px/cdef void _update_animation_rotation_matrix(): def _update_animation_rotation_matrix(): #px/cdef float angle = animation.angle / 180. * M_PI angle = radians(animation.angle) #px+cdef float x, y, z x = animation.rotation_x y = animation.rotation_y z = animation.rotation_z #px+cdef float c, s c = cos(angle) s = sin(angle) animation.rotation_matrix[0][0] = x*x*(1-c) + c animation.rotation_matrix[0][1] = x*y*(1-c) + z*s animation.rotation_matrix[0][2] = x*z*(1-c) - y*s animation.rotation_matrix[1][0] = y*x*(1-c) - z*s animation.rotation_matrix[1][1] = y*y*(1-c) + c animation.rotation_matrix[1][2] = y*z*(1-c) + x*s animation.rotation_matrix[2][0] = x*z*(1-c) + y*s animation.rotation_matrix[2][1] = y*z*(1-c) - x*s animation.rotation_matrix[2][2] = z*z*(1-c) + c #px/cpdef set_animation_next(float increment): def set_animation_next(increment): animation.angle -= increment _update_animation_rotation_matrix() return abs(animation.angle) < animation.angle_max #px/cdef void _mult_matrix(mat4 &dest, mat4 &src1, mat4 &src2): def _mult_matrix(dest, src1, src2): #px+cdef int i, j, k #px+cdef float sum_ for j in range(4): for i in range(4): sum_ = 0. for k in range(4): sum_ += src1[k][i] * src2[j][k] dest[j][i] = sum_ #pxd/cdef void gl_draw_cube(): def gl_draw_cube(): #px+cdef unsigned int i #px/cdef mat4 object_matrix object_matrix = mat4() for i in range(cube.number_blocks): if cube.blocks[i].in_motion: _mult_matrix(object_matrix, animation.rotation_matrix, cube.blocks[i].transformation) #px/glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) else: #px/glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &cube.blocks[i].transformation[0][0]) glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, cube.blocks[i].transformation) glDrawArrays(GL_TRIANGLES, cube.blocks[i].idx_triangles, cube.blocks[i].cnt_triangles) #pxd/cdef void gl_pick_cube(): def gl_pick_cube(): glDrawArrays(GL_TRIANGLES, 0, cube.cnt_pick) #pxd/cdef void gl_init_buffers(): def gl_init_buffers(): #px/glGenBuffers(1, &cube.glbuffer) cube.glbuffer = glGenBuffers(1) #pxd/cdef void gl_delete_buffers(): def gl_delete_buffers(): glBindBuffer(GL_ARRAY_BUFFER, 0) #px/glDeleteBuffers(1, &cube.glbuffer) glDeleteBuffers(1, [cube.glbuffer]) cube.glbuffer = 0 #px/cdef void _gl_set_pointer(GLuint index, GLint size, GLenum type, GLboolean normalized, long pointer): def _gl_set_pointer(index, size, type, normalized, pointer): #px/glVertexAttribPointer(index, size, type, normalized, 0, pointer) glVertexAttribPointer(index, size, type, normalized, 0, ctypes.cast(pointer, ctypes.c_void_p)) glEnableVertexAttribArray(index) #px/cpdef gl_set_data(int nblocks, bytes vertexdata, vertexpointers, vertexinfo, transformations): def gl_set_data(nblocks, vertexdata, vertexpointers, vertexinfo, transformations): assert nblocks <= MAX_BLOCKS, '{} blocks, hardcoded limit is {}'.format( nblocks, MAX_BLOCKS) cube.number_blocks = nblocks #### Create the raw GL data #### #px+cdef long normalpointer, colorpointer, texpospointer, barycpointer #px+cdef unsigned int idx_debug, cnt_pick normalpointer, colorpointer, texpospointer, barycpointer, pickvertpointer, pickcolorpointer = vertexpointers cnts_block, idx_debug, cnt_pick = vertexinfo #px+cdef unsigned int idx_block, idx, i, j idx_block = 0 for idx in range(cube.number_blocks): cube.blocks[idx].idx_triangles = idx_block cube.blocks[idx].cnt_triangles = cnts_block[idx] idx_block += cnts_block[idx] cube.cnt_pick = cnt_pick cube.idx_debug = idx_debug glBindBuffer(GL_ARRAY_BUFFER, cube.glbuffer) #px/glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) glBufferData(GL_ARRAY_BUFFER, len(vertexdata), vertexdata, GL_STATIC_DRAW) _gl_set_pointer(ATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, 0) _gl_set_pointer(ATTRIB_LOCATION+1, 3, GL_FLOAT, GL_FALSE, normalpointer) _gl_set_pointer(ATTRIB_LOCATION+2, 3, GL_UNSIGNED_BYTE, GL_TRUE, colorpointer) _gl_set_pointer(ATTRIB_LOCATION+3, 2, GL_FLOAT, GL_FALSE, texpospointer) _gl_set_pointer(ATTRIB_LOCATION+4, 3, GL_FLOAT, GL_FALSE, barycpointer) _gl_set_pointer(PICKATTRIB_LOCATION, 3, GL_FLOAT, GL_FALSE, pickvertpointer) _gl_set_pointer(PICKATTRIB_LOCATION+1, 3, GL_UNSIGNED_BYTE, GL_TRUE, pickcolorpointer) assert len(transformations) <= MAX_TRANSFORMATIONS, '{} transformations, hardcoded limit is {}'.format( len(transformations), MAX_TRANSFORMATIONS) for idx in range(len(transformations)): for i in range(4): for j in range(4): cube.transformations[idx][i][j] = float(transformations[idx][i][j]) #pxd/cdef void gl_draw_cube_debug(): def gl_draw_cube_debug(): #px/cdef mat4 object_matrix object_matrix = mat4() matrix_set_identity(object_matrix) #px/glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, &object_matrix[0][0]) glUniformMatrix4fv(cube.object_location, 1, GL_FALSE, object_matrix) glDrawArrays(GL_LINES, cube.idx_debug, 6) #pxd/cdef void gl_draw_select_debug(GLfloat *selectdata, GLsizeiptr size, GLuint prog_hud): def gl_draw_select_debug(selectdata, size, prog_hud): #px+cdef int i, j #px+cdef GLintptr offset offset = (cube.idx_debug+6) * 3 * sizeof(GLfloat) #px/glBufferSubData(GL_ARRAY_BUFFER, offset, size, &selectdata[0]) glBufferSubData(GL_ARRAY_BUFFER, offset, len(selectdata) * sizeof(GLfloat), ArrayDatatype.asArray(selectdata, GL_FLOAT)) glDisable(GL_DEPTH_TEST) glDrawArrays(GL_LINES, cube.idx_debug+6, 2) glUseProgram(prog_hud) glDrawArrays(GL_POINTS, cube.idx_debug+6+2, 2) glEnable(GL_DEPTH_TEST) #pxd/cdef void gl_init_object_location(GLuint location): def gl_init_object_location(location): cube.object_location = location pybik-2.1/pybiklib/application.py0000664000175000017500000011465612556236004017344 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . import sys, os from collections import OrderedDict from PyQt5.QtCore import Qt, QFileSystemWatcher, QTimer from PyQt5.QtCore import pyqtSignal as Signal, pyqtSlot as Slot from PyQt5.QtGui import (QPainter, QFontMetrics, QLinearGradient, QPalette, QPen, QBrush, QIcon, QKeySequence, QStandardItemModel, QStandardItem) from PyQt5.QtWidgets import (QMainWindow, QSizePolicy, QAction, QMessageBox, QLabel, QLineEdit, QPushButton, QTreeView, QFrame, QAbstractItemView) from .debug import (debug, DEBUG_ROTATE, DEBUG_DRAW, DEBUG_FPS, DEBUG_LIVESHADER, DEBUG_LIVEPLUGINS) from . import config from .settings import settings from . import dialogs from . import pluginlib from .model import Model, empty_model from .gamestate import GameState from . import drawingarea try: _, ngettext except NameError: debug('gettext not found') _ = lambda string: string ngettext = lambda singular, plural, cnt: singular if cnt == 1 else plural class AnimType: # pylint: disable=R0903 __slots__ = () NONE, FWD, BWD, KEY, NEW = range(5) AnimType = AnimType() class ElideLabel (QLabel): def paintEvent(self, unused_event): p = QPainter(self) fm = QFontMetrics(self.font()) rect = self.contentsRect() if fm.width(self.text()) > rect.width(): gradient = QLinearGradient(rect.topLeft(), rect.topRight()) start = (rect.width() - 2*rect.height()) / rect.width() gradient.setColorAt(start, self.palette().color(QPalette.WindowText)) gradient.setColorAt(1.0, self.palette().color(QPalette.Window)) pen = QPen() pen.setBrush(QBrush(gradient)) p.setPen(pen) p.drawText(self.rect(), Qt.TextSingleLine, self.text()) class QMoveEdit (QLineEdit): nextword = Signal() prevword = Signal() swapnext = Signal() swapprev = Signal() def keyPressEvent(self, event): if event.matches(QKeySequence.MoveToNextWord): self.nextword.emit() elif event.matches(QKeySequence.MoveToPreviousWord): self.prevword.emit() elif event.key() == Qt.Key_Right and event.modifiers() == Qt.AltModifier: self.swapnext.emit() elif event.key() == Qt.Key_Left and event.modifiers() == Qt.AltModifier: self.swapprev.emit() else: QLineEdit.keyPressEvent(self, event) class MainWindow (QMainWindow): ### init ### def __init__(self, opts, **kwargs): super().__init__(**kwargs) if not os.path.exists(config.USER_DATA_DIR): os.makedirs(config.USER_DATA_DIR) try: Model.load_index() except OSError as e: error_message = str(e) debug(error_message) QTimer.singleShot(1000, lambda: self.error_dialog(error_message)) self.games_file = opts.games_file # initialize settings try: version = settings.load(opts.config_file) except OSError as e: error_message = _('An error occurred while reading the settings:\n' '{error_message}').format(error_message=e) debug(error_message) settings.load('') #FIXME: don't guess, show message if window is visible QTimer.singleShot(1000, lambda: self.error_dialog(error_message)) else: if version == 1: from . import schema schema.migrate_theme_face_N_color_image_mode(settings) values = schema.migrate_game_size_blocks_moves_position(settings) #XXX: block indices are not the same in previous version #if values is not None: # GameState.migrate_1to2(self.games_file, *values) # Set default format before any widget is created, so that everything uses the same format. # To test this use DEBUG_VFPS. The framerate should be then >60. drawingarea.CubeArea.set_default_surface_format() # UI self.ui = dialogs.UI(self, 'main.ui') from .ui.main import retranslate retranslate(self) self.ui.splitter.setCollapsible(0, False) self.ui.splitter.setStretchFactor(0, 1) self.ui.splitter.setStretchFactor(1, 0) self.ui.label_debug_text.setVisible(DEBUG_DRAW or DEBUG_FPS) # set icons self.setWindowIcon(QIcon(config.APPICON_FILE)) self.ui.button_edit_exec.setIcon(QIcon.fromTheme('system-run')) self.ui.button_edit_clear.setIcon(QIcon.fromTheme('edit-clear')) self.ui.action_quit.setIcon(QIcon.fromTheme('application-exit')) self.ui.action_rewind.setIcon(QIcon.fromTheme('media-seek-backward')) self.ui.action_previous.setIcon(QIcon.fromTheme('media-skip-backward')) self.ui.action_stop.setIcon(QIcon.fromTheme('media-playback-stop')) self.ui.action_play.setIcon(QIcon.fromTheme('media-playback-start')) self.ui.action_next.setIcon(QIcon.fromTheme('media-skip-forward')) self.ui.action_forward.setIcon(QIcon.fromTheme('media-seek-forward')) self.ui.action_add_mark.setIcon(QIcon.fromTheme('list-add')) self.ui.action_remove_mark.setIcon(QIcon.fromTheme('list-remove')) self.ui.action_preferences.setIcon(QIcon.fromTheme('document-properties')) self.ui.action_info.setIcon(QIcon.fromTheme('help-about')) self.ui.action_help.setIcon(QIcon.fromTheme('help')) def set_shortcut(qobj, key): # Workaround, need to keep a reference to keysequence to avoid exception keysequence = QKeySequence(key) qobj.setShortcut(keysequence) set_shortcut(self.ui.action_selectmodel, settings.action.selectmodel) set_shortcut(self.ui.action_initial_state, settings.action.initial_state) set_shortcut(self.ui.action_reset_rotation, settings.action.reset_rotation) set_shortcut(self.ui.action_preferences, settings.action.preferences) # widgets that are not created with Qt Designer self.playbarstate = self.create_toolbar() self.edit_moves = QMoveEdit() self.edit_moves.setObjectName("edit_moves") self.edit_moves.setFrame(False) self.ui.layout_moves.insertWidget(1, self.edit_moves) self.edit_moves.returnPressed.connect(self.on_edit_moves_returnPressed) self.edit_moves.nextword.connect(self.on_edit_moves_nextword) self.edit_moves.prevword.connect(self.on_edit_moves_prevword) self.edit_moves.swapprev.connect(self.on_edit_moves_swapprev) self.edit_moves.swapnext.connect(self.on_edit_moves_swapnext) self.cube_area = self.create_cube_area(opts) self.cube_area.drop_color.connect(self.on_cubearea_drop_color) self.cube_area.drop_file.connect(self.on_cubearea_drop_file) self.cube_area.debug_info.connect(self.on_cubearea_debug_info) self.setTabOrder(self.edit_moves, self.cube_area) self.setTabOrder(self.cube_area, self.ui.box_sidepane) self.cube_area.setFocus(Qt.OtherFocusReason) self.status_text = ElideLabel() p = self.status_text.sizePolicy() p.setHorizontalStretch(1) p.setHorizontalPolicy(QSizePolicy.Ignored) self.status_text.setSizePolicy(p) self.ui.statusbar.addWidget(self.status_text) # created when needed self.progress_dialog = None # actions that belongs to no widget self.action_jump_to_editbar = QAction(self) self.action_jump_to_editbar.setObjectName('action_jump_to_editbar') self.action_jump_to_editbar.setShortcut(QKeySequence(settings.action.edit_moves)) self.action_jump_to_editbar.triggered.connect(self.on_action_jump_to_editbar_triggered) self.addAction(self.action_jump_to_editbar) self.action_edit_cube = QAction(self) self.action_edit_cube.setObjectName('action_edit_cube') self.action_edit_cube.setShortcut(QKeySequence(settings.action.edit_cube)) self.action_edit_cube.triggered.connect(self.on_action_edit_cube_triggered) self.addAction(self.action_edit_cube) if DEBUG_LIVESHADER: self.filesystemwatcher = QFileSystemWatcher() self.filesystemwatcher.addPath(config.SHADER_DIR) self.filesystemwatcher.directoryChanged.connect(lambda unused_path: self.cube_area.reload_shader()) if DEBUG_LIVEPLUGINS: from . import plugins self.filesystemwatcher_plugins = QFileSystemWatcher() self.filesystemwatcher_plugins.addPaths([config.PLUGINS_DIR, os.path.dirname(plugins.__file__)]) def reload_plugins(unused_path): import importlib for name, module in sys.modules.items(): if name.startswith(('pybiklib.plugins.')): importlib.reload(module) plugin_group = self.active_plugin_group self.add_plugins_to_sidepane() plugin_group = min(plugin_group, len(self.plugin_group_widgets)-1) if plugin_group < 0: plugin_group = None self.set_active_plugin_group(plugin_group) self.filesystemwatcher_plugins.directoryChanged.connect(reload_plugins) # plugins self.treestore = QStandardItemModel() self.selected_tree_path = None self.active_plugin_group = None self.plugin_group_widgets = [] # tuples of (button, treeview) self.plugin_helper = pluginlib.PluginHelper() self.add_plugins_to_sidepane(False) self.unsolved = False self.animtype = AnimType.NONE # Load window state from settings self.ui.action_toolbar.setChecked(settings.window.toolbar) self.ui.action_editbar.setChecked(settings.window.editbar) self.ui.action_statusbar.setChecked(settings.window.statusbar) self.ui.toolbar.setVisible(settings.window.toolbar) self.ui.frame_editbar.setVisible(settings.window.editbar) self.ui.statusbar.setVisible(settings.window.statusbar) self.move_keys = self.get_move_key_dict() settings.keystore.changed.connect(self.on_settings_changed, Qt.QueuedConnection) settings.keystore.error.connect(self.on_settings_error) # Reload last game self.game = GameState() self.update_ui() self.resize(*settings.window.size) divider_position = settings.window.divider self.show() sizes = self.ui.splitter.sizes() sizes = [divider_position, sum(sizes)-divider_position] self.ui.splitter.setSizes(sizes) QTimer.singleShot(0, self.postcreate) def create_cube_area(self, opts): cube_area = drawingarea.CubeArea(opts=opts, model=empty_model) cube_area.setObjectName('drawingarea') sizepolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizepolicy.setHorizontalStretch(0) sizepolicy.setVerticalStretch(0) cube_area.setSizePolicy(sizepolicy) self.ui.verticalLayout.addWidget(cube_area) cube_area.animation_ending.connect(self.on_cubearea_animation_ending) cube_area.request_rotation.connect(self.on_cubearea_request_rotation) cube_area.request_swap_blocks.connect(self.on_cubearea_request_swap_blocks) cube_area.request_rotate_block.connect(self.on_cubearea_request_rotate_block) glformat = cube_area.format() dialogs.PreferencesDialog.sample_buffers = max(glformat.samples(), 1) return cube_area def create_toolbar(self): play_actions = [self.ui.action_rewind, self.ui.action_previous, self.ui.action_stop, self.ui.action_play, self.ui.action_next, self.ui.action_forward, self.ui.action_add_mark, self.ui.action_remove_mark] for action in play_actions: self.ui.toolbar.addAction(action) self.ui.toolbar.addSeparator() self.ui.toolbar.addAction(self.ui.action_help) playbarstate = PlaybarState(play_actions) return playbarstate def postcreate(self): self.load_current_game() self.add_plugins_to_sidepane() ### helper functions ### @staticmethod def get_settings(): # only for pybiktest.utils return settings @staticmethod def keyval_from_name(keystr): key = QKeySequence('+'.join(k for k in keystr.split('+') if k != 'KP')) if key.count() == 0: return 0 key = key[0] if 'KP' in keystr.split('+'): key |= int(Qt.KeypadModifier) return key def get_move_key_dict(self): return {self.keyval_from_name(key): move for (move, key) in settings.draw.accels} def add_plugins_to_sidepane(self, load=True): # remove old plugins self.treestore.clear() for button, treeview in self.plugin_group_widgets: self.ui.layout_sidepane.removeWidget(button) button.deleteLater() treeview.setModel(None) self.ui.layout_sidepane.removeWidget(treeview) treeview.deleteLater() self.plugin_group_widgets.clear() # get a list of all plugins if load: plugins = self.plugin_helper.load_plugins() if self.plugin_helper.error_messages: self.error_dialog('\n\n'.join(self.plugin_helper.error_messages)) else: plugins = [] # convert plugin list to a tree structure ptree = OrderedDict() for plugin_path, func in plugins: subtree = [None, ptree, None] for name, transl in plugin_path: subtree = subtree[1].setdefault(name, [None, OrderedDict(), transl]) if plugin_path: subtree[0] = func # fill treestore with plugins def fill_treestore(parent, tree): for name, [func, subtree, transl] in tree.items(): item = QStandardItem(transl) item.setData(func) parent.appendRow(item) fill_treestore(item, subtree) fill_treestore(self.treestore, ptree) # create widgets in the sidepane to display the plugins for i, (name, [func, subtree, transl]) in enumerate(ptree.items()): button = QPushButton(self.ui.box_sidepane) button.setText(transl) button.setFlat(True) button.setFocusPolicy(Qt.TabFocus) self.ui.layout_sidepane.addWidget(button) obsc = lambda i: lambda: self.on_button_sidepane_clicked(i) button.clicked.connect(obsc(i)) treeview = QTreeView(self.ui.box_sidepane) treeview.setFrameShape(QFrame.NoFrame) treeview.setEditTriggers(QAbstractItemView.NoEditTriggers) treeview.setUniformRowHeights(True) treeview.setAnimated(True) treeview.setHeaderHidden(True) treeview.hide() treeview.setModel(self.treestore) index = self.treestore.index(i, 0) treeview.setRootIndex(index) self.ui.layout_sidepane.addWidget(treeview) treeview.activated.connect(self.on_treeview_activated) self.plugin_group_widgets.append((button, treeview)) # visibility self.set_active_plugin_group(0 if self.plugin_group_widgets else None) if load: self.hide_incompatible_plugins() def hide_incompatible_plugins(self): def hide_row(treeview, index): func_idx = index.data(Qt.UserRole + 1) if func_idx is not None: try: self.plugin_helper.get_function(self.game.current_state.model, func_idx) except pluginlib.PluginModelCompatError: return True hide_all = func_idx is None rows = self.treestore.rowCount(index) for r in range(rows): hide = hide_row(treeview, self.treestore.index(r, 0, index)) treeview.setRowHidden(r, index, hide) hide_all = hide_all and hide return hide_all for i, (button, treeview) in enumerate(self.plugin_group_widgets): index = treeview.rootIndex() if hide_row(treeview, index): button.hide() if i == self.active_plugin_group: self.set_active_plugin_group(0) else: button.show() def set_active_plugin_group(self, i): if self.active_plugin_group is not None: unused_button, treeview = self.plugin_group_widgets[self.active_plugin_group] treeview.hide() if i is not None: unused_button, treeview = self.plugin_group_widgets[i] treeview.show() self.active_plugin_group = i def load_current_game(self): mtype = settings.game.type size = settings.games[mtype].size model = Model(mtype, size) self.game.load(self.games_file, model) self.cube_area.set_glmodel_full(model, self.game.current_state.rotations) self.update_ui() def load_game(self, mtype, size): self.save_game() if self.is_animating(): return assert mtype is not None model = Model(mtype, size) settings.game.type = model.type settings.games[model.type].size = model.size self.game.load(self.games_file, model) self.unsolved = False self.cube_area.set_glmodel_full(model, self.game.current_state.rotations) self.update_ui() self.hide_incompatible_plugins() def save_game(self): self.game.save(self.games_file) def new_game(self, mtype=None, size=None, solved=False): if self.is_animating(): return self.game.new_game(None, solved) self.unsolved = not solved self.cube_area.set_glmodel_full(None, self.game.current_state.rotations) self.update_ui() def is_animating(self): return self.cube_area.animation_active def start_animation(self, move_data, stop_after, animtype): if move_data: blocks = self.game.current_state.identify_rotation_blocks( move_data.axis, move_data.slice) self.cube_area.animate_rotation(move_data, blocks, stop_after) self.playbarstate.playing(self.game.mark_before) self.animtype = animtype return True return False def update_statusbar(self): '''This function must be called before any action that change the move queue length to reflect total count of moves and after each single move''' if self.cube_area.editing_model: mesg = _('Press the Esc key to exit Edit Mode') self.unsolved = False else: current = self.game.move_sequence.current_place total = self.game.move_sequence.queue_length solved = self.game.current_state.is_solved() model_text = str(self.game.current_state.model) # substitution for {move_text} in statusbar text move_text = ngettext("{current} / {total} move", "{current} / {total} moves", total).format(current=current, total=total) # substitution for {solved_text} in statusbar text solved_text = _('solved') if solved else _('not solved') # statusbar text mesg = _('{model_text}, {move_text}, {solved_text}').format( model_text=model_text, move_text=move_text, solved_text=solved_text) if self.unsolved and solved: self.unsolved = False self.show_solved_message() self.status_text.setText(mesg) def update_ui(self): # update toolbar if self.game.move_sequence.at_start(): if self.game.move_sequence.at_end(): self.playbarstate.empty() else: self.playbarstate.first() else: if self.game.move_sequence.at_end(): self.playbarstate.last(self.game.move_sequence.is_mark_after(-1)) else: self.playbarstate.mid(self.game.move_sequence.is_mark_current()) # update formula code, pos = self.game.move_sequence.format(self.game.current_state.model) self.set_edit_moves(code, pos) self.update_statusbar() def show_solved_message(self): dialog = QMessageBox(self) dialog.setWindowTitle(_(config.APPNAME)) dialog.setText(_('Congratulations, you have solved the puzzle!')) dialog.setIcon(QMessageBox.Information) dialog.setStandardButtons(QMessageBox.Close) self.cube_area.set_std_cursor() QTimer.singleShot(100, dialog.exec_) def error_dialog(self, message, delay=0): dialog = QMessageBox(self) dialog.setWindowTitle(_(config.APPNAME)) dialog.setText(message) dialog.setIcon(QMessageBox.Warning) dialog.setStandardButtons(QMessageBox.Close) self.cube_area.set_std_cursor() if delay: QTimer.singleShot(delay, dialog.exec_) else: dialog.exec_() def set_progress(self, step, message=None, value_max=None): if self.progress_dialog is None: self.progress_dialog = dialogs.ProgressDialog(parent=self) canceled = self.progress_dialog.tick(step, message, value_max) from PyQt5.QtWidgets import qApp qApp.processEvents() return canceled def end_progress(self): if self.progress_dialog is not None: self.progress_dialog.done() ### application handlers ### def resizeEvent(self, event): settings.window.size = event.size().width(), event.size().height() sizes = self.ui.splitter.sizes() if sum(sizes) > 0: # ignore the first resize event where sizes==[0,0] settings.window.divider = sizes[0] QMainWindow.resizeEvent(self, event) def closeEvent(self, event): try: dialogs.Dialog.delete() self.cube_area.stop() settings.disconnect() self.save_game() settings.flush() finally: QMainWindow.closeEvent(self, event) def on_settings_changed(self, key): if key == 'draw.accels': self.move_keys = self.get_move_key_dict() def on_settings_error(self, message): self.status_text.setText(message) MODIFIER_MASK = int(Qt.ShiftModifier | Qt.ControlModifier | Qt.KeypadModifier) def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.cube_area.set_editing_mode(False) self.update_ui() return try: move = self.move_keys[event.key() | int(event.modifiers()) & self.MODIFIER_MASK] except KeyError: event.ignore() QMainWindow.keyPressEvent(self, event) return else: if self.is_animating() and self.animtype != AnimType.KEY: return if not self.is_animating(): self.game.move_sequence.truncate() self.game.move_sequence.parse(move, len(move), self.game.current_state.model) self.update_ui() if not self.is_animating(): move_data = self.game.step_next() self.start_animation(move_data, stop_after=False, animtype=AnimType.KEY) ### GL area handlers ### def on_cubearea_animation_ending(self, last_move): self.cube_area.set_transformations(self.game.current_state.rotations) if not last_move: # go again self.update_statusbar() if self.animtype == AnimType.BWD: move_data = self.game.step_back() else: move_data = self.game.step_next() if self.start_animation(move_data, stop_after=False, animtype=self.animtype): return self.cube_area.animation_end() self.update_ui() def on_cubearea_request_rotation(self, maxis, mslice, mdir): self.game.set_next((maxis, mslice, mdir)) self.update_statusbar() move_data = self.game.step_next() self.start_animation(move_data, stop_after=False, animtype=AnimType.NEW) def on_cubearea_request_swap_blocks(self, blockpos, maxis, mslice, mdir): self.game.swap_block(blockpos, maxis, mslice, mdir) self.cube_area.set_transformations(self.game.current_state.rotations) def on_cubearea_request_rotate_block(self, blockpos, rdir): self.game.rotate_block(blockpos, rdir) self.cube_area.set_transformations(self.game.current_state.rotations) def on_cubearea_drop_color(self, blockpos, facesym, colorname): if blockpos < 0: settings.theme.bgcolor = colorname else: colornum = self.game.current_state.get_colornum(blockpos, facesym) facekey = self.game.current_state.model.facekeys[colornum] settings.theme.faces[facekey].color = colorname def on_cubearea_drop_file(self, blockpos, facesym, filename): colornum = self.game.current_state.get_colornum(blockpos, facesym) facekey = self.game.current_state.model.facekeys[colornum] settings.theme.faces[facekey].image = filename def on_cubearea_debug_info(self, mode, info): if mode == 'fps': text = "FPS %.1f" % info elif mode == 'pick': pos = self.cube_area.pickdata.blockpos cube = self.game.current_state idx, rot = cube._blocksr[pos] #FIXME: access to protected member color = cube.get_colorsymbol(pos, self.cube_area.pickdata.symbol) angle = self.cube_area.pickdata.angle and format(self.cube_area.pickdata.angle, '.1f') text = ('idx {idx}, pos {pos} {indices}, rot {rot!r}\n' 'face {0.symbol} ({face}), color {color}\n' 'axis {0.maxis}, slice {0.mslice}, dir {0.mdir}, angle {angle}\n' 'mouse {1[0]}, {1[1]}').format(self.cube_area.pickdata, self.cube_area.mouse_xy, idx=idx, pos=pos, indices=cube.model.cell_indices[pos], rot=rot, color=color, angle=angle, **info) else: text = 'unknown mode: ' + mode self.ui.label_debug_text.setText(text) ### @Slot(int, int) def on_splitter_splitterMoved(self, pos, index): # pylint: disable=R0201 if index == 1: settings.window.divider = pos ### sidepane handlers ### def on_button_sidepane_clicked(self, i): self.set_active_plugin_group(i) def on_treeview_activated(self, index): if self.is_animating(): return func_idx = index.data(Qt.UserRole + 1) if func_idx is None: return if self.game.current_state.model is empty_model: return try: func = self.plugin_helper.get_function(self.game.current_state.model, func_idx) except pluginlib.PluginModelCompatError as e: self.error_dialog(e.args[0]) return # model accepted, now run the plugin function game = self.game.copy() try: func(game) except pluginlib.PluginSolverAbort as e: self.error_dialog(e.args[0]) return if game.plugin_mode == 'append': # append moves self.unsolved = False position = self.game.move_sequence.mark_and_extend(game.move_sequence) changed = position >= 0 if changed: self.game.goto_next_pos(position) changed = 'animate' elif game.plugin_mode == 'replace': # replace game self.game.initial_state = game.initial_state self.game.current_state = game.current_state self.game.move_sequence = game.move_sequence self.unsolved = False changed = True elif game.plugin_mode == 'challenge': # challenge self.game.initial_state = game.initial_state self.game.current_state = game.initial_state.copy() self.game.move_sequence.reset() self.unsolved = True changed = True else: assert False if changed: self.cube_area.set_transformations(self.game.current_state.rotations) self.update_ui() if changed == 'animate': move_data = self.game.step_next() self.start_animation(move_data, stop_after=False, animtype=AnimType.NEW) self.cube_area.update() ### action handlers ### @Slot() def on_action_new_triggered(self): self.new_game(solved=False) @Slot() def on_action_new_solved_triggered(self): self.new_game(solved=True) @Slot() def on_action_selectmodel_triggered(self): dialog = dialogs.SelectModelDialog.run(parent=self) if dialog: dialog.response_ok.connect(self.load_game) @Slot() def on_action_quit_triggered(self): self.close() @Slot() def on_action_preferences_triggered(self): dialogs.PreferencesDialog.run(parent=self) @Slot(bool) def on_action_toolbar_toggled(self, checked): self.ui.toolbar.setVisible(checked) settings.window.toolbar = checked @Slot(bool) def on_action_editbar_toggled(self, checked): self.ui.frame_editbar.setVisible(checked) settings.window.editbar = checked @Slot(bool) def on_action_statusbar_toggled(self, checked): self.ui.statusbar.setVisible(checked) settings.window.statusbar = checked @Slot() def on_action_reset_rotation_triggered(self): self.cube_area.reset_rotation() @Slot() def on_action_help_triggered(self): dialogs.HelpDialog.run(parent=self) @Slot() def on_action_info_triggered(self): about = dialogs.AboutDialog(parent=self) about.run() @Slot() def on_action_rewind_triggered(self): if self.is_animating(): self.cube_area.stop_requested = True if self.animtype == AnimType.BWD: self.game.step_next() # undo the already applied move self.game.goto_prev_mark() self.cube_area.animate_abort() else: needs_update = self.game.goto_prev_mark() self.cube_area.set_transformations(self.game.current_state.rotations) if needs_update: self.cube_area.update() self.update_ui() @Slot() def on_action_previous_triggered(self): if self.is_animating(): if self.animtype == AnimType.BWD: # request another BWD move self.cube_area.stop_requested = False else: self.cube_area.stop_requested = True self.game.step_back() self.cube_area.animate_abort() self.cube_area.stop_requested = True else: move_data = self.game.step_back() self.start_animation(move_data, stop_after=True, animtype=AnimType.BWD) @Slot() def on_action_stop_triggered(self): if self.is_animating(): if self.cube_area.stop_requested: self.cube_area.animate_abort() else: self.cube_area.stop_requested = True @Slot() def on_action_play_triggered(self): if not self.is_animating(): move_data = self.game.step_next() self.start_animation(move_data, stop_after=False, animtype=AnimType.FWD) @Slot() def on_action_next_triggered(self): if self.is_animating(): sr = self.cube_area.stop_requested if self.animtype == AnimType.BWD: self.cube_area.stop_requested = True self.game.step_next() else: self.cube_area.stop_requested = False self.cube_area.animate_abort() self.cube_area.stop_requested = sr else: move_data = self.game.step_next() self.start_animation(move_data, stop_after=True, animtype=AnimType.FWD) @Slot() def on_action_forward_triggered(self): if self.is_animating(): self.cube_area.stop_requested = True if self.animtype != AnimType.BWD: self.game.step_back() # undo the already applied move self.game.goto_next_mark() self.cube_area.animate_abort() else: self.game.goto_next_mark() self.cube_area.set_transformations(self.game.current_state.rotations) self.cube_area.update() self.update_ui() @Slot() def on_action_add_mark_triggered(self): self.game.move_sequence.mark_current(True) self.update_ui() @Slot() def on_action_remove_mark_triggered(self): self.game.move_sequence.mark_current(False) self.update_ui() @Slot() def on_action_initial_state_triggered(self): if self.is_animating(): return self.game.set_as_initial_state() self.update_ui() ### edit formula handlers ### def on_action_jump_to_editbar_triggered(self): self.edit_moves.setFocus() def on_edit_moves_returnPressed(self): if self.is_animating(): self.cube_area.animate_abort(update=False) code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() self.game.set_code(code, pos) self.cube_area.set_transformations(self.game.current_state.rotations) self.cube_area.update() self.update_ui() def on_edit_moves_nextword(self): code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() moves, mpos, cpos = self.game.move_sequence.new_from_code(code, pos, self.game.current_state.model) moves.current_place = mpos if cpos <= pos: moves.advance() unused_code, pos = moves.format(self.game.current_state.model) self.edit_moves.setCursorPosition(pos) def on_edit_moves_prevword(self): code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() moves, mpos, cpos = self.game.move_sequence.new_from_code(code, pos, self.game.current_state.model) moves.current_place = mpos if cpos >= pos: moves.retard() unused_code, pos = moves.format(self.game.current_state.model) self.edit_moves.setCursorPosition(pos) def on_edit_moves_swapnext(self): code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() moves, mpos, cpos = self.game.move_sequence.new_from_code(code, pos, self.game.current_state.model) moves.current_place = mpos if pos < cpos: moves.retard() moves.swapnext() code, pos = moves.format(self.game.current_state.model) self.edit_moves.setText(code) self.edit_moves.setCursorPosition(pos) def on_edit_moves_swapprev(self): code = self.edit_moves.text() pos = self.edit_moves.cursorPosition() moves, mpos, cpos = self.game.move_sequence.new_from_code(code, pos, self.game.current_state.model) moves.current_place = mpos if pos < cpos: moves.retard() moves.swapprev() code, pos = moves.format(self.game.current_state.model) self.edit_moves.setText(code) self.edit_moves.setCursorPosition(pos) @Slot() def on_button_edit_clear_clicked(self): self.edit_moves.setText('') self.on_edit_moves_returnPressed() @Slot() def on_button_edit_exec_clicked(self): self.on_edit_moves_returnPressed() def set_edit_moves(self, code, pos): self.edit_moves.setText(code) self.edit_moves.setCursorPosition(pos) def on_action_edit_cube_triggered(self): self.cube_area.animate_abort(update=False) self.game.goto_start() if DEBUG_ROTATE: self.game.current_state.debug_blocksymbols(allsyms=True) self.cube_area.set_transformations(self.game.current_state.rotations) self.cube_area.set_editing_mode(True) self.update_ui() class PlaybarState: def __init__(self, play_actions): self.play_button_list = play_actions self.empty() def set_toolbar_state(self, sflags, vflags, mark): if mark: vflags ^= 0b11 for a in reversed(self.play_button_list): a.setEnabled(sflags & 1) a.setVisible(vflags & 1) sflags >>= 1 vflags >>= 1 # pylint: disable=C0321,C0326 def empty(self): self.set_toolbar_state(0b00000000, 0b11011101, False) def first(self): self.set_toolbar_state(0b00011100, 0b11011101, False) def mid(self, mark): self.set_toolbar_state(0b11011111, 0b11011110, mark) def last(self, mark): self.set_toolbar_state(0b11000011, 0b11011110, mark) def playing(self, mark): self.set_toolbar_state(0b11101100, 0b11101110, mark) # pylint: enable=C0321 pybik-2.1/pybiklib/model.py0000664000175000017500000007232112556223565016141 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2012-2015 B. Clausius # # 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 3 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, see . import sys, os import re import pickle from array import array from .debug import DEBUG_DRAW, debug from .config import MODELS_DIR from .modelcommon import filebyteorder, epsilon, get_texcoords_range, Vector, epsdigits try: _ except NameError: _ = lambda t: t def get_texcoords(vector, normal, minx, maxx, miny, maxy): x, y = vector.rotationyx_normal(normal) return (x - minx) / (maxx - minx), (y - miny) / (maxy - miny) class EmptyModel: symbols = '' symbolsI = '' faces = '' default_rotation = (0., 0.) size = sizes = () blocks = [] cell_count = 0 cells_visible_faces = [] def __init__(self, *unused_args): pass def __str__(self): return 'no puzzle' def gl_vertex_data(self, *unused_args): return (0, b'', (0, 0, 0, 0, 0, 0), ([], 0, 0), []), [()] class Model: cache_index = {} cache_data = {} cache_vectors = [] def __init__(self, mtype, size): items = self.cache_index['type'][mtype].items() self.type = mtype for key, value in items: setattr(self, key, value) self.mformat = _(self.mformat) # size for UI and config, sizes for plugins self.size = self.cache_index['normsize'][mtype].get(size, self.defaultsize) self.sizes, filename = self.cache_index['sizes'][mtype][self.size] self.load_data(filename) self.cell_count = len(self.cell_indices) self.rotation_indices = {s:i for i, s in enumerate(self.rotation_symbols)} self._inplace_rotations = None @property def inplace_rotations(self): if self._inplace_rotations is None: # slow and only used in edit mode self._inplace_rotations = [] for cellidx in range(self.cell_count): inplace_rotations = [] for rotsym, blocknum_blocknum2 in self.rotated_position.items(): for blocknum, blocknum2 in enumerate(blocknum_blocknum2): if blocknum == blocknum2 == cellidx and rotsym: inplace_rotations.append(rotsym) self._inplace_rotations.append(sorted(inplace_rotations, key=len)[:2]) return self._inplace_rotations def __str__(self): return self.mformat.format(*self.sizes) @classmethod def load_index(cls): indexfilename = os.path.join(MODELS_DIR, 'index') with open(indexfilename, 'rb') as indexfile: cls.cache_index = pickle.load(indexfile) @staticmethod def read_vectors(datafile): def isplit3(vals): it = iter(vals) for x in it: try: yield Vector((x, next(it), next(it))) except StopIteration: raise ValueError('len must be a multiple of 3') vlen = array('I') vlen.fromfile(datafile, 1) if sys.byteorder != filebyteorder: vlen.byteswap() vlen = vlen[0] vectors = array('f') vectors.fromfile(datafile, vlen) if sys.byteorder != filebyteorder: vectors.byteswap() return list(isplit3(vectors)) def load_data(self, filename): try: data = self.cache_data[self.type][self.sizes] except KeyError: filename = os.path.join(MODELS_DIR, filename) debug('loading model data:', filename) with open(filename, 'rb') as datafile: data = pickle.load(datafile) vectors = self.read_vectors(datafile) self.__class__.cache_data = data self.__class__.cache_vectors = vectors data = data[self.type][self.sizes] self.vectors = self.cache_vectors for key, value in data.items(): setattr(self, key, value) @classmethod def from_string(cls, modelstr): if modelstr == '*': return '*', '*', (), None re_model = r'''^(\w+) (?: \s+(\w+) (?: \s*(\W) \s*(\w+) (?: \s*\3 \s*(\w+) )?)? (?:\s+with \s+(.+) )?)?\s*$''' match = re.match(re_model, modelstr, re.X) if match is None: raise ValueError('Invalid model: ' + modelstr) #TODO: len(sizes) > 3 mtype, width, height, depth, exp = match.group(1, 2, 4, 5, 6) if mtype not in cls.cache_index['types']: raise ValueError('Unknown model type %r' % mtype) def convert_if_int(value): if value is None: return value try: return int(value) except ValueError: return value sizes = tuple(convert_if_int(s) for s in (width, height, depth)) return modelstr, mtype, sizes, exp def norm_symbol(self, sym): try: return self.normal_rotation_symbols[sym] except KeyError: new_sym = '' for c in sym: try: new_sym = self.normal_rotation_symbols[new_sym+c] except KeyError: raise ValueError('invalid symbol:', sym) return new_sym def rotations_symbolic_to_index(self, rotations): for sym in rotations: yield self.rotation_indices[sym] def blocksym_to_blockpos(self, blocksym): for i, faces in enumerate(self.cells_visible_faces): #FIXME: different blocks can have same visible faces (eg. edges for 4-Cubes) if sorted(faces) == sorted(list(blocksym)): return i raise ValueError('Invalid block symbol:', blocksym) def blockpos_to_blocksym(self, blockpos, rotsym): #TODO: use cells_visible_faces, see blocksym_to_blockpos def axisidx_to_sym(axis, idx): if idx <= self.sizes[axis] // 2: sym = self.symbols[axis] else: idx = self.sizes[axis]-1 - idx sym = self.symbolsI[axis] if idx == 0: # skip idx for corners return sym, self.face_symbolic_to_face_color(sym, rotsym) elif idx == 1 and self.sizes[axis] == 3: # for size == 3 there is only one edge return '', '' else: # symbol with index to distinguish edge, but no color because the face is not visible return sym + str(idx+1), '?' x, y, z = self.cell_indices[blockpos] symx, colorsymx = axisidx_to_sym(0, x) symy, colorsymy = axisidx_to_sym(1, y) symz, colorsymz = axisidx_to_sym(2, z) return symx + symy + symz, colorsymx + colorsymy + colorsymz def face_symbolic_to_face_color(self, face, rot): for k, v in self.face_permutations[rot].items(): if v == face: return k assert False, (face, rot) def sym_to_move(self, sym, mslice=-1): try: maxis = self.symbols.index(sym) return maxis, mslice, False except ValueError: maxis = self.symbolsI.index(sym) return maxis, mslice, True def normalize_complete_moves(self, moves): syms = ''.join((self.symbols if not mdir else self.symbolsI)[maxis] for maxis, unused_mslice, mdir in moves) syms = self.norm_symbol(syms) for sym in syms: yield self.sym_to_move(sym) def rotate_symbolic(self, axis, rdir, block, sym): rsym = (self.symbols if not rdir else self.symbolsI)[axis] block = self.rotated_position[rsym][block] sym = self.norm_symbol(sym + rsym) return block, sym def rotate_move(self, complete_move, move): caxis, unused_cslice, cdir = complete_move maxis, mslice, mdir = move caxissym = (self.symbols if cdir else self.symbolsI)[caxis] maxissym = (self.symbols if not mdir else self.symbolsI)[maxis] raxissym = self.face_permutations[caxissym][maxissym] raxis, unused_rslice, rdir = self.sym_to_move(raxissym) if mdir != rdir: mslice = self.sizes[raxis] - 1 - mslice return raxis, mslice, rdir def _get_selected_moves(self, cellidx, vector): for iaxis, axis in enumerate(self.axes): vda = vector.dot(axis) if -epsilon < vda < epsilon: continue mslice = self.cell_indices[cellidx][iaxis] if mslice is not None: yield iaxis, mslice, vda def get_selected_moves2(self, cellidx, vert1, vert2): res = sorted(self._get_selected_moves(cellidx, vert2 - vert1), key=lambda m: m[2]) a1, s1, d1 = res[0] if len(res) == 1: return True, (a1, s1, d1>0) a2, s2, d2 = res[-1] return False, (a1, s1, d1>0, a2, s2, d2>0) def get_selected_move_center(self, cellidx, vector): moves = ((ma, ms, md) for ma, ms, md in self._get_selected_moves(cellidx, vector) if ms in [0,self.sizes[ma]-1]) ma, ms, md = max(moves, key=lambda m: m[2]) return ma, ms, md>0 @staticmethod def triangulate(indices, reverse=False): indices = iter(indices) first = next(indices) prev = next(indices) for index in indices: yield first if reverse: yield index yield prev else: yield prev yield index prev = index @staticmethod def triangulate_barycentric(count, indices, reverse=False): if count == 3: index1, index2, index3 = indices yield index1, (1., 0., 0.) index2 = index2, (0., 1., 0.) index3 = index3, (0., 0., 1.) if reverse: yield index3; yield index2 else: yield index2; yield index3 elif count == 4: # +---+ 4---3 +-1-+ # | / | | / | 3 2 1 # +---+ 1---2 +-3-+ index1, index2, index3, index4 = indices index1 = index1, (1., 1., 0.) index2 = index2, (0., 1., 0.) index3 = index3, (0., 1., 1.) index4 = index4, (0., 1., 0.) if reverse: yield index1; yield index3; yield index2; yield index1; yield index4; yield index3 else: yield index1; yield index2; yield index3; yield index1; yield index3; yield index4 elif count == 5: # +---+ 4---3 +---+ # /| /| /| /| 2| /| # + | / | 5 | / | + 3 3 2 # \|/ | \|/ | 1|/ | # +---+ 1---2 +-1-+ index1, index2, index3, index4, index5 = indices index1 = index1, (0., 1., 1.) index2 = index2, (0., 0., 1.) index3 = index3, (1., 0., 1.) index4 = index4, (1., 0., 1.) index5 = index5, (0., 0., 1.) if reverse: yield index1; yield index3; yield index2; yield index1; yield index4; yield index3 yield index1; yield index5; yield index4 else: yield index1; yield index2; yield index3; yield index1; yield index3; yield index4 yield index1; yield index4; yield index5 elif count == 6: # +---+ 1---6 +---+ # /|\ |\ /|\ |\ 1|\ |1 # + | \ | + 2 | \ | 5 + 3 \ 3 + # \| \|/ \| \|/ 2| \|2 # +---+ 3---4 +---+ index1, index2, index3, index4, index5, index6 = indices index1a = index1, (0., 1., 1.) index1b = index1, (0., 1., 1.) index2 = index2, (0., 0., 1.) index3 = index3, (1., 0., 1.) index4 = index4, (1., 0., 1.) index5 = index5, (0., 0., 1.) index6 = index6, (0., 1., 1.) if reverse: yield index1a; yield index3; yield index2; yield index1b; yield index4; yield index3 yield index1b; yield index6; yield index4; yield index4; yield index6; yield index5 else: yield index1a; yield index2; yield index3; yield index1a; yield index3; yield index4 yield index1a; yield index4; yield index6; yield index4; yield index5; yield index6 else: assert False, count def gl_label_vertices(self, polygons, faces, mirror_distance): for *cell_vertices, faceno in polygons: fd = faces[faceno] cell_vertices = [self.vectors[i] for i in cell_vertices] normal = self.vectors[self.normals[faceno]] color = fd.color if fd.imagemode: texrange = self.texranges_mosaic[faceno] else: texrange = get_texcoords_range(cell_vertices, normal) texpos = (get_texcoords(v, normal, *texrange) for v in cell_vertices) x1,y1,x2,y2 = fd.texrect texpos = [(tpx*(x2-x1) + x1, tpy*(y2-y1) + y1) for tpx, tpy in texpos] for (vertex, tp), baryc in self.triangulate_barycentric( len(cell_vertices), zip(cell_vertices, texpos)): yield vertex, normal, color, tp, baryc if mirror_distance is not None: offset = normal * mirror_distance mirror_normal = -normal for (vertex, tp), baryc in self.triangulate_barycentric( len(cell_vertices), zip(cell_vertices, texpos), reverse=True): yield vertex + offset, mirror_normal, color, tp, baryc def gl_black_vertices(self, polygons): def vngroup(vns): vns = iter(vns) for v in vns: yield v, next(vns) for vertices_normals in polygons: for ivertex, inormal in self.triangulate(vngroup(vertices_normals)): yield self.vectors[ivertex], self.vectors[inormal] def pickarrowdir(self, maxis, mdir, normal): if mdir: return Vector(self.axes[maxis]).cross(normal).normalised() else: return normal.cross(Vector(self.axes[maxis])).normalised() def _gl_pick_triangles_pickdata_helper(self, cellidx, symbol, normal, vert1, vert2, pickdata): def roundeps(val): return round(val, epsdigits) one, masd = self.get_selected_moves2(cellidx, vert1, vert2) if one: maxis, mslice, mdir = masd arrowdir = self.pickarrowdir(maxis, mdir, normal) pickdata.append((maxis, mslice, mdir, cellidx, symbol, arrowdir)) else: maxis1, mslice1, mdir1, maxis2, mslice2, mdir2 = masd sdist1 = roundeps(abs(vert1.dot(self.axes[maxis1]) - self.slice_centers[maxis1][mslice1])) sdist2 = roundeps(abs(vert1.dot(self.axes[maxis2]) - self.slice_centers[maxis2][mslice2])) if sdist1 <= sdist2: arrowdir = self.pickarrowdir(maxis1, mdir1, normal) pickdata.append((maxis1, mslice1, mdir1, cellidx, symbol, arrowdir)) else: arrowdir = self.pickarrowdir(maxis2, mdir2, normal) pickdata.append((maxis2, mslice2, mdir2, cellidx, symbol, arrowdir)) sdist1 = roundeps(abs(vert2.dot(self.axes[maxis1]) - self.slice_centers[maxis1][mslice1])) sdist2 = roundeps(abs(vert2.dot(self.axes[maxis2]) - self.slice_centers[maxis2][mslice2])) if sdist1 < sdist2: arrowdir = self.pickarrowdir(maxis1, mdir1, normal) pickdata.append((maxis1, mslice1, mdir1, cellidx, symbol, arrowdir)) else: arrowdir = self.pickarrowdir(maxis2, mdir2, normal) pickdata.append((maxis2, mslice2, mdir2, cellidx, symbol, arrowdir)) return one def _gl_pick_triangulate(self, color1, vertsl, normal, mirror_distance): for i, verts in enumerate(vertsl): for vert in self.triangulate(verts): yield color1 + i, vert if mirror_distance is not None: mirror_offset = normal * mirror_distance vertsl = [[v + mirror_offset for v in verts] for verts in vertsl] for i, verts in enumerate(vertsl): for vert in self.triangulate(verts, reverse=True): yield color1 + i, vert def gl_pick_triangles_center(self, cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata): # selection_mode: simple, no adjacent visible faces maxis, mslice, mdir = self.get_selected_move_center(cellidx, normal) color = len(pickdata) pickdata.append((maxis, mslice, mdir, cellidx, symbol, None)) verts = [self.vectors[i] for i in edges_iverts] for vert in self.triangulate(verts): yield color, vert if mirror_distance is not None: mirror_offset = normal * mirror_distance color = len(pickdata) pickdata.append((maxis, mslice, not mdir, cellidx, symbol, None)) for vert in self.triangulate(verts, reverse=True): yield color, vert + mirror_offset def gl_pick_triangles_edge3(self, cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata): # selection_mode: simple, face is on an edge block of a tetrahedron # the first and second vertex are on the edge of the tetrahedron vert1, vert2, vert3 = (self.vectors[i] for i in edges_iverts) color1 = len(pickdata) one = self._gl_pick_triangles_pickdata_helper(cellidx, symbol, normal, vert1, vert2, pickdata) if one: vertsl = [[vert1, vert2, vert3]] else: v12 = (vert1 + vert2) / 2 vertsl = [[v12, vert2, vert3], [vert1, v12, vert3]] yield from self._gl_pick_triangulate(color1, vertsl, normal, mirror_distance) def gl_pick_triangles_edge6(self, cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata): # selection_mode: simple, face is on an edge block and has 6 vertices, rotates 2 slices # the first and second vertex are on the edge vert1, vert2, vert3, vert4, vert5, vert6 = (self.vectors[i] for i in edges_iverts) v12 = (vert1 + vert2) / 2 v45 = (vert4 + vert5) / 2 color = len(pickdata) one = self._gl_pick_triangles_pickdata_helper(cellidx, symbol, normal, vert1, vert2, pickdata) if one: vertsl = [[vert1, vert2, vert3, vert4, vert5, vert6]] else: vertsl = [[v12, vert2, vert3, vert4, v45], [vert1, v12, v45, vert5, vert6]] yield from self._gl_pick_triangulate(color, vertsl, normal, mirror_distance) def gl_pick_triangles_edge4(self, cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata): # selection_mode: simple, face is on an edge block, 4 vertices, rotate 1 or 2 slices, # the first and second vertex are on the edge vert1, vert2, vert3, vert4 = (self.vectors[i] for i in edges_iverts) color = len(pickdata) one = self._gl_pick_triangles_pickdata_helper(cellidx, symbol, normal, vert1, vert2, pickdata) if one: vertsl = [[vert1, vert2, vert3, vert4]] else: #assert ncolors == 2 ec12 = (vert1 + vert2) / 2 ec34 = (vert3 + vert4) / 2 vertsl = [[ec12, vert2, vert3, ec34], [vert1, ec12, ec34, vert4]] yield from self._gl_pick_triangulate(color, vertsl, normal, mirror_distance) def gl_pick_triangles_corner34(self, cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata): # selection_mode: simple, face is on a corner block, 3 or 4 vertices, # the second vert is on the corner, the first and third are on the edges if len(edges_iverts) == 3: vert1, vert2, vert3 = (self.vectors[iv] for iv in edges_iverts) vert4 = (vert3 + vert1) / 2 else: vert1, vert2, vert3, vert4 = (self.vectors[iv] for iv in edges_iverts) # first triangle color = len(pickdata) one = self._gl_pick_triangles_pickdata_helper(cellidx, symbol, normal, vert1, vert2, pickdata) if one: vertsl = [[vert1, vert2, vert4]] else: ec12 = (vert1 + vert2) / 2 vertsl = [[ec12, vert2, vert4], [vert1, ec12, vert4]] # second triangle one = self._gl_pick_triangles_pickdata_helper(cellidx, symbol, normal, vert2, vert3, pickdata) if one: vertsl.append([vert2, vert3, vert4]) else: ec23 = (vert2 + vert3) / 2 vertsl.extend([[ec23, vert3, vert4], [vert2, ec23, vert4]]) yield from self._gl_pick_triangulate(color, vertsl, normal, mirror_distance) def gl_pick_triangles_corner5(self, cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata): # selection_mode: simple, face is on a corner block, 5 vertices, # the second vert is on the corner, the first and third are on the edges vert1, vert2, vert3, vert4, vert5 = (self.vectors[iv] for iv in edges_iverts) vc13 = (vert1 + vert3) / 2 ec45 = (vert4 + vert5) / 2 color1 = len(pickdata) one = self._gl_pick_triangles_pickdata_helper(cellidx, symbol, normal, vert1, vert2, pickdata) if one: vertsl = [[vert1, vert2, ec45, vert5]] else: vertsl = [[vert1, vert2, vc13], [vert1, vc13, ec45, vert5]] one = self._gl_pick_triangles_pickdata_helper(cellidx, symbol, normal, vert2, vert3, pickdata) if one: vertsl.append([vert2, vert3, vert4, ec45]) else: vertsl.extend([[vc13, vert3, vert4, ec45], [vert2, vert3, vc13]]) yield from self._gl_pick_triangulate(color1, vertsl, normal, mirror_distance) def gl_pick_triangles_any(self, cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata): # either selection_mode is quadrant or weird model (size==1 in at least one dimension) verts = [self.vectors[i] for i in edges_iverts] vc = sum(verts, Vector()) / len(verts) vert1 = verts[-1] for vert2 in verts: color1 = len(pickdata) one = self._gl_pick_triangles_pickdata_helper(cellidx, symbol, normal, vert1, vert2, pickdata) if one: vertsl = [[vc, vert1, vert2]] else: #assert ncolors == 2 ec = (vert1 + vert2) / 2 vertsl = [[vc, vert1, ec], [vc, ec, vert2]] yield from self._gl_pick_triangulate(color1, vertsl, normal, mirror_distance) vert1 = vert2 def gl_pick_triangles(self, polygons, selection_mode, mirror_distance, pickdata): for cellidx, (face, picktype), edges_iverts in polygons: symbol = self.faces[face] normal = self.vectors[self.normals[face]] if selection_mode == 0 or picktype == -1: yield from self.gl_pick_triangles_any(cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata) elif selection_mode == 1: if picktype == 0: yield from self.gl_pick_triangles_center(cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata) elif picktype == 1: yield from self.gl_pick_triangles_edge3(cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata) elif picktype == 2: yield from self.gl_pick_triangles_edge4(cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata) elif picktype == 3: yield from self.gl_pick_triangles_corner34(cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata) elif picktype == 5: yield from self.gl_pick_triangles_corner5(cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata) elif picktype == 4: yield from self.gl_pick_triangles_edge6(cellidx, edges_iverts, symbol, normal, mirror_distance, pickdata) else: assert False, (selection_mode, picktype) else: assert False, (selection_mode, picktype) def gl_vertex_data(self, selection_mode, theme, mirror_distance): vertices = [] normals = [] colors = [] texpos = [] baryc = [] # list of [count vertices, face index] cnts_block = [] faces = [theme.faces[fk] for fk in self.facekeys] for label_polygons, black_polygons in self.block_polygons: cnt = 0 # label vertices for v, n, c, t, b in self.gl_label_vertices(label_polygons, faces, mirror_distance): vertices += v normals += n colors += c texpos += t baryc += b cnt += 1 # bevel, hidden labels for v, n in self.gl_black_vertices(black_polygons): vertices += v normals += n #TODO: colors and texpos unused colors += (0,0,0) texpos += (0,0) baryc += (0,0,0) cnt += 1 cnts_block.append(cnt) idx_debug = len(vertices) // 3 if DEBUG_DRAW: #FIXME: what if len(self.sizes) < 3 ? x = float(-self.sizes[0]) y = float(-self.sizes[1]) z = float(-self.sizes[2]) # axes vertices += [x-1, y-1, z, -x, y-1, z] colors += [255, 0, 0, 255, 0, 0] vertices += [x-1, y-1, z, x-1, -y, z] colors += [0, 255, 0, 0, 255, 0] vertices += [x-1, y-1, z, x-1, y-1, -z] colors += [0, 0, 255, 0, 0, 255] # selection (modelview) vertices += [0, 0, 0, 1, 1, 1] colors += [255, 255, 255, 255, 255, 255] # selection (viewport) vertices += [0, 0, 0, 1, 1, 0] colors += [255, 255, 0, 255, 0, 0] assert len(cnts_block) == self.cell_count assert sum(cnts_block) == idx_debug pickvertices, pickcolors, pickdata = self.gl_pick_data(selection_mode, mirror_distance) cnt_pick = len(pickvertices) // 3 vertices = array('f', vertices).tobytes() normals = array('f', normals).tobytes() colors = array('B', colors).tobytes() texpos = array('f', texpos).tobytes() barycentric = array('f', baryc).tobytes() pickvertices = array('f', pickvertices).tobytes() pickcolors = array('B', pickcolors).tobytes() vertexdata = vertices + normals + colors + texpos + barycentric + pickvertices + pickcolors debug('GL data: %d bytes' % len(vertexdata)) ptrnormals = len(vertices) ptrcolors = ptrnormals + len(normals) ptrtexpos = ptrcolors + len(colors) ptrbarycentric = ptrtexpos + len(texpos) ptrpickvertices = ptrbarycentric + len(barycentric) ptrpickcolors = ptrpickvertices + len(pickvertices) return ( self.cell_count, vertexdata, (ptrnormals, ptrcolors, ptrtexpos, ptrbarycentric, ptrpickvertices, ptrpickcolors), (cnts_block, idx_debug, cnt_pick), self.rotation_matrices, ), pickdata def gl_pick_data(self, selection_mode, mirror_distance): # Pick TRIANGLES vertices vertices = [] colors = [] pickdata = [()] # list of (maxis, mslice, mdir, face, center, cellidx, symbol, arrowdir) for col, v in self.gl_pick_triangles(self.pick_polygons, selection_mode, mirror_distance, pickdata): vertices += v color = [(col>>4) & 0xf0, (col) & 0xf0, (col<<4) & 0xf0] colors += color assert len(vertices) == len(colors) return vertices, colors, pickdata empty_model = EmptyModel() pybik-2.1/pybiklib/gamestate.py0000664000175000017500000002100012556223565016777 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . import os import pickle from contextlib import suppress from .debug import debug from .config import USER_GAMES_FILE from .model import empty_model from . import cubestate from .moves import MoveQueue class GameState: def __init__(self): self.mark_before = False self.initial_state = cubestate.CubeState(empty_model) self.initial_state.set_solved() self.current_state = self.initial_state.copy() self.move_sequence = MoveQueue() def copy(self): game = GameState() game.mark_before = self.mark_before game.initial_state = self.initial_state.copy() game.current_state = self.current_state.copy() game.move_sequence = self.move_sequence.copy() return game def set_state(self, model, blocks, moves, position): self.initial_state = cubestate.CubeState(model) try: self.initial_state.parse_block(blocks) except ValueError as e: debug('Invalid block list:', *e.args) debug(' start with solved game') self.initial_state.set_solved() self.current_state = self.initial_state.copy() self.move_sequence = MoveQueue() if moves.startswith('native:'): moves = moves.split(':', 1)[1].lstrip() else: moves = '' pos, unused_cpos = self.move_sequence.parse(moves, position, model) self.goto_next_pos(pos) def get_state(self): model = self.initial_state.model blocks = self.initial_state.format_block() moves, position = self.move_sequence.format(model) return model, blocks, 'native: ' + moves, position @staticmethod def _load_game_file(filename, mtype): data = None try: with suppress(FileNotFoundError): with open(filename, 'rb') as datafile: data = pickle.load(datafile) except Exception as e: print('error while loading game {0}: {1.__class__.__name__}: {1}'.format(mtype, e)) if type(data) is not dict: data = {} data_games = None with suppress(KeyError): data_games = data['games'] if type(data_games) is not dict: data_games = {} data['games'] = data_games data_type = None with suppress(KeyError): data_type = data_games[mtype] if type(data_type) is not dict: data_type = {} data_games[mtype] = data_type return data, data_type def load(self, filename, model): unused_data, data_type = self._load_game_file(filename, model.type) blocks, moves, position = data_type.get(model.size, ('solved', '', 0)) self.set_state(model, blocks, moves, position) def save(self, filename): model, blocks, moves, position = self.get_state() if model is empty_model: return data, data_type = self._load_game_file(filename, model.type) data_type[model.size] = blocks, moves, position try: with open(filename, 'wb') as datafile: pickle.dump(data, datafile, protocol=4) except Exception as e: print('error while saving game {0}: {1.__class__.__name__}: {1}'.format(model.type, e)) @classmethod def migrate_1to2(self, filename, mtype, msize, blocks, moves, position): data, data_type = self._load_game_file(filename, mtype) data_type[msize] = blocks, moves, position try: with open(filename, 'wb') as datafile: pickle.dump(data, datafile, protocol=4) except Exception as e: print('error during migrantion of {0}: {1.__class__.__name__}: {1}'.format(mtype, e)) def new_game(self, model, solved): if model is not None: self.initial_state = cubestate.CubeState(model) self.random(count=0 if solved else -1) def random(self, count=-1): self.initial_state.set_solved() self.initial_state.random(count) self.current_state = self.initial_state.copy() self.move_sequence.reset() ### Funktions to control the cube for use in callbacks and plugins def step_back(self): '''One step back in the sequence of moves''' if self.move_sequence.at_start(): return None self.mark_before = self.move_sequence.is_mark_current() self.move_sequence.retard() move = self.move_sequence.current().inverted() self.current_state.rotate_slice(move) return move def step_next(self): '''One step forward in the sequence of moves''' move = self.move_sequence.current() if move: self.mark_before = self.move_sequence.is_mark_current() self.current_state.rotate_slice(move) self.move_sequence.advance() return move def set_next(self, move): '''Make one new move.''' self.move_sequence.push_current(move) def goto_prev_mark(self): if self.move_sequence.at_start(): return False while True: self.move_sequence.retard() move = self.move_sequence.current().inverted() self.current_state.rotate_slice(move) if self.move_sequence.is_mark_current(): break return True def goto_start(self): self.current_state = self.initial_state.copy() self.move_sequence.rewind_start() def goto_next_mark(self): move = self.move_sequence.current() while move: self.current_state.rotate_slice(move) self.move_sequence.advance() if self.move_sequence.is_mark_current(): break move = self.move_sequence.current() def goto_next_pos(self, pos): move = self.move_sequence.current() while move: if pos == self.move_sequence.current_place: break self.current_state.rotate_slice(move) self.move_sequence.advance() move = self.move_sequence.current() def set_code(self, code, pos): self.current_state = self.initial_state.copy() self.move_sequence.reset() pos, unused_cpos = self.move_sequence.parse(code, pos, self.current_state.model) self.goto_next_pos(pos) def add_moves(self, moves): for move in moves: self.current_state.rotate_slice(move) self.move_sequence.push(move) def add_code(self, code): for res in self.move_sequence.parse_iter(code, len(code), self.current_state.model): self.current_state.rotate_slice(res[0]) def set_plugin_mode(self, plugin_mode): ''' Set plugin mode append: append moves from the plugin to the game replace: replace initial state and moves challenge: replace initial state and clear moves, set the unsolved flag ''' self.plugin_mode = plugin_mode def recalc_current_state(self): self.current_state = self.initial_state.copy() pos = self.move_sequence.current_place self.move_sequence.rewind_start() self.goto_next_pos(pos) # game transformations def set_as_initial_state(self): self.initial_state = self.current_state.copy() self.move_sequence.truncate_before() # cube editing def swap_block(self, blockpos, maxis, mslice, mdir): self.initial_state.swap_block(blockpos, maxis, mslice, mdir) self.goto_start() def rotate_block(self, blockpos, rdir): self.initial_state.rotate_block(blockpos, rdir) self.goto_start() pybik-2.1/pybiklib/cubestate.py0000664000175000017500000002456112556223565017023 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . import random from copy import deepcopy from .debug import debug, DEBUG_MSG, DEBUG_RAND, DEBUG_ROTATE from .moves import MoveQueuePacked, MoveData # This class is currently used to store the initial state of the cube # and to provide the cube to plugins. class CubeState: rand = random.Random() if DEBUG_RAND: print('rand.seed(123)') rand.seed(123) def __init__(self, model): self.model = model self._blocksn = [] # list of (block-position, rotation-symbol) self._blocksr = [] # list of (block-index, rotation-symbol) # if self._blocksn[idx] == (pos, rot) # then self._blocksr[pos] == (idx, rot) def copy(self): other = CubeState(self.model) other._blocksn = deepcopy(self._blocksn) other._blocksr = deepcopy(self._blocksr) return other @property def rotations(self): return [blockn[1] for blockn in self._blocksn] def set_solved(self): # '' symbolic rotation for identity self._blocksn = [(i, '') for i in range(self.model.cell_count)] self._blocksr = [(i, '') for i in range(self.model.cell_count)] def is_solved(self): '''Check whether the cube is solved. Only test the colors of the visible faces. Cubes with rotated center faces are treated as solved. ''' face_colors = {} for blockpos, cells_visible_faces in enumerate(self.model.cells_visible_faces): for face in cells_visible_faces: color = self.get_colorsymbol(blockpos, face) try: color_ref = face_colors[face] except KeyError: face_colors[face] = color else: if color != color_ref: return False return True def is_solved_strict(self): '''Check whether the cube is solved. Test the rotation and position of the blocks. Cubes with rotated center faces are treated as not solved. ''' #FIXME: currently unused function, should be used for faces with images allrot = self._blocksn[0][1] for index, (pos, rot) in enumerate(self._blocksn): if rot != allrot: return False # Cubie rotated block = self.model.rotated_position[rot][index] if pos != block: return False # Cubie at wrong place return True def identify_rotation_blocks(self, maxis, mslice): if mslice == -1: for i, blockn in enumerate(self._blocksn): yield i, blockn else: for i, blockn in enumerate(self._blocksn): bslice = self.model.cell_indices[blockn[0]][maxis] if bslice == mslice: yield i, blockn def _rotate_slice(self, axis, slice_, dir_): if DEBUG_ROTATE: print('rotate axis={} slice={} dir={!s:5}\n blocks:'.format(axis, slice_, dir_), end=' ') for idx, (pos, rot) in self.identify_rotation_blocks(axis, slice_): if DEBUG_ROTATE: print('{}:{}{}'.format(idx, pos, rot), end='') pos, rot = self.model.rotate_symbolic(axis, dir_, pos, rot) if DEBUG_ROTATE: print('-{}{}'.format(pos, rot), end=' ') self._blocksn[idx] = pos, rot self._blocksr[pos] = idx, rot if DEBUG_ROTATE: print() def get_colorsymbol(self, blockpos, facesym): rot = self._blocksr[blockpos][1] return self.model.face_symbolic_to_face_color(facesym, rot) def get_colornum(self, blockpos, facesym): colorsym = self.get_colorsymbol(blockpos, facesym) return self.model.faces.index(colorsym) def format_block(self): # every block is stored as pos-sym, where sym is a symbolic rotation blocks = ['{}-{}'.format(pos, sym) for pos, sym in self._blocksn] return 'idx-rot: ' + ' '.join(blocks) __str__ = format_block def parse_block(self, blocks): if blocks == 'solved': return self.set_solved() bformat, blocks = blocks.split(':', 1) if bformat != 'idx-rot': raise ValueError('unknown block format:', bformat) blocks = blocks.strip().split(' ') if len(blocks) != self.model.cell_count: raise ValueError('wrong block count: %s, expected: %s' % (len(blocks), self.model.cell_count)) blocksn = [] for block in blocks: # every block is stored as idx-rot, where idx: index to blocklist, rot: symbolic rotation block = block.strip().split('-', 1) index, rot = block index = int(index) rot = self.model.norm_symbol(rot) blocksn.append((index, rot)) # test whether block indices is a permutation, # in fact thats not enough, e.g. swap a corner cubie with an edge, # also cubie rotation may be invalid, it can be possible that a # label is rotated inside the cube. for i1, i2 in enumerate(sorted(i for i, r in blocksn)): if i1 != i2: raise ValueError('block list is not a permutation') self._blocksn = blocksn self._blocksr = [None] * len(blocksn) for i, (pos, rot) in enumerate(blocksn): self._blocksr[pos] = (i, rot) def random(self, count=-1): sizes = self.model.sizes count_moves = sum(sizes)*2 randrange = self.rand.randrange if count < 0: count = 10 * count_moves + randrange(count_moves) if count: # The solved cube should be randomly rotated (lp: 1411999) for sym in self.rand.choice(self.model.rotation_symbols): self.rotate_slice(self.model.sym_to_move(sym)) packed = MoveQueuePacked() #FIXME: workaround: for random Prism5* the last slice should not be used prism5workaround = count and self.model.type.startswith('Prism5') for i in range(count): candidates = list(range(count_moves)) while candidates: mslice = candidates.pop(randrange(len(candidates))) mdir = bool(mslice % 2) mslice //= 2 for maxis, size in enumerate(sizes): if mslice < size: break mslice -= size else: assert False if prism5workaround and maxis != 1: if mslice == size-1: continue move = packed.pack(MoveData(maxis, mslice, mdir), self.model) if packed.length() > i: if (prism5workaround and maxis != 1) or not bool(move.get_full_moves(self.model)): self._rotate_slice(maxis, mslice, mdir) break packed.pack(MoveData(maxis, mslice, not mdir), self.model) else: break if DEBUG_MSG: print(count, 'random moves:', packed.format(self.model)[0]) def rotate_slice(self, move_data): self._rotate_slice(*move_data) def swap_block(self, blockpos1, maxis, mslice, mdir): if DEBUG_ROTATE: print('rotate axis={} slice={} dir={!s:5}\n from:'.format(maxis, mslice, mdir), end=' ') blockidx1, blockrot1 = self._blocksr[blockpos1] blockpos2, blockrot1r = self.model.rotate_symbolic(maxis, mdir, blockpos1, blockrot1) blockidx2, blockrot2 = self._blocksr[blockpos2] blockpos2r, blockrot2r = self.model.rotate_symbolic(maxis, not mdir, blockpos2, blockrot2) if DEBUG_ROTATE: print('{}:{}{}->{}{}\n to: {}:{}{}->{}{}'.format( blockidx1, blockpos1, blockrot1, blockpos2, blockrot1r, blockidx2, blockpos2, blockrot2, blockpos2r, blockrot2r)) assert blockpos2r == blockpos1 self._blocksn[blockidx1] = blockpos2, blockrot1r self._blocksr[blockpos2] = blockidx1, blockrot1r self._blocksn[blockidx2] = blockpos2r, blockrot2r self._blocksr[blockpos2r] = blockidx2, blockrot2r def rotate_block(self, blockpos, rdir): blockidx, blockrot = self._blocksr[blockpos] try: rot = self.model.inplace_rotations[blockpos][-1 if rdir else 0] except IndexError: # not every block can be rotated inline: e.g. edges and center faces on the 4×4×4-Cube, # edges and corners on towers and bricks #TODO: swap edge at pos n with the one at pos (size-1 - n), # rotate all center faces on the same ring return blockrot2 = self.model.norm_symbol(blockrot + rot) self._blocksn[blockidx] = blockpos, blockrot2 self._blocksr[blockpos] = blockidx, blockrot2 if DEBUG_ROTATE: sym1, colorsym1 = self.model.blockpos_to_blocksym(blockpos, blockrot) sym2, colorsym2 = self.model.blockpos_to_blocksym(blockpos, blockrot2) print('{}:{}{}->{}{} ({}:{}->{}:{})'.format(blockidx, blockpos, blockrot, blockpos, blockrot2, sym1, colorsym1, sym2, colorsym2)) self.debug_blocksymbols(allsyms=False) def debug_blocksymbols(self, allsyms): for blockpos, blockrot in self._blocksn: blocksym, colorsym = self.model.blockpos_to_blocksym(blockpos, blockrot) if allsyms or blocksym != colorsym: print(' {}:{}'.format(blocksym, colorsym), end='') print('') pybik-2.1/pybiklib/dialogs.py0000664000175000017500000010463112556223565016463 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009, 2011-2015 B. Clausius # # 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 3 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, see . # pylint: disable=C0321 import os import re import html from itertools import zip_longest from PyQt5.QtCore import QAbstractAnimation, QEvent, QObject, QPropertyAnimation, QSize, QStandardPaths, Qt, QTimer from PyQt5.QtCore import pyqtSignal as Signal, pyqtSlot as Slot from PyQt5.QtGui import (QColor, QDesktopServices, QFontMetrics, QIcon, QIconEngine, QKeySequence, QPixmap, QStandardItem, QStandardItemModel, QTextDocumentFragment) from PyQt5.QtWidgets import (QAbstractItemDelegate, QColorDialog, QDialog, QDialogButtonBox, QFileDialog, QLabel, QProgressDialog, QPushButton, QStyledItemDelegate, QTextEdit) from . import config from .settings import settings from .theme import Theme from .model import Model try: _ except NameError: _ = lambda t: t class Dialog (QDialog): _instance = None _classes = [] def __init__(self, **kwargs): super().__init__(**kwargs) self.accepted.connect(self.on_response) self._ignore_changed = False self.bound = {} settings.keystore.changed.connect(self.on_settings_changed, Qt.QueuedConnection) @classmethod def run(cls, **kwargs): if cls._instance is None: cls._instance = cls(**kwargs) ret = cls._instance cls._classes.append(cls) else: ret = None cls._instance.move(cls._instance.pos()) cls._instance.show() return ret @classmethod def delete(cls): while cls._classes: cls_ = cls._classes.pop(0) # pylint: disable=W0212 cls_._instance.close() cls_._instance.deleteLater() # pylint: enable=W0212 cls_._instance = None def bind(self, key, widget, getter, setter, signal): if isinstance(getter, str): getter = getattr(widget, getter) if isinstance(setter, str): setter = getattr(widget, setter) if isinstance(signal, str): signal = getattr(widget, signal) setter(getattr(settings, key)) if signal is not None: signal.connect(lambda: self.on_widget_changed(key)) self.bound[key] = (getter, setter, signal) @staticmethod def bind_reset(settings_key, button): button.clicked.connect(lambda: delattr(settings, settings_key)) def on_response(self): pass def on_widget_changed(self, key): if self._ignore_changed: return try: getter = self.bound[key][0] except KeyError: return self._ignore_changed = True setattr(settings, key, getter()) self._ignore_changed = False def on_settings_changed(self, key): if self._ignore_changed: return try: setter = self.bound[key][1] except KeyError: return self._ignore_changed = True setter(getattr(settings, key)) self._ignore_changed = False class ColorIconEngine (QIconEngine): def __init__(self, **kwargs): super().__init__(**kwargs) self.color = 'black' def paint(self, painter, rect, unused_mode, unused_state): painter.fillRect(rect, QColor(self.color)) class ColorButton (QPushButton): color_changed = Signal(str) def __init__(self, replace_button, **kwargs): self._icon = ColorIconEngine() parent = replace_button.parentWidget() super().__init__(QIcon(self._icon), '', parent, **kwargs) height = self.iconSize().height() self.setIconSize(QSize(height * self.width() // self.height(), height)) self.setSizePolicy(replace_button.sizePolicy()) self.setObjectName(replace_button.objectName()) layout = replace_button.parentWidget().layout() index = layout.indexOf(replace_button) position = layout.getItemPosition(index) layout.removeWidget(replace_button) layout.addWidget(self, *position) replace_button.deleteLater() self.clicked.connect(self.on_clicked) def set_color(self, color): self._icon.color = color self.update() def get_color(self): return self._icon.color def on_clicked(self): dialog = QColorDialog(self) dialog.setCurrentColor(QColor(self.get_color())) if dialog.exec_() == QDialog.Accepted: color = dialog.currentColor().name() self.set_color(color) self.color_changed.emit(color) class ShortcutEditor (QLabel): key_pressed = Signal() def __init__(self, **kwargs): super().__init__(text=_('Press a key …'), **kwargs) self.setFocusPolicy(Qt.StrongFocus) self.setAutoFillBackground(True) self.key = None SAFE_MODIFIER_MASK = Qt.ShiftModifier | Qt.ControlModifier IGNORE_KEYS = [Qt.Key_Shift, Qt.Key_Control, Qt.Key_Meta, Qt.Key_Alt, Qt.Key_AltGr, Qt.Key_CapsLock, Qt.Key_NumLock, Qt.Key_ScrollLock] def keyPressEvent(self, event): if event.key() in self.IGNORE_KEYS or event.count() != 1: return QLabel.keyPressEvent(self, event) mod = event.modifiers() & self.SAFE_MODIFIER_MASK key = QKeySequence(event.key() | int(mod)).toString().split('+') if event.modifiers() & Qt.KeypadModifier: key.insert(-1, 'KP') self.key = '+'.join(key) self.key_pressed.emit() class ShortcutDelegate (QStyledItemDelegate): def __init__(self, **kwargs): super().__init__(**kwargs) def createEditor(self, parent, unused_option, unused_index): editor = ShortcutEditor(parent=parent) editor.key_pressed.connect(self.on_editor_key_pressed) return editor def setEditorData(self, editor, index): pass def setModelData(self, editor, model, index): if editor.key is not None: model.setData(index, editor.key, Qt.DisplayRole) def on_editor_key_pressed(self): editor = self.sender() self.commitData.emit(editor) self.closeEditor.emit(editor, QAbstractItemDelegate.NoHint) class PreferencesDialog (Dialog): sample_buffers = 0 def __init__(self, **kwargs): super().__init__(**kwargs) self.ui = UI(self, 'preferences.ui') from .ui.preferences import retranslate self.ui = retranslate(self) self.ui.button_animspeed_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_shader_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_antialiasing_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_mirror_faces_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_movekey_add.setIcon(QIcon.fromTheme('list-add')) self.ui.button_movekey_remove.setIcon(QIcon.fromTheme('list-remove')) self.ui.button_movekey_reset.setIcon(QIcon.fromTheme('document-revert')) self.ui.button_color_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_image_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_background_color_reset.setIcon(QIcon.fromTheme('edit-clear')) self.ui.button_mousemode_quad.setIcon(QIcon(os.path.join(config.UI_DIR, 'qt', 'mousemode-quad.png'))) self.ui.button_mousemode_ext.setIcon(QIcon(os.path.join(config.UI_DIR, 'qt', 'mousemode-ext.png'))) self.ui.buttonBox.button(QDialogButtonBox.Close).setDefault(True) self.ui.label_needs_restarted.setVisible(False) # graphic tab self.ui.slider_animspeed.setValue(settings.draw.speed) self.ui.slider_animspeed.setRange(*settings.draw.speed_range) self.bind('draw.speed', self.ui.slider_animspeed, 'value', 'setValue', 'valueChanged') self.bind_reset('draw.speed', self.ui.button_animspeed_reset) shader_names = {'lighting': _('Lighting'), 'simple': _('Simple')} for nick in settings.draw.shader_range: self.ui.combobox_shader.addItem(shader_names.get(nick, nick), nick) self.ui.combobox_shader.setCurrentIndex(settings.draw.shader) self.bind('draw.shader', self.ui.combobox_shader, 'currentIndex', 'setCurrentIndex', 'currentIndexChanged') self.bind_reset('draw.shader', self.ui.button_shader_reset) for text in settings.draw.samples_range: self.ui.combobox_samples.addItem(_(text), text) self.ui.combobox_samples.setCurrentIndex(settings.draw.samples) self.bind('draw.samples', self.ui.combobox_samples, 'currentIndex', 'setCurrentIndex', 'currentIndexChanged') self.bind_reset('draw.samples', self.ui.button_antialiasing_reset) self.ui.spinbox_mirror_faces.setRange(*settings.draw.mirror_distance_range) def set_mirror_faces(checked): self.ui.checkbox_mirror_faces.setChecked(checked) self.ui.spinbox_mirror_faces.setEnabled(checked) self.bind('draw.mirror_faces', self.ui.checkbox_mirror_faces, 'isChecked', set_mirror_faces, 'toggled') self.bind_reset('draw.mirror_faces', self.ui.button_mirror_faces_reset) self.bind('draw.mirror_distance', self.ui.spinbox_mirror_faces, 'value', 'setValue', 'valueChanged') self.bind_reset('draw.mirror_distance', self.ui.button_mirror_faces_reset) html_text = '

{}

' html_text = html_text.format(html.escape(_('The program needs to be restarted for the changes to take effect.'))) self.ui.label_needs_restarted.setText(html_text) # mouse tab def set_selection_mode(unused_mode): if settings.draw.selection_nick == 'quadrant': self.ui.button_mousemode_quad.setChecked(True) elif settings.draw.selection_nick == 'simple': self.ui.button_mousemode_ext.setChecked(True) self.bind('draw.selection', None, None, set_selection_mode, None) # keys tab self.liststore_movekeys = QStandardItemModel(self) self.fill_liststore_movekeys() self.ui.listview_movekeys.setModel(self.liststore_movekeys) self.liststore_movekeys.itemChanged.connect(self.on_liststore_movekeys_itemChanged) self.shortcut_delegate = ShortcutDelegate(parent=self.ui.listview_movekeys) self.ui.listview_movekeys.setItemDelegateForColumn(1, self.shortcut_delegate) # theme tab location = QStandardPaths.standardLocations(QStandardPaths.PicturesLocation) if not location: location = QStandardPaths.standardLocations(QStandardPaths.HomeLocation) if not location: location = [''] self.image_dirname = location[0] self.button_color = ColorButton(self.ui.button_color) self.setTabOrder(self.ui.listview_faces, self.button_color) self.button_color.color_changed.connect(self.on_button_color_color_changed) self.button_background_color = ColorButton(self.ui.button_background_color) self.setTabOrder(self.ui.radiobutton_mosaic, self.button_background_color) # Only a single color, no picture or pattern self.stockfiles = [''] self.ui.combobox_image.addItem(_('plain'), '') for filename, icon in Theme.textures.get_icons(): self.stockfiles.append(filename) self.ui.combobox_image.addItem(icon, '', filename) self.ui.combobox_image.addItem(_('select …'), '/') self.bind_reset_item('theme.faces.{}.color', self.ui.button_color_reset) self.bind_reset_item('theme.faces.{}.image', self.ui.button_image_reset) self.bind('theme.bgcolor', self.button_background_color, 'get_color', 'set_color', 'color_changed') self.bind_reset('theme.bgcolor', self.ui.button_background_color_reset) self.facenames = Model.cache_index['facenames'] self.liststore_faces = QStandardItemModel() self.ui.listview_faces.setModel(self.liststore_faces) self.ui.listview_faces.selectionModel().currentChanged.connect(self.on_listview_faces_currentChanged) self.fill_face_selector() def fill_face_selector(self): for i, (facekey, facename) in enumerate(self.facenames): self.liststore_faces.appendRow((QStandardItem(i), QStandardItem(_(facename)))) filename = settings.theme.faces[facekey].image if filename.startswith('/'): self.image_dirname = os.path.dirname(filename) self.ui.listview_faces.setModelColumn(1) #XXX: workaround, listview_faces should automatically set to the correct width fm = QFontMetrics(self.ui.listview_faces.font()) width = max(fm.width(_(fn)) for fk, fn in self.facenames) + 8 self.ui.listview_faces.setMaximumWidth(width) active_face = 0 self.current_facekey = self.facenames[active_face][0] index = self.liststore_faces.index(active_face, 1) self.ui.listview_faces.setCurrentIndex(index) def fill_liststore_movekeys(self): for move, key in settings.draw.accels: self.liststore_movekeys.appendRow([QStandardItem(move), QStandardItem(key)]) self.liststore_movekeys.setHeaderData(0, Qt.Horizontal, _('Move')) self.liststore_movekeys.setHeaderData(1, Qt.Horizontal, _('Key')) def bind_reset_item(self, settings_key, button): def on_clicked(): delattr(settings, settings_key.format(self.current_facekey)) button.clicked.connect(on_clicked) @ staticmethod def _accel_mods_to_str(accel_mods): accel_str = '' for a in accel_mods.value_nicks: if accel_str: accel_str += '+' if a.endswith('-mask'): a = a[:-5] accel_str += a return accel_str def set_imagefile(self, imagefile): index_icon = len(self.stockfiles) if imagefile.startswith('/'): index = index_icon icon = QIcon(imagefile) else: try: index = self.stockfiles.index(imagefile) except ValueError: index = 0 icon = QIcon() self.ui.combobox_image.setItemIcon(index_icon, icon) self.ui.combobox_image.setCurrentIndex(index) def on_settings_changed(self, key): Dialog.on_settings_changed(self, key) if self._ignore_changed: return self._ignore_changed = True if key == 'draw.samples': visible = (self.sample_buffers != 2**settings.draw.samples > 1) self.ui.label_needs_restarted.setVisible(visible) elif key == 'draw.accels': self.liststore_movekeys.clear() self.fill_liststore_movekeys() elif key == 'theme.faces.{}.color'.format(self.current_facekey): self.button_color.set_color(settings.theme.faces[self.current_facekey].color) elif key == 'theme.faces.{}.image'.format(self.current_facekey): self.set_imagefile(settings.theme.faces[self.current_facekey].image) # Not needed: #elif key == 'theme.faces.{}.mode'.format(self.current_facekey): self._ignore_changed = False ### @Slot(bool) def on_checkbox_mirror_faces_toggled(self, checked): self.ui.spinbox_mirror_faces.setEnabled(checked) ### mouse handlers ### def set_mousemode(self, checked, mode): if self._ignore_changed: return if checked: self._ignore_changed = True settings.draw.selection_nick = mode self._ignore_changed = False @Slot(bool) def on_button_mousemode_quad_toggled(self, checked): self.set_mousemode(checked, 'quadrant') @Slot(bool) def on_button_mousemode_ext_toggled(self, checked): self.set_mousemode(checked, 'simple') ### key handlers ### def get_move_key_list(self): move_keys = [] for i in range(self.liststore_movekeys.rowCount()): move, key = [self.liststore_movekeys.item(i, j).data(Qt.DisplayRole) for j in (0, 1)] move_keys.append((move, key)) return move_keys @Slot() def on_button_movekey_add_clicked(self): row = self.ui.listview_movekeys.currentIndex().row() self._ignore_changed = True self.liststore_movekeys.insertRow(row, (QStandardItem(''), QStandardItem(''))) index = self.liststore_movekeys.index(row, 0) self.ui.listview_movekeys.setCurrentIndex(index) self.ui.listview_movekeys.edit(index) self._ignore_changed = False @Slot() def on_button_movekey_remove_clicked(self): row = self.ui.listview_movekeys.currentIndex().row() self._ignore_changed = True self.liststore_movekeys.takeRow(row) settings.draw.accels = self.get_move_key_list() self._ignore_changed = False @Slot() def on_button_movekey_reset_clicked(self): # pylint: disable=R0201 del settings.draw.accels def on_liststore_movekeys_itemChanged(self, unused_item): self._ignore_changed = True settings.draw.accels = self.get_move_key_list() self._ignore_changed = False ### appearance handlers ### def on_listview_faces_currentChanged(self, current): active_face = current.row() self.current_facekey = self.facenames[active_face][0] self._ignore_changed = True self.button_color.set_color(settings.theme.faces[self.current_facekey].color) self.set_imagefile(settings.theme.faces[self.current_facekey].image) imagemode = settings.theme.faces[self.current_facekey].mode_nick if imagemode == 'tiled': self.ui.radiobutton_tiled.setChecked(True) elif imagemode == 'mosaic': self.ui.radiobutton_mosaic.setChecked(True) self._ignore_changed = False def on_button_color_color_changed(self, color): if self._ignore_changed: return self._ignore_changed = True settings.theme.faces[self.current_facekey].color = color self._ignore_changed = False @Slot(int) def on_combobox_image_activated(self, index): if self._ignore_changed: return try: filename = self.stockfiles[index] except IndexError: filename = QFileDialog.getOpenFileName(self, _("Open Image"), self.image_dirname) if isinstance(filename, (tuple, list)): filename = filename[0] if filename == '': # canceled, set the old image filename = settings.theme.faces[self.current_facekey].image self.set_imagefile(filename) else: self.image_dirname = os.path.dirname(filename) self._ignore_changed = True settings.theme.faces[self.current_facekey].image = filename self._ignore_changed = False @Slot(bool) def on_radiobutton_tiled_toggled(self, checked): self.set_imagemode(checked, 'tiled') @Slot(bool) def on_radiobutton_mosaic_toggled(self, checked): self.set_imagemode(checked, 'mosaic') def set_imagemode(self, checked, mode): if self._ignore_changed: return if checked: self._ignore_changed = True settings.theme.faces[self.current_facekey].mode_nick = mode self._ignore_changed = False class SelectModelDialog (Dialog): response_ok = Signal(str, tuple) def __init__(self, **kwargs): super().__init__(**kwargs) self.ui = UI(self, 'model.ui') from .ui.model import retranslate retranslate(self) self.mtypes = Model.cache_index['types'] self.modeldefs = [Model.cache_index['type'][mtype] for mtype in self.mtypes] mtype_ranges = lambda mtype: tuple((min(vals), max(vals)) for vals in zip(*Model.cache_index['normsize'][mtype].keys())) self.sranges = [mtype_ranges(mtype) for mtype in self.mtypes] for i, mtype in enumerate(self.mtypes): name = self.modeldefs[i]['name'] self.ui.combobox_model.addItem(_(name), mtype) mtypeidx = self.mtypes.index(settings.game.type) self.ui.combobox_model.setCurrentIndex(mtypeidx) # Hide items after the dialog size is calculated to avoid later resizing QTimer.singleShot(0, lambda: self.on_combobox_model_activated(mtypeidx)) @Slot(int) def on_combobox_model_activated(self, index): mtype = self.mtypes[index] size = settings.games[mtype].size try: size = Model.cache_index['normsize'][mtype][size] except KeyError: size = self.modeldefs[index]['defaultsize'] for label, spin, sizename, srange, svalue in zip_longest( (self.ui.label_width, self.ui.label_heigth, self.ui.label_depth), (self.ui.spin_size1, self.ui.spin_size2, self.ui.spin_size3), self.modeldefs[index]['sizenames'], self.sranges[index], size, ): if label is None: continue label.setText(_(sizename) if sizename is not None else '') spin.setVisible(sizename is not None) if sizename is not None: spin.setRange(*srange) spin.setValue(svalue) def on_response(self): index = self.ui.combobox_model.currentIndex() size_len = len(self.modeldefs[index]['defaultsize']) spins = (self.ui.spin_size1, self.ui.spin_size2, self.ui.spin_size3)[:size_len] self.response_ok.emit( self.mtypes[index], tuple(s.value() for s in spins), ) class ProgressDialog (QProgressDialog): def __init__(self, **kwargs): super().__init__(**kwargs) self.canceled_ = False self.value_max = 10 self.value = 0 self.setWindowModality(Qt.WindowModal) self.setMaximum(self.value_max) self.setMinimumDuration(0) self.setAutoReset(False) self.canceled.connect(self.on_canceled) def on_canceled(self): self.canceled_ = True self.setLabelText(_('Canceling operation, please wait')) def tick(self, step, message=None, value_max=None): if not self.isVisible(): self.show() if message is not None: self.setLabelText(message) if value_max is not None: self.value_max = value_max self.value = 0 self.setMaximum(value_max) if step < 0 or self.value > self.value_max: self.setValue(0) self.setMaximum(0) else: self.setValue(self.value) self.value += step return self.canceled_ def done(self): self.canceled_ = False self.reset() class HelpDialog (Dialog): helpstrings = [ # The next strings form the text in the help dialog _('Using the mouse to rotate the cube'), _('Position the mouse cursor over the puzzle and you will see an arrow ' 'that gives you a hint in which direction the slice under the mouse cursor will be rotated.'), _('The left mouse button rotates a single slice of the cube in the direction of the arrow.'), _('The right mouse button rotates a single slice of the cube against the direction of the arrow.'), _('To rotate the whole cube instead of a single slice press the Ctrl key together with the mouse button.'), _('Using the keyboard to rotate the cube'), _('Make sure the keyboard focus is on the cube area (e.g. click on the background of the cube). ' 'The keys can be configured in the preferences dialog, the default is:'), _('Moves the left, right, upper, down, front or back slice clockwise.'), _('Moves a slice couterclockwise.'), _('Moves the whole cube.'), _('Other keys and buttons'), _('Mouse wheel – Zoom in/out'), _('Arrow keys, Left mouse button on the background – Changes the direction of looking at the cube.'), _('Moves keyboard focus to the sequence editor above the cube area ' 'where you can edit the move sequence in the notation described below. ' 'Hit enter when done.'), _('Notation for moves'), _('All moves, however they are made, are displayed progressively above the cube area:'), _('Moves the left, right, upper, down, front or back slice clockwise.'), _('Moves a slice couterclockwise.'), _('Moves the whole cube.'), _('Moves the first, second or third slice from left clockwise. ' 'The allowed numbers are in the range from 1 to the count of parallel slices. ' '"l1" is always the same as "l" ' 'and for the classic 3×3×3-Cube "l2" is the same as "r2-" and "l3" is the same as "r-".'), _('You can use a space to separate groups of moves.'), ] helpformat = '''

{}

{}

  • {}
  • {}
  • {}

{}

{}

  • 4,6,8,2,5,0 – {}
  • Shift+4, … – {}
  • Ctrl+4, … – {}

{}

  • {}
  • {}
  • Ctrl+L – {}

{}

{}

  • l, r, u, d, f, b – {}
  • l-, r-, u-, d-, f-, b- – {}
  • L, R, U, D, F, B – {}
  • l1, l2, l3 – {}
  • {}
''' def __init__(self, **kwargs): super().__init__(**kwargs) self.ui = UI(self, 'help.ui') from .ui.help import retranslate self.ui = retranslate(self) helpstrings = [html.escape(s) for s in self.helpstrings] helptext = self.helpformat.format(*helpstrings) self.ui.text_help.setHtml(helptext) def linkedtext_to_html(text): html = QTextDocumentFragment.fromPlainText(text).toHtml() html = re.sub(r'<((?:http:|https:|text:).*?)\|>', r'', html) html = re.sub(r'<\|>', r'', html) return re.sub(r'<((?:http:|https:).*?)>', r'<\1>', html) class UI: def __init__(self, toplevel, filename): self._toplevel = toplevel from PyQt5 import uic uic.loadUi(os.path.join(config.UI_DIR, 'qt', filename), toplevel) def __getattr__(self, attrname): if attrname[0] == '_': raise AttributeError('{!r} object has no attribute {!r}'.format('UI', attrname)) else: return self._toplevel.findChild(QObject, attrname) class AboutDialog (QDialog): def __init__(self, **kwargs): super().__init__(**kwargs) self.about = UI(self, 'about.ui') from .ui.about import retranslate retranslate(self) self.fill_header() self.fill_about_tab() self.fill_feedback_tab() self.fill_translation_tab() self.fill_license_tab() self.index_tab_about = self.about.tab_widget.indexOf(self.about.tab_about) self.index_tab_license = self.about.tab_widget.indexOf(self.about.tab_license) # About tab animation self.scrollbar = self.about.text_translators.verticalScrollBar() self.animation = QPropertyAnimation(self.scrollbar, 'value') self.animation.setLoopCount(-1) def fill_header(self): pixmap = QPixmap(config.APPICON_FILE) self.about.label_icon.setPixmap(pixmap) self.about.label_appname.setText(_(config.APPNAME)) self.about.label_version.setText(config.VERSION) self.about.label_description.setText(_(config.SHORT_DESCRIPTION)) def fill_about_tab(self): self.about.label_copyright.setText(config.COPYRIGHT) html_text = '

{}

'.format( config.WEBSITE, _('Pybik project website')) self.about.label_website.setText(html_text) html_template = ''' {}''' html_p_template = '

{}

' html_language_template = '{}' html_person_template = '{}' html_p_items = [] from .translators import translators try: import icu except ImportError: print('PyICU is not installed') langname_from_code = lambda code, name: name else: def langname_from_code(code, name): iculocale = icu.Locale.createFromName(code) lang = iculocale.getLanguage() if icu.Locale.createFromName(lang).getDisplayName() == lang: return name return str(iculocale.getDisplayName()) or name import locale sortfunc = lambda v: locale.strxfrm(v[0]) def gentranslators(): for language, langcode, persons in translators: language = langname_from_code(langcode, language) yield language, persons for language, persons in sorted(gentranslators(), key=sortfunc): language = html.escape(language) html_items = [html_language_template.format(language)] for name, link in sorted(persons, key=sortfunc): name = html.escape(name) html_items.append(html_person_template.format(link, name)) html_p_items.append(html_p_template.format('
'.join(html_items))) html_text = html_template.format(''.join(html_p_items)) self.about.text_translators.setHtml(html_text) qdesktopservices_openurl = QDesktopServices.openUrl self.about.text_translators.anchorClicked.connect(qdesktopservices_openurl) self.about.text_translators.viewport().installEventFilter(self) def fill_feedback_tab(self): html = linkedtext_to_html(config.get_filebug_text()) self.about.label_feedback.setText(html) def fill_translation_tab(self): html = linkedtext_to_html(_(config.TRANSLATION_TEXT)) self.about.label_translation.setText(html) def fill_license_tab(self): self.about.text_license_short.hide() self.about.text_license_full.hide() html = linkedtext_to_html('\n\n'.join((_(config.LICENSE_INFO), _(config.LICENSE_FURTHER)))) self.about.text_license_short.setHtml(html) try: with open(config.LICENSE_FILE, 'rt', encoding='utf-8') as license_file: text = license_file.read() except Exception as e: print('Unable to find license text:', e) text = _(config.LICENSE_NOT_FOUND) self.about.text_license_full.setLineWrapMode(QTextEdit.WidgetWidth) html = linkedtext_to_html(text) self.about.text_license_full.setHtml(html) self.about.tab_widget.currentChanged.connect(self._on_tab_widget_currentChanged) self.about.text_license_short.anchorClicked.connect(self._on_text_license_anchorClicked) def update_animation(self): smin = self.scrollbar.minimum() smax = self.scrollbar.maximum() if smax <= smin: return self.animation.setDuration((smax-smin) * 40) self.animation.setKeyValueAt(0., smin) self.animation.setKeyValueAt(0.04, smin) self.animation.setKeyValueAt(0.50, smax) self.animation.setKeyValueAt(0.54, smax) self.animation.setKeyValueAt(1., smin) def showEvent(self, unused_event): if self.animation.state() == QAbstractAnimation.Stopped: self.update_animation() self.scrollbar.hide() self.animation.start() def resizeEvent(self, unused_event): self.update_animation() def eventFilter(self, unused_obj, event): #assert obj == self.about.text_translators.viewport() if event.type() in [QEvent.MouseButtonPress, QEvent.Wheel]: self.animation.pause() self.scrollbar.show() return False def _on_tab_widget_currentChanged(self, index): if index == self.index_tab_about: self.animation.resume() self.scrollbar.hide() else: self.animation.pause() self.scrollbar.show() if index == self.index_tab_license: self.about.text_license_short.setVisible(True) self.about.text_license_full.setVisible(False) def _on_text_license_anchorClicked(self, url): if url.toString() == 'text:FULL_LICENSE_TEXT': self.about.text_license_short.setVisible(False) self.about.text_license_full.setVisible(True) else: QDesktopServices.openUrl(url) def run(self): self.exec_() self.deleteLater() pybik-2.1/pybiklib/theme.py0000664000175000017500000000651012556223565016140 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009, 2011-2015 B. Clausius # # 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 3 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, see . import os from glob import glob from collections import defaultdict from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QImage, QPixmap from . import config class Textures: max_size = 256 stock_dir = os.path.join(config.UI_DIR, 'images') def __init__(self): self.stock_images = {os.path.basename(f): None for f in glob(os.path.join(self.stock_dir, '*'))} self.empty_image = QImage(1, 1, QImage.Format_RGBA8888) self.empty_image.fill(0) def _get_stock_image(self, name): filename = os.path.join(self.stock_dir, name) self.stock_images[name] = image = self._load_image_from_file(filename) return image @classmethod def _load_image_from_file(cls, filename): image = QImage(filename) if image.isNull(): return None # scale the image to size 2^n for OpenGL width = image.width() height = image.height() if width < 1 or height < 1: return None scaled_width = cls.max_size while scaled_width > width: scaled_width //= 2 scaled_height = cls.max_size while scaled_height > height: scaled_height //= 2 image = image.scaled(scaled_width, scaled_height, transformMode=Qt.SmoothTransformation) image = image.convertToFormat(QImage.Format_RGBA8888) return image def get_icons(self): for filename, image in sorted(self.stock_images.items()): if image is None: image = self._get_stock_image(filename) if image is not None: yield filename, QIcon(QPixmap(image)) def image_from_file(self, filename): if not filename: image = self.empty_image elif filename.startswith('/'): image = self._load_image_from_file(filename) else: try: image = self.stock_images[filename] if image is None: image = self._get_stock_image(filename) except KeyError: image = None return image class FaceTheme: __slots__ = 'color imagemode image texrect'.split() class Theme: textures = Textures() def __init__(self): self.faces = defaultdict(FaceTheme) def load_face_image(self, facekey, filename): image = self.textures.image_from_file(filename) if image is None: self.faces[facekey].image = self.textures.empty_image return False self.faces[facekey].image = image return True pybik-2.1/pybiklib/moves.py0000664000175000017500000003657612556223565016206 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . import re from collections import namedtuple from .debug import debug class MoveData (namedtuple('_MoveData', 'axis slice dir')): # pylint: disable=W0232 # axis = 0... # slice = 0...dim-1 or -1 for all slices # dir = 0 or 1 __slots__ = () def inverted(self): return self._replace(dir=not self.dir) # pylint: disable=E1101 class MoveDataPacked (namedtuple('_MoveDataPacked', 'axis counts fullcount')): # pylint: disable=W0232 # axis = 0... # counts = [...], length: model.sizes[axis], values: number of slice-rotations, >0 CW <0 CCW # fullcount = number of full rotations, >0 CW <0 CCW __slots__ = () def length(self): return sum(abs(c) for c in self.counts) def get_full_moves(self, model): symmetry = model.symmetries[self.axis] vals = [0] * symmetry for i, scount in enumerate(self.counts): for s in range(symmetry): v = scount + s if v > symmetry//2: v -= symmetry vals[s] += abs(v) minval = vals[0]+1 for i, v in enumerate(vals): if v < minval: f = i minval = v f = symmetry - f + self.fullcount if f > symmetry//2: f -= symmetry return f def update_fullmoves(self, model): def counts_offset(fullcount): symmetry = model.symmetries[self.axis] for sdirs in self.counts: sdirs -= fullcount if sdirs < 0: sdirs += symmetry if sdirs > symmetry // 2: sdirs -= symmetry yield sdirs fullcount = self.get_full_moves(model) counts = list(counts_offset(fullcount)) return self._replace(counts=counts, fullcount=fullcount) class _MoveQueueBase: class MoveQueueItem: def __init__(self, data, *, mark_after=False, code=None): assert isinstance(data, (MoveData, MoveDataPacked)) self.data = data self.mark_after = mark_after self.code = code axis = property(lambda self: self.data.axis) slice = property(lambda self: self.data.slice) dir = property(lambda self: self.data.dir) def copy(self): return self.__class__(self.data, mark_after=self.mark_after, code=self.code) def invert(self): self.data = self.data.inverted() def rotate_by(self, model, totalmove): rmove = model.rotate_move(totalmove.data, self.data) self.data = self.data.__class__(*rmove) self.code = None @classmethod def normalize_complete_moves(cls, model, totalmoves): for move in model.normalize_complete_moves(move.data for move in totalmoves): yield cls(MoveData(*move)) def unpack(self): maxis, sslices, fullmoves = self.data # slice rotations for mslice, sdirs in enumerate(sslices): mdir = sdirs < 0 for unused in range(abs(sdirs)): yield maxis, mslice, mdir # total rotations mdir = fullmoves < 0 for unused in range(abs(fullmoves)): yield maxis, -1, mdir def update_fullmoves(self, model): self.data = self.data.update_fullmoves(model) def __init__(self): self.current_place = self._pos_0 self.moves = [] def copy(self): movequeue = self.__class__() movequeue.current_place = self.current_place movequeue.moves = [m.copy() for m in self.moves] return movequeue def __str__(self): return '{}(len={})'.format(self.__class__.__name__, len(self.moves)) class MoveQueue (_MoveQueueBase): _pos_0 = 0 @classmethod def new_from_code(cls, code, pos, model): moves = cls() mpos, cpos = moves.parse(code, pos, model) return moves, mpos, cpos def at_start(self): return self.current_place == 0 def at_end(self): return self.current_place == self.queue_length @property def _prev(self): return self.moves[self.current_place-1] @property def _current(self): return self.moves[self.current_place] @property def queue_length(self): return len(self.moves) def push(self, move_data, **kwargs): new_element = self.MoveQueueItem(MoveData(*move_data), **kwargs) self.moves.append(new_element) def push_current(self, move_data): if not self.at_end(): self.moves[self.current_place:] = [] self.push(move_data) def current(self): return None if self.at_end() else self._current.data def retard(self): if not self.at_start(): self.current_place -= 1 def rewind_start(self): self.current_place = 0 def forward_end(self): self.current_place = self.queue_length def truncate(self): self.moves[self.current_place:] = [] def truncate_before(self): self.moves[:self.current_place] = [] self.current_place = 0 def reset(self): self.current_place = 0 self.moves[:] = [] def advance(self): if not self.at_end(): self.current_place += 1 def swapnext(self): cp = self.current_place if cp+1 < self.queue_length: ma, mb = self.moves[cp], self.moves[cp+1] ma.code = mb.code = None ma.data, mb.data = mb.data, ma.data self.advance() def swapprev(self): cp = self.current_place if 0 < cp < self.queue_length: ma, mb = self.moves[cp-1], self.moves[cp] ma.code = mb.code = None ma.data, mb.data = mb.data, ma.data self.retard() def invert(self): # a mark at the end of the moves is discarded because a mark at start is not supported mark = False for move in self.moves: move.invert() move.code = None move.mark_after, mark = mark, move.mark_after self.moves.reverse() if not (self.at_start() or self.at_end()): self.current_place = len(self.moves) - self.current_place def normalize_complete_rotations(self, model): totalmoves = [] new_moves = [] for i, move in enumerate(self.moves): if i == self.current_place: self.current_place = len(new_moves) if move.slice < 0: totalmoves.append(move) else: for totalmove in reversed(totalmoves): move.rotate_by(model, totalmove) new_moves.append(move) totalmoves = list(self.MoveQueueItem.normalize_complete_moves(model, totalmoves)) self.moves = new_moves + totalmoves def unpack(self, move): for move in move.unpack(): self.push(move) def normalize_moves(self, model): mqp = MoveQueuePacked() for i, move in enumerate(self.moves): if i == self.current_place: mqp.current_place = (len(mqp.moves)-1, mqp.moves[-1].data.length()) if mqp.moves else (0, 0) mqp.pack(move.data, model) if len(self.moves) <= self.current_place: mqp.current_place = len(mqp.moves), 0 self.reset() for i, move in enumerate(mqp.moves): move.update_fullmoves(model) if i == mqp.current_place[0]: self.current_place = len(self.moves) + mqp.current_place[1] self.unpack(move) if len(mqp.moves) <= mqp.current_place[0]: self.current_place = len(self.moves) def is_mark_current(self): return self.at_start() or self._prev.mark_after def is_mark_after(self, pos): return self.moves[pos].mark_after def mark_current(self, mark=True): if not self.at_start(): self._prev.mark_after = mark if self._prev.code is not None: self._prev.code = self._prev.code.replace(' ','') if mark: self._prev.code += ' ' def mark_and_extend(self, other): if not other.moves: return -1 self.mark_current() self.truncate() self.moves += other.moves return self.current_place + other.current_place def format(self, model): code = '' pos = 0 for i, move in enumerate(self.moves): if move.code is None: move.code = MoveFormat.format(move, model) code += move.code if i < self.current_place: pos = len(code) return code, pos def parse_iter(self, code, pos, model): code = code.lstrip(' ') queue_pos = self.current_place move_code = '' for i, c in enumerate(code): if move_code and MoveFormat.isstart(c, model): data, mark = MoveFormat.parse(move_code, model) if data is not None: #FIXME: invalid chars at start get lost, other invalid chars are just ignored self.push(data, mark_after=mark, code=move_code) yield data, queue_pos, i if i == pos: queue_pos = self.queue_length move_code = c else: move_code += c if i < pos: queue_pos = self.queue_length + 1 if move_code: data, mark = MoveFormat.parse(move_code, model) if data is not None: self.push(data, mark_after=mark, code=move_code) if len(code)-len(move_code) < pos: queue_pos = self.queue_length yield data, queue_pos, len(code) def parse(self, code, pos, model): queue_pos = 0 cpos = 0 for unused_data, queue_pos, code_len in self.parse_iter(code, pos, model): if cpos < pos: cpos = code_len return queue_pos, cpos class MoveQueuePacked (_MoveQueueBase): _pos_0 = (0, 0, 0) def length(self): i = 0 for move in self.moves: i += move.data.length() return i def push(self, move_data, **kwargs): new_element = self.MoveQueueItem(MoveDataPacked(*move_data), **kwargs) self.moves.append(new_element) def pack(self, move, model): def getstack(): if self.moves: return self.moves[-1].data return None def newsmove(maxis): return MoveDataPacked(maxis, [0] * model.sizes[maxis], 0) def addslice(scounts, move): sdir = -1 if move.dir else 1 if move.slice < 0: for s in range(model.sizes[move.axis]): scounts[s] += sdir else: scounts[move.slice] += sdir def symmetry(smove): ssymmetry = model.symmetries[smove.axis] for i, scount in enumerate(smove.counts): if scount < 0: scount += ssymmetry if scount > ssymmetry//2: scount -= ssymmetry smove.counts[i] = scount smove = getstack() if smove is None or smove.axis != move.axis: smove = newsmove(move.axis) self.push(smove) addslice(smove.counts, move) symmetry(smove) if not any(smove.counts) and not smove.fullcount: self.moves.pop() return smove def format(self, model): mq = MoveQueue() for move in self.moves: mq.unpack(move) return mq.format(model) class MoveFormat: # pylint: disable=W0232 re_flubrd = re.compile(r"(.)(\d*)(['-]?)([^ ]*)( *)(.*)") @classmethod def isstart(cls, char, model): return char.upper() in model.faces @staticmethod def intern_to_str_move(move, model): if move.slice <= -1: # Rotate entire cube if move.dir: mface = model.symbolsI[move.axis] if mface in model.faces: # opposite symbol not reversed return mface, '', '' # no opposite symbol mface = model.symbols[move.axis] mdir = '-' if move.dir else '' return mface, '', mdir elif move.slice*2 > model.sizes[move.axis]-1: mface = model.symbolsI[move.axis] if mface in model.faces: # slice is nearer to the opposite face mface = mface.lower() mslice = model.sizes[move.axis]-1 - move.slice mslice = str(mslice+1) if mslice else '' mdir = '' if move.dir else '-' return mface, mslice, mdir # no opposite face mface = model.symbols[move.axis].lower() mslice = str(move.slice+1) if move.slice else '' mdir = '-' if move.dir else '' return mface, mslice, mdir @classmethod def format(cls, move, model): mface, mslice, mdir = cls.intern_to_str_move(move, model) #print('format:', move.data, '->', (mface, mslice, mdir)) mark = ' ' if move.mark_after else '' move_code = mface + mslice + mdir + mark return move_code @staticmethod def str_to_intern_move(tface, tslice, tdir, model): mface = tface.upper() mslice = int(tslice or 1) - 1 mdir = bool(tdir) if mface not in model.faces: return None elif mface in model.symbols: maxis = model.symbols.index(mface) elif mface in model.symbolsI: maxis = model.symbolsI.index(mface) mslice = model.sizes[maxis]-1 - mslice mdir = not mdir else: assert False, 'faces is a subset of symbols+symbolsI' if mslice < 0 or mslice >= model.sizes[maxis]: return None if tface.isupper(): mslice = -1 return MoveData(maxis, mslice, mdir) @classmethod def parse(cls, move_code, model): tface, tslice, tdir, err1, mark, err2 = cls.re_flubrd.match(move_code).groups() mark = bool(mark) move = cls.str_to_intern_move(tface, tslice, tdir, model) #print('parse:', (tface, tslice, tdir), '->', move) if move is None: debug('Error parsing formula') return move, False return move, mark pybik-2.1/pybiklib/ui/0000775000175000017500000000000012556245305015073 5ustar barccbarcc00000000000000pybik-2.1/pybiklib/ui/__init__.py0000664000175000017500000000000012505775003017167 0ustar barccbarcc00000000000000pybik-2.1/pybiklib/drawingarea.py0000664000175000017500000006350412556223565017330 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009-2015 B. Clausius # # 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 3 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, see . import os from collections import namedtuple import math from time import sleep from contextlib import contextmanager #XXX: Workaround for lp:941826, "dlopen(libGL.so) resolves to mesa rather than nvidia" # Was: "PyQt cannot compile shaders with Ubuntu's Nvidia drivers" # https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 import ctypes.util ctypes.CDLL(ctypes.util.find_library('GL'), ctypes.RTLD_GLOBAL) from PyQt5.QtCore import QElapsedTimer, QMutex, Qt, QThread, QTimer, QWaitCondition from PyQt5.QtCore import pyqtSignal as Signal from PyQt5.QtGui import (QColor, QCursor, QImage, QPixmap, QTransform, QSurfaceFormat, QOpenGLTexture, QOpenGLFramebufferObject) from PyQt5.QtWidgets import QOpenGLWidget from .debug import (debug, DEBUG, DEBUG_MSG, DEBUG_DRAW, DEBUG_MOUSEPOS, DEBUG_FPS, DEBUG_VFPS, DEBUG_PUREPYTHON, DEBUG_LIVESHADER, DEBUG_LOGGL) if DEBUG_LOGGL: try: import OpenGL OpenGL.FULL_LOGGING = True import OpenGL.GL except ImportError: pass from . import config from .theme import Theme from .settings import settings from .model import Model class ShaderInterface: shader_prefix = b''' #version 120 #line 0 ''' def __init__(self, **kwargs): super().__init__(**kwargs) self.shadername = None def gl_init_shaders(self): self.gl_load_shader() if DEBUG_DRAW: debug('Creating "hud" shaders:') vertex_source = self._read_shader('hud.vert') fragment_source = self._read_shader('pick.frag') self.glarea.gl_create_hud_program(vertex_source, fragment_source) debug('Creating "pick" shaders:') vertex_source = self._read_shader('pick.vert') fragment_source = self._read_shader('pick.frag') self.glarea.gl_create_pick_program(vertex_source, fragment_source) @staticmethod def _read_shader(filename): if DEBUG_MSG or DEBUG_LIVESHADER: print('Loading shader:', filename) filename = os.path.join(config.SHADER_DIR, filename) with open(filename, 'rb') as sfile: source = sfile.read() return ShaderInterface.shader_prefix + source def gl_set_shader(self): if self.shadername is None: return vertex_source = self._read_shader(self.shadername + '.vert') fragment_source = self._read_shader(self.shadername + '.frag') self.glarea.gl_create_render_program(vertex_source, fragment_source) def gl_load_shader(self): self.shadername = settings.draw.shader_nick self.gl_set_shader() class AnimationInterface: def __init__(self, **kwargs): super().__init__(**kwargs) self.stop_requested = False self.animation_active = False self.timer_animate = QTimer() self.timer_animate.timeout.connect(self._on_animate) def animate_rotation(self, move_data, blocks, stop_after): self.stop_requested = stop_after angle = 360. / self.model.symmetries[move_data.axis] axisx, axisy, axisz = self.model.axes[move_data.axis] if move_data.dir: self.gldraw.set_animation_start(blocks, angle, -axisx, -axisy, -axisz) else: self.gldraw.set_animation_start(blocks, angle, axisx, axisy, axisz) self.animation_active = True self.timer_animate.start(0 if DEBUG_VFPS else 20) self.update_selection() def animation_end(self): self.animation_active = False self.timer_animate.stop() def _on_animate(self): increment = self.speed * 1e-02 * 20 increment = min(increment, 45) if self.gldraw.set_animation_next(increment): self.update() return self.animation_ending.emit(self.stop_requested) self.update() self.update_selection() self.stop_requested = False def animate_abort(self, update=True): if update: self.animation_ending.emit(self.stop_requested) self.update() self.update_selection() else: self.animation_end() self.stop_requested = False class CubeArea (QOpenGLWidget, ShaderInterface, AnimationInterface): animation_ending = Signal(bool) request_rotation = Signal((int, int, bool)) request_swap_blocks = Signal((int, int, int, bool)) request_rotate_block = Signal((int, bool)) drop_color = Signal((int, str, str)) drop_file = Signal((int, str, str)) debug_info = Signal(str, object) def __init__(self, opts, model, **kwargs): super().__init__(**kwargs) self.texture = None self.theme = Theme() self.mirror_distance = None self.model = model self.last_mouse_x = -1 self.last_mouse_y = -1 self.button_down_background = False self.mouse_xy = -1, -1 self.pickdata = None self.editing_model = False settings.keystore.changed.connect(self.on_settings_changed, Qt.QueuedConnection) if DEBUG_FPS: self.monotonic_time = QElapsedTimer() self.monotonic_time.start() self.render_count = 0 self.fps = 0. self.speed = settings.draw.speed # Initialize the render engine self.gldraw, self.glarea = self.import_gl_engine() self.glarea.init_module() self.gldraw.init_module() self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy(*self.model.default_rotation) self.glarea.set_antialiasing(self.format().samples() > 1) self.init_theme() self.setAcceptDrops(True) self.setFocusPolicy(Qt.StrongFocus) self.setMinimumSize(300, 300) self.cursors = None self.load_cursors() self.update_selection_pending = False self.timer_update_selection = QTimer(self) self.timer_update_selection.setSingleShot(True) self.timer_update_selection.timeout.connect(self.on_idle_update_selection) self.set_cursor() self.setMouseTracking(True) @classmethod def set_default_surface_format(cls): glformat = QSurfaceFormat() if settings.draw.samples > 0: glformat.setSamples(2**settings.draw.samples) if DEBUG_VFPS: glformat.setSwapInterval(0) cls.default_format = QSurfaceFormat.defaultFormat() QSurfaceFormat.setDefaultFormat(glformat) def import_gl_engine(self): if not DEBUG_PUREPYTHON: from . import _gldraw as gldraw from . import _glarea as glarea else: try: import OpenGL.GL except ImportError as e: print('The pure Python mode needs PyOpenGL (for Python 3):', e) raise SystemExit(1) from . import gldraw from . import glarea return gldraw, glarea @contextmanager def lock_glcontext(self): self.makeCurrent() yield self.doneCurrent() def stop(self): with self.lock_glcontext(): self.glarea.gl_exit() self.gl_delete_textures() # this line prevents a segmentation fault with PySide if game->quit selected self.setMouseTracking(False) settings.keystore.changed.disconnect(self.on_settings_changed) self.timer_update_selection.timeout.disconnect(self.on_idle_update_selection) self.timer_animate.timeout.disconnect(self._on_animate) def load_cursors(self): cursors = [] # Load 3 cursors from file (n - ne) for i, (x, y) in enumerate([(8, 0), (15, 0), (15, 0)]): filename = os.path.join(config.UI_DIR, 'cursors', 'mouse_{}.png'.format(i)) image = QImage(filename) cursors.append((image, x, y)) # 1 cursor (nnw) image, x, y = cursors[1] cursors.insert(0, (image.mirrored(True, False), 15-x, y)) # 12 cursors (ene - nw) transform = QTransform() transform.rotate(90) for i in range(4, 16): image, x, y = cursors[-4] cursors.append((image.transformed(transform), 15-y, x)) cursors.append(cursors[0]) self.cursors = [QCursor(QPixmap.fromImage(image), x, y) for image, x, y in cursors[1:]] # cursor for center faces filename = os.path.join(config.UI_DIR, 'cursors', 'mouse_ccw.png') cursor = QCursor(QPixmap(filename), 7, 7) self.cursors.append(cursor) # background cursor cursor = QCursor() cursor.setShape(Qt.CrossCursor) self.cursors.append(cursor) def init_theme(self): rgba = QColor() for facekey, unused_facename in Model.cache_index['facenames']: rgba.setNamedColor(settings.theme.faces[facekey].color) self.theme.faces[facekey].color = rgba.red(), rgba.green(), rgba.blue() self.theme.faces[facekey].imagemode = settings.theme.faces[facekey].mode self.set_background_color(settings.theme.bgcolor) def load_face_texture(self, facekey): filename = settings.theme.faces[facekey].image if not self.theme.load_face_image(facekey, filename): del settings.theme.faces[facekey].image def gl_set_texture_atlas(self): width, height = 0, 0 texrects = [] faces = [self.theme.faces[fk] for fk, fn in Model.cache_index['facenames']] for fd in faces: x = width w = fd.image.width() h = fd.image.height() width += w height = max(h, height) texrects.append((x, w, h)) w = h = 64 while w < width: w *= 2 while h < height: h *= 2 width, height = w, h if self.texture is not None: self.texture.destroy() self.texture = QOpenGLTexture(QOpenGLTexture.Target2D) self.texture.setFormat(QOpenGLTexture.RGBA32F) self.texture.setSize(width, height) self.texture.setMinMagFilters(QOpenGLTexture.Linear, QOpenGLTexture.Linear) self.texture.allocateStorage() self.texture.bind() for (x, w, h), fd in zip(texrects, faces): fd.texrect = (x+.5)/width, .5/height, (x+w-.5)/width, (h-.5)/height data = fd.image.bits() data.setsize(fd.image.byteCount()) data = bytes(data) self.gldraw.gl_set_atlas_texture(x, w, h, data) def gl_delete_textures(self): if self.texture is not None: self.texture.release() self.texture.destroy() for fd in self.theme.faces.values(): fd.image = None def set_glmodel_full(self, model=None, rotations=None): if model is not None: self.model = model self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy(*self.model.default_rotation) #TODO: The bounding_sphere_radius is optimised for the far clipping plane, # for the near clipping plane the radius without the mirror_distance # would be sufficient. s = max(self.model.sizes) if self.model.sizes else 1 if settings.draw.mirror_faces: self.mirror_distance = settings.draw.mirror_distance * s sm = s + self.mirror_distance else: self.mirror_distance = None sm = s bounding_sphere_radius = math.sqrt(2*s*s + sm*sm) self.glarea.set_frustum(bounding_sphere_radius, settings.draw.zoom) self.set_glmodel_selection_mode(settings.draw.selection) if rotations is not None: self.set_transformations(rotations) self.update_selection() self.update() def set_glmodel_selection_mode(self, selection_mode): glmodeldata, self.glpickdata = self.model.gl_vertex_data(selection_mode, self.theme, self.mirror_distance) with self.lock_glcontext(): self.gldraw.gl_set_data(*glmodeldata) def set_transformations(self, rotations): indices = self.model.rotations_symbolic_to_index(rotations) self.gldraw.set_transformations(indices) def gl_create_pickbuffer(self, width, height): self.pickbuffer = QOpenGLFramebufferObject(width, height) self.pickbuffer.setAttachment(QOpenGLFramebufferObject.Depth) def initializeGL(self): if DEBUG_MSG: glformat = self.format() glrformat = QSurfaceFormat.defaultFormat() # requested format gldformat = self.default_format def printglattr(name, *attrs): print(' {}: '.format(name), end='') def get_value(glformat, attr): if isinstance(attr, str): return getattr(glformat, attr)() else: return attr(glformat) values = [get_value(glformat, a) for a in attrs] rvalues = [get_value(glrformat, a) for a in attrs] dvalues = [get_value(gldformat, a) for a in attrs] print(*values, end='') if values != rvalues: print(' (', end='') print(*rvalues, end=')') if rvalues != dvalues: print(' [', end='') print(*dvalues, end=']') print() print('Surface format (requested (), default []):') printglattr('alpha', 'alphaBufferSize') printglattr('rgb', 'redBufferSize', 'greenBufferSize', 'blueBufferSize') printglattr('depth', 'depthBufferSize') printglattr('options', lambda glformat: str(int(glformat.options()))) printglattr('profile', 'profile') printglattr('renderableType', 'renderableType') printglattr('samples', 'samples') printglattr('stencil', 'stencilBufferSize') printglattr('stereo', 'stereo') printglattr('swapBehavior', 'swapBehavior') printglattr('swapInterval', 'swapInterval') printglattr('version', lambda glformat: '{}.{}'.format(*glformat.version())) self.gl_init_shaders() for facekey, unused_facename in Model.cache_index['facenames']: self.load_face_texture(facekey) self.gl_set_texture_atlas() self.glarea.gl_init() self.gl_create_pickbuffer(self.width(), self.height()) def paintGL(self): self.texture.bind() self.glarea.gl_render() if DEBUG: if DEBUG_DRAW: if self.pickdata is not None and self.pickdata.angle is not None: self.glarea.gl_render_select_debug() if DEBUG_FPS: self.render_count += 1 if self.monotonic_time.elapsed() > 1000: elapsed = self.monotonic_time.restart() self.fps = 1000. / elapsed * self.render_count self.render_count = 0 self.debug_info.emit('fps', self.fps) def resizeGL(self, width, height): self.glarea.gl_resize(width, height) self.gl_create_pickbuffer(width, height) MODIFIER_MASK = int(Qt.ShiftModifier | Qt.ControlModifier) def keyPressEvent(self, event): modifiers = int(event.modifiers()) & self.MODIFIER_MASK if modifiers: return QOpenGLWidget.keyPressEvent(self, event) elif event.key() == Qt.Key_Right: self.rotation_x += 2 elif event.key() == Qt.Key_Left: self.rotation_x -= 2 elif event.key() == Qt.Key_Up: self.rotation_y -= 2 elif event.key() == Qt.Key_Down: self.rotation_y += 2 else: return QOpenGLWidget.keyPressEvent(self, event) self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy(self.rotation_x, self.rotation_y) self.update() self.update_selection() PickData = namedtuple('PickData', 'maxis mslice mdir blockpos symbol angle') def pick_polygons(self, x, y): height = self.height() with self.lock_glcontext(): self.pickbuffer.bind() index = self.glarea.gl_pick_polygons(x, height-y) self.pickbuffer.release() if not index: self.pickdata = None return maxis, mslice, mdir, blockpos, symbol, arrowdir = self.glpickdata[index] if arrowdir is None: angle = None else: angle = self.glarea.get_cursor_angle(x, height-y, arrowdir) self.pickdata = self.PickData(maxis, mslice, mdir, blockpos, symbol, angle) if DEBUG_DRAW: info = {'face': self.model.faces.index(symbol)} self.debug_info.emit('pick', info) def update_selection(self): if self.animation_active: if self.pickdata is not None: self.pickdata = None self.set_cursor() return if self.update_selection_pending: return self.update_selection_pending = True self.timer_update_selection.start() def on_idle_update_selection(self): if self.animation_active: if self.pickdata is not None: self.pickdata = None self.set_cursor() else: self.pick_polygons(*self.mouse_xy) self.set_cursor() if DEBUG_DRAW: self.update() self.update_selection_pending = False def mouseMoveEvent(self, event): self.mouse_xy = event.x(), event.y() if DEBUG_MOUSEPOS: print(self.mouse_xy) if not self.button_down_background: self.update_selection() return # perform rotation offset_x = event.x() - self.last_mouse_x offset_y = event.y() - self.last_mouse_y self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy( self.rotation_x + offset_x, self.rotation_y + offset_y) self.rotation_x -= offset_x self.rotation_y -= offset_y self.update() def mousePressEvent(self, event): if self.pickdata is not None: if self.animation_active: return # make a move if self.editing_model: if event.modifiers() & Qt.ControlModifier: if event.button() == Qt.LeftButton: self.request_rotate_block.emit(self.pickdata.blockpos, False) elif event.button() == Qt.RightButton: self.request_rotate_block.emit(self.pickdata.blockpos, True) else: if event.button() == Qt.LeftButton: self.request_swap_blocks.emit(self.pickdata.blockpos, self.pickdata.maxis, self.pickdata.mslice, self.pickdata.mdir) else: mslice = -1 if event.modifiers() & Qt.ControlModifier else self.pickdata.mslice if event.button() == Qt.LeftButton: self.request_rotation.emit(self.pickdata.maxis, mslice, self.pickdata.mdir) elif event.button() == Qt.RightButton and settings.draw.selection_nick == 'simple': self.request_rotation.emit(self.pickdata.maxis, mslice, not self.pickdata.mdir) elif event.button() == Qt.LeftButton: # start rotation self.button_down_background = True self.last_mouse_x = event.x() self.last_mouse_y = event.y() self.update() def mouseReleaseEvent(self, event): if event.button() != Qt.LeftButton: return if self.button_down_background: # end rotation self.rotation_x += event.x() - self.last_mouse_x self.rotation_y += event.y() - self.last_mouse_y self.button_down_background = False self.update_selection() def wheelEvent(self, event): zoom = settings.draw.zoom * math.pow(1.1, -event.angleDelta().y() / 120) zoom_min, zoom_max = settings.draw.zoom_range if zoom < zoom_min: zoom = zoom_min if zoom > zoom_max: zoom = zoom_max settings.draw.zoom = zoom def dragEnterEvent(self, event): mime_data = event.mimeData() debug('drag enter:', mime_data.formats()) if mime_data.hasColor(): event.acceptProposedAction() elif mime_data.hasUrls() and mime_data.urls()[0].isLocalFile(): event.acceptProposedAction() def dropEvent(self, event): # when a drag is in progress the pickdata is not updated, so do it now self.pick_polygons(event.pos().x(), event.pos().y()) mime_data = event.mimeData() if mime_data.hasColor(): color = mime_data.colorData() if self.pickdata is not None: self.drop_color.emit(self.pickdata.blockpos, self.pickdata.symbol, color.name()) else: self.drop_color.emit(-1, '', color.name()) elif mime_data.hasUrls(): if self.pickdata is None: debug('Background image is not supported.') return uris = mime_data.urls() for uri in uris: if not uri.isLocalFile(): debug('filename "%s" not found or not a local file.' % uri.toString()) continue filename = uri.toLocalFile() if not filename or not os.path.exists(filename): debug('filename "%s" not found.' % filename) continue self.drop_file.emit(self.pickdata.blockpos, self.pickdata.symbol, filename) break # ignore other uris debug('Skip mime type:', ' '.join(mime_data.formats())) def set_cursor(self): if self.pickdata is None or self.button_down_background: index = -1 elif self.pickdata.angle is None: index = -2 else: index = int((self.pickdata.angle+180) / 22.5 + 0.5) % 16 self.setCursor(self.cursors[index]) def set_std_cursor(self): #FIXME: then there still is the wrong cursor QTimer.singleShot(0, self.unsetCursor) def set_editing_mode(self, enable): self.editing_model = enable self.set_glmodel_selection_mode(0 if enable else settings.draw.selection) self.update_selection() def set_background_color(self, color): rgba = QColor() rgba.setNamedColor(color) self.glarea.set_background_color(rgba.redF(), rgba.greenF(), rgba.blueF()) def reset_rotation(self): '''Reset cube rotation''' self.rotation_x, self.rotation_y = self.glarea.set_rotation_xy(*self.model.default_rotation) self.update() def reload_shader(self): with self.lock_glcontext(): self.gl_set_shader() self.update() def on_settings_changed(self, key): if key == 'draw.speed': self.speed = settings.draw.speed elif key == 'draw.shader': with self.lock_glcontext(): self.gl_load_shader() elif key == 'draw.samples': if self.format().samples(): samples = 2**settings.draw.samples if samples == 1: self.glarea.set_antialiasing(False) elif samples == self.format().samples(): self.glarea.set_antialiasing(True) elif key == 'draw.selection': self.set_glmodel_selection_mode(settings.draw.selection) self.update_selection() elif key in ['draw.mirror_faces', 'draw.mirror_distance']: self.set_glmodel_full() elif key.startswith('theme.faces.'): facekey, faceattr = key.split('.')[2:] if faceattr == 'color': color = QColor() color.setNamedColor(settings.theme.faces[facekey].color) self.theme.faces[facekey].color = (color.red(), color.green(), color.blue()) self.set_glmodel_selection_mode(settings.draw.selection) elif faceattr == 'image': self.load_face_texture(facekey) with self.lock_glcontext(): self.gl_set_texture_atlas() self.set_glmodel_selection_mode(settings.draw.selection) elif faceattr == 'mode': self.theme.faces[facekey].imagemode = settings.theme.faces[facekey].mode self.set_glmodel_selection_mode(settings.draw.selection) elif key == 'theme.bgcolor': self.set_background_color(settings.theme.bgcolor) elif key == 'draw.zoom': self.glarea.set_frustum(0, settings.draw.zoom) else: debug('Unknown settings key changed:', key) self.update() pybik-2.1/pybiklib/pluginlib.py0000664000175000017500000005065412556244525017032 0ustar barccbarcc00000000000000#-*- coding:utf-8 -*- # Copyright © 2009, 2011-2015 B. Clausius # # 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 3 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, see . import os import sys import importlib from collections import namedtuple, OrderedDict from .debug import debug, DEBUG_ALG from . import config from . import model FILE_FORMAT = 'Pybik Plugins Collection - Version 2.0' FILE_SIG = 'Format: ' + FILE_FORMAT class PluginFileError (Exception): pass class PluginSolverAbort (Exception): pass class PluginModelCompatError (Exception): pass class PluginFileLoader: def __init__(self, filename): # field name: (required, singleline, convert-func) parse_pass = lambda value, lineno, comment: value self.header_scheme = { 'Format': (True, True, self.parse_version), 'Copyright': (False, False, parse_pass), 'License': (False, False, parse_pass), 'Model': (False, False, self.parse_model), 'Ref-Blocks': (False, True, self.parse_refblocks), } self.body_scheme = { 'Path': (True, True, self.parse_path), 'Depends': (False, False, parse_pass), 'Model': (True, False, self.parse_model), 'Ref-Blocks': (False, True, self.parse_refblocks), 'Solution': (False, False, self.parse_solution), 'Moves': (False, False, self.parse_moves), 'Module': (False, True, self.parse_module), } self.conflicts = [('Solution', 'Moves', 'Module'), ('Depends', 'Moves', 'Module')] self.paras = [] self.header = None self.body = [] self.load(filename) self.parse() def load(self, filename): with open(filename, 'rt', encoding='utf-8') as fp: lines = fp.readlines() debug('Loaded plugin:', filename) # parse file para = {} key = None comment = None for lineno, line in enumerate(lines): line = line.rstrip() if not line: # end para if not self.paras and not para: raise PluginFileError('File must not start with empty line.') self.paras.append(para) para = {} comment = None elif line[0] == '#': # comment if not self.paras and not para: raise PluginFileError('File must not start with comment.') comment = line elif line[0] in ' \t': if not para: raise PluginFileError('Paragraph must not start with indented line.') line = line.strip() if line[0] != '#': # multiline para[key][0].append(line) comment = None else: if not self.paras and not para and line.rstrip() != FILE_SIG: raise PluginFileError('File must start with:', FILE_SIG) key, value = line.split(':') value = value.strip() para[key] = [value] if value else [], lineno, comment comment = None if para: self.paras.append(para) @staticmethod def parse_version(value, lineno, comment): if value != FILE_FORMAT: raise PluginFileError('wrong file version:', value) return value @staticmethod def parse_model(modelstrings, lineno, comment): model_infos = [] for modelstr in modelstrings or []: try: model_info = model.Model.from_string(modelstr) except ValueError as e: debug('Error in model %s:' % modelstr, e) else: model_infos.append(model_info) return model_infos @staticmethod def parse_refblocks(value, lineno, comment): return value and [[v, v] for v in value.upper().split()] @staticmethod def parse_path(value, lineno, comment): if not value: raise PluginFileError('empty path') sep = value[0] if sep == '@': return value, None, lineno, comment def _translate(value): transl = True for v in value.strip(sep).split(sep): if not v: continue if transl is True: if v == '_': transl = True elif v == 'P_': transl = 'sing' elif v == '!_': transl = False else: yield v, _(v) elif transl is False: yield v, v transl = True elif transl == 'sing': vs = v transl = 'plural' elif transl == 'plural': vp = v transl = 'n' elif transl == 'n': try: vi = int(v) except ValueError: raise PluginFileError('Third value after P_ must be int.') yield (vs if vi==1 else vp).format(v), ngettext(vs, vp, vi).format(v) return value, tuple(_translate(value)), lineno, comment @staticmethod def parse_solution(value, lineno, comment): def split_solution(value): try: conditions, moves = value.split(',') except ValueError: raise PluginFileError('expected exactly one comma in: ' + value) conditions = conditions.strip().upper().split() conditions = [c.split('=') for c in conditions] for c in conditions: if len(c) != 2: raise PluginFileError('expected exactly one "=" in: ' + '='.join(c)) return value, conditions, moves.strip() return value and [split_solution(v) for v in value if v] @staticmethod def parse_moves(value, lineno, comment): if value is None: return None moves = ' '.join(value) def func(game): game.move_sequence.reset() game.add_code(moves) game.set_plugin_mode('append') return func @staticmethod def parse_module(value, lineno, comment): if value is None: return None value = value.split(',') if len(value) != 2: raise PluginFileError('Wrong Syntax in Module field, expected: module.func, flag') value, flag = value modulename, funcname = value.rstrip().rsplit('.', 1) from . import plugins moduleobj = importlib.import_module('.'+modulename, plugins.__package__) modulefunc = getattr(moduleobj, funcname) flag = flag.strip() if flag not in ['append', 'replace', 'challenge']: raise PluginFileError('Unknown flag %s for module' % flag) def func(game): if flag == 'append': game.move_sequence.reset() modulefunc(game) game.set_plugin_mode(flag) return func def parse(self): if not self.paras: raise PluginFileError('empty plugin file') self.header = self.paras.pop(0) default = {k:v for k,v in self.header.items() if k in self.header_scheme and k in self.body_scheme} self.parse_para(self.header, self.header_scheme) def check_conflicts(para): for conflicts in self.conflicts: if sum(int(c in para) for c in conflicts) > 1: debug('Only one field allowed of:', ', '.join(conflicts)) debug('Skipping paragraph %s in plugin file' % para.get('Path')) return False return True while self.paras: para = self.paras.pop(0) if not para: continue if DEBUG_ALG: debug(' Path:', para.get('Path')) if not check_conflicts(para): continue for k, v in default.items(): para.setdefault(k, v) try: self.parse_para(para, self.body_scheme) except PluginFileError as e: debug('Skipping paragraph in plugin file:', e, 'keys:', *para.keys()) else: self.body.append(para) self.paras = None @staticmethod def parse_para(para, scheme): for key, (required, singleline, convert_func) in scheme.items(): try: value, lineno, comment = para[key] except KeyError: if required: raise PluginFileError('missing required field {!r}'.format(key)) else: value, lineno, comment = None, None, None if singleline and value is not None: if len(value) == 0: value = None elif len(value) == 1: value = value[0] else: raise PluginFileError('{!r} is a singleline field, but {} lines found'.format(key, len(value))) para[key] = convert_func(value, lineno, comment) class PluginHelper: def __init__(self): self.scripts = OrderedDict() self.error_messages = [] @staticmethod def test_model(model, models): for unused_modelstr, mtype, sizes, exp in models: if mtype == '*': return True if mtype is None: continue if model.type != mtype: continue sizedict = {} for size1, size2 in zip(sizes, model.sizes): if size1 is None: continue if type(size1) is int: if size1 != size2: break else: sizedict[size1] = size2 else: try: if exp is None or eval(exp, {}, sizedict): return True except ValueError: continue return False def get_function(self, model, index): all_models = [] for models, func in list(self.scripts.values())[index]: if self.test_model(model, models): assert func is not None return func all_models += models else: # all model rejected all_models = [model_[0] for model_ in all_models if model_[1] is not None] if not all_models: raise PluginModelCompatError(_('This plugin does not work for any model.\n')) elif len(all_models) == 1: raise PluginModelCompatError(_('This plugin only works for:\n') + ' ' + all_models[0]) else: raise PluginModelCompatError( _('This plugin only works for:\n') + '\n'.join([' • ' + m for m in all_models]) ) def load_plugins_from_directory(self, dirname): debug('Loading Plugins from', dirname) for filename in sorted(os.listdir(dirname), key=str.lower): unused_name, ext = os.path.splitext(filename) if ext != '.plugins': continue if DEBUG_ALG: debug(' plugins:', filename) try: self.load_plugins_from_file(os.path.join(dirname, filename)) except Exception as e: # pylint: disable=W0703 self.error_messages.append('Error loading {}:\n{}'.format(os.path.basename(filename), e)) sys.excepthook(*sys.exc_info()) def load_plugins(self): self.scripts.clear() del self.error_messages[:] for dirname in [config.PLUGINS_DIR, config.USER_PLUGINS_DIR]: if os.path.isdir(dirname): debug('Found plugins path:', dirname) self.load_plugins_from_directory(dirname) else: debug('Plugins path does not exist:', dirname) if DEBUG_ALG: debug('found', len(self.scripts)) return [(path, i) for i, path in enumerate(self.scripts.keys())] @staticmethod def resolve_depends(params): depends = [] # resolve dependencies to other scripts for depend in params.depends: for path, unused_models, instance in params.scripts: if path == depend: depends += instance.params.depends depends.append(depend) if DEBUG_ALG: debug(' Resolve dependencies for:', params.path) if params.depends != depends: debug(' before:', params.depends) debug(' after: ', depends) params.depends[:] = depends # resolve dependencies to params for path, unused_models, instance in params.scripts: depends = [] for depend in instance.params.depends: if params.path == depend: depends += params.depends depends.append(depend) if DEBUG_ALG: debug(' Resolve dependencies for:', path) if instance.params.depends != depends: debug(' before:', instance.params.depends) debug(' after: ', depends) instance.params.depends[:] = depends def load_plugins_from_file(self, filename, solutionfactory=None): try: file = PluginFileLoader(filename) except PluginFileError as e: print('Skipping plugin file:', e) return scripts = [] for para in file.body: path, pathitems, *unused = para['Path'] models = para['Model'] depends = para['Depends'] solution = para['Solution'] moves = para['Moves'] module = para['Module'] if depends or solution: params = ScriptParams( depends=depends or [], precond=para['Ref-Blocks'] or [], solution=solution, scripts=scripts, path=path, ) self.resolve_depends(params) func = (solutionfactory or Solution)(params) elif moves is not None: func = moves elif module is not None: func = module else: debug(' skip Path without plugin:', path) continue scripts.append((path, models, func)) if pathitems is not None: funclist = self.scripts.setdefault(pathitems, []) funclist.append((models, func)) ScriptParams = namedtuple('ScriptParams', 'depends precond solution scripts path') class Solution: def __init__(self, params): self.solved_face_colors = {} self.params = params def __call__(self, game): game.move_sequence.reset() scripts = {path: func for path, models, func in self.params.scripts} for depend in self.params.depends: instance = scripts[depend] self.execute(game, instance.params) self.execute(game, self.params) game.set_plugin_mode('append') def test_face(self, cube, blockpos, position, condition): color1 = cube.get_colorsymbol(blockpos, position) color2 = self.solved_face_colors.setdefault(condition, color1) return color1 == color2 def test_basic_condition(self, cube, position, condition): assert len(position) == len(condition) blockpos = cube.model.blocksym_to_blockpos(position) for pos, cond in zip(position, condition): if not self.test_face(cube, blockpos, pos, cond): return False return True @staticmethod def opposite(face): #FIXME: this only works for BrickModel return { 'F': 'B', 'B': 'F', 'L': 'R', 'R': 'L', 'U': 'D', 'D': 'U', }[face] def test_pattern_condition(self, cube, position, condition): if '?' in condition: conditions = (condition.replace('?', face, 1) for face in 'FLUBRD' if face not in condition if self.opposite(face) not in condition) return self.test_or_conditions(cube, position, conditions) else: return self.test_basic_condition(cube, position, condition) @staticmethod def rotated_conditions(condition): for i in range(len(condition)): yield condition[i:] + condition[:i] def test_prefix_condition(self, cube, position, condition): if condition.startswith('!*'): return not self.test_or_conditions(cube, position, self.rotated_conditions(condition[2:])) elif condition.startswith('*'): #TODO: Instead of testing only rotated conditions, test all permutations. # This should not break existing rules, and would allow to match # e.g. dfr and dfl. Could be done by comparing sorted strings after # expanding patterns. return self.test_or_conditions(cube, position, self.rotated_conditions(condition[1:])) elif condition.startswith('!'): return not self.test_pattern_condition(cube, position, condition[1:]) else: return self.test_pattern_condition(cube, position, condition) def test_or_conditions(self, cube, position, conditions): for prefix_cond in conditions: if self.test_prefix_condition(cube, position, prefix_cond): return True return False def test_and_conditions(self, cube, conditions): for position, or_cond in conditions: if not self.test_or_conditions(cube, position, or_cond.split('|')): return False return True def execute(self, game, params): rules = params.solution if rules is None: return cube = game.current_state count = 0 pos = 0 if DEBUG_ALG: print('{}:'.format(params.path)) print(' ', cube) while pos < len(rules): self.solved_face_colors.clear() rule, conditions, moves = rules[pos] if self.test_and_conditions(cube, params.precond + conditions): if DEBUG_ALG: print(' accept: {:2}. {}'.format(pos+1, rule)) if moves == '@@solved': return if moves == '@@unsolvable': raise PluginSolverAbort(_('This puzzle is not solvable.')) if count > 4 * len(rules): # this value is just guessed raise PluginSolverAbort( 'An infinite loop was detected. ' 'This is probably an error in the solution.') count += 1 game.add_code(moves) pos = 0 else: if DEBUG_ALG: print(' reject: {:2}. {}'.format(pos+1, rule)) pos += 1 raise PluginSolverAbort( 'No matching rules found. ' 'This is probably an error in the solution.') pybik-2.1/README0000664000175000017500000000564312556245304013540 0ustar barccbarcc00000000000000 About Pybik 2.1 =============== Pybik is a 3D puzzle game about the cube invented by Ernő Rubik. * Different 3D puzzles - up to 10x10x10: cubes, towers, bricks, tetrahedra and prisms * Solvers for some puzzles * Pretty patterns * Editor for move sequences * Changeable colors and images Author: B. Clausius License: GPL-3+ Project page: Installation ============ If Pybik is available for your distribution, you should install Pybik with a package manager. Otherwise see the file INSTALL for installation instructions. Feedback ======== If you find any bugs in Pybik or have a suggestion for an improvement then please submit a bug report [1]. In the latter case you can mark the bug report as "Wishlist". [1] Translation =========== Translations are managed by the Launchpad translation group [2]. If you want help to translate Pybik to your language you can do it through the web interface [3]. Read more about "Translating with Launchpad" [4] and "Starting to translate" [5]. [2] [3] [4] [5] License ======= 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 3 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, see . Hidden Features =============== You can change shortcuts for some menu items and actions: Action | Menuitem | Default ----------------------------------------------------- selectmodel | Game->Select Model | Ctrl+M initial_state | Edit->Set as Initial State | None reset_rotation | Edit->Reset Rotation | Ctrl+R preferences | Edit->Preferences | Ctrl+P edit_moves | None (Select moves editor) | Ctrl+L edit_cube | None (Cube editor) | None Append the following lines with the shortcuts changed as you like to your Pybik config file (~/.config/pybik/settings.conf): action.selectmodel = 'Ctrl+M' action.initial_state = '' action.reset_rotation = 'Ctrl+R' action.preferences = 'Ctrl+P' action.edit_moves = 'Ctrl+L' action.edit_cube = '' The cube editor is a immature feature. To use it anyway, you must assign a shortcut to the action edit_cube. In cube editor mode swap cubies with left mouse button and rotate cubies with Ctrl and left mouse button. pybik-2.1/NEWS0000664000175000017500000000354112556223565013357 0ustar barccbarcc00000000000000Pybik 2.1: * New puzzles: Triangular Prisms and Pentagonal Prisms * For each puzzle type, the game is saved independently * Misc improvements * Updated translations Pybik 2.0: * New puzzle: Tetrahedron * New solution: Beginner's method * Added move transformations * Other new and improved plugins * Improved rendering engine * Added simple help Pybik 1.1.1: * New and updated translations * Misc bugfixes and improvements Pybik 1.1: * Rendering engine now uses modern OpenGL - should be faster on most systems - improved lighting effect * New and updated translations Pybik 1.0.1: * Minor improvements and bugfixes * Updated translations Pybik 1.0: * Improved user interface. * Added Towers and Bricks (non cubic puzzles). * Added an option to show the back faces. * The cube can be manipulated with the keyboard. * Animation is faster and rendering more beautiful. * Added more pretty patterns. * Added a new solver. * Added new translations. Pybik 0.5: * New solutions: - Spiegel improved - Solution for the 2×2×2 Cube * New file format for solutions * Improved mouse control - Mouse button with control key rotates the whole cube - Right button moves in the opposite direction * Changeable background color Pybik 0.4: This release does not contain many new features. Most of the changes took place under the hood. A new solution (Spiegel) has been added. Pybik 0.3: * Text field to edit moves in a notation similar to Singmaster's * The state of the cube and the moves are now stored between sessions * Some sequences for pretty patterns in the sidebar Pybik 0.2: * Preferences are stored with GConf * UI Improvements and bugfixes Pybik 0.1: * Port from gnubik-2.3 to Python * Sidebar for Actions * Redesigned color dialog * Improvements in cube rendering pybik-2.1/pybiktest/0000775000175000017500000000000012556245305014667 5ustar barccbarcc00000000000000pybik-2.1/pybiktest/runner.py0000664000175000017500000013561512556223565016571 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2013-2015 B. Clausius # # 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 3 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, see . import sys, os, re import random from collections import namedtuple, OrderedDict from contextlib import suppress import tempfile import time from PyQt5.QtCore import Qt, QTimer from PyQt5.QtWidgets import QAction from PyQt5.QtTest import QTest from . import utils from pybiklib.settings import settings class Quit (Exception): pass # pylint: disable=C0321 class Logger: def __init__(self): self.lineno = None self.result = None def log(self, *args, **kwargs): if self.lineno is not None: args = ('line {}:'.format(self.lineno),) + args print(*args, **kwargs) def logf(self, format, *args): self.log(format.format(*args)) def error(self, message, *args): self.log(message, *args, file=sys.stderr) message = message.rstrip(':') if message not in self.result: self.result[message] = 1 else: self.result[message] += 1 def errorf(self, message, format, *args): self.error(message, format.format(*args)) logger = Logger() log = logger.log logf = logger.logf log_error = logger.error logf_error = logger.errorf class NamedObject: # pylint: disable=R0903 def __init__(self, name): self.name = name def __repr__(self): return self.name matchall = NamedObject('matchall') nomatch = NamedObject('nomatch') def mkState(fields): _State = namedtuple('_State', fields) class State(_State): # pylint: disable=W0232 __slots__ = () def tostr(self, other=None): def field_tostr(i): if self[i] is matchall: return '' elif other is None or self[i] != other[i]: return '{}={!r}, '.format(self.fields[i], self[i]) else: return ' ' * (len(self.fields[i]) + len(repr(self[i])) + 3) return ''.join([field_tostr(i) for i in range(len(self))]).rstrip(', ') fields = _State._fields asdict = _State._asdict replace = _State._replace State.default = State(**{f: matchall for f in State.fields}) return State class StateInfo: # pylint: disable=R0903 def __init__(self): self.untested_tnames = None self.islimit = None def __str__(self): return 'StateInfo: untested_t: #{}, islimit: {}'.format( len(self.untested_tnames), self.islimit) class StatesInfo (dict): __slots__ = () def __init__(self): dict.__init__(self) def istested(self, *args): if len(args) == 0: for s in self.values(): if s.untested_tnames and s.islimit: return False return True elif len(args) == 1: state = args[0] return state in self and not (self[state].untested_tnames and self[state].islimit) else: raise TypeError('istested expected at most 1 argument, got %s' % len(args)) def reset(self, untested_tnames): for v in self.values(): v.untested_tnames = untested_tnames[:] def get_unreached(self): return [s for s, si in self.items() if si.untested_tnames and si.islimit] class Transition: Func = namedtuple('Func', 'name fname args func') def __init__(self, name, func=None): if name: fname, args = self._parse_name(name) self.funcs = [self.Func(name, fname, args, func)] else: self.funcs = [] self.exprs_src = [] self.exprs = {} self.chains = {} @property def name(self): return self.funcs[0].name if self.funcs else '' def appendfunc(self, name): assert self.funcs fname, args = self._parse_name(name) self.funcs.append(self.Func(name, fname, args, None)) def setfunc(self, i, func): assert self.funcs[i].func is None self.funcs[i] = self.funcs[i]._replace(func=func) @staticmethod def _parse_name(name): fname, *args = name.split(' ', 1) args = args[0] if args else None return fname, args class TestData: def __init__(self): self.constants = {} self.transitions = {} self.limits = [] self.stateinfos = StatesInfo() self.path_to_untested = [] def islimit(self, state): state = state.asdict() for limit in self.limits: try: if not eval(limit, self.constants, state): return False except Exception as e: # pylint: disable=W0703 log_error('error in limit:', e) return True def reset(self): self.stateinfos.reset(list(self.transitions.keys())) def add_stateinfo(self, state): try: return self.stateinfos[state] except KeyError: stateinfo = dict.setdefault(self.stateinfos, state, StateInfo()) stateinfo.untested_tnames = list(self.transitions.keys()) stateinfo.islimit = self.islimit(state) return stateinfo def update_transition(self, transition, state, chain): self.add_stateinfo(state) target = chain[-1] if target is not None and target not in transition.chains: transition.chains[target] = [None] * len(transition.funcs) self.add_stateinfo(target) @staticmethod def _path_to_list(path): result = [] while path is not None: item, path = path result.append(item) return result def get_path_to_untested(self, state): paths = [[(state, None), None]] reachable = set() while paths: path = paths.pop(0) state = path[0][0] stateinfo = self.stateinfos[state] reachable.add(state) if stateinfo.islimit and stateinfo.untested_tnames: return self._path_to_list(path) for name, transition in self.transitions.items(): target = transition.chains[state][-1] if not stateinfo.islimit or self.stateinfos[target].islimit: if target not in reachable: paths.append([(target, name), path]) return None def get_random_transition(self, state): if not self.path_to_untested: stateinfo = self.stateinfos[state] while stateinfo.untested_tnames: name = stateinfo.untested_tnames.pop(random.randrange(len(stateinfo.untested_tnames))) chain = self.transitions[name].chains.get(state, None) target = None if chain is None else chain[-1] if target is None or self.stateinfos[target].islimit: return name self.path_to_untested = self.get_path_to_untested(state) if self.path_to_untested is None: raise Quit('End of test:') target, name = self.path_to_untested.pop() assert name is None assert target == state target, name = self.path_to_untested.pop() assert name is not None return name class Result (OrderedDict): __slots__ = ('_perf_counter', '_process_time', '_showtime') def __init__(self, showtime): super().__init__() self._dict = dict(visited=0, states=0, transitions=0) self._showtime = showtime errors = property(lambda self: sum(self.values())) def __enter__(self): self._perf_counter = -time.perf_counter() self._process_time = -time.process_time() return self def __exit__(self, *unused_exc): self._perf_counter += time.perf_counter() self._process_time += time.process_time() return False @staticmethod def _fmt_dtime(val): fmt_sec = lambda val, fmt: format(val, fmt).rstrip('0').rstrip('.') if val < 60: return '{}s'.format(fmt_sec(val, '.2f')) s = fmt_sec(val % 60, '.1f') val = int(val // 60) if val < 60: return '{}m {}s'.format(val, s) m = val % 60 val //= 60 if val < 24: return '{}h {}m {}s'.format(val, m, s) h = val % 60 val //= 24 return '{}d {}h {}m {}s'.format(val, h, m, s) def fmt_dtime(self): return 'time: {}, {}'.format(self._fmt_dtime(self._perf_counter), self._fmt_dtime(self._process_time)) def __str__(self): summary = '\n visited: {0.visited}, states: {0.states}, transitions: {0.transitions}'.format(self) errors = self.errors if errors: summary += '\n errors: {}'.format(errors) for k, v in self.items(): summary += '\n {} {}'.format(v, k) if self._showtime: summary += '\n {}'.format(self.fmt_dtime()) return summary def __getattr__(self, key): if key.startswith('_'): raise AttributeError() return self._dict[key] def __setattr__(self, key, value): if key.startswith('_'): OrderedDict.__setattr__(self, key, value) else: self._dict[key] = value def __iadd__(self, other): for k, v in other._dict.items(): # pylint: disable=W0212 self._dict[k] += v for k, v in other.items(): self[k] = self.get(k, 0) + v return self add = __iadd__ class TestReader: class ParseArgs: __slots__ = ('transition', 'initial', 'chain') def __init__(self, filename): self.current_testfile = filename self.constantstrs = [] self.fields = OrderedDict() self.initial = None self.testdata = TestData() self.conditions_src = [] self.conditions_code = [] self.conditions_needed = [] def isvalid(self, state, report=False): state = state.asdict() for i, condition in enumerate(self.conditions_code): try: if not eval(condition, self.testdata.constants, state): if report: logf_error('condition failed', '({}): {}', i+1, self.conditions_src[i]) self.conditions_needed[i] = True return False except Exception as e: # pylint: disable=W0703 logf_error('error in condition', '({}): {}: {}', i+1, e, self.conditions_src[i]) return True def _token_generic(self, pattern, line, *args): match = re.match(pattern, line.rstrip()) if match is None: return False, args groups = match.groups() for arg, group in zip(args, groups): if arg is not None and arg != group: return False, groups return True, groups def token_keyvalue(self, line): success, (key, value) = self._token_generic(r'^(?:([\w-]+):|End\.)\s*(.*)$', line, None, None) return success, key, value def token_indent(self, line, indent): success, (indent, value) = self._token_generic( r'^(\s*)(.+)$', line, indent, None) return success, value def token_indent2(self, line): success, (indent, value) = self._token_generic( r'^(\s*)(\S.*)$', line, None, None) assert success return indent def token_assignvalue(self, expr): success, (field, value) = self._token_generic(r'^(\w+)\s*=\s*(.*)$', expr, None, None) return success, field, value def parse_file(self): structure = { # func: key, required, repeat, multiln, children, [endhook] None: (None, False, False, False, [ self.parse_constants, self.parse_fields, self.parse_conditions, self.parse_limits, self.parse_initial, self.parse_transition, self.parse_error_end, ]), self.parse_constants: ('Constants', False, False, True, []), self.parse_fields: ('Fields', True, False, True, [], self.parse_fields_end), self.parse_conditions: ('Conditions', False, False, True, []), self.parse_limits: ('Limits', False, False, True, []), self.parse_initial: ('Initial', True, False, True, [self.parse_state]), self.parse_transition: ('Transition', False, True, True, [self.parse_field_expr, self.parse_state]), self.parse_field_expr: ('Expression', False, True, False, []), self.parse_state: ('State', False, True, True, [], self.parse_state_end), self.parse_error_end: (None, False, False, False, []), } valid_keys = [k for k, *unused in structure.values()] def _parse_indent(parentindent, line): indent = self.token_indent2(line) if parentindent is None: if indent != '': log_error('unexpected indent') return None else: if indent == parentindent: return False if not indent.startswith(parentindent): if parentindent.startswith(indent): return False log_error('non-matching indent') return None return indent def _parse_indent_next(parentindent, line): indent = self.token_indent2(line) if parentindent == indent or parentindent.startswith(indent): return indent if indent.startswith(parentindent): log_error('unexpected indent') else: log_error('non-matching indent') return None def _parse_block(blocks, parentindent): nonlocal line indent = _parse_indent(parentindent, line) while indent is None: line = yield indent = _parse_indent(parentindent, line) if indent is False: return for func in blocks: key, required, repeat, multiline, children, *extra = structure[func] endhook = extra[0] if extra else lambda: None while True: success, expr = self.token_indent(line, indent) if not success: break success, lkey, value = self.token_keyvalue(expr) if not success or lkey != key: if lkey not in valid_keys: log_error('unknown statement', repr(lkey)) line = yield continue if required: func(None) endhook() break if not func(value): break line = yield if multiline: while True: multilineindent = _parse_indent(indent, line) while multilineindent is None: line = yield multilineindent = _parse_indent(indent, line) success, expr = self.token_indent(line, multilineindent) if not success: break success, lkey, value = self.token_keyvalue(expr) if success: break if not func(expr, first=False): break line = yield yield from _parse_block(children, indent) endhook() if not repeat: break assert parentindent is not None indent = _parse_indent_next(parentindent, line) while indent is None: line = yield indent = _parse_indent_next(parentindent, line) key, required, repeat, multiline, blocks = structure[None] self.parse_args = self.ParseArgs() try: line = yield yield from _parse_block(blocks, None) assert False, 'Should not be reached' finally: # GeneratorExit del self.parse_args def parse_constants(self, value, first=True): if not first: success, cname, cexpr = self.token_assignvalue(value) try: self.testdata.constants[cname] = eval(cexpr, self.testdata.constants) except SyntaxError: log_error('error parsing constant:', cname) else: self.constantstrs.append((cname, cexpr)) return True def parse_fields(self, value, first=True): if first: if value is None: log_error('missing statement:', 'Fields') for f in sorted(utils.field_functions.keys()): self.fields[f] = [] return True else: success, field, fvalue = self.token_assignvalue(value) if not success: log_error('error parsing:', value) elif field not in list(utils.field_functions.keys()): log_error('unknown field:', field) else: if field in self.testdata.constants: log_error('field overwrites constant:', field) del self.testdata.constants[field] self.fields[field] = eval(fvalue, self.testdata.constants) return success def parse_fields_end(self): self.State = mkState(self.fields) def parse_conditions(self, value, first=True): if not first: self.conditions_src.append(value) try: code = compile(value, '', 'eval') except Exception as e: # pylint: disable=W0703 log_error('error in condition:', e) code = compile('True', '', 'eval') self.conditions_code.append(code) self.conditions_needed.append(False) return True def parse_limits(self, value, first=True): if not first: self.testdata.limits.append(value) return True def _parse_state_value(self, default, line, exprs=None): try: state = eval('dict({})'.format(line), self.testdata.constants) except SyntaxError: logf_error('error parsing state:', '{!r}', line) state = None else: exprs = list((exprs or {}).keys()) for field in list(state.keys()): if field not in self.State.fields: log_error('unselected field:', field) del state[field] elif field in exprs: logf_error('state contains expression field', '{}: {}', field, line) state = default and default.replace(**state) return state def parse_initial(self, value, first=True): if first: if value is None: log_error('missing statement:', 'Initial') value = '' transition = Transition(value) self.initial = transition self.parse_args.transition = transition self.parse_args.initial = True else: self.parse_args.transition.appendfunc(value) return True def parse_transition(self, value, first=True): if first: transition = Transition(value) if value in self.testdata.transitions: logf_error('duplicate transition:', '{!r}', value) else: self.testdata.transitions[value] = transition self.parse_args.transition = transition self.parse_args.initial = False else: self.parse_args.transition.appendfunc(value) return True def parse_field_expr(self, value): success, field, expr = self.token_assignvalue(value) if not success: log_error('error parsing:', value) else: transition = self.parse_args.transition transition.exprs_src.append((field, expr)) if field in transition.exprs: logf_error('duplicate expression', 'for {}: {!r}', field, expr) elif field not in self.State.fields: log_error('unknown expression field:', field) else: try: expr = compile(expr, '', 'eval') except Exception as e: log_error('error in expression:', e) else: transition.exprs[field] = expr return success def _replace_target(self, exprs, dstate, target, field, value): target_value = getattr(target, field) if field in exprs: try: value = eval(exprs[field], self.testdata.constants, dstate) except Exception as e: # pylint: disable=W0703 logf_error('error parsing expression', '{!r}: {}', exprs[field], e) if target_value is matchall: if value is matchall: value = dstate[field] target = target.replace(**{field: value}) else: if field in exprs: if value == target_value: log_error('target contains expression field:', field, 'value:', target_value) else: log_error('target contains expression field:', field, 'value:', target_value, 'expected:', value) return target def _expand_state(self, fields, state): if state is None: return if len(fields) == 0: yield state return stack = [None for f in state.fields] i = 0 dstate = state.asdict() while True: field = state.fields[i] value = getattr(state, field) values = iter(fields[field] if value is matchall else (value,)) while True: try: value = next(values) except StopIteration: if i == 0: return i -= 1 values = stack[i] field = state.fields[i] else: if i == len(stack) - 1: dstate[field] = value yield self.State(**dstate) else: stack[i] = values i += 1 dstate[field] = value break def _expand_target(self, state, target, exprs): assert state is not None and target is not None, (state, target) dstate = state.asdict() for field, value in dstate.items(): target = self._replace_target(exprs, dstate, target, field, value) return target def parse_state(self, value, first=True): if first: state = self._parse_state_value(self.State.default, value) self.parse_args.chain = [state] else: len_chain_max = len(self.parse_args.transition.funcs) + 1 if len(self.parse_args.chain) == len_chain_max: log_error('too many states:', 'not more than', len_chain_max, 'possible') else: if value == '.': value = '' self.parse_args.chain.append(self._parse_state_value(self.State.default, value, self.parse_args.transition.exprs)) return True def parse_state_end(self): transition = self.parse_args.transition state, *chain = self.parse_args.chain while len(chain) < len(transition.funcs): chain.append(self.State.default) assert len(chain) == len(transition.funcs) target = chain[-1] if chain else state for state in self._expand_state(self.fields, state): if state in transition.chains and transition.chains[state][-1] is not None: log_error('duplicate state:', state.tostr()) elif self.isvalid(state): chain_ = [] state_ = state for target in chain: target = self._expand_target(state_, target, transition.exprs) if not self.isvalid(target, report=True): log_error('invalid target state:', target.tostr()) target = None chain_.append(target) state_ = target transition.chains[state] = chain_ if not self.parse_args.initial: self.testdata.update_transition(transition, state, chain_) def parse_error_end(self, value): if value.rstrip() != '': logf_error('error parsing:', '{!r}', value) return True # success in case of an error just means skipping the line def read_test(self): try: parse_file = self.parse_file() next(parse_file) with open(self.current_testfile, 'rt', encoding='utf-8') as testfile: if self.current_testfile.endswith('.py'): _locals = {} exec(testfile.read(), {}, _locals) testfile = _locals['lines']() for logger.lineno, line in enumerate(testfile): if line.lstrip().startswith('#'): continue parse_file.send(line) finally: parse_file.send('End.') parse_file.close() logger.lineno = None for i, needed in enumerate(self.conditions_needed): if not needed: logf_error('condition not needed:', '({}): {}', i+1, self.conditions_src[i]) def _ignore_fields(self, chains, igntype, exprs=None): result = {} for i, field in enumerate(self.State.fields): target_value = nomatch for state, chain in chains.items(): target = chain[-1] if igntype == 'unchanged': if state[i] != target[i]: result = {} break state = state.replace(**{field: matchall}) target = target.replace(**{field: matchall}) elif igntype == 'sametarget': if target_value in {nomatch, target[i]}: state = state.replace(**{field: matchall}) target_value = target[i] else: result = {} break elif igntype == 'expressions': if field in exprs: target = target.replace(**{field: matchall}) else: assert False, igntype if state in result and result[state][-1] != target: result = {} break chain_ = chain[:] chain_[-1] = target result[state] = chain_ else: chains = result result = {} return chains def write_test(self): with open(self.current_testfile, 'wt', encoding='utf-8') as testfile: testfile.write('Constants:\n') for name, value in self.constantstrs: print(' ', name, '=', value, file=testfile) testfile.write('Fields:\n') for field, values in self.fields.items(): print(' ', field, '=', values, file=testfile) testfile.write('Conditions:\n') for condition in self.conditions_src: print(' ', condition, file=testfile) testfile.write('Limits:\n') for limit in self.testdata.limits: print(' ', limit, file=testfile) transition = self.initial testfile.write('Initial: %s\n' % transition.name) chains = list(transition.chains.items()) #assert len(chains) == 1 for state, chain in chains: testfile.write(' State: {}\n'.format(state.tostr())) targetstrs = [] for target in chain: targetstr = target.tostr(state) if not targetstr.strip(): targetstr = '.' targetstrs.append(targetstr) while targetstrs and targetstrs[-1] == '.': del targetstrs[-1] for targetstr in targetstrs: testfile.write(' {}\n'.format(targetstr)) for name, transition in sorted(self.testdata.transitions.items()): testfile.write('Transition: %s\n' % name) chains = {s:c for s, c in transition.chains.items() if self.testdata.stateinfos[s].islimit} chains = self._ignore_fields(chains, 'expressions', transition.exprs) chains = self._ignore_fields(chains, 'unchanged') chains = self._ignore_fields(chains, 'sametarget') if len(transition.funcs) > 1: for f in transition.funcs[1:]: testfile.write(' {}\n'.format(f.name)) for field, expr in sorted(transition.exprs_src): testfile.write(' Expression: {} = {}\n'.format(field, expr)) for state, chain in sorted(chains.items()): testfile.write(' State: {}\n'.format(state.tostr())) targetstrs = [] for target in chain: targetstr = target.tostr(state) if not targetstr.strip(): targetstr = '.' targetstrs.append(targetstr) while targetstrs and targetstrs[-1] == '.': del targetstrs[-1] for targetstr in targetstrs: testfile.write(' {}\n'.format(targetstr)) class TestRunner: _instance = None def __init__(self, testdata_dir, test, test_args): assert self._instance is None self.current_test = test self.write_mode = 'no' self.log_widgets = False for a in test_args: if a.startswith('write-n'): self.write_mode = 'no' elif a.startswith('write-y'): self.write_mode = 'yes' elif a.startswith('write-e'): self.write_mode = 'error' elif a == 'log-widgets': self.log_widgets = True filename = os.path.join(testdata_dir, test) self.reader = TestReader(filename) self.testdata = self.reader.testdata self.widgets = {} self.known_widget_functions = [] self.field_functions = [] def run(self, main_window): self.main_window = main_window self.running = True settings.draw.speed = 120 QTimer.singleShot(0, self.loop) def get_state(self): state = {field: func() for field, func in self.field_functions} return self.State(**state) def find_qobjects(self, root_widget, write_template=False): def log_obj(indent, msg, name, obj): if self.log_widgets: logf('{}{}: {} ({})', ' '*indent, msg, name, obj.__class__.__name__) objects = [(root_widget, 0)] while objects: obj, indent = objects.pop() name = obj.objectName() if name in self.widgets: log_obj(indent, 'kwnobj', name, obj) elif name and not name.startswith('qt_'): self.widgets[name] = obj if isinstance(obj, QAction): if self.reader.initial is not None: transition = self.reader.initial if transition.name == name: transition.setfunc(0, obj.trigger) if name in self.testdata.transitions: transition = self.testdata.transitions[name] transition.setfunc(0, obj.trigger) elif write_template: self.testdata.transitions[name] = Transition(name, obj.trigger) log_obj(indent, 'object', name, obj) else: log_obj(indent, 'intobj', name, obj) for child in reversed(obj.children()): objects.append((child, indent+1)) def update_field_functions(self): self.field_functions = [] mk_func = lambda wname, func: lambda: func(self.widgets[wname]) mk_default = lambda default: lambda: default for field, (wname, default, func) in utils.field_functions.items(): if field in self.State.fields: if wname in self.widgets: self.field_functions.append((field, mk_func(wname, func))) else: self.field_functions.append((field, mk_default(default))) def update_transition_functions(self, write_template=False): def mk_transition(func, widgets, *args): if len(widgets) == 1: widgets = widgets[0] return lambda: func(widgets, *args) def parse_transition_func(func, widgets, tfunc): if tfunc.args is None: return mk_transition(func, widgets) try: args = eval(tfunc.args, {'Qt': Qt}, self.testdata.constants) except Exception as e: # pylint: disable=W0703 logf_error('error parsing expression', '{!r}: {}', func.args, e) func = lambda: None else: if type(args) is not tuple: args = (args,) func = mk_transition(func, widgets, *args) return func for wnames, fname, func in utils.widget_functions: if fname in self.known_widget_functions: continue if not all((n in self.widgets) for n in wnames): continue self.known_widget_functions.append(fname) widgets = [self.widgets[n] for n in wnames] initial = ([] if self.reader.initial is None or not self.reader.initial.funcs else [(self.reader.initial.name, self.reader.initial)]) for tname, transition in initial + list(self.testdata.transitions.items()): tfunc = transition.funcs[0] assert tname == tfunc.name if tfunc.fname == fname: tfunc = parse_transition_func(func, widgets, tfunc) transition.setfunc(0, tfunc) for i, chainfunc in enumerate(transition.funcs[1:]): if transition.funcs[i+1].func is not None: continue cfname = chainfunc.fname for cwnames, _cfname, cfunc in utils.widget_functions: if _cfname == cfname: cwidgets = [self.widgets[n] for n in cwnames] cfunc = parse_transition_func(cfunc, cwidgets, chainfunc) break else: if cfname in self.widgets and isinstance(self.widgets[cfname], QAction): cwidgets = [self.widgets[cfname]] cfunc = cwidgets[0].trigger else: assert False, '%s not found in utils.widget_functions and actions' % cfname transition.setfunc(i+1, cfunc) if write_template: assert fname not in self.testdata.transitions self.testdata.transitions[fname] = Transition(fname, mk_transition(func, widgets)) def init_test(self): try: self.reader.read_test() except OSError as e: log('Error reading test data file:', e) finally: self.State = self.reader.State self.fields = self.reader.fields assert list(self.fields.keys()) == list(self.State.fields), (list(self.fields.keys()), self.State.fields) write_template = False if not self.testdata.transitions: log_error('empty test') write_template = True # introspect ui self.find_qobjects(self.main_window, write_template) self.update_field_functions() self.update_transition_functions(write_template) self.current_state = self.get_state() self.testdata.reset() if write_template: raise Quit('Template created:') def check_initial(self): transition = self.reader.initial if transition is None: transition = self.reader.initial = Transition('') if len(transition.chains) > 1: logf_error('ambiguous initial transition:', '\n {}: {} states', transition.name, len(transition.chains)) for state in list(transition.chains.keys()): if state != self.current_state: logf_error('wrong initial state:', '\n found: {}\n expected: {}', self.current_state.tostr(), state) del transition.chains[state] if len(transition.chains) == 0: logf_error('missing initial state:', '{}', self.current_state) transition.chains[self.current_state] = [None for f in transition.funcs] def check_transition(self, transition, chain, i, initial=False): target = chain[i] current_state = self.get_state() if target != current_state: if target is None: logf_error('unknown transition:', '\n {}: {} -> {}', transition.name, self.current_state.tostr(), current_state.tostr()) else: logf_error('wrong target', 'for {}: {}\n found: -> {}\n expected: -> {}', transition.name, self.current_state.tostr(), current_state.tostr(), target.tostr()) chain[i] = current_state if not initial and i+1 == len(chain): self.testdata.update_transition(transition, self.current_state, chain) self.current_state = current_state def check_result(self): for name, transition in list(self.testdata.transitions.items()): if transition.funcs[0].func is None: log_error('unused transition:', name) del self.testdata.transitions[name] all_states = list(self.testdata.stateinfos.keys()) all_transitions = [(name, state) for name, transition in self.testdata.transitions.items() for state in transition.chains.keys()] logger.result.states = len(all_states) # pylint: disable=W0201 logger.result.transitions = len(all_transitions) # pylint: disable=W0201 unreached = self.testdata.stateinfos.get_unreached() for state in unreached: log_error('unreached', state.tostr()) field_values = {} for name, transition in self.testdata.transitions.items(): chains = transition.chains for state, chain in list(chains.items()): target = chain[-1] if state in unreached or not self.testdata.stateinfos[state].islimit or target is None: del chains[state] continue for field, svalue, tvalue in zip(self.State.fields, state, target): field_values.setdefault(field, set()).update([svalue, tvalue]) for field, values in self.fields.items(): if field in field_values: if set(values) != field_values[field]: log_error('changed field values:', field) values[:] = sorted(field_values[field]) else: log_error('unused field', field) def step(self, transition, initial=False): chain = transition.chains.get(self.current_state, None) if chain is None: logf_error('unknown chain:', '\n {}: {}', transition.name, self.current_state.tostr()) chain = [None] * len(transition.funcs) transition.chains[self.current_state] = chain for i, func in enumerate(transition.funcs): yield from self._step(func) self.check_transition(transition, chain, i, initial) def _step(self, func): postfunc = func.func() if postfunc == 'find_qobjects': self.find_qobjects(self.main_window) self.update_field_functions() self.update_transition_functions() logger.result.visited += 1 # pylint: disable=E1101 yield while self.main_window.is_animating(): yield def loop(self): if not QTest.qWaitForWindowExposed(self.main_window, timeout=5000): log_error('Wait for window timed out') self.running = False return for unused in self._iloop(): if not self.main_window.isVisible(): log_error('Unexpected end of test') self.running = False return QTest.qWait(10) # without this line sometimes there is a segfault in the next window self.main_window.deleteLater() def _iloop(self): self.current_state = name = target = None # for except statement try: log('Initializing:', self.current_test) self.init_test() yield log('Running:', self.current_test) self.check_initial() assert self.reader.initial is not None yield from self.step(self.reader.initial, True) if self.current_state not in self.testdata.stateinfos: log_error('unknown state:', self.current_state) stateinfo = self.testdata.add_stateinfo(self.current_state) if not stateinfo.islimit: log_error('state not in limit:', self.current_state) while True: name = self.testdata.get_random_transition(self.current_state) transition = self.testdata.transitions[name] yield from self.step(transition) except Quit as e: self.check_result() if self.write_mode == 'yes' or logger.result.errors and self.write_mode == 'error': self.reader.write_test() log('test data file written') log(e, self.current_test) except Exception: self.check_result() logf('exception in {}: {} -> {}', name, self.current_state and self.current_state.tostr(), target and target.tostr()) sys.excepthook(*sys.exc_info()) finally: if self.running: self.running = False self.main_window.close() @classmethod def wrap(cls, testdata_dir, tests, test_args): showtime = 'notime' not in test_args with Result(showtime) as result: temp_dir = tempfile.mkdtemp(prefix='pybiktest-') results = [] cnt_tests = 0 for test in tests: if '=' in test: test, repeat_cnt = test.split('=', 1) repeat_cnt = int(repeat_cnt) else: repeat_cnt = 1 with Result(showtime) as cnt_result: results.append((test, cnt_result)) cnt_tests += repeat_cnt for repeat_idx in range(repeat_cnt): with Result(showtime) as logger.result: if repeat_cnt > 1: logf('Test: {} {}/{}', test, repeat_idx+1, repeat_cnt) else: log('Test:', test) instance = cls(testdata_dir, test, test_args) settings.reset() instance.settings_file = tempfile.mktemp(prefix='settings.conf-', dir=temp_dir) instance.games_file = tempfile.mktemp(prefix='games-', dir=temp_dir) yield instance if instance.running: log_error('Unexpected end of testrunner') log('Result:', test, logger.result) log('') os.remove(instance.settings_file) del instance.settings_file os.remove(instance.games_file) del instance.games_file result += logger.result cnt_result.add(logger.result) with suppress(OSError): os.rmdir(temp_dir) for test, testresult in results: fmt = 'Test {0}: {1} errors' if testresult.errors else 'Test {0}: success' if showtime: fmt += ', {2}' dtime = testresult.fmt_dtime() logf(fmt, test, testresult.errors, dtime) else: logf(fmt, test, testresult.errors) if cnt_tests > 1: log('') logf('Summary ({}): {}', cnt_tests, result) pybik-2.1/pybiktest/utils.py0000664000175000017500000002016312556223565016407 0ustar barccbarcc00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # Copyright © 2013-2015 B. Clausius # # 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 3 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, see . from PyQt5.QtCore import Qt, QPoint from PyQt5.QtWidgets import QDialogButtonBox from PyQt5.QtTest import QTest field_functions = { # fieldname objectname default function 'view_editbar': ('action_editbar', False, lambda widget: widget.isChecked()), 'view_toolbar': ('action_toolbar', False, lambda widget: widget.isChecked()), 'view_statusbar': ('action_statusbar', False, lambda widget: widget.isChecked()), 'edit_text': ('edit_moves', None, lambda widget: str(widget.text())), 'edit_pos': ('edit_moves', None, lambda widget: widget.cursorPosition()), 'game_pos': ('MainWindow', None, lambda widget: widget.game.move_sequence.current_place), 'game_len': ('MainWindow', None, lambda widget: len(widget.game.move_sequence.moves)), 'solved': ('MainWindow', None, lambda widget: widget.game.current_state.is_solved()), 'type': ('MainWindow', None, lambda widget: widget.game.current_state.model.type), 'sizes': ('MainWindow', None, lambda widget: widget.game.current_state.model.sizes), 'rotationx': ('MainWindow', None, lambda widget: widget.cube_area.rotation_x), 'rotationy': ('MainWindow', None, lambda widget: widget.cube_area.rotation_y), 'selection_mode': ('MainWindow', None, lambda widget: widget.get_settings().draw.selection_nick), 'mirror_faces': ('MainWindow', None, lambda widget: widget.get_settings().draw.mirror_faces), 'selectdlg_exists': ('DialogSelectModel', False, lambda widget: True), 'selectdlg_visible':('DialogSelectModel', False, lambda widget: widget.isVisible()), 'dlg_model': ('combobox_model', None, lambda widget: widget.currentIndex()), 'lblsize1': ('label_width', None, lambda widget: bool(widget.text())), 'lblsize2': ('label_heigth', None, lambda widget: bool(widget.text())), 'lblsize3': ('label_depth', None, lambda widget: bool(widget.text())), 'size1': ('spin_size1', None, lambda widget: (None if widget.isHidden() else widget.value())), 'size2': ('spin_size2', None, lambda widget: (None if widget.isHidden() else widget.value())), 'size3': ('spin_size3', None, lambda widget: (None if widget.isHidden() else widget.value())), 'preferencesdlg_exists': ('DialogPreferences', False, lambda widget: True), 'preferencesdlg_visible': ('DialogPreferences', False, lambda widget: widget.isVisible()), 'aboutdlg_exists': ('AboutDialog', False, lambda widget: True), 'aboutdlg_visible': ('AboutDialog', False, lambda widget: widget.isVisible()), 'plugingroup': ('MainWindow', None, lambda widget: widget.active_plugin_group), } widget_functions = [] def widget(*wnames, **kwargs): fname = kwargs.setdefault('fname', None) assert list(kwargs.keys()) == ['fname'], kwargs def decorator(func): widget_functions.append((wnames, fname or func.__name__, func)) return func return decorator @widget('MainWindow') def active_plugin_group_activate(widget, number, name=None): button = widget.plugin_group_widgets[number][0] if name is None or button.text() == _(name): QTest.mouseClick(button, Qt.LeftButton) @widget('MainWindow') def plugin_activate(widget, *names): treeview = widget.plugin_group_widgets[widget.active_plugin_group][1] model = widget.treestore index = treeview.rootIndex() names = [_(n) for n in names] assert names assert names[0] == index.data(), 'Wrong group: {!r} != {!r}'.format(names[0], index.data()) for name in names[1:]: for row in range(model.rowCount(index)): _index = model.index(row, 0, index) if name == _index.data(): index = _index break else: assert False, '{!r} in plugin {} not found'.format(name, names) treeview.scrollTo(index) rect = treeview.visualRect(index) assert rect.isValid() point = rect.center() treeview = widget.plugin_group_widgets[widget.active_plugin_group][1] QTest.mouseClick(treeview.viewport(), Qt.LeftButton, pos=point, delay=-1) QTest.mouseDClick(treeview.viewport(), Qt.LeftButton, pos=point, delay=-1) QTest.qWait(100) @widget('MainWindow') def set_settings_draw(widget, key, value): widget.get_settings().draw[key] = value QTest.qWait(100) @widget('edit_moves') def edit_moves_text(widget, text, enter=True): widget.setText(text) if enter: widget.returnPressed.emit() edit_moves_key = widget('edit_moves', fname='edit_moves_key')(QTest.keyClick) @widget('edit_moves') def edit_moves_key_enter(widget, key, modifiers=Qt.NoModifier): QTest.keyClick(widget, key, modifiers) QTest.keyClick(widget, Qt.Key_Enter) button_edit_exec_click = widget('button_edit_exec', fname='button_edit_exec_click')(QTest.mouseClick) button_edit_clear_click = widget('button_edit_clear', fname='button_edit_clear_click')(QTest.mouseClick) drawingarea_key = widget('drawingarea', fname='drawingarea_key')(QTest.keyClick) @widget('drawingarea') def drawingarea_mouse_move_(widget, x, y): QTest.mouseMove(widget, QPoint(x, y)) QTest.qWait(1000) @widget('drawingarea') def drawingarea_mouse_click(widget, p, button, modifiers=Qt.NoModifier): QTest.mouseMove(widget, QPoint(*p)) QTest.mouseClick(widget, button, modifiers, QPoint(*p), delay=50) @widget('drawingarea') def drawingarea_mouse_move(widget, p1, p2, button, modifiers=Qt.NoModifier): QTest.mouseMove(widget, QPoint(*p1)) QTest.mousePress(widget, button, modifiers, QPoint(*p1), delay=50) QTest.mouseMove(widget, QPoint(*p2)) QTest.mouseRelease(widget, button, modifiers, QPoint(*p2)) @widget('action_selectmodel') def dialog_selectmodel(action): action.trigger() QTest.qWait(200) return 'find_qobjects' @widget('combobox_model') def dialog_selectmodel_changemodel(widget, key): if widget.isVisible(): QTest.keyClick(widget, key, delay=100) @widget('buttonBox') def dialog_selectmodel_ok(widget): if widget.isVisible(): QTest.qWait(100) QTest.mouseClick(widget.button(QDialogButtonBox.Ok), Qt.LeftButton) QTest.qWait(100) @widget('buttonBox') def dialog_selectmodel_cancel(widget): if widget.isVisible(): QTest.qWait(100) QTest.mouseClick(widget.button(QDialogButtonBox.Cancel), Qt.LeftButton) QTest.qWait(100) @widget('action_preferences') def dialog_preferences(action): action.trigger() QTest.qWait(200) return 'find_qobjects' @widget('buttonBox') def dialog_preferences_close(widget): if widget.isVisible(): QTest.qWait(100) QTest.mouseClick(widget.button(QDialogButtonBox.Close), Qt.LeftButton) QTest.qWait(100) #TODO: The testrunner can't currently test modal dialogs, this function will block @widget('action_info') def dialog_about(action): action.trigger() QTest.qWait(200) return 'find_qobjects' @widget('buttonBox') def dialog_about_close(widget): if widget.isVisible(): QTest.qWait(100) QTest.mouseClick(widget.button(QDialogButtonBox.Close), Qt.LeftButton) QTest.qWait(100) @widget('MainWindow') def direct_selectmodel(widget, mtype, size): widget.load_game(mtype, size) pybik-2.1/pybiktest/__init__.py0000664000175000017500000000000012146422271016760 0ustar barccbarcc00000000000000pybik-2.1/copyright0000664000175000017500000000521612556245304014607 0ustar barccbarcc00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: Pybik Upstream-Contact: B. Clausius Source: https://launchpad.net/pybik/+download Comment: Originally this package was derived from GNUbik 2.3 and ported from C to Python. Authors of GNUbik: * John Mark Darrington is the main author and maintainer of GNUbik. * Dale Mellor Files: * Copyright: 2009-2015 B. Clausius License: GPL-3+ Files: data/ui/images/BEAMED?EIGHTH?NOTES.png data/ui/images/ATOM?SYMBOL.png data/ui/images/SNOWFLAKE.png data/ui/images/WHITE?SUN?WITH?RAYS.png Copyright: 2002-2010 Free Software Foundation 2012 B. Clausius License: GPL-3+ Comment: Images created from font FreeSerif: U+266B BEAMED EIGHTH NOTES U+269B ATOM SYMBOL U+2744 SNOWFLAKE Image created from font FreeMono: U+263C WHITE SUN WITH RAYS Files: data/ui/images/SHAMROCK.png data/ui/images/SKULL?AND?CROSSBONES.png data/ui/images/PEACE?SYMBOL.png data/ui/images/YIN?YANG.png data/ui/images/BLACK?SMILING?FACE.png data/ui/images/WHITE?SMILING?FACE.png Copyright: DejaVu Authors 2012 B. Clausius License: public-domain The DejaVu fonts are a font family based on the Vera Fonts. License of DejaVu (http://dejavu-fonts.org/wiki/Main_Page): Fonts are © Bitstream (…). DejaVu changes are in public domain. …. Glyphs imported from Arev fonts are © Tavmjung Bah (…). . The used symbols where added in version 2.4 as stated by DejaVu in the file status.txt and therefore are in the public domain. Comment: Images were created from font DejaVu-Sans-Oblique: U+2618 SHAMROCK U+2620 SKULL AND CROSSBONES U+262E PEACE SYMBOL U+262F YIN YANG U+263A WHITE SMILING FACE U+263B BLACK SMILING FACE License: GPL-3+ 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 3 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, see . . The full text of the GPL is distributed in the original source archive in the file COPYING.