# -*- coding: utf-8 -*- # # Gramps - a GTK+/GNOME based genealogy program # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # Copyright (C) 2010 Josip (josip at pisoj dot com) """ Croatian-specific classes for calculating relationships and kinship names. """ #------------------------------------------------------------------------- # # GRAMPS modules # #------------------------------------------------------------------------- #import gen.lib import Relationship _PARENTS = ['', 'otac i majka', 'djedovi i bake', 'pradjedovi i prabake', '%s pradjedovi i %s prabake'] _CHILDS = ['', 'djeca', 'unučad', 'praunučad', '%s praunučad'] _CHILDS_SP = ['', 'snahe i zetovi', 'prasnahe i prazetovi', 'supružnici praunučadi', 'supružnici %s praunučadi'] #------------------------------------------------------------------------- # # Class HrDeclination # #------------------------------------------------------------------------- class HrDeclination(object): """ Croatian declination system """ numdcl = { 1: 'prv', 2: 'drug', 3: 'treć', 4: 'četvrt', 5: 'pet', 6: 'šest', 7: 'sedm', 8: 'osm', 9: 'devet', 10: 'deset', 11: 'jedanaest', 12: 'dvanaest', 13: 'trinaest', 14: 'četrnaest', 15: 'petnaest', 16: 'šestnaest', 17:'sedamnaest', 18: 'osamnaest', 19: 'devetnaest', 20: 'dvadeset', 30: 'trideset', 40: 'četrdeset', 50: 'pedeset', 60: 'šesdeset', 70: 'sedamdeset', 80: 'osamdeset', 90: 'devedeset', (1, 1, 1): 'i', (1, 1, 5): 'i', (1, 2, 1): 'i', (1, 2, 5): 'i', (1, 1, 2): 'og', (1, 1, 4): 'og', (2, 1, 2): 'og', (1, 1, 3): 'om', (1, 1, 6): 'om', (0, 1, 7): 'om', (2, 1, 3): 'om', (2, 1, 6): 'om', (2, 2, 7): 'om', (1, 1, 7): 'im', (2, 1, 7): 'im', (1, 2, 3): 'im', (1, 2, 6): 'im', (1, 2, 7): 'im', (0, 2, 3): 'im', (0, 2,6): 'im', (0, 2, 7): 'im', (0, 1, 1): 'a', (0, 1, 5): 'a', (2, 2, 1): 'a', (2, 2, 5): 'a', (0, 1, 2): 'e', (0, 1, 4): 'e', (1, 2, 4): 'e', (0, 2, 1): 'e', (0, 2, 4): 'e', (0, 2, 5): 'e', (2 , 1, 1): 'o', (2, 1, 4): 'o', (2, 1, 5): 'o', (0, 1, 3): 'oj', (0, 1, 6): 'oj', (2, 2, 3): 'oj', (2, 2, 6): 'oj', (0, 2, 2): 'ih', (1, 2, 2): 'ih', (2, 2, 2): 'ih', (2, 2, 4): 'u' } def get_ordnum(self, num, gender, number, case): """ Declination of ordinal numbers gender: 0 = feminine, 1 = masculine, 2 = neuter case: 1 = nominative, 2 = genitive, 3 = dative, 4 = accusative 5 = vocative, 6 = locative, 7 = instrumental number: 1 = single, 2 = plural :rtype: str """ if 0 < num < 100: lres = [] #lres.append(self.numdcl[(num / 100) * 100]) if (num < 21) or (num % 10) == 0: lres.append(self.numdcl[num]) else: lres.append(self.numdcl[(num % 10) * 10]) lres.append(self.numdcl[(num % 10)]) sufix = self.numdcl[(gender, number, case)] if num % 10 == 3: if gender != 0 and sufix != 'oj': sufix = sufix.replace('o','e') lres[-1] += sufix res = ' '.join(lres) else: res = str(num) + '. ' return res HRD = HrDeclination() HRDN = HRD.get_ordnum def _get_childs(level, inlaw): """ children, grandchildren et. """ if level < len(_CHILDS)-1: if not inlaw: return _CHILDS[level] else: return _CHILDS_SP[level] else: if not inlaw: return '%s' % _CHILDS[4] % (HRDN(level-2, 0, 1, 1)) elif inlaw: return '%s' % _CHILDS_SP[4] % (HRDN(level-2, 0, 2, 1)) def _get_parents(level): """ parents, grandparents """ if level < 4: return _PARENTS[level] else: return u'%s' % _PARENTS[4] % (HRDN(level-2, 1, 1, 1), HRDN(level-2, 0, 2, 1)) def _get_uncles(gen, inlaw): """ in general: uncles, ants--- """ if gen == 2: if not inlaw: return 'stričevi, ujaci i tetke' else: return 'strine, ujne i tetci' elif gen == 3: if not inlaw: return 'prastričevi, praujaci i pratetke' else: return 'prastrine, praujne i pratetci' else: if not inlaw: return '%s prastričevi, %s praujaci i %s pratetke' % (HRDN(gen-2, 1, 2, 1), HRDN(gen-2, 1, 2, 1), HRDN(gen-2, 0, 2, 1)) else: return 'prastrine, praujne i pratetci' #------------------------------------------------------------------------- # # CroatianRelationshipCalculator # #------------------------------------------------------------------------- class RelationshipCalculator(Relationship.RelationshipCalculator): """ RelationshipCalculator Class """ def __init__(self): Relationship.RelationshipCalculator.__init__(self) def get_plural_relationship_string(self, gena, genb, reltocommon_a='', reltocommon_b='', only_birth=True, in_law_a=False, in_law_b=False): """returns kinship terms for groups of persons """ if not in_law_b: rel_str = u'potomci %s generacije predaka u %s koljenu: '\ % (HRDN(gena, 0, 1, 2), HRDN(genb, 2, 1, 6)) elif in_law_b: rel_str = u'supružnici potomaka %s generacije predaka u %s '\ 'koljenu: ' % (HRDN(gena, 0, 1, 2), HRDN(genb, 2, 1, 6)) if genb == 0: #These are ancestors rel_str = u'%s generacija predaka: %s' % (HRDN(gena, 0, 1, 1),_get_parents(gena)) elif gena == 0: # These are descendants if not in_law_b: rel_str = u'%s generacija potomaka: %s' % (HRDN(genb, 0, 1, 1), _get_childs(genb, in_law_b)) else: rel_str = u'supružnici %s generacije potomaka: %s' \ % (HRDN(genb, 0, 2, 1), _get_childs(genb, in_law_b)) elif gena == 1 == genb: # These are siblings if not in_law_b: rel_str += u'braća i sestre' else: rel_str = u'supružnici braće i sestara' elif genb == 1: # These are aunts/uncles rel_str += _get_uncles(gena, in_law_b) return rel_str if __name__ == "__main__": # Test function. Call it as follows from the command line (so as to find # imported modules): # export PYTHONPATH=/path/to/gramps/src # python src/plugins/rel/rel_ru.py from Relationship import test RC = RelationshipCalculator() test(RC, True)