diff --git a/src/DateHandler/_Date_zh.py b/src/DateHandler/_Date_zh.py index d4e6e3f58..593d86a20 100644 --- a/src/DateHandler/_Date_zh.py +++ b/src/DateHandler/_Date_zh.py @@ -18,20 +18,17 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -# DateHandler/_Date_zh.py -# $Id$ -# + +""" +Simplified-Chinese-specific classes for parsing and displaying dates. +""" #------------------------------------------------------------------------- # # Python modules # #------------------------------------------------------------------------- - -""" -Chinese-specific classes for parsing and displaying dates. -""" - +from __future__ import unicode_literals import re #------------------------------------------------------------------------- @@ -39,7 +36,6 @@ import re # GRAMPS modules # #------------------------------------------------------------------------- - from gen.lib import Date from _DateParser import DateParser from _DateDisplay import DateDisplay @@ -47,147 +43,128 @@ from _DateHandler import register_datehandler #------------------------------------------------------------------------- # -# Chinese parser +# Simplified-Chinese parser # #------------------------------------------------------------------------- -class DateParserZH(DateParser): +class DateParserZH_CN(DateParser): """ Convert a text string into a Date object. If the date cannot be converted, the text string is assigned. """ - # translate english strings into chinese - + # modifiers before the date modifier_to_int = { - u'before' : Date.MOD_BEFORE, u'bef' : Date.MOD_BEFORE, - u'bef.' : Date.MOD_BEFORE, u'after' : Date.MOD_AFTER, - u'aft' : Date.MOD_AFTER, u'aft.' : Date.MOD_AFTER, - u'about' : Date.MOD_ABOUT, u'abt.' : Date.MOD_ABOUT, - u'abt' : Date.MOD_ABOUT, u'circa' : Date.MOD_ABOUT, - u'c.' : Date.MOD_ABOUT, u'around' : Date.MOD_ABOUT, + '以前' : Date.MOD_BEFORE, + '以后' : Date.MOD_AFTER, + '大约' : Date.MOD_ABOUT, } month_to_int = DateParser.month_to_int - month_to_int[u"正"] = 1 - month_to_int[u"一"] = 1 - month_to_int[u"zhēngyuè"] = 1 - month_to_int[u"二"] = 2 - month_to_int[u"èryuè"] = 2 - month_to_int[u"三"] = 3 - month_to_int[u"sānyuè"] = 3 - month_to_int[u"四"] = 4 - month_to_int[u"sìyuè"] = 4 - month_to_int[u"五"] = 5 - month_to_int[u"wǔyuè"] = 5 - month_to_int[u"六"] = 6 - month_to_int[u"liùyuè"] = 6 - month_to_int[u"七"] = 7 - month_to_int[u"qīyuè"] = 7 - month_to_int[u"八"] = 8 - month_to_int[u"bāyuè"] = 8 - month_to_int[u"九"] = 9 - month_to_int[u"jiǔyuè"] = 9 - month_to_int[u"十"] = 10 - month_to_int[u"shíyuè"] = 10 - month_to_int[u"十一"] = 11 - month_to_int[u"shíyīyuè"] = 11 - month_to_int[u"十二"] = 12 - month_to_int[u"shí'èryuè"] = 12 - month_to_int[u"假閏"] = 13 - month_to_int[u"jiǎ rùn yùe"] = 13 - - # translate english strings into chinese + month_to_int["正"] = 1 + month_to_int["一"] = 1 + month_to_int["zhēngyuè"] = 1 + month_to_int["二"] = 2 + month_to_int["èryuè"] = 2 + month_to_int["三"] = 3 + month_to_int["sānyuè"] = 3 + month_to_int["四"] = 4 + month_to_int["sìyuè"] = 4 + month_to_int["五"] = 5 + month_to_int["wǔyuè"] = 5 + month_to_int["六"] = 6 + month_to_int["liùyuè"] = 6 + month_to_int["七"] = 7 + month_to_int["qīyuè"] = 7 + month_to_int["八"] = 8 + month_to_int["bāyuè"] = 8 + month_to_int["九"] = 9 + month_to_int["jiǔyuè"] = 9 + month_to_int["十"] = 10 + month_to_int["shíyuè"] = 10 + month_to_int["十一"] = 11 + month_to_int["shíyīyuè"] = 11 + month_to_int["十二"] = 12 + month_to_int["shí'èryuè"] = 12 + month_to_int["假閏"] = 13 + month_to_int["jiǎ rùn yùe"] = 13 calendar_to_int = { - 'gregorian' : Date.CAL_GREGORIAN, + '阳历' : Date.CAL_GREGORIAN, 'g' : Date.CAL_GREGORIAN, - 'julian' : Date.CAL_JULIAN, + '儒略历' : Date.CAL_JULIAN, 'j' : Date.CAL_JULIAN, - 'hebrew' : Date.CAL_HEBREW, + '希伯来历' : Date.CAL_HEBREW, 'h' : Date.CAL_HEBREW, - 'islamic' : Date.CAL_ISLAMIC, + '伊斯兰历' : Date.CAL_ISLAMIC, 'i' : Date.CAL_ISLAMIC, - 'french' : Date.CAL_FRENCH, - 'french republican': Date.CAL_FRENCH, + '法国共和历' : Date.CAL_FRENCH, 'f' : Date.CAL_FRENCH, - 'persian' : Date.CAL_PERSIAN, + '伊郎历' : Date.CAL_PERSIAN, 'p' : Date.CAL_PERSIAN, - 'swedish' : Date.CAL_SWEDISH, + '瑞典历' : Date.CAL_SWEDISH, 's' : Date.CAL_SWEDISH, } - # translate english strings into chinese - quality_to_int = { - u'estimated' : Date.QUAL_ESTIMATED, - u'est.' : Date.QUAL_ESTIMATED, - u'est' : Date.QUAL_ESTIMATED, - u'calc.' : Date.QUAL_CALCULATED, - u'calc' : Date.QUAL_CALCULATED, - u'calculated' : Date.QUAL_CALCULATED, + '据估计' : Date.QUAL_ESTIMATED, + '据计算' : Date.QUAL_CALCULATED, } - # translate english strings into chinese - - bce = [u"before calendar", u"negative year"] + DateParser.bce + # FIXME translate these English strings into simplified-Chinese ones + bce = ["before calendar", "negative year"] + DateParser.bce def init_strings(self): """ This method compiles regular expression strings for matching dates. - - Most of the re's in most languages can stay as is. span and range - most likely will need to change. Whatever change is done, this method - may be called first as DateParser.init_strings(self) so that the - invariant expresions don't need to be repeteadly coded. All differences - can be coded after DateParser.init_strings(self) call, that way they - override stuff from this method. See DateParserRU() as an example. """ DateParser.init_strings(self) - - # day: 日 ; month : 月 ; year : 年 - - # See DateParser class; translate english strings (from/to, between/and) into chinese - # do not translate and - - self._span = re.compile(u"(from)\s+(?P.+)\s+to\s+(?P.+)", - re.IGNORECASE) - self._range = re.compile(u"(bet|bet.|between)\s+(?P.+)\s+and\s+(?P.+)", - re.IGNORECASE) + _span_1 = ['自'] + _span_2 = ['至'] + _range_1 = ['介于'] + _range_2 = ['与'] + self._span = re.compile("(%s)\s+(?P.+)\s+(%s)\s+(?P.+)" % + ('|'.join(_span_1), '|'.join(_span_2)), + re.IGNORECASE) + self._range = re.compile("(%s)\s+(?P.+)\s+(%s)\s+(?P.+)" % + ('|'.join(_range_1), '|'.join(_range_2)), + re.IGNORECASE) - #def _parse_lunisolar(self, date_val=text): - #text = text.strip() # otherwise spaces can make it a bad date - #date = Date(self._qual_str, self._mod_str, self._cal_str, text, self._ny_str) - #return unicode(text) - #------------------------------------------------------------------------- # -# Chinese display +# Simplified-Chinese display # #------------------------------------------------------------------------- -class DateDisplayZH(DateDisplay): +class DateDisplayZH_CN(DateDisplay): """ - Chinese language date display class. + Simplified-Chinese language date display class. """ - # translate english strings into chinese - - long_months = ( u"", u"January", u"February", u"March", u"April", u"May", - u"June", u"July", u"August", u"September", u"October", - u"November", u"December" ) + # this is used to display the 12 gregorian months + long_months = ( "", "正月", "二月", "三月", "四月", "五月", + "六月", "七月", "八月", "九月", "十月", + "十一月", "十二月" ) - short_months = ( u"", u"Jan", u"Feb", u"Mar", u"Apr", u"May", u"Jun", - u"Jul", u"Aug", u"Sep", u"Oct", u"Nov", u"Dec" ) + short_months = ( "", "一月", "二月", "三月", "四月", "五月", "六月", + "七月", "八月", "九月", "十月", "十一月", "十二月" ) + formats = ( + "年年年年-月月-日日 (ISO)", "数字格式", "月 日,年", + "月 日,年", "日 月 年", "日 月 年", + ) + # this must agree with DateDisplayEn's "formats" definition + # (since no locale-specific _display_gregorian exists, here) + calendar = ( - "", u"Julian", u"Hebrew", u"French Republican", - u"Persian", u"Islamic", u"Swedish" + "", "儒略历", "希伯来历", "法国共和历", + "伊郎历", "伊斯兰历", "瑞典历" ) - _mod_str = ("", u"before ", u"after ", u"around ", "", "", "") + _mod_str = ("", "以前 ", "以后 ", "大约 ", "", "", "") - _qual_str = ("", u"estimated ", u"calculated ", "") + _qual_str = ("", "据估计 ", "据计算 ", "") + # FIXME translate these English strings into simplified-Chinese ones _bce_str = "%s B.C.E." @@ -195,7 +172,6 @@ class DateDisplayZH(DateDisplay): """ Return a text string representing the date. """ - mod = date.get_modifier() cal = date.get_calendar() qual = date.get_quality() @@ -209,45 +185,28 @@ class DateDisplayZH(DateDisplay): elif start == Date.EMPTY: return "" elif mod == Date.MOD_SPAN: - date1 = self.display_cal[cal](start) - date2 = self.display_cal[cal](date.get_stop_date()) + d1 = self.display_cal[cal](start) + d2 = self.display_cal[cal](date.get_stop_date()) scal = self.format_extras(cal, newyear) - # translate english strings into chinese - return "%s%s %s %s %s%s" % (qual_str, u'from', date1, u'to', - date2, scal) + return "%s%s %s %s %s%s" % (qual_str, '自', d1, '至', d2, scal) elif mod == Date.MOD_RANGE: - date1 = self.display_cal[cal](start) - date2 = self.display_cal[cal](date.get_stop_date()) + d1 = self.display_cal[cal](start) + d2 = self.display_cal[cal](date.get_stop_date()) scal = self.format_extras(cal, newyear) - # translate english strings into chinese - return "%s%s %s %s %s%s" % (qual_str, u'between', date1, u'and', - date2, scal) + return "%s%s %s %s %s%s之间" % (qual_str, '介于', d1, '与', + d2, scal) else: text = self.display_cal[date.get_calendar()](start) scal = self.format_extras(cal, newyear) return "%s%s%s%s" % (qual_str, (self._mod_str)[mod], text, scal) - #def _display_chinese(self, date_val): - #self._tformat = '%Y年%m月%d日' - #year = self._slash_year(date_val[2], date_val[3]) - #if date_val[3]: - #return self.display_iso(date_val) - #else: - #if date_val[0] == date_val[1] == 0: - #value = u'%Y年' % date_val[2] - #else: - #value = self._tformat.replace('%m月', str(self.lunisolar[date_val[1]])) - #value = u'%m月' % date_val[1] - #value = u'%d日' % date_val[0] - #value = u'%Y年' % date_val[2] - - #------------------------------------------------------------------------- # # Register classes # #------------------------------------------------------------------------- -register_datehandler(('zh_CN', 'zh_TW', 'zh_SG', 'zh_HK', 'zh', 'chinese', 'Chinese'), - DateParserZH, DateDisplayZH) +register_datehandler(('zh_CN', 'zh_SG', 'zh_TW', 'zh_HK', + 'zh', 'chinese', 'Chinese'), + DateParserZH_CN, DateDisplayZH_CN)