Gary.Wang has proposed merging lp:~gary-wzl77/ubuntu-calendar-app/lunar_calendar_support into lp:ubuntu-calendar-app with lp:~gary-wzl77/ubuntu-calendar-app/show-week-number as a prerequisite.
Commit message: Add lunar calendar support Requested reviews: Yuan-Chen Cheng (ycheng-twn) Jenkins Bot (ubuntu-core-apps-jenkins-bot): continuous-integration Alan Pope (popey) Related bugs: Bug #1513099 in Ubuntu Calendar App: "Have a Lunar Calendar for Chinese user" https://bugs.launchpad.net/ubuntu-calendar-app/+bug/1513099 For more details, see: https://code.launchpad.net/~gary-wzl77/ubuntu-calendar-app/lunar_calendar_support/+merge/278288 Add lunar calendar support -- Your team Ubuntu Calendar Developers is subscribed to branch lp:ubuntu-calendar-app.
=== added directory '3rd-party' === added file '3rd-party/lunar.js' --- 3rd-party/lunar.js 1970-01-01 00:00:00 +0000 +++ 3rd-party/lunar.js 2015-11-23 09:30:32 +0000 @@ -0,0 +1,515 @@ +/** +* @1900-2100区间内的公历、农历互转 +* @charset UTF-8 +* @Author Ajing(jjonl...@jjonline.cn) +* @Time 2014-7-21 +* @Version $ID$ +* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] +* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] +* http://blog.jjonline.cn/userInterFace/173.html +*/ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo:[0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-1909 + 0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-1919 + 0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-1929 + 0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-1939 + 0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-1949 + 0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-1959 + 0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-1969 + 0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-1979 + 0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-1989 + 0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-1999 + 0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-2009 + 0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-2019 + 0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-2029 + 0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-2039 + 0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-2049 + /**Add By jjonl...@jjonline.cn**/ + 0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-2059 + 0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-2069 + 0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-2079 + 0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-2089 + 0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-2099 + 0x0d520],//2100 + + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth:[31,28,31,30,31,30,31,31,30,31,30,31], + + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan:["\u7532","\u4e59","\u4e19","\u4e01","\u620a","\u5df1","\u5e9a","\u8f9b","\u58ec","\u7678"], + + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi:["\u5b50","\u4e11","\u5bc5","\u536f","\u8fb0","\u5df3","\u5348","\u672a","\u7533","\u9149","\u620c","\u4ea5"], + + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals:["\u9f20","\u725b","\u864e","\u5154","\u9f99","\u86c7","\u9a6c","\u7f8a","\u7334","\u9e21","\u72d7","\u732a"], + + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm:["\u5c0f\u5bd2","\u5927\u5bd2","\u7acb\u6625","\u96e8\u6c34","\u60ca\u86f0","\u6625\u5206","\u6e05\u660e","\u8c37\u96e8","\u7acb\u590f","\u5c0f\u6ee1","\u8292\u79cd","\u590f\u81f3","\u5c0f\u6691","\u5927\u6691","\u7acb\u79cb","\u5904\u6691","\u767d\u9732","\u79cb\u5206","\u5bd2\u9732","\u971c\u964d","\u7acb\u51ac","\u5c0f\u96ea","\u5927\u96ea","\u51ac\u81f3"], + + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo:[ '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f','b027097bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f','97bd0b06bdb0722c965ce1cfcc920f','b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa','9778397bd19801ec9210c965cc920e','97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f','97bd097bd097c36b0b6fc9210c8dc2','9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e','97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec95f8c965cc920e','97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e','97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f','97bd097bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e','97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2','9778397bd19801ec9210c9274c920e','97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f','97bd07f5307f595b0b0bc920fb0722','7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa','97b6b97bd19801ec9210c965cc920e','97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e','97bcf7f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e','97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e','97bcf7f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa','97b6b97bd197c36c9210c9274c920e','97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9210c8dc2','9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722','7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa','97b6b7f0e47f531b0723b0b6fb0721','7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2','9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722','9778397bd097c36b0b6fc9274c91aa','97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721','7f0e27f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa','97b6b7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722','9778397bd097c36b0b6fc9210c8dc2','977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722','7f0e37f5307f595b0b0bc920fb0722','7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0721','7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2','977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722','977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0b0bb0b6fb0722','7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd','7f07e7f0e37f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722','977837f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722','7f0e37f1487f595b0b0bb0b6fb0722','7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0722','7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722','7f0e37f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722','7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722','7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721','7f0e27f0e47f531b0723b0b6fb0722','7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd','7f07e7f0e37f14998083b0787b0721','7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35','7ec967f0e37f14898082b0723b02d5','7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722','7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721','7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35','665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721','7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1:["\u65e5","\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341"], + + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2:["\u521d","\u5341","\u5eff","\u5345"], + + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3:["\u6b63","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u51ac","\u814a"], + + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays:function(y) { + var i, sum = 348; + for(i=0x8000; i>0x8; i>>=1) { sum += (calendar.lunarInfo[y-1900] & i)? 1: 0; } + return(sum+calendar.leapDays(y)); + }, + + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth:function(y) { //闰字编码 \u95f0 + return(calendar.lunarInfo[y-1900] & 0xf); + }, + + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays:function(y) { + if(calendar.leapMonth(y)) { + return((calendar.lunarInfo[y-1900] & 0x10000)? 30: 29); + } + return(0); + }, + + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays:function(y,m) { + if(m>12 || m<1) {return -1}//月份参数从1至12,参数错误返回-1 + return( (calendar.lunarInfo[y-1900] & (0x10000>>m))? 30: 29 ); + }, + + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays:function(y,m) { + if(m>12 || m<1) {return -1} //若参数错误 返回-1 + var ms = m-1; + if(ms==1) { //2月份的闰平规律测算后确认返回28或29 + return(((y%4 == 0) && (y%100 != 0) || (y%400 == 0))? 29: 28); + }else { + return(calendar.solarMonth[ms]); + } + }, + + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi:function(offset) { + return(calendar.Gan[offset%10]+calendar.Zhi[offset%12]); + }, + + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm:function(y,n) { + if(y<1900 || y>2100) {return -1;} + if(n<1 || n>24) {return -1;} + var _table = calendar.sTermInfo[y-1900]; + var _info = [ + parseInt('0x'+_table.substr(0,5)).toString() , + parseInt('0x'+_table.substr(5,5)).toString(), + parseInt('0x'+_table.substr(10,5)).toString(), + parseInt('0x'+_table.substr(15,5)).toString(), + parseInt('0x'+_table.substr(20,5)).toString(), + parseInt('0x'+_table.substr(25,5)).toString() + ]; + var _calday = [ + _info[0].substr(0,1), + _info[0].substr(1,2), + _info[0].substr(3,1), + _info[0].substr(4,2), + + _info[1].substr(0,1), + _info[1].substr(1,2), + _info[1].substr(3,1), + _info[1].substr(4,2), + + _info[2].substr(0,1), + _info[2].substr(1,2), + _info[2].substr(3,1), + _info[2].substr(4,2), + + _info[3].substr(0,1), + _info[3].substr(1,2), + _info[3].substr(3,1), + _info[3].substr(4,2), + + _info[4].substr(0,1), + _info[4].substr(1,2), + _info[4].substr(3,1), + _info[4].substr(4,2), + + _info[5].substr(0,1), + _info[5].substr(1,2), + _info[5].substr(3,1), + _info[5].substr(4,2), + ]; + return parseInt(_calday[n-1]); + }, + + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth:function(m) { // 月 => \u6708 + if(m>12 || m<1) {return -1} //若参数错误 返回-1 + var s = calendar.nStr3[m-1]; + s+= "\u6708";//加上月字 + return s; + }, + + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay:function(d){ //日 => \u65e5 + var s; + switch (d) { + case 10: + s = '\u521d\u5341'; break; + case 20: + s = '\u4e8c\u5341'; break; + break; + case 30: + s = '\u4e09\u5341'; break; + break; + default : + s = calendar.nStr2[Math.floor(d/10)]; + s += calendar.nStr1[d%10]; + } + return(s); + }, + + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function(y) { + return calendar.Animals[(y - 4) % 12] + }, + + + /** + * 传入公历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar:function (y,m,d) { //参数区间1900.1.31~2100.12.31 + if(y<1900 || y>2100) {return -1;}//年份限定、上限 + if(y==1900&&m==1&&d<31) {return -1;}//下限 + if(!y) { //未传参 获得当天 + var objDate = new Date(); + }else { + var objDate = new Date(y,parseInt(m)-1,d) + } + var i, leap=0, temp=0; + //修正ymd参数 + var y = objDate.getFullYear(),m = objDate.getMonth()+1,d = objDate.getDate(); + var offset = (Date.UTC(objDate.getFullYear(),objDate.getMonth(),objDate.getDate()) - Date.UTC(1900,0,31))/86400000; + for(i=1900; i<2101 && offset>0; i++) { temp=calendar.lYearDays(i); offset-=temp; } + if(offset<0) { offset+=temp; i--; } + + //是否今天 + var isTodayObj = new Date(),isToday=false; + if(isTodayObj.getFullYear()==y && isTodayObj.getMonth()+1==m && isTodayObj.getDate()==d) { + isToday = true; + } + //星期几 + var nWeek = objDate.getDay(),cWeek = calendar.nStr1[nWeek]; + if(nWeek==0) {nWeek =7;}//数字表示周几顺应天朝周一开始的惯例 + //农历年 + var year = i; + + var leap = calendar.leapMonth(i); //闰哪个月 + var isLeap = false; + + //效验闰月 + for(i=1; i<13 && offset>0; i++) { + //闰月 + if(leap>0 && i==(leap+1) && isLeap==false){ + --i; + isLeap = true; temp = calendar.leapDays(year); //计算农历闰月天数 + } + else{ + temp = calendar.monthDays(year, i);//计算农历普通月天数 + } + //解除闰月 + if(isLeap==true && i==(leap+1)) { isLeap = false; } + offset -= temp; + } + + if(offset==0 && leap>0 && i==leap+1) + if(isLeap){ + isLeap = false; + }else{ + isLeap = true; --i; + } + if(offset<0){ offset += temp; --i; } + //农历月 + var month = i; + //农历日 + var day = offset + 1; + + //天干地支处理 + var sm = m-1; + var term3 = calendar.getTerm(year,3); //该农历年立春日期 + var gzY = calendar.toGanZhi(year-4);//普通按年份计算,下方尚需按立春节气来修正 + + //依据立春日进行修正gzY + if(sm<2 && d<term3) { + gzY = calendar.toGanZhi(year-5); + }else { + gzY = calendar.toGanZhi(year-4); + } + + //月柱 1900年1月小寒以前为 丙子月(60进制12) + var firstNode = calendar.getTerm(y,(m*2-1));//返回当月「节」为几日开始 + var secondNode = calendar.getTerm(y,(m*2));//返回当月「节」为几日开始 + + //依据12节气修正干支月 + var gzM = calendar.toGanZhi((y-1900)*12+m+11); + if(d>=firstNode) { + gzM = calendar.toGanZhi((y-1900)*12+m+12); + } + + //传入的日期的节气与否 + var isTerm = false; + var Term = null; + if(firstNode==d) { + isTerm = true; + Term = calendar.solarTerm[m*2-2]; + } + if(secondNode==d) { + isTerm = true; + Term = calendar.solarTerm[m*2-1]; + } + //日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y,sm,1,0,0,0,0)/86400000+25567+10; + var gzD = calendar.toGanZhi(dayCyclical+d-1); + + return {'lYear':year,'lMonth':month,'lDay':day,'Animal':calendar.getAnimal(year),'IMonthCn':(isLeap?"\u95f0":'')+calendar.toChinaMonth(month),'IDayCn':calendar.toChinaDay(day),'cYear':y,'cMonth':m,'cDay':d,'gzYear':gzY,'gzMonth':gzM,'gzDay':gzD,'isToday':isToday,'isLeap':isLeap,'nWeek':nWeek,'ncWeek':"\u661f\u671f"+cWeek,'isTerm':isTerm,'Term':Term}; + }, + + + /** + * 传入公历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not. + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar:function(y,m,d,isLeapMonth) { //参数区间1900.1.31~2100.12.1 + var leapOffset = 0; + var leapMonth = calendar.leapMonth(y); + var leapDay = calendar.leapDays(y); + if(isLeapMonth&&(leapMonth!=m)) {return -1;}//传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if(y==2100&&m==12&&d>1 || y==1900&&m==1&&d<31) {return -1;}//超出了最大极限值 + var day = calendar.monthDays(y,m); + if(y<1900 || y>2100 || d>day) {return -1;}//参数合法性效验 + + //计算农历的时间差 + var offset = 0; + for(var i=1900;i<y;i++) { + offset+=calendar.lYearDays(i); + } + var leap = 0,isAdd= false; + for(var i=1;i<m;i++) { + leap = calendar.leapMonth(y); + if(!isAdd) {//处理闰月 + if(leap<=i && leap>0) { + offset+=calendar.leapDays(y);isAdd = true; + } + } + offset+=calendar.monthDays(y,i); + } + //转换闰月农历 需补充该年闰月的前一个月的时差 + if(isLeapMonth) {offset+=day;} + //1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900,1,30,0,0,0); + var calObj = new Date((offset+d-31)*86400000+stmap); + var cY = calObj.getUTCFullYear(); + var cM = calObj.getUTCMonth()+1; + var cD = calObj.getUTCDate(); + + return calendar.solar2lunar(cY,cM,cD); + } +}; === modified file 'AgendaView.qml' --- AgendaView.qml 2015-11-23 09:30:32 +0000 +++ AgendaView.qml 2015-11-23 09:30:32 +0000 @@ -21,6 +21,7 @@ import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItem import "dateExt.js" as DateExt +import "./3rd-party/lunar.js" as Lunar Page{ id: root @@ -168,7 +169,16 @@ // while the second one (%2) refers to the end time var timeString = i18n.tr("%1 - %2").arg(startTime).arg(endTime) - header.text = date + if (mainView.displayLunarCalendar) { + var lunarDate = Lunar.calendar.solar2lunar(event.startDateTime.getFullYear(), + event.startDateTime.getMonth() + 1, + event.startDateTime.getDate()) + header.text = i18n.tr("%1 %2 %3 %4 %5").arg(lunarDate.gzYear).arg(lunarDate .IMonthCn).arg(lunarDate.IDayCn) + .arg(lunarDate.gzDay).arg(lunarDate.isTerm ? lunarDate.Term : "") + } else { + header.text = date + } + timeLabel.text = timeString header.color = event.startDateTime.toLocaleDateString() === new Date().toLocaleDateString() ? UbuntuColors.orange : UbuntuColors.darkGrey detailsContainer.color = eventListModel.collection(event.collectionId).color @@ -221,8 +231,6 @@ height: detailsColumn.height + units.gu(1) ListItem.Standard{ - - showDivider:false Column{ id: detailsColumn === modified file 'AllDayEventComponent.qml' --- AllDayEventComponent.qml 2015-11-23 09:30:32 +0000 +++ AllDayEventComponent.qml 2015-06-16 09:18:21 +0000 @@ -40,9 +40,6 @@ for(var i = 0 ; i < items.length ; ++i) { var event = items[(i)]; if( event && event.allDay ) { - - console.log("event.startDateTime", event.startDateTime," event.endDateTime",event.endDateTime); - for(var d = event.startDateTime; d < event.endDateTime; d = d.addDays(1)) { var key = Qt.formatDateTime(d, "dd-MMM-yyyy"); if( !(key in map)) { === modified file 'CMakeLists.txt' --- CMakeLists.txt 2014-09-25 21:34:16 +0000 +++ CMakeLists.txt 2015-11-23 09:30:32 +0000 @@ -75,6 +75,8 @@ install(FILES ${APPLICATION_FILE} DESTINATION ${APPLICATION_DIR}) +install(DIRECTORY "3rd-party" DESTINATION ${DATA_DIR}) + # Tests enable_testing() === modified file 'DayView.qml' --- DayView.qml 2015-11-23 09:30:32 +0000 +++ DayView.qml 2015-11-23 09:30:32 +0000 @@ -20,6 +20,7 @@ import Ubuntu.Components 1.1 import "dateExt.js" as DateExt import "ViewType.js" as ViewType +import "./3rd-party/lunar.js" as Lunar Page{ id: dayViewPage @@ -57,7 +58,6 @@ id:monthYear objectName:"monthYearLabel" fontSize: "x-large" - text: currentDay.toLocaleString(Qt.locale(),i18n.tr("MMMM yyyy")) font.capitalization: Font.Capitalize } } @@ -137,4 +137,17 @@ } } } + + Component.onCompleted: { + monthYear.text = Qt.binding(function(){ + if(mainView.displayLunarCalendar){ + var lunarDate = Lunar.calendar.solar2lunar(currentDay.getFullYear(), + currentDay.getMonth() + 1, + currentDay.getDate()) + return i18n.tr("%1 %2").arg(lunarDate .IMonthCn).arg(lunarDate.gzYear) + } else { + return currentDay.toLocaleString(Qt.locale(),i18n.tr("MMMM yyyy")) + } + }) + } } === modified file 'EventDetails.qml' --- EventDetails.qml 2015-08-03 04:47:59 +0000 +++ EventDetails.qml 2015-11-23 09:30:32 +0000 @@ -24,6 +24,7 @@ import "Defines.js" as Defines import "dateExt.js" as DateExt +import "./3rd-party/lunar.js" as Lunar Page { id: root @@ -123,21 +124,55 @@ var startTime = e.startDateTime.toLocaleTimeString(Qt.locale(), Locale.ShortFormat) var endTime = e.endDateTime.toLocaleTimeString(Qt.locale(), Locale.ShortFormat) + var lunarStartDate = null; + var lunarEndDate = null; + if (mainView.displayLunarCalendar) { + lunarStartDate = Lunar.calendar.solar2lunar(e.startDateTime.getFullYear(), + e.startDateTime.getMonth() + 1, + e.startDateTime.getDate()) + + lunarEndDate = Lunar.calendar.solar2lunar(e.endDateTime.getFullYear(), + e.endDateTime.getMonth() + 1, + e.endDateTime.getDate()) + } + if( e.allDay ) { var days = Math.floor((e.endDateTime - e.startDateTime) / Date.msPerDay); if( days !== 1 ) { - dateLabel.text = i18n.tr("%1 - %2 (All Day)") - .arg( e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)) - .arg( e.endDateTime.addDays(-1).toLocaleDateString(Qt.locale(), Locale.LongFormat)) + if (mainView.displayLunarCalendar) { + dateLabel.text = i18n.tr("%1 %2 %3 - %4 %5 %6 (All Day)") + .arg(lunarStartDate.gzYear).arg(lunarStartDate .IMonthCn).arg(lunarStartDate.IDayCn) + .arg(lunarEndDate.gzYear).arg(lunarEndDate .IMonthCn).arg(lunarEndDate.IDayCn) + } else { + dateLabel.text = i18n.tr("%1 - %2 (All Day)") + .arg( e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)) + .arg( e.endDateTime.addDays(-1).toLocaleDateString(Qt.locale(), Locale.LongFormat)) + } } else { - dateLabel.text = i18n.tr("%1 (All Day)").arg( e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)) + if (mainView.displayLunarCalendar) { + dateLabel.text = i18n.tr("%1 %2 %3 (All Day)") + .arg(lunarStartDate.gzYear).arg(lunarStartDate .IMonthCn).arg(lunarStartDate.IDayCn) + } else { + dateLabel.text = i18n.tr("%1 (All Day)").arg( e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat)) + } } } else { if (e.endDateTime.getDate() !== e.startDateTime.getDate()) { - dateLabel.text = e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + ", " +startTime + " - " - + e.endDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + ", " + endTime; + if (mainView.displayLunarCalendar) { + dateLabel.text = i18n.tr("%1 %2 %3, %4 - %5 %6 %7, %8") + .arg(lunarStartDate.gzYear).arg(lunarStartDate .IMonthCn).arg(lunarStartDate.IDayCn).arg(startTime) + .arg(lunarEndDate.gzYear).arg(lunarEndDate .IMonthCn).arg(lunarEndDate.IDayCn).arg(endTime); + } else { + dateLabel.text = e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + ", " +startTime + " - " + + e.endDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + ", " + endTime; + } } else { - dateLabel.text = e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + ", " +startTime + " - " + endTime; + if (mainView.displayLunarCalendar) { + dateLabel.text = i18n.tr("%1 %2 %3, %4 - %5") + .arg(lunarStartDate.gzYear).arg(lunarStartDate .IMonthCn).arg(lunarStartDate.IDayCn).arg(startTime).arg(endTime); + } else { + dateLabel.text = e.startDateTime.toLocaleDateString(Qt.locale(), Locale.LongFormat) + ", " +startTime + " - " + endTime; + } } } === modified file 'HeaderDateComponent.qml' --- HeaderDateComponent.qml 2015-05-14 13:03:02 +0000 +++ HeaderDateComponent.qml 2015-11-23 09:30:32 +0000 @@ -18,6 +18,7 @@ import QtQuick 2.3 import Ubuntu.Components 1.1 +import "./3rd-party/lunar.js" as Lunar Item { id: root @@ -79,4 +80,17 @@ root.dateSelected(date); } } + + Component.onCompleted: { + dateLabel.text = Qt.binding(function(){ + if(mainView.displayLunarCalendar){ + var lunarDate = Lunar.calendar.solar2lunar(date.getFullYear(), + date.getMonth() + 1, + date.getDate()) + return i18n.tr("%1 %2 %3").arg(lunarDate.IDayCn).arg(lunarDate.gzDay).arg(lunarDate.isTerm ? lunarDate.Term : "") + } else { + return date.getDate(); + } + }) + } } === modified file 'MonthComponent.qml' --- MonthComponent.qml 2015-11-23 09:30:32 +0000 +++ MonthComponent.qml 2015-11-23 09:30:32 +0000 @@ -32,7 +32,9 @@ property var isYearView; property var selectedDay; property bool displayWeekNumber:false; + property bool displayLunarCalendar: false; + property string subLabelFontSize: "small" property string dayLabelFontSize: "medium" property string dateLabelFontSize: "large" property string monthLabelFontSize: "x-large" @@ -93,7 +95,6 @@ property int todayMonth: today.getMonth() property int todayYear: today.getFullYear() - //date from month will start, this date might be from previous month property var monthStart: currentMonth.weekStart( Qt.locale().firstDayOfWeek ) property int monthStartDate: monthStart.getDate() @@ -167,6 +168,7 @@ anchors.fill: parent month: intern.curMonth year: intern.curMonthYear + daysInMonth: intern.daysInCurMonth monthLabelFontSize: root.monthLabelFontSize yearLabelFontSize: root.yearLabelFontSize @@ -334,6 +336,7 @@ width: parent.dayWidth height: parent.dayHeight fontSize: intern.dateFontSize + showLunarCalendar: displayLunarCalendar showEvent: showEvents && intern.eventStatus !== undefined && intern.eventStatus[index] !== undefined === modified file 'MonthComponentDateDelegate.qml' --- MonthComponentDateDelegate.qml 2015-09-05 05:30:23 +0000 +++ MonthComponentDateDelegate.qml 2015-11-23 09:30:32 +0000 @@ -1,5 +1,6 @@ import QtQuick 2.0 import Ubuntu.Components 1.1 +import "./3rd-party/lunar.js" as Lunar Item{ id: dateRootItem @@ -8,6 +9,7 @@ property bool isCurrentMonth; property bool isToday; property bool showEvent; + property bool showLunarCalendar; property alias fontSize: dateLabel.font.pixelSize property bool isSelected: false @@ -48,6 +50,50 @@ } Loader{ + sourceComponent: showLunarCalendar ? reservedFiled : undefined + onSourceComponentChanged: { + if (item != undefined) { + item.reservedData = Qt.binding(function(){ + var lunarDate = Lunar.calendar.solar2lunar(intern.monthStartYear, + intern.monthStartMonth + 1, + intern.monthStartDate + index) + if (lunarDate.isTerm) { + return {"lunarText": lunarDate.Term, "isTerm" :lunarDate.isTerm}; + } else { + return {"lunarText": lunarDate.IDayCn, "isTerm" :lunarDate.isTerm}; + } + }) + } + + width = Qt.binding( function() { return units.gu(0.8)}) + height = Qt.binding( function() { return width }) + anchors.horizontalCenter = Qt.binding( function() { return parent.horizontalCenter }) + anchors.top = Qt.binding( function() { return parent.verticalCenter }) + anchors.topMargin = Qt.binding( function() { + return (dateRootItem.height > dateRootItem.width ? dateRootItem.width :dateRootItem.height)/ 4.0 + units.gu(0.25) + }); + } + } + + //this component is reserved for extra information display + Component { + id: reservedFiled + Label { + id: reservedLabel + property var reservedData + onReservedDataChanged: { + text = reservedData.lunarText + if (reservedData.isTerm) + color = "red"; + } + + horizontalAlignment: Text.AlignHCenter + fontSize: root.subLabelFontSize + color: "#5D5D5D" + } + } + + Loader{ sourceComponent: showEvent ? eventIndicatorComp : undefined onSourceComponentChanged: { width = Qt.binding( function() { return units.gu(0.8)}) @@ -55,8 +101,12 @@ anchors.horizontalCenter = Qt.binding( function() { return parent.horizontalCenter }) anchors.top = Qt.binding( function() { return parent.verticalCenter }) anchors.topMargin = Qt.binding( function() { - var w = (dateRootItem.height > dateRootItem.width ? dateRootItem.width :dateRootItem.height)/1.3 - return (w/2) + units.gu(0.1) + if (showLunarCalendar) { + return (dateRootItem.height > dateRootItem.width ? dateRootItem.width :dateRootItem.height) / 2 + units.gu(1.5) + } else { + var w = (dateRootItem.height > dateRootItem.width ? dateRootItem.width :dateRootItem.height)/1.3 + return (w/2) + units.gu(0.1) + } }); } } === modified file 'MonthView.qml' --- MonthView.qml 2015-11-23 09:30:32 +0000 +++ MonthView.qml 2015-11-23 09:30:32 +0000 @@ -19,6 +19,7 @@ import Ubuntu.Components 1.1 import "dateExt.js" as DateExt import "colorUtils.js" as Color +import "./3rd-party/lunar.js" as Lunar Page { id: monthViewPage @@ -53,12 +54,9 @@ ] contents: Label { + id:monthYear objectName:"monthYearLabel" fontSize: "x-large" - // TRANSLATORS: this is a time formatting string, - // see http://qt-project.org/doc/qt-5/qml-qtqml-date.html#details for valid expressions. - // It's used in the header of the month and week views - text: currentMonth.toLocaleString(Qt.locale(),i18n.tr("MMMM yyyy")) font.capitalization: Font.Capitalize } } @@ -109,8 +107,8 @@ showEvents: true - displayWeekNumber: mainView.displayWeekNumber; - + displayWeekNumber: mainView.displayWeekNumber + displayLunarCalendar: mainView.displayLunarCalendar anchors.fill: parent currentMonth: monthViewPath.addMonth(monthViewPath.startMonth, @@ -130,4 +128,21 @@ } } } + + Component.onCompleted: { + monthYear.text = Qt.binding(function(){ + if(mainView.displayLunarCalendar){ + var year = currentMonth.getFullYear() + var month = currentMonth.getMonth() + var day = Math.floor(Date.daysInMonth(year, month) / 2.0) + var lunarDate = Lunar.calendar.solar2lunar( year, month + 1, day) + return i18n.tr("%1 %2").arg(lunarDate .IMonthCn).arg(lunarDate.gzYear) + } else { + // TRANSLATORS: this is a time formatting string, + // see http://qt-project.org/doc/qt-5/qml-qtqml-date.html#details for valid expressions. + // It's used in the header of the month and week views + return currentMonth.toLocaleString(Qt.locale(),i18n.tr("MMMM yyyy")) + } + }) + } } === modified file 'Settings.qml' --- Settings.qml 2015-11-23 09:30:32 +0000 +++ Settings.qml 2015-11-23 09:30:32 +0000 @@ -52,29 +52,60 @@ Item{ width: parent.width; - height: Math.max(weekNumber.height, weekCheckBox.height) + height: Math.max(weekNumber.height, weekCheckbox.height) Label{ id: weekNumber; objectName: "weekNumber" text: i18n.tr("Show week numbers"); elide: Text.ElideRight - opacity: weekCheckBox.checked ? 1.0 : 0.8 + opacity: weekCheckbox.checked ? 1.0 : 0.8 color: UbuntuColors.midAubergine anchors { left: parent.left - right: weekCheckBox.left; + right: weekCheckbox.left; margins: units.gu(2) verticalCenter: parent.verticalCenter } } CheckBox { - id: weekCheckBox + id: weekCheckbox objectName: "weekCheckBox" anchors.right:parent.right; onCheckedChanged: { - mainView.displayWeekNumber = weekCheckBox.checked; + mainView.displayWeekNumber = weekCheckbox.checked; + } + } + } + + ListItem.ThinDivider {} + + Item{ + width: parent.width; + height: Math.max(lunarCal.height, lunarCalCheckbox.height) + + Label{ + id: lunarCal; + objectName: "lunarCalendar" + text: i18n.tr("Show lunar calendar"); + elide: Text.ElideRight + opacity: lunarCalCheckbox.checked ? 1.0 : 0.8 + color: UbuntuColors.midAubergine + anchors { + left: parent.left + right: lunarCalCheckbox.left; + margins: units.gu(2) + verticalCenter: parent.verticalCenter + } + } + + CheckBox { + id: lunarCalCheckbox + objectName: "lunarCalCheckbox" + anchors.right:parent.right; + onCheckedChanged: { + mainView.displayLunarCalendar = lunarCalCheckbox.checked } } } @@ -83,7 +114,7 @@ } Component.onCompleted: { - weekCheckBox.checked = mainView.displayWeekNumber; + weekCheckbox.checked = mainView.displayWeekNumber + lunarCalCheckbox.checked = mainView.displayLunarCalendar } } - === modified file 'ViewHeader.qml' --- ViewHeader.qml 2014-11-29 09:40:53 +0000 +++ ViewHeader.qml 2015-11-23 09:30:32 +0000 @@ -17,6 +17,7 @@ */ import QtQuick 2.3 import Ubuntu.Components 1.1 +import "./3rd-party/lunar.js" as Lunar Item{ id: header @@ -25,6 +26,7 @@ property int month; property int year; + property int daysInMonth; property string monthLabelFontSize: "x-large" property string yearLabelFontSize: "large" @@ -33,7 +35,6 @@ id: monthLabel objectName: "monthLabel" fontSize: monthLabelFontSize - text: Qt.locale().standaloneMonthName(month) anchors.leftMargin: units.gu(1) anchors.left: parent.left color:"black" @@ -44,10 +45,28 @@ id: yearLabel objectName: "yearLabel" fontSize: yearLabelFontSize - text: year anchors.right: parent.right anchors.rightMargin: units.gu(1) color:"black" anchors.verticalCenter: parent.verticalCenter } + + Component.onCompleted: { + yearLabel.text = Qt.binding(function(){ + if (mainView.displayLunarCalendar) { + var lunarDate = Lunar.calendar.solar2lunar(year, month + 1, daysInMonth) + return lunarDate.gzYear + } else { + return year + } + }) + monthLabel.text = Qt.binding(function(){ + if (mainView.displayLunarCalendar) { + var lunarDate = Lunar.calendar.solar2lunar(year, month + 1, daysInMonth) + return lunarDate.IMonthCn + } else { + return Qt.locale().standaloneMonthName(month) + } + }) + } } === modified file 'WeekView.qml' --- WeekView.qml 2015-11-23 09:30:32 +0000 +++ WeekView.qml 2015-11-23 09:30:32 +0000 @@ -20,6 +20,7 @@ import Ubuntu.Components 1.1 import "dateExt.js" as DateExt import "ViewType.js" as ViewType +import "./3rd-party/lunar.js" as Lunar Page{ id: weekViewPage @@ -61,7 +62,6 @@ id:monthYear objectName:"monthYearLabel" fontSize: "x-large" - text: i18n.tr(dayStart.toLocaleString(Qt.locale(),i18n.tr("MMMM yyyy"))) font.capitalization: Font.Capitalize } } @@ -160,4 +160,17 @@ } } } + + Component.onCompleted: { + monthYear.text = Qt.binding(function(){ + if(mainView.displayLunarCalendar){ + var lunarDate = Lunar.calendar.solar2lunar(dayStart.getFullYear(), + dayStart.getMonth() + 1, + dayStart.getDate()) + return i18n.tr("%1 %2").arg(lunarDate .IMonthCn).arg(lunarDate.gzYear) + } else { + return dayStart.toLocaleString(Qt.locale(),i18n.tr("MMMM yyyy")) + } + }) + } } === modified file 'YearView.qml' --- YearView.qml 2015-11-23 09:30:32 +0000 +++ YearView.qml 2015-11-23 09:30:32 +0000 @@ -18,8 +18,9 @@ import QtQuick 2.3 import Ubuntu.Components 1.1 - import "dateExt.js" as DateExt +import "./3rd-party/lunar.js" as Lunar + Page { id: yearViewPage objectName: "yearViewPage" @@ -58,7 +59,6 @@ id:year objectName:"yearLabel" fontSize: "x-large" - text: i18n.tr("Year %1").arg(currentYear) } } @@ -99,4 +99,15 @@ } } } + + Component.onCompleted: { + year.text = Qt.binding(function(){ + if(mainView.displayLunarCalendar){ + var lunarDate = Lunar.calendar.solar2lunar(currentYear, 6, 0) + return lunarDate.gzYear +" "+ lunarDate.Animal + } else { + return i18n.tr("Year %1").arg(currentYear) + } + }) + } } === modified file 'YearViewDelegate.qml' --- YearViewDelegate.qml 2015-11-23 09:30:32 +0000 +++ YearViewDelegate.qml 2015-11-23 09:30:32 +0000 @@ -79,6 +79,7 @@ showEvents: false currentMonth: new Date(yearView.year, index, 1, 0, 0, 0, 0) displayWeekNumber: mainView.displayWeekNumber; + displayLunarCalendar: false; //we disable lunar calendar display in yeaer view due to space isCurrentItem: yearView.focus isYearView: true === modified file 'calendar.qml' --- calendar.qml 2015-11-23 09:30:32 +0000 +++ calendar.qml 2015-11-23 09:30:32 +0000 @@ -26,6 +26,7 @@ id: mainView property bool displayWeekNumber: false; + property bool displayLunarCalendar: false; useDeprecatedToolbar: false @@ -325,6 +326,7 @@ id: settings property alias defaultViewIndex: tabs.selectedTabIndex property alias showWeekNumber: mainView.displayWeekNumber + property alias showLunarCalendar: mainView.displayLunarCalendar } Keys.onTabPressed: { === modified file 'po/com.ubuntu.calendar.pot' --- po/com.ubuntu.calendar.pot 2015-11-23 09:30:32 +0000 +++ po/com.ubuntu.calendar.pot 2015-11-23 09:30:32 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-11-23 15:14+0800\n" +"POT-Creation-Date: 2015-11-23 17:13+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <l...@li.org>\n" @@ -18,41 +18,46 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: ../AgendaView.qml:51 ../DayView.qml:40 ../MonthView.qml:39 -#: ../WeekView.qml:44 ../YearView.qml:42 +#: ../AgendaView.qml:52 ../DayView.qml:41 ../MonthView.qml:40 +#: ../WeekView.qml:45 ../YearView.qml:43 msgid "Today" msgstr "" -#: ../AgendaView.qml:93 +#: ../AgendaView.qml:94 msgid "No upcoming events" msgstr "" -#: ../AgendaView.qml:96 +#: ../AgendaView.qml:97 msgid "You have no calendars enabled" msgstr "" -#: ../AgendaView.qml:106 +#: ../AgendaView.qml:107 msgid "Enable calendars" msgstr "" #. TRANSLATORS: the first argument (%1) refers to a start time for an event, #. while the second one (%2) refers to the end time -#: ../AgendaView.qml:169 ../EventBubble.qml:133 +#: ../AgendaView.qml:170 ../EventBubble.qml:133 #, qt-format msgid "%1 - %2" msgstr "" +#: ../AgendaView.qml:176 +#, qt-format +msgid "%1 %2 %3 %4 %5" +msgstr "" + #. TRANSLATORS: the first parameter refers to the number of all-day events #. on a given day. "Ev." is short form for "Events". #. Please keep the translation of "Ev." to 3 characters only, as the week view #. where it's shown has limited space -#: ../AllDayEventComponent.qml:126 +#: ../AllDayEventComponent.qml:123 #, qt-format msgid "%1 ev." msgstr "" #. TRANSLATORS: the argument refers to the number of all day events -#: ../AllDayEventComponent.qml:130 +#: ../AllDayEventComponent.qml:127 #, qt-format msgid "%1 all day event" msgid_plural "%1 all day events" @@ -98,10 +103,15 @@ msgid "Search contact" msgstr "" +#: ../DayView.qml:147 ../MonthView.qml:139 ../WeekView.qml:170 +#, qt-format +msgid "%1 %2" +msgstr "" + #. TRANSLATORS: this is a time formatting string, #. see http://qt-project.org/doc/qt-5/qml-qtqml-date.html#details for valid expressions. #. It's used in the header of the month and week views -#: ../DayView.qml:60 ../MonthView.qml:61 ../WeekView.qml:64 +#: ../DayView.qml:149 ../MonthView.qml:144 ../WeekView.qml:172 msgid "MMMM yyyy" msgstr "" @@ -169,35 +179,55 @@ msgid "%1 <b>%2</b>" msgstr "" -#: ../EventDetails.qml:43 ../NewEvent.qml:436 +#: ../EventDetails.qml:44 ../NewEvent.qml:436 msgid "Event Details" msgstr "" #. TRANSLATORS: the first parameter refers to the name of event calendar. -#: ../EventDetails.qml:68 +#: ../EventDetails.qml:69 #, qt-format msgid "%1 Calendar" msgstr "" -#: ../EventDetails.qml:129 +#: ../EventDetails.qml:143 +#, qt-format +msgid "%1 %2 %3 - %4 %5 %6 (All Day)" +msgstr "" + +#: ../EventDetails.qml:147 #, qt-format msgid "%1 - %2 (All Day)" msgstr "" -#: ../EventDetails.qml:133 +#: ../EventDetails.qml:153 +#, qt-format +msgid "%1 %2 %3 (All Day)" +msgstr "" + +#: ../EventDetails.qml:156 #, qt-format msgid "%1 (All Day)" msgstr "" -#: ../EventDetails.qml:203 +#: ../EventDetails.qml:162 +#, qt-format +msgid "%1 %2 %3, %4 - %5 %6 %7, %8" +msgstr "" + +#: ../EventDetails.qml:171 +#, qt-format +msgid "%1 %2 %3, %4 - %5" +msgstr "" + +#: ../EventDetails.qml:238 msgid "Edit" msgstr "" -#: ../EventDetails.qml:354 ../NewEvent.qml:538 +#: ../EventDetails.qml:389 ../NewEvent.qml:538 msgid "Guests" msgstr "" -#: ../EventDetails.qml:397 ../EventReminder.qml:35 ../NewEvent.qml:635 +#: ../EventDetails.qml:432 ../EventReminder.qml:35 ../NewEvent.qml:635 msgid "Reminder" msgstr "" @@ -251,6 +281,11 @@ msgid "Weekly on %1" msgstr "" +#: ../HeaderDateComponent.qml:90 +#, qt-format +msgid "%1 %2 %3" +msgstr "" + #: ../LimitLabelModel.qml:25 msgid "Never" msgstr "" @@ -263,7 +298,7 @@ msgid "After Date" msgstr "" -#: ../MonthComponent.qml:260 +#: ../MonthComponent.qml:262 msgid "Wk" msgstr "" @@ -402,6 +437,10 @@ msgid "Show week numbers" msgstr "" +#: ../Settings.qml:91 +msgid "Show lunar calendar" +msgstr "" + #: ../TimeLineBase.qml:73 msgid "Untitled" msgstr "" @@ -416,35 +455,35 @@ msgid "All Day" msgstr "" -#: ../YearView.qml:61 +#: ../YearView.qml:109 #, qt-format msgid "Year %1" msgstr "" -#: ../calendar.qml:47 +#: ../calendar.qml:48 msgid "" "Calendar app accept four arguments: --starttime, --endtime, --newevent and --" "eventid. They will be managed by system. See the source for a full comment " "about them" msgstr "" -#: ../calendar.qml:455 +#: ../calendar.qml:457 msgid "Year" msgstr "" -#: ../calendar.qml:462 +#: ../calendar.qml:464 msgid "Month" msgstr "" -#: ../calendar.qml:469 +#: ../calendar.qml:471 msgid "Week" msgstr "" -#: ../calendar.qml:476 +#: ../calendar.qml:478 msgid "Day" msgstr "" -#: ../calendar.qml:483 +#: ../calendar.qml:485 msgid "Agenda" msgstr "" === modified file 'po/zh_CN.po' --- po/zh_CN.po 2015-11-08 05:43:56 +0000 +++ po/zh_CN.po 2015-11-23 09:30:32 +0000 @@ -157,6 +157,10 @@ msgid "New Event" msgstr "新建事件" +#: ../EventActions.qml:72 ../Settings.qml:28 +msgid "Settings" +msgstr "设置" + #. TRANSLATORS: the first argument (%1) refers to a time for an event, #. while the second one (%2) refers to title of event #: ../EventBubble.qml:144 ../EventBubble.qml:149
-- Mailing list: https://launchpad.net/~ubuntu-touch-coreapps-reviewers Post to : ubuntu-touch-coreapps-reviewers@lists.launchpad.net Unsubscribe : https://launchpad.net/~ubuntu-touch-coreapps-reviewers More help : https://help.launchpad.net/ListHelp