Bhikkhu-Kosalla 5 years ago
parent
commit
48787e735c
84 changed files with 4831 additions and 62 deletions
  1. 308 4
      app/calendar/index.html
  2. 62 58
      app/calendar/index1.html
  3. 141 0
      app/calendar/js/theme-chooser.js
  4. 228 0
      app/calendar/json/events.json
  5. 50 0
      app/calendar/php/get-events.php
  6. 9 0
      app/calendar/php/get-time-zones.php
  7. 130 0
      app/calendar/php/utils.php
  8. 158 0
      app/lib/README.md
  9. 12 0
      app/lib/julian.js
  10. 1425 0
      app/lib/locales-all.js
  11. 0 0
      app/lib/locales-all.min.js
  12. 27 0
      app/lib/locales/af.js
  13. 28 0
      app/lib/locales/ar-dz.js
  14. 28 0
      app/lib/locales/ar-kw.js
  15. 28 0
      app/lib/locales/ar-ly.js
  16. 28 0
      app/lib/locales/ar-ma.js
  17. 28 0
      app/lib/locales/ar-sa.js
  18. 28 0
      app/lib/locales/ar-tn.js
  19. 28 0
      app/lib/locales/ar.js
  20. 29 0
      app/lib/locales/az.js
  21. 28 0
      app/lib/locales/bg.js
  22. 29 0
      app/lib/locales/bs.js
  23. 27 0
      app/lib/locales/ca.js
  24. 29 0
      app/lib/locales/cs.js
  25. 27 0
      app/lib/locales/da.js
  26. 30 0
      app/lib/locales/de.js
  27. 27 0
      app/lib/locales/el.js
  28. 14 0
      app/lib/locales/en-au.js
  29. 14 0
      app/lib/locales/en-gb.js
  30. 14 0
      app/lib/locales/en-nz.js
  31. 27 0
      app/lib/locales/es-us.js
  32. 27 0
      app/lib/locales/es.js
  33. 29 0
      app/lib/locales/et.js
  34. 27 0
      app/lib/locales/eu.js
  35. 30 0
      app/lib/locales/fa.js
  36. 27 0
      app/lib/locales/fi.js
  37. 24 0
      app/lib/locales/fr-ca.js
  38. 28 0
      app/lib/locales/fr-ch.js
  39. 28 0
      app/lib/locales/fr.js
  40. 27 0
      app/lib/locales/gl.js
  41. 24 0
      app/lib/locales/he.js
  42. 29 0
      app/lib/locales/hi.js
  43. 29 0
      app/lib/locales/hr.js
  44. 27 0
      app/lib/locales/hu.js
  45. 27 0
      app/lib/locales/id.js
  46. 27 0
      app/lib/locales/is.js
  47. 29 0
      app/lib/locales/it.js
  48. 25 0
      app/lib/locales/ja.js
  49. 29 0
      app/lib/locales/ka.js
  50. 29 0
      app/lib/locales/kk.js
  51. 23 0
      app/lib/locales/ko.js
  52. 27 0
      app/lib/locales/lb.js
  53. 27 0
      app/lib/locales/lt.js
  54. 29 0
      app/lib/locales/lv.js
  55. 25 0
      app/lib/locales/mk.js
  56. 29 0
      app/lib/locales/ms.js
  57. 27 0
      app/lib/locales/nb.js
  58. 27 0
      app/lib/locales/ne.js
  59. 27 0
      app/lib/locales/nl.js
  60. 27 0
      app/lib/locales/nn.js
  61. 27 0
      app/lib/locales/pl.js
  62. 25 0
      app/lib/locales/pt-br.js
  63. 27 0
      app/lib/locales/pt.js
  64. 29 0
      app/lib/locales/ro.js
  65. 29 0
      app/lib/locales/ru.js
  66. 29 0
      app/lib/locales/sk.js
  67. 27 0
      app/lib/locales/sl.js
  68. 29 0
      app/lib/locales/sq.js
  69. 29 0
      app/lib/locales/sr-cyrl.js
  70. 29 0
      app/lib/locales/sr.js
  71. 27 0
      app/lib/locales/sv.js
  72. 30 0
      app/lib/locales/th.js
  73. 27 0
      app/lib/locales/tr.js
  74. 17 0
      app/lib/locales/ug.js
  75. 29 0
      app/lib/locales/uk.js
  76. 21 0
      app/lib/locales/uz.js
  77. 29 0
      app/lib/locales/vi.js
  78. 30 0
      app/lib/locales/zh-cn.js
  79. 23 0
      app/lib/locales/zh-tw.js
  80. 355 0
      app/lib/lune.js
  81. 71 0
      app/lib/main.css
  82. 56 0
      app/lib/main.js
  83. 0 0
      app/lib/main.min.css
  84. 5 0
      app/lib/main.min.js

+ 308 - 4
app/calendar/index.html

@@ -3,6 +3,309 @@
 	<head>
 		<meta charset="utf-8" />
 		<link href="../lib/main.css" rel="stylesheet" />
+		<script src="../public/js/jquery.js"></script>
+		<script src="../public/js/comm.js"></script>
+		<script src="jquery-3.3.1.min.js"></script>
+		<script src="julian.js"></script>
+		<script src="lune.js"></script>
+		<script src="suncalc.js"></script>
+		<script src="./planet_position/js/planet-positions.js"></script>
+
+		<script src="../studio/js/fixedsticky.js"></script>
+		<script src="../guide/guide.js"></script>
+		<link type="text/css" rel="stylesheet" href="../guide/guide.css" />
+
+		<script src="../public/js/marked.js"></script>
+		<!--获取语言-->
+		<script>
+			var g_language = "en";
+			var g_currLink = "";
+			function lang_init(strPage) {
+				g_currLink = strPage;
+			}
+			function setLang(strLang) {
+				g_language = strLang;
+				setCookie("language", g_language, 365);
+				window.location.assign(location.pathname + "?language=" + g_language);
+			}
+		</script>
+		<script>
+			var current_phase = phase();
+			console.log(current_phase); //输出到控制台
+
+			//$("#title_text").html(localString[g_language].BE);
+			var new_list = new Array(); //新月列表
+			var first_list = new Array(); //上弦月列表
+			var full_list = new Array(); //满月列表
+			var last_list = new Array(); //下弦月列表
+			var planets = new Array(); //
+			var lunar_position = new Object();
+
+			var g_coordinate_this = new Object();
+			var g_now_date = new Date();
+			var today = new Date();
+			var start_day = new Date();
+			var next_year = new Date();
+			var sun_times = new Object();
+
+			var curr_position = localStorage.getItem("local_position");
+			if (curr_position) {
+				g_coordinate_this.AT = curr_position.split("#")[0];
+				g_coordinate_this.LT = curr_position.split("#")[1];
+				g_coordinate_this.height = curr_position.split("#")[2];
+				if (g_coordinate_this.AT >= 0) {
+					var AT_string = angle_trans(g_coordinate_this.AT) + "N";
+				} else {
+					var AT_string = angle_trans(g_coordinate_this.AT) + "S";
+				}
+				if (g_coordinate_this.LT >= 0) {
+					var LT_string = angle_trans(g_coordinate_this.LT) + "E";
+				} else {
+					var LT_string = angle_trans(g_coordinate_this.LT) + "W";
+				}
+				let height_string = g_coordinate_this.height + "M";
+				$("#selected_position_string").html(AT_string + " " + LT_string + " " + height_string);
+			} else {
+				getLocation();
+			}
+			function show_time() {
+				if ($("#input_time").val()) {
+					today = new Date($("#input_time").val());
+				} else {
+					today = g_now_date;
+				}
+				if (phase(today).phase <= 0.5) {
+					start_day.setDate(today.getDate() - 16); //退到本月的新月之前
+					start_day = phaseHunt(start_day).full_date; //得到之前最近的满月日
+					start_day.setDate(start_day.getDate() + 1);
+				} else {
+					start_day.setDate(today.getDate() - 31); //退到本月的新月之前
+					start_day = phaseHunt(start_day).full_date; //得到之前最近的满月日
+					start_day.setDate(start_day.getDate() + 1);
+				}
+				next_year.setDate(start_day.getDate() + 360);
+
+				last_list = phaseRange(start_day, next_year, LAST); //获取下弦月列表
+				new_list = phaseRange(start_day, next_year, NEW); //获取新月列表
+				first_list = phaseRange(start_day, next_year, FIRST); //获取上弦月列表
+				full_list = phaseRange(start_day, next_year, FULL); //获取满月列表
+
+				console.log(last_list); //输出到控制台
+				console.log(new_list); //输出到控制台
+				console.log(first_list); //输出到控制台
+				console.log(full_list); //输出到控制台
+				lunar_phase_list_refresh();
+				get_position(today);
+
+				let d_earth_to_moon =
+					lunar_position.position.x ^
+					(2 + lunar_position.position.y) ^
+					(2 + lunar_position.position.z) ^
+					2 ^
+					0.5;
+				let d_earth_to_moon_0 = phase(today).distance;
+
+				sun_times = SunCalc.getTimes(
+					today,
+					g_coordinate_this.AT,
+					g_coordinate_this.LT,
+					g_coordinate_this.height / 1000
+				);
+				sun_position = SunCalc.getPosition(today, g_coordinate_this.AT, g_coordinate_this.LT);
+				moon_position = SunCalc.getMoonPosition(today, g_coordinate_this.AT, g_coordinate_this.LT);
+				moon_Illumination = SunCalc.getMoonIllumination(today);
+				$("#today_dawn").html(sun_times.dawn.toLocaleTimeString()); //破晓
+				$("#today_solarNoon").html(sun_times.solarNoon.toLocaleTimeString()); //正午
+				$("#today_sunset").html(sun_times.sunset.toLocaleTimeString()); //日落
+				$("#today_sun_azimuth").html(angle_trans((sun_position.azimuth / Math.PI) * 180)); //太阳水平弧度
+				$("#today_moon_azimuth").html(angle_trans((moon_position.azimuth / Math.PI) * 180)); //月亮水平弧度
+				$("#today_moon_phase").html(phase(today).phase); //月相值
+				$("#today_moon_percent").html(phase(today).illuminated); //月照度
+				$("#today_moon_angle").html(angle_trans((moon_Illumination.angle / Math.PI) * 180)); //月相角
+				$("#angle_sun_e_moon").html(
+					angle_trans((Math.abs(Math.PI + sun_position.azimuth - moon_position.azimuth) / Math.PI) * 180)
+				); //月亮水平弧度
+				$("#curr_time").html(today.toLocaleTimeString()); //当前时间
+				$("#now_time").html(g_now_date.toLocaleTimeString()); //现在
+				$("#curr_time_unix").html(today.getTime()); //時間戳
+
+				let earth_angle_string = "";
+				earth_angle_string += get_position(today).solar_position_angle + "——";
+				earth_angle_string += get_position(today).solar_position_angle_round + "——";
+				earth_angle_string += get_position(today).solar_station + "——";
+				earth_angle_string += get_station_name(today).solar.icon;
+				$("#earth_angle").html(earth_angle_string); //地球角度
+
+				let moon_angle_string = "";
+				moon_angle_string += get_position(today).lunar_position_angle + "——";
+				moon_angle_string += get_position(today).lunar_position_angle_round + "——";
+				moon_angle_string += get_position(today).lunar_station + "——";
+				moon_angle_string += get_station_name(today).lunar.value;
+				$("#moon_angle").html(moon_angle_string); //月亮角度——角度差算法
+
+				let moon_angle_string2 = "";
+				moon_angle_string2 += get_position(today).lunar_position_angle2 + "——";
+				moon_angle_string2 += get_position(today).lunar_position_angle_round2 + "——";
+				moon_angle_string2 += get_position(today).lunar_station2 + "——";
+				moon_angle_string2 += get_station_name(today).lunar.value;
+				$("#moon_angle2").html(moon_angle_string2); //月亮角度——向量差算法
+			}
+			//根据时间计算偏角,输出
+			function get_position(date_time) {
+				let planets_position = new Object();
+				planets = window.lagrange.planet_positions.getPositions(date_time);
+				//planets = global.planet_positions.getPositions(today);
+				//console.log(planets)//输出到控制台
+				earth_position = window.lagrange.planet_positions.getPositions(date_time)[3];
+				lunar_position = window.lagrange.planet_positions.getPositions(date_time)[11];
+				let lunar_position_angle = 0;
+				let lunar_station = 0;
+				let earth_position_angle = 0;
+				let earth_station = 0;
+				let earth_position_angle_round = 0;
+				let lunar_position_angle_round = 0;
+				//太阳相对地球的黄道偏角
+				if (earth_position.position.y >= 0) {
+					earth_position_angle = Math.atan2(earth_position.position.y, earth_position.position.x);
+				} else {
+					earth_position_angle =
+						Math.PI * 2 + Math.atan2(earth_position.position.y, earth_position.position.x);
+				}
+				earth_position_angle_round = earth_position_angle / Math.PI / 2 + 0.5;
+				earth_position_angle_round = earth_position_angle_round - Math.floor(earth_position_angle_round);
+				earth_station = earth_position_angle_round * 12;
+				planets_position.solar_station = earth_station;
+				planets_position.solar_position_angle = earth_position_angle_round * Math.PI * 2;
+				planets_position.solar_position_angle_round = earth_position_angle_round;
+				//月球相对地球的黄道偏角——角度差算法
+				lunar_position_angle_round = earth_position_angle_round + phase(date_time).phase;
+				lunar_position_angle_round = lunar_position_angle_round - Math.floor(lunar_position_angle_round);
+				lunar_position_angle = lunar_position_angle_round * Math.PI * 2;
+				lunar_station = lunar_position_angle_round * 27;
+				//月球相对地球的黄道偏角算法——向量差算法
+				let lunar_to_earth = new Object();
+				lunar_to_earth.y = lunar_position.position.y - earth_position.position.y;
+				lunar_to_earth.x = lunar_position.position.x - earth_position.position.x;
+				if (lunar_to_earth.y >= 0) {
+					lunar_position_angle2 = Math.atan2(lunar_to_earth.y, lunar_to_earth.x);
+				} else {
+					lunar_position_angle2 = Math.PI * 2 + Math.atan2(lunar_to_earth.y, lunar_to_earth.x);
+				}
+				lunar_position_angle_round2 = lunar_position_angle2 / Math.PI / 2;
+				//lunar_position_angle_round = lunar_position_angle_round - Math.floor(lunar_position_angle_round)
+				lunar_position_angle2 = lunar_position_angle_round2 * Math.PI * 2;
+
+				lunar_station2 = lunar_position_angle_round2 * 27;
+
+				planets_position.lunar_station = lunar_station; //月站值【角度差算夹角】
+				planets_position.lunar_position_angle = lunar_position_angle; //月站角【角度差算夹角】
+				planets_position.lunar_position_angle_round = lunar_position_angle_round; //月站圆周比率【角度差算夹角】
+				planets_position.lunar_station2 = lunar_station2; //月站值【矢量差算夹角】
+				planets_position.lunar_position_angle2 = lunar_position_angle2; //月站角【矢量差算夹角】
+				planets_position.lunar_position_angle_round2 = lunar_position_angle_round2; //月站圆周比率【矢量差算夹角】
+				return planets_position;
+			}
+			//根据;
+			function get_station_name(data_time) {
+				//获取星象信息
+				let solar_num = 0;
+				let lunar_num = 0;
+				solar_num = get_position(data_time).solar_station;
+				solar_num = Math.floor(solar_num);
+				lunar_num = get_position(data_time).lunar_station;
+				lunar_num = Math.floor(lunar_num);
+
+				let result = new Object();
+				result.solar = horoscope_name[solar_num]; //黄道十二宫星象名称
+				result.lunar = pali_nakkhatta_name[lunar_num]; //27星宿月站名称
+				return result;
+			}
+			function getLocation() {
+				//自动定位
+				if (navigator.geolocation) {
+					navigator.geolocation.getCurrentPosition(showPosition, showError);
+				} else {
+					$("#selected_position_string").html("Geolocation is not supported by this browser.");
+				}
+			}
+			function showPosition(position) {
+				alert("get cordinate success");
+				g_coordinate_this.AT = position.coords.latitude; //纬度
+				g_coordinate_this.LT = position.coords.longitude; //经度
+				g_coordinate_this.height = position.coords.altitude; //海拔高度
+				//手动输入
+				var LT = Number($("#LT_°")[0].value);
+				LT += Number($("#LT_’")[0].value) / 60;
+				LT += Number($("#LT_”")[0].value) / 3600;
+				LT = Number($("#WE")[0].value + LT);
+				var AT = Number($("#AT_°")[0].value);
+				AT += Number($("#AT_’")[0].value) / 60;
+				AT += Number($("#AT_”")[0].value) / 3600;
+				AT = Number($("#NS")[0].value + AT);
+				if (AT != 0) {
+					g_coordinate_this.LT = LT;
+					g_coordinate_this.AT = AT;
+				}
+
+				let position_string =
+					g_coordinate_this.AT + "#" + g_coordinate_this.LT + "#" + g_coordinate_this.height;
+				localStorage.setItem("local_position", position_string);
+
+				if (g_coordinate_this.AT >= 0) {
+					var AT_string = angle_trans(g_coordinate_this.AT) + "N";
+				} else {
+					var AT_string = angle_trans(g_coordinate_this.AT) + "S";
+				}
+				if (g_coordinate_this.LT >= 0) {
+					var LT_string = angle_trans(g_coordinate_this.LT) + "E";
+				} else {
+					var LT_string = angle_trans(g_coordinate_this.LT) + "W";
+				}
+				let height_string = g_coordinate_this.height + "M";
+				$("#selected_position_string").html(AT_string + " " + LT_string + " " + height_string);
+				$("#position_input").hide();
+			}
+			function showError(error) {
+				switch (error.code) {
+					case error.PERMISSION_DENIED:
+						alert("定位失败,用户拒绝请求地理定位");
+						break;
+					case error.POSITION_UNAVAILABLE:
+						alert("定位失败,位置信息是不可用");
+						break;
+					case error.TIMEOUT:
+						alert("定位失败,请求获取用户位置超时");
+						break;
+					case error.UNKNOWN_ERROR:
+						alert("定位失败,定位系统失效");
+						break;
+				}
+			}
+			function angle_trans(angle) {
+				var angle_str = "";
+				var num_d = Math.floor(angle);
+				var num_m = Math.floor((angle - num_d) * 60);
+				var num_s = Math.round((angle - num_d) * 60 - num_m);
+				if (num_d != 0) {
+					angle_str += num_d + "°";
+				}
+				if (num_m != 0) {
+					angle_str += num_m + "’";
+				}
+				if (num_s != 0) {
+					angle_str += num_s + "”";
+				}
+				return angle_str;
+			}
+			function input_position() {
+				$("#position_input").show();
+			}
+			var g_event_list_arr = new Array();
+			function get_event_arr() {
+				let from_str = new Date();
+				let info_obj = new Object();
+			}
+		</script>
 		<script src="../lib/main.js"></script>
 		<script>
 			function getCookie(name) {
@@ -36,11 +339,12 @@
 					editable: true,
 					selectable: true,
 					dayMaxEvents: true, // allow "more" link when too many events
+					resources: g_event_list_arr,
 					events: {
-						url: "php/get-events.php",
-						failure: function () {
-							document.getElementById("script-warning").style.display = "inline"; // show
-						},
+						/*url: "php/get-events.php",
+							failure: function () {
+								document.getElementById("script-warning").style.display = "inline"; // show
+							},*/
 					},
 					eventClick: function (info) {
 						info.jsEvent.preventDefault(); // don't let the browser navigate

+ 62 - 58
app/calendar/index1.html

@@ -464,7 +464,7 @@
 			.correct {
 				background-color: gold;
 			}
-			#position_input{
+			#position_input {
 				width: fit-content;
 				background: #dfdfdf;
 				padding: 1em;
@@ -474,11 +474,10 @@
 				left: 5em;
 				top: 10em;
 			}
-			#position_input input[type="number" i]{
+			#position_input input[type="number" i] {
 				width: 4em;
 			}
 			#position_input span {
-
 			}
 			#position_input select {
 				width: 3.5em;
@@ -513,37 +512,43 @@
 					//localString[g_language].my_loc
 				</script>
 			</button>
-			<div id="position_input" style="display:none;">
-				<div style="display:flex;"><span style="flex: 3;justify-content: flex-end;display: flex;margin: auto 1em auto 0;">
-					<script>
-						document.write(localString[g_language].atitude);
-					</script></span><span style="flex:7;white-space: nowrap;">
-					<input id="AT_°" type="number" min="0" max="90" /> °
-					<input id="AT_’" type="number" min="0" max="60" /> ’
-					<input id="AT_”" type="number" min="0" max="60" /> ”
-					<select id="NS">
-						<option value="+">N</option>
-						<option value="-">S</option>
-					</select></span>
+			<div id="position_input" style="display: none">
+				<div style="display: flex">
+					<span style="flex: 3; justify-content: flex-end; display: flex; margin: auto 1em auto 0">
+						<script>
+							document.write(localString[g_language].atitude);
+						</script></span
+					><span style="flex: 7; white-space: nowrap">
+						<input id="AT_°" type="number" min="0" max="90" /> °
+						<input id="AT_’" type="number" min="0" max="60" /> ’
+						<input id="AT_”" type="number" min="0" max="60" /> ”
+						<select id="NS">
+							<option value="+">N</option>
+							<option value="-">S</option>
+						</select></span
+					>
 				</div>
-				<div style="display:flex;">
-					<span style="flex: 3;justify-content: flex-end;display: flex;margin: auto 1em auto 0;"><script>
-						document.write(localString[g_language].longitude);
-					</script></span><span style="flex:7;white-space: nowrap;">
-					<input id="LT_°" type="number" min="0" max="180" /> °
-					<input id="LT_’" type="number" min="0" max="60" /> ’
-					<input id="LT_”" type="number" min="0" max="60" /> ”
-					<select id="WE">
-						<option value="+">E</option>
-						<option value="-">W</option>
-					</select></span>
+				<div style="display: flex">
+					<span style="flex: 3; justify-content: flex-end; display: flex; margin: auto 1em auto 0"
+						><script>
+							document.write(localString[g_language].longitude);
+						</script></span
+					><span style="flex: 7; white-space: nowrap">
+						<input id="LT_°" type="number" min="0" max="180" /> °
+						<input id="LT_’" type="number" min="0" max="60" /> ’
+						<input id="LT_”" type="number" min="0" max="60" /> ”
+						<select id="WE">
+							<option value="+">E</option>
+							<option value="-">W</option>
+						</select></span
+					>
 				</div>
 				<div id="position_selected"></div>
-				<div style="display:flex;">
-					<button onclick="getLocation()" style="margin:0 auto;">
-					<script>
-						document.write(localString[g_language].confirm);
-					</script>
+				<div style="display: flex">
+					<button onclick="getLocation()" style="margin: 0 auto">
+						<script>
+							document.write(localString[g_language].confirm);
+						</script>
 					</button>
 				</div>
 			</div>
@@ -658,9 +663,9 @@
 				sun_position = SunCalc.getPosition(today, g_coordinate_this.AT, g_coordinate_this.LT);
 				moon_position = SunCalc.getMoonPosition(today, g_coordinate_this.AT, g_coordinate_this.LT);
 				moon_Illumination = SunCalc.getMoonIllumination(today);
-				$("#today_dawn").html(sun_times.dawn.toLocaleTimeString());
-				$("#today_solarNoon").html(sun_times.solarNoon.toLocaleTimeString());
-				$("#today_sunset").html(sun_times.sunset.toLocaleTimeString());
+				$("#today_dawn").html(sun_times.dawn.toLocaleTimeString()); //破晓
+				$("#today_solarNoon").html(sun_times.solarNoon.toLocaleTimeString()); //正午
+				$("#today_sunset").html(sun_times.sunset.toLocaleTimeString()); //日落
 				$("#today_sun_azimuth").html(angle_trans((sun_position.azimuth / Math.PI) * 180)); //太阳水平弧度
 				$("#today_moon_azimuth").html(angle_trans((moon_position.azimuth / Math.PI) * 180)); //月亮水平弧度
 				$("#today_moon_phase").html(phase(today).phase); //月相值
@@ -694,6 +699,7 @@
 				moon_angle_string2 += get_station_name(today).lunar.value;
 				$("#moon_angle2").html(moon_angle_string2); //月亮角度——向量差算法
 			}
+			//根据时间计算偏角,输出
 			function get_position(date_time) {
 				let planets_position = new Object();
 				planets = window.lagrange.planet_positions.getPositions(date_time);
@@ -740,14 +746,15 @@
 
 				lunar_station2 = lunar_position_angle_round2 * 27;
 
-				planets_position.lunar_station = lunar_station;
-				planets_position.lunar_position_angle = lunar_position_angle;
-				planets_position.lunar_position_angle_round = lunar_position_angle_round;
-				planets_position.lunar_station2 = lunar_station2;
-				planets_position.lunar_position_angle2 = lunar_position_angle2;
-				planets_position.lunar_position_angle_round2 = lunar_position_angle_round2;
+				planets_position.lunar_station = lunar_station; //月站值【角度差算夹角】
+				planets_position.lunar_position_angle = lunar_position_angle; //月站角【角度差算夹角】
+				planets_position.lunar_position_angle_round = lunar_position_angle_round; //月站圆周比率【角度差算夹角】
+				planets_position.lunar_station2 = lunar_station2; //月站值【矢量差算夹角】
+				planets_position.lunar_position_angle2 = lunar_position_angle2; //月站角【矢量差算夹角】
+				planets_position.lunar_position_angle_round2 = lunar_position_angle_round2; //月站圆周比率【矢量差算夹角】
 				return planets_position;
 			}
+			根据;
 			function get_station_name(data_time) {
 				//获取星象信息
 				let solar_num = 0;
@@ -758,8 +765,8 @@
 				lunar_num = Math.floor(lunar_num);
 
 				let result = new Object();
-				result.solar = horoscope_name[solar_num];
-				result.lunar = pali_nakkhatta_name[lunar_num];
+				result.solar = horoscope_name[solar_num]; //黄道十二宫星象名称
+				result.lunar = pali_nakkhatta_name[lunar_num]; //27星宿月站名称
 				return result;
 			}
 			function lunar_phase_list_refresh() {
@@ -923,20 +930,18 @@
 				g_coordinate_this.LT = position.coords.longitude; //经度
 				g_coordinate_this.height = position.coords.altitude; //海拔高度
 				//手动输入
-				var LT=Number($("#LT_°")[0].value);
-					LT+=Number($("#LT_’")[0].value)/60;
-					LT+=Number($("#LT_”")[0].value)/3600;
-					LT=Number($("#WE")[0].value+LT);
-				var AT=Number($("#AT_°")[0].value);
-					AT+=Number($("#AT_’")[0].value)/60;
-					AT+=Number($("#AT_”")[0].value)/3600;
-					AT=Number($("#NS")[0].value+AT);
-					if(AT!=0){
-						g_coordinate_this.LT=LT;
-						g_coordinate_this.AT=AT;
-
-					}
-
+				var LT = Number($("#LT_°")[0].value);
+				LT += Number($("#LT_’")[0].value) / 60;
+				LT += Number($("#LT_”")[0].value) / 3600;
+				LT = Number($("#WE")[0].value + LT);
+				var AT = Number($("#AT_°")[0].value);
+				AT += Number($("#AT_’")[0].value) / 60;
+				AT += Number($("#AT_”")[0].value) / 3600;
+				AT = Number($("#NS")[0].value + AT);
+				if (AT != 0) {
+					g_coordinate_this.LT = LT;
+					g_coordinate_this.AT = AT;
+				}
 
 				let position_string =
 					g_coordinate_this.AT + "#" + g_coordinate_this.LT + "#" + g_coordinate_this.height;
@@ -955,7 +960,6 @@
 				let height_string = g_coordinate_this.height + "M";
 				$("#selected_position_string").html(AT_string + " " + LT_string + " " + height_string);
 				$("#position_input").hide();
-
 			}
 			function showError(error) {
 				switch (error.code) {
@@ -989,7 +993,7 @@
 				}
 				return angle_str;
 			}
-			function input_position(){
+			function input_position() {
 				$("#position_input").show();
 			}
 		</script>

+ 141 - 0
app/calendar/js/theme-chooser.js

@@ -0,0 +1,141 @@
+
+function initThemeChooser(settings) {
+  var isInitialized = false;
+  var currentThemeSystem; // don't set this directly. use setThemeSystem
+  var currentStylesheetEl;
+  var loadingEl = document.getElementById('loading');
+  var systemSelectEl = document.querySelector('#theme-system-selector select');
+  var themeSelectWrapEls = Array.prototype.slice.call( // convert to real array
+    document.querySelectorAll('.selector[data-theme-system]')
+  );
+
+  systemSelectEl.addEventListener('change', function() {
+    setThemeSystem(this.value);
+  });
+
+  setThemeSystem(systemSelectEl.value);
+
+  themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
+    var themeSelectEl = themeSelectWrapEl.querySelector('select');
+
+    themeSelectWrapEl.addEventListener('change', function() {
+      setTheme(
+        currentThemeSystem,
+        themeSelectEl.options[themeSelectEl.selectedIndex].value
+      );
+    });
+  });
+
+
+  function setThemeSystem(themeSystem) {
+    var selectedTheme;
+
+    currentThemeSystem = themeSystem;
+
+    themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
+      var themeSelectEl = themeSelectWrapEl.querySelector('select');
+
+      if (themeSelectWrapEl.getAttribute('data-theme-system') === themeSystem) {
+        selectedTheme = themeSelectEl.options[themeSelectEl.selectedIndex].value;
+        themeSelectWrapEl.style.display = 'inline-block';
+      } else {
+        themeSelectWrapEl.style.display = 'none';
+      }
+    });
+
+    setTheme(themeSystem, selectedTheme);
+  }
+
+
+  function setTheme(themeSystem, themeName) {
+    var stylesheetUrl = generateStylesheetUrl(themeSystem, themeName);
+    var stylesheetEl;
+
+    function done() {
+      if (!isInitialized) {
+        isInitialized = true;
+        settings.init(themeSystem);
+      }
+      else {
+        settings.change(themeSystem);
+      }
+
+      showCredits(themeSystem, themeName);
+    }
+
+    if (stylesheetUrl) {
+      stylesheetEl = document.createElement('link');
+      stylesheetEl.setAttribute('rel', 'stylesheet');
+      stylesheetEl.setAttribute('href', stylesheetUrl);
+      document.querySelector('head').appendChild(stylesheetEl);
+
+      loadingEl.style.display = 'inline';
+
+      whenStylesheetLoaded(stylesheetEl, function() {
+        if (currentStylesheetEl) {
+          currentStylesheetEl.parentNode.removeChild(currentStylesheetEl);
+        }
+        currentStylesheetEl = stylesheetEl;
+        loadingEl.style.display = 'none';
+        done();
+      });
+    } else {
+      if (currentStylesheetEl) {
+        currentStylesheetEl.parentNode.removeChild(currentStylesheetEl);
+        currentStylesheetEl = null
+      }
+      done();
+    }
+  }
+
+
+  function generateStylesheetUrl(themeSystem, themeName) {
+    if (themeSystem === 'bootstrap') {
+      if (themeName) {
+        return 'https://bootswatch.com/4/' + themeName + '/bootstrap.min.css';
+      }
+      else { // the default bootstrap theme
+        return 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css';
+      }
+    }
+  }
+
+
+  function showCredits(themeSystem, themeName) {
+    var creditId;
+
+    if (themeSystem.match('bootstrap')) {
+      if (themeName) {
+        creditId = 'bootstrap-custom';
+      }
+      else {
+        creditId = 'bootstrap-standard';
+      }
+    }
+
+    Array.prototype.slice.call( // convert to real array
+      document.querySelectorAll('.credits')
+    ).forEach(function(creditEl) {
+      if (creditEl.getAttribute('data-credit-id') === creditId) {
+        creditEl.style.display = 'block';
+      } else {
+        creditEl.style.display = 'none';
+      }
+    })
+  }
+
+
+  function whenStylesheetLoaded(linkNode, callback) {
+    var isReady = false;
+
+    function ready() {
+      if (!isReady) { // avoid double-call
+        isReady = true;
+        callback();
+      }
+    }
+
+    linkNode.onload = ready; // does not work cross-browser
+    setTimeout(ready, 2000); // max wait. also handles browsers that don't support onload
+  }
+}

+ 228 - 0
app/calendar/json/events.json

@@ -0,0 +1,228 @@
+[
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-11-30T08:00:00+06:30",
+		"end": "2020-11-30T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-1T08:00:00+06:30",
+		"end": "2020-12-1T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-4T08:00:00+06:30",
+		"end": "2020-12-4T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-7T08:00:00+06:30",
+		"end": "2020-12-7T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-8T08:00:00+06:30",
+		"end": "2020-12-8T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-11T08:00:00+06:30",
+		"end": "2020-12-11T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-14T08:00:00+06:30",
+		"end": "2020-12-14T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-15T08:00:00+06:30",
+		"end": "2020-12-15T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-18T08:00:00+06:30",
+		"end": "2020-12-18T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-21T08:00:00+06:30",
+		"end": "2020-12-21T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-22T08:00:00+06:30",
+		"end": "2020-12-22T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-25T08:00:00+06:30",
+		"end": "2020-12-25T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-28T08:00:00+06:30",
+		"end": "2020-12-28T09:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2020-12-29T08:00:00+06:30",
+		"end": "2020-12-29T09:30:00+06:30"
+	},
+	{
+		"id": "888",
+		"title": "kāmasuttaniddesa",
+		"url": "https://www.wikipali.org/app/course/course.php?id=7f18a3b9-0cd5-47f6-99dd-bae441227d27",
+		"start": "2020-12-3T7:00:00+06:30",
+		"end": "2020-12-3T8:30:00+06:30"
+	},
+	{
+		"id": "888",
+		"title": "kāmasuttaniddesa",
+		"url": "https://www.wikipali.org/app/course/course.php?id=7f18a3b9-0cd5-47f6-99dd-bae441227d27",
+		"start": "2020-12-10T7:00:00+06:30",
+		"end": "2020-12-10T8:30:00+06:30"
+	},
+	{
+		"id": "888",
+		"title": "kāmasuttaniddesa",
+		"url": "https://www.wikipali.org/app/course/course.php?id=7f18a3b9-0cd5-47f6-99dd-bae441227d27",
+		"start": "2020-12-17T7:00:00+06:30",
+		"end": "2020-12-17T8:30:00+06:30"
+	},
+	{
+		"id": "888",
+		"title": "kāmasuttaniddesa",
+		"url": "https://www.wikipali.org/app/course/course.php?id=7f18a3b9-0cd5-47f6-99dd-bae441227d27",
+		"start": "2020-12-24T7:00:00+06:30",
+		"end": "2020-12-24T8:30:00+06:30"
+	},
+	{
+		"id": "888",
+		"title": "kāmasuttaniddesa",
+		"url": "https://www.wikipali.org/app/course/course.php?id=7f18a3b9-0cd5-47f6-99dd-bae441227d27",
+		"start": "2020-12-31T7:00:00+06:30",
+		"end": "2020-12-31T8:30:00+06:30"
+	},
+	{
+		"id": "888",
+		"title": "kāmasuttaniddesa",
+		"url": "https://www.wikipali.org/app/course/course.php?id=7f18a3b9-0cd5-47f6-99dd-bae441227d27",
+		"start": "2021-1-7T7:00:00+06:30",
+		"end": "2021-1-7T8:30:00+06:30"
+	},
+	{
+		"id": "999",
+		"title": "Dhammacakkha",
+		"url": "https://www.wikipali.org/app/course/lesson.php?id=6a42e993-8f7e-414a-a291-a4094764f992",
+		"start": "2021-1-1T08:00:00+06:30",
+		"end": "2021-1-1T09:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-07T2:30:00-05:00",
+		"end": "2020-12-07T4:00:00-05:00"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-10T2:30:00-05:00",
+		"end": "2020-12-10T4:00:00-05:00"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-11T2:30:00-05:00",
+		"end": "2020-12-11T4:00:00-05:00"
+	},
+	{
+		"id": "1001",
+		"title": "haritaca-jātaka",
+		"url": "https://youtu.be/5UdZDewA3TA",
+		"start": "2020-12-13T19:00:00+07:00",
+		"end": "2020-12-13T21:00:00+07:00"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-16T14:00:00+06:30",
+		"end": "2020-12-16T15:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-17T14:00:00+06:30",
+		"end": "2020-12-17T15:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-18T14:00:00+06:30",
+		"end": "2020-12-18T15:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-21T14:00:00+06:30",
+		"end": "2020-12-21T15:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-24T14:00:00+06:30",
+		"end": "2020-12-24T15:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-25T14:00:00+06:30",
+		"end": "2020-12-25T15:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-28T14:00:00+06:30",
+		"end": "2020-12-28T15:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2020-12-30T14:00:00+06:30",
+		"end": "2020-12-30T15:30:00+06:30"
+	},
+	{
+		"id": "1000",
+		"title": "nibbāna-gāmini",
+		"start": "2021-01-01T14:00:00+06:30",
+		"end": "2021-01-01T15:30:00+06:30"
+	}
+]

+ 50 - 0
app/calendar/php/get-events.php

@@ -0,0 +1,50 @@
+<?php
+
+//--------------------------------------------------------------------------------------------------
+// This script reads event data from a JSON file and outputs those events which are within the range
+// supplied by the "start" and "end" GET parameters.
+//
+// An optional "timeZone" GET parameter will force all ISO8601 date stings to a given timeZone.
+//
+// Requires PHP 5.2.0 or higher.
+//--------------------------------------------------------------------------------------------------
+
+// Require our Event class and datetime utilities
+require dirname(__FILE__) . '/utils.php';
+
+// Short-circuit if the client did not give us a date range.
+if (!isset($_GET['start']) || !isset($_GET['end'])) {
+  die("Please provide a date range.");
+}
+
+// Parse the start/end parameters.
+// These are assumed to be ISO8601 strings with no time nor timeZone, like "2013-12-29".
+// Since no timeZone will be present, they will parsed as UTC.
+$range_start = parseDateTime($_GET['start']);
+$range_end = parseDateTime($_GET['end']);
+
+// Parse the timeZone parameter if it is present.
+$time_zone = null;
+if (isset($_GET['timeZone'])) {
+  $time_zone = new DateTimeZone($_GET['timeZone']);
+}
+
+// Read and parse our events JSON file into an array of event data arrays.
+$json = file_get_contents(dirname(__FILE__) . '/../json/events.json');
+$input_arrays = json_decode($json, true);
+
+// Accumulate an output array of event data arrays.
+$output_arrays = array();
+foreach ($input_arrays as $array) {
+
+  // Convert the input array into a useful Event object
+  $event = new Event($array, $time_zone);
+
+  // If the event is in-bounds, add it to the output
+  if ($event->isWithinDayRange($range_start, $range_end)) {
+    $output_arrays[] = $event->toArray();
+  }
+}
+
+// Send JSON to the client.
+echo json_encode($output_arrays);

+ 9 - 0
app/calendar/php/get-time-zones.php

@@ -0,0 +1,9 @@
+<?php
+
+//--------------------------------------------------------------------------------------------------
+// This script outputs a JSON array of all timezones (like "America/Chicago") that PHP supports.
+//
+// Requires PHP 5.2.0 or higher.
+//--------------------------------------------------------------------------------------------------
+
+echo json_encode(DateTimeZone::listIdentifiers());

+ 130 - 0
app/calendar/php/utils.php

@@ -0,0 +1,130 @@
+<?php
+
+//--------------------------------------------------------------------------------------------------
+// Utilities for our event-fetching scripts.
+//
+// Requires PHP 5.2.0 or higher.
+//--------------------------------------------------------------------------------------------------
+
+// PHP will fatal error if we attempt to use the DateTime class without this being set.
+date_default_timezone_set('UTC');
+
+
+class Event {
+
+  // Tests whether the given ISO8601 string has a time-of-day or not
+  const ALL_DAY_REGEX = '/^\d{4}-\d\d-\d\d$/'; // matches strings like "2013-12-29"
+
+  public $title;
+  public $allDay; // a boolean
+  public $start; // a DateTime
+  public $end; // a DateTime, or null
+  public $properties = array(); // an array of other misc properties
+
+
+  // Constructs an Event object from the given array of key=>values.
+  // You can optionally force the timeZone of the parsed dates.
+  public function __construct($array, $timeZone=null) {
+
+    $this->title = $array['title'];
+
+    if (isset($array['allDay'])) {
+      // allDay has been explicitly specified
+      $this->allDay = (bool)$array['allDay'];
+    }
+    else {
+      // Guess allDay based off of ISO8601 date strings
+      $this->allDay = preg_match(self::ALL_DAY_REGEX, $array['start']) &&
+        (!isset($array['end']) || preg_match(self::ALL_DAY_REGEX, $array['end']));
+    }
+
+    if ($this->allDay) {
+      // If dates are allDay, we want to parse them in UTC to avoid DST issues.
+      $timeZone = null;
+    }
+
+    // Parse dates
+    $this->start = parseDateTime($array['start'], $timeZone);
+    $this->end = isset($array['end']) ? parseDateTime($array['end'], $timeZone) : null;
+
+    // Record misc properties
+    foreach ($array as $name => $value) {
+      if (!in_array($name, array('title', 'allDay', 'start', 'end'))) {
+        $this->properties[$name] = $value;
+      }
+    }
+  }
+
+
+  // Returns whether the date range of our event intersects with the given all-day range.
+  // $rangeStart and $rangeEnd are assumed to be dates in UTC with 00:00:00 time.
+  public function isWithinDayRange($rangeStart, $rangeEnd) {
+
+    // Normalize our event's dates for comparison with the all-day range.
+    $eventStart = stripTime($this->start);
+
+    if (isset($this->end)) {
+      $eventEnd = stripTime($this->end); // normalize
+    }
+    else {
+      $eventEnd = $eventStart; // consider this a zero-duration event
+    }
+
+    // Check if the two whole-day ranges intersect.
+    return $eventStart < $rangeEnd && $eventEnd >= $rangeStart;
+  }
+
+
+  // Converts this Event object back to a plain data array, to be used for generating JSON
+  public function toArray() {
+
+    // Start with the misc properties (don't worry, PHP won't affect the original array)
+    $array = $this->properties;
+
+    $array['title'] = $this->title;
+
+    // Figure out the date format. This essentially encodes allDay into the date string.
+    if ($this->allDay) {
+      $format = 'Y-m-d'; // output like "2013-12-29"
+    }
+    else {
+      $format = 'c'; // full ISO8601 output, like "2013-12-29T09:00:00+08:00"
+    }
+
+    // Serialize dates into strings
+    $array['start'] = $this->start->format($format);
+    if (isset($this->end)) {
+      $array['end'] = $this->end->format($format);
+    }
+
+    return $array;
+  }
+
+}
+
+
+// Date Utilities
+//----------------------------------------------------------------------------------------------
+
+
+// Parses a string into a DateTime object, optionally forced into the given timeZone.
+function parseDateTime($string, $timeZone=null) {
+  $date = new DateTime(
+    $string,
+    $timeZone ? $timeZone : new DateTimeZone('UTC')
+      // Used only when the string is ambiguous.
+      // Ignored if string has a timeZone offset in it.
+  );
+  if ($timeZone) {
+    // If our timeZone was ignored above, force it.
+    $date->setTimezone($timeZone);
+  }
+  return $date;
+}
+
+
+// Takes the year/month/date values of the given DateTime and converts them to a new DateTime,
+// but in UTC.
+function stripTime($datetime) {
+  return new DateTime($datetime->format('Y-m-d'));
+}

+ 158 - 0
app/lib/README.md

@@ -0,0 +1,158 @@
+<div align="center">
+  <img height="150" width="150"  src="http://ryanseys.com/img/moon.png"/>
+</div>
+
+# Lune [![Build Status](https://travis-ci.org/ryanseys/lune.svg?branch=0.2.0)](https://travis-ci.org/ryanseys/lune)
+
+Lune.js — calculate the phases of the moon.
+
+## Installation
+
+```sh   
+npm install lune
+```
+
+## Usage
+
+### To calculate *current* phase information:计算*当前*相的信息
+
+```javascript
+var lune = require('lune')//
+var current_phase = lune.phase()
+console.log(current_phase)//输出到控制台
+```
+
+#### Output:
+
+```javascript
+{ phase: 0.3435664924086369,
+  illuminated: 0.7773055846628978,
+  age: 10.1457207715498,
+  distance: 386679.7626047325,
+  angular_diameter: 0.5150467579643708,
+  sun_distance: 148929846.0148686,
+  sun_angular_diameter: 0.5354732715700135 }
+```
+- phase: 月相,
+- illuminated: 亮度,
+- age: 月龄,
+- distance: 地月距离,
+- angular_diameter: 月角直径
+- sun_distance: 地日距离,
+- sun_angular_diameter: 日角直径
+
+
+### To calculate phase information for a *specific* date:
+计算一个*指定*日期的相的信息
+```javascript
+var lune = require('lune')
+var some_date = new Date('2014-02-17T00:00-0500')
+var some_date_phase = lune.phase(some_date)
+console.log(some_date_phase)
+```
+
+#### Output:
+
+```javascript
+{ phase: 0.568204641580006,
+  illuminated: 0.9547862069882863,
+  age: 16.779417556565985,
+  distance: 396084.54752883443,
+  angular_diameter: 0.5028172882344054,
+  sun_distance: 147822484.14817196,
+  sun_angular_diameter: 0.5394845874736046 }
+```
+- phase: 月相,
+- illuminated: 亮度,
+- age: 月龄,
+- distance: 地月距离,
+- angular_diameter: 月角直径
+- sun_distance: 地日距离,
+- sun_angular_diameter: 日角直径
+
+### To search for recent phases around the *current* date:
+在*当前*日期附近搜索最近的相
+```javascript
+var lune = require('lune')
+var recent_phases = lune.phase_hunt()
+console.log(recent_phases)
+```
+
+#### Output:
+
+```javascript
+{ new_date: Tue Mar 08 2016 20:55:59 GMT-0500 (EST),
+  q1_date: Tue Mar 15 2016 13:04:23 GMT-0400 (EDT),
+  full_date: Wed Mar 23 2016 08:01:38 GMT-0400 (EDT),
+  q3_date: Thu Mar 31 2016 11:18:41 GMT-0400 (EDT),
+  nextnew_date: Thu Apr 07 2016 07:25:20 GMT-0400 (EDT) }
+```
+- new_date: 新月日期
+- q1_date: 上弦月日期
+- full_date: 满月日期
+- q3_date: 下弦月日期
+- nextnew_date: 下次新月日期
+### To search for recent phases around a *specific* date:
+在*指定*日期附近搜索最近的相
+```javascript
+var lune = require('lune')
+var some_date = new Date('2014-02-17T00:00-0500')
+var some_date_phase = lune.phase_hunt(some_date)
+console.log(some_date_phase)
+```
+
+#### Output:
+
+```javascript
+{ new_date: Thu Jan 30 2014 16:40:35 GMT-0500 (EST),
+  q1_date: Thu Feb 06 2014 14:22:33 GMT-0500 (EST),
+  full_date: Fri Feb 14 2014 18:54:46 GMT-0500 (EST),
+  q3_date: Sat Feb 22 2014 12:16:56 GMT-0500 (EST),
+  nextnew_date: Sat Mar 01 2014 03:02:41 GMT-0500 (EST) }
+```
+- new_date: 新月日期
+- q1_date: 上弦月日期
+- full_date: 满月日期
+- q3_date: 下弦月日期
+- nextnew_date: 下次新月日期
+
+### To search for phases between two dates:
+在两个日期之间搜索相
+```javascript
+// print all full moons in the first quarter of 2014
+var lune = require('lune')
+var phase_list = lune.phase_range(
+  new Date('2014-01-01T00:00:00.000Z'),
+  new Date('2014-03-31T23:59:59.999Z'),
+  lune.PHASE_FULL
+)
+console.log(phase_list)
+```
+
+Possible values for the third argument of the function are:
+
+*   `lune.PHASE_NEW` (new moon)
+*   `lune.PHASE_FIRST` (first quarter moon)
+*   `lune.PHASE_FULL` (full moon)
+*   `lune.PHASE_LAST` (third or last quarter moon)
+
+#### Output:
+
+```javascript
+[ Wed Jan 01 2014 06:15:02 GMT-0500 (EST),
+  Thu Jan 30 2014 16:40:35 GMT-0500 (EST),
+  Sat Mar 01 2014 03:02:41 GMT-0500 (EST),
+  Sun Mar 30 2014 14:48:06 GMT-0400 (EDT) ]
+```
+
+## Image
+
+Moon image graciously provided by [Mike DiLuigi.](https://www.behance.net/mikediluigi)
+
+## Contributing
+
+Please feel free to contribute to this project! :) Pull requests and feature requests welcome!
+
+## License
+
+See LICENSE file in this repo

+ 12 - 0
app/lib/julian.js

@@ -0,0 +1,12 @@
+'use strict'
+
+function fromDate (date) {
+  return date.getTime() / 86400000 + 2440587.5
+}
+
+function toDate (julian) {
+  return new Date((julian - 2440587.5) * 86400000)
+}
+
+exports.fromDate = fromDate
+exports.toDate = toDate

+ 1425 - 0
app/lib/locales-all.js

@@ -0,0 +1,1425 @@
+[].push.apply(FullCalendar.globalLocales, function () {
+  'use strict';
+
+  var l0 = {
+    code: 'af',
+    week: {
+      dow: 1, // Maandag is die eerste dag van die week.
+      doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+    },
+    buttonText: {
+      prev: 'Vorige',
+      next: 'Volgende',
+      today: 'Vandag',
+      year: 'Jaar',
+      month: 'Maand',
+      week: 'Week',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    allDayText: 'Heeldag',
+    moreLinkText: 'Addisionele',
+    noEventsText: 'Daar is geen gebeurtenisse nie',
+  };
+
+  var l1 = {
+    code: 'ar-dz',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 4, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  var l2 = {
+    code: 'ar-kw',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  var l3 = {
+    code: 'ar-ly',
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  var l4 = {
+    code: 'ar-ma',
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  var l5 = {
+    code: 'ar-sa',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  var l6 = {
+    code: 'ar-tn',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  var l7 = {
+    code: 'ar',
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  var l8 = {
+    code: 'az',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Əvvəl',
+      next: 'Sonra',
+      today: 'Bu Gün',
+      month: 'Ay',
+      week: 'Həftə',
+      day: 'Gün',
+      list: 'Gündəm',
+    },
+    weekText: 'Həftə',
+    allDayText: 'Bütün Gün',
+    moreLinkText(n) {
+      return '+ daha çox ' + n
+    },
+    noEventsText: 'Göstərmək üçün hadisə yoxdur',
+  };
+
+  var l9 = {
+    code: 'bg',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'назад',
+      next: 'напред',
+      today: 'днес',
+      month: 'Месец',
+      week: 'Седмица',
+      day: 'Ден',
+      list: 'График',
+    },
+    allDayText: 'Цял ден',
+    moreLinkText(n) {
+      return '+още ' + n
+    },
+    noEventsText: 'Няма събития за показване',
+  };
+
+  var l10 = {
+    code: 'bs',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prošli',
+      next: 'Sljedeći',
+      today: 'Danas',
+      month: 'Mjesec',
+      week: 'Sedmica',
+      day: 'Dan',
+      list: 'Raspored',
+    },
+    weekText: 'Sed',
+    allDayText: 'Cijeli dan',
+    moreLinkText(n) {
+      return '+ još ' + n
+    },
+    noEventsText: 'Nema događaja za prikazivanje',
+  };
+
+  var l11 = {
+    code: 'ca',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Anterior',
+      next: 'Següent',
+      today: 'Avui',
+      month: 'Mes',
+      week: 'Setmana',
+      day: 'Dia',
+      list: 'Agenda',
+    },
+    weekText: 'Set',
+    allDayText: 'Tot el dia',
+    moreLinkText: 'més',
+    noEventsText: 'No hi ha esdeveniments per mostrar',
+  };
+
+  var l12 = {
+    code: 'cs',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Dříve',
+      next: 'Později',
+      today: 'Nyní',
+      month: 'Měsíc',
+      week: 'Týden',
+      day: 'Den',
+      list: 'Agenda',
+    },
+    weekText: 'Týd',
+    allDayText: 'Celý den',
+    moreLinkText(n) {
+      return '+další: ' + n
+    },
+    noEventsText: 'Žádné akce k zobrazení',
+  };
+
+  var l13 = {
+    code: 'da',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Forrige',
+      next: 'Næste',
+      today: 'I dag',
+      month: 'Måned',
+      week: 'Uge',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    weekText: 'Uge',
+    allDayText: 'Hele dagen',
+    moreLinkText: 'flere',
+    noEventsText: 'Ingen arrangementer at vise',
+  };
+
+  var l14 = {
+    code: 'de',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Zurück',
+      next: 'Vor',
+      today: 'Heute',
+      year: 'Jahr',
+      month: 'Monat',
+      week: 'Woche',
+      day: 'Tag',
+      list: 'Terminübersicht',
+    },
+    weekText: 'KW',
+    allDayText: 'Ganztägig',
+    moreLinkText(n) {
+      return '+ weitere ' + n
+    },
+    noEventsText: 'Keine Ereignisse anzuzeigen',
+  };
+
+  var l15 = {
+    code: 'el',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Προηγούμενος',
+      next: 'Επόμενος',
+      today: 'Σήμερα',
+      month: 'Μήνας',
+      week: 'Εβδομάδα',
+      day: 'Ημέρα',
+      list: 'Ατζέντα',
+    },
+    weekText: 'Εβδ',
+    allDayText: 'Ολοήμερο',
+    moreLinkText: 'περισσότερα',
+    noEventsText: 'Δεν υπάρχουν γεγονότα προς εμφάνιση',
+  };
+
+  var l16 = {
+    code: 'en-au',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+  };
+
+  var l17 = {
+    code: 'en-gb',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+  };
+
+  var l18 = {
+    code: 'en-nz',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+  };
+
+  var l19 = {
+    code: 'es',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Ant',
+      next: 'Sig',
+      today: 'Hoy',
+      month: 'Mes',
+      week: 'Semana',
+      day: 'Día',
+      list: 'Agenda',
+    },
+    weekText: 'Sm',
+    allDayText: 'Todo el día',
+    moreLinkText: 'más',
+    noEventsText: 'No hay eventos para mostrar',
+  };
+
+  var l20 = {
+    code: 'es',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Ant',
+      next: 'Sig',
+      today: 'Hoy',
+      month: 'Mes',
+      week: 'Semana',
+      day: 'Día',
+      list: 'Agenda',
+    },
+    weekText: 'Sm',
+    allDayText: 'Todo el día',
+    moreLinkText: 'más',
+    noEventsText: 'No hay eventos para mostrar',
+  };
+
+  var l21 = {
+    code: 'et',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Eelnev',
+      next: 'Järgnev',
+      today: 'Täna',
+      month: 'Kuu',
+      week: 'Nädal',
+      day: 'Päev',
+      list: 'Päevakord',
+    },
+    weekText: 'näd',
+    allDayText: 'Kogu päev',
+    moreLinkText(n) {
+      return '+ veel ' + n
+    },
+    noEventsText: 'Kuvamiseks puuduvad sündmused',
+  };
+
+  var l22 = {
+    code: 'eu',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Aur',
+      next: 'Hur',
+      today: 'Gaur',
+      month: 'Hilabetea',
+      week: 'Astea',
+      day: 'Eguna',
+      list: 'Agenda',
+    },
+    weekText: 'As',
+    allDayText: 'Egun osoa',
+    moreLinkText: 'gehiago',
+    noEventsText: 'Ez dago ekitaldirik erakusteko',
+  };
+
+  var l23 = {
+    code: 'fa',
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'قبلی',
+      next: 'بعدی',
+      today: 'امروز',
+      month: 'ماه',
+      week: 'هفته',
+      day: 'روز',
+      list: 'برنامه',
+    },
+    weekText: 'هف',
+    allDayText: 'تمام روز',
+    moreLinkText(n) {
+      return 'بیش از ' + n
+    },
+    noEventsText: 'هیچ رویدادی به نمایش',
+  };
+
+  var l24 = {
+    code: 'fi',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Edellinen',
+      next: 'Seuraava',
+      today: 'Tänään',
+      month: 'Kuukausi',
+      week: 'Viikko',
+      day: 'Päivä',
+      list: 'Tapahtumat',
+    },
+    weekText: 'Vk',
+    allDayText: 'Koko päivä',
+    moreLinkText: 'lisää',
+    noEventsText: 'Ei näytettäviä tapahtumia',
+  };
+
+  var l25 = {
+    code: 'fr',
+    buttonText: {
+      prev: 'Précédent',
+      next: 'Suivant',
+      today: "Aujourd'hui",
+      year: 'Année',
+      month: 'Mois',
+      week: 'Semaine',
+      day: 'Jour',
+      list: 'Mon planning',
+    },
+    weekText: 'Sem.',
+    allDayText: 'Toute la journée',
+    moreLinkText: 'en plus',
+    noEventsText: 'Aucun événement à afficher',
+  };
+
+  var l26 = {
+    code: 'fr-ch',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Précédent',
+      next: 'Suivant',
+      today: 'Courant',
+      year: 'Année',
+      month: 'Mois',
+      week: 'Semaine',
+      day: 'Jour',
+      list: 'Mon planning',
+    },
+    weekText: 'Sm',
+    allDayText: 'Toute la journée',
+    moreLinkText: 'en plus',
+    noEventsText: 'Aucun événement à afficher',
+  };
+
+  var l27 = {
+    code: 'fr',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Précédent',
+      next: 'Suivant',
+      today: "Aujourd'hui",
+      year: 'Année',
+      month: 'Mois',
+      week: 'Semaine',
+      day: 'Jour',
+      list: 'Planning',
+    },
+    weekText: 'Sem.',
+    allDayText: 'Toute la journée',
+    moreLinkText: 'en plus',
+    noEventsText: 'Aucun événement à afficher',
+  };
+
+  var l28 = {
+    code: 'gl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Ant',
+      next: 'Seg',
+      today: 'Hoxe',
+      month: 'Mes',
+      week: 'Semana',
+      day: 'Día',
+      list: 'Axenda',
+    },
+    weekText: 'Sm',
+    allDayText: 'Todo o día',
+    moreLinkText: 'máis',
+    noEventsText: 'Non hai eventos para amosar',
+  };
+
+  var l29 = {
+    code: 'he',
+    direction: 'rtl',
+    buttonText: {
+      prev: 'הקודם',
+      next: 'הבא',
+      today: 'היום',
+      month: 'חודש',
+      week: 'שבוע',
+      day: 'יום',
+      list: 'סדר יום',
+    },
+    allDayText: 'כל היום',
+    moreLinkText: 'אחר',
+    noEventsText: 'אין אירועים להצגה',
+    weekText: 'שבוע',
+  };
+
+  var l30 = {
+    code: 'hi',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'पिछला',
+      next: 'अगला',
+      today: 'आज',
+      month: 'महीना',
+      week: 'सप्ताह',
+      day: 'दिन',
+      list: 'कार्यसूची',
+    },
+    weekText: 'हफ्ता',
+    allDayText: 'सभी दिन',
+    moreLinkText(n) {
+      return '+अधिक ' + n
+    },
+    noEventsText: 'कोई घटनाओं को प्रदर्शित करने के लिए',
+  };
+
+  var l31 = {
+    code: 'hr',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prijašnji',
+      next: 'Sljedeći',
+      today: 'Danas',
+      month: 'Mjesec',
+      week: 'Tjedan',
+      day: 'Dan',
+      list: 'Raspored',
+    },
+    weekText: 'Tje',
+    allDayText: 'Cijeli dan',
+    moreLinkText(n) {
+      return '+ još ' + n
+    },
+    noEventsText: 'Nema događaja za prikaz',
+  };
+
+  var l32 = {
+    code: 'hu',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'vissza',
+      next: 'előre',
+      today: 'ma',
+      month: 'Hónap',
+      week: 'Hét',
+      day: 'Nap',
+      list: 'Napló',
+    },
+    weekText: 'Hét',
+    allDayText: 'Egész nap',
+    moreLinkText: 'további',
+    noEventsText: 'Nincs megjeleníthető esemény',
+  };
+
+  var l33 = {
+    code: 'id',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'mundur',
+      next: 'maju',
+      today: 'hari ini',
+      month: 'Bulan',
+      week: 'Minggu',
+      day: 'Hari',
+      list: 'Agenda',
+    },
+    weekText: 'Mg',
+    allDayText: 'Sehari penuh',
+    moreLinkText: 'lebih',
+    noEventsText: 'Tidak ada acara untuk ditampilkan',
+  };
+
+  var l34 = {
+    code: 'is',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Fyrri',
+      next: 'Næsti',
+      today: 'Í dag',
+      month: 'Mánuður',
+      week: 'Vika',
+      day: 'Dagur',
+      list: 'Dagskrá',
+    },
+    weekText: 'Vika',
+    allDayText: 'Allan daginn',
+    moreLinkText: 'meira',
+    noEventsText: 'Engir viðburðir til að sýna',
+  };
+
+  var l35 = {
+    code: 'it',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prec',
+      next: 'Succ',
+      today: 'Oggi',
+      month: 'Mese',
+      week: 'Settimana',
+      day: 'Giorno',
+      list: 'Agenda',
+    },
+    weekText: 'Sm',
+    allDayText: 'Tutto il giorno',
+    moreLinkText(n) {
+      return '+altri ' + n
+    },
+    noEventsText: 'Non ci sono eventi da visualizzare',
+  };
+
+  var l36 = {
+    code: 'ja',
+    buttonText: {
+      prev: '前',
+      next: '次',
+      today: '今日',
+      month: '月',
+      week: '週',
+      day: '日',
+      list: '予定リスト',
+    },
+    weekText: '週',
+    allDayText: '終日',
+    moreLinkText(n) {
+      return '他 ' + n + ' 件'
+    },
+    noEventsText: '表示する予定はありません',
+  };
+
+  var l37 = {
+    code: 'ka',
+    week: {
+      dow: 1,
+      doy: 7,
+    },
+    buttonText: {
+      prev: 'წინა',
+      next: 'შემდეგი',
+      today: 'დღეს',
+      month: 'თვე',
+      week: 'კვირა',
+      day: 'დღე',
+      list: 'დღის წესრიგი',
+    },
+    weekText: 'კვ',
+    allDayText: 'მთელი დღე',
+    moreLinkText(n) {
+      return '+ კიდევ ' + n
+    },
+    noEventsText: 'ღონისძიებები არ არის',
+  };
+
+  var l38 = {
+    code: 'kk',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Алдыңғы',
+      next: 'Келесі',
+      today: 'Бүгін',
+      month: 'Ай',
+      week: 'Апта',
+      day: 'Күн',
+      list: 'Күн тәртібі',
+    },
+    weekText: 'Не',
+    allDayText: 'Күні бойы',
+    moreLinkText(n) {
+      return '+ тағы ' + n
+    },
+    noEventsText: 'Көрсету үшін оқиғалар жоқ',
+  };
+
+  var l39 = {
+    code: 'ko',
+    buttonText: {
+      prev: '이전달',
+      next: '다음달',
+      today: '오늘',
+      month: '월',
+      week: '주',
+      day: '일',
+      list: '일정목록',
+    },
+    weekText: '주',
+    allDayText: '종일',
+    moreLinkText: '개',
+    noEventsText: '일정이 없습니다',
+  };
+
+  var l40 = {
+    code: 'lb',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Zréck',
+      next: 'Weider',
+      today: 'Haut',
+      month: 'Mount',
+      week: 'Woch',
+      day: 'Dag',
+      list: 'Terminiwwersiicht',
+    },
+    weekText: 'W',
+    allDayText: 'Ganzen Dag',
+    moreLinkText: 'méi',
+    noEventsText: 'Nee Evenementer ze affichéieren',
+  };
+
+  var l41 = {
+    code: 'lt',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Atgal',
+      next: 'Pirmyn',
+      today: 'Šiandien',
+      month: 'Mėnuo',
+      week: 'Savaitė',
+      day: 'Diena',
+      list: 'Darbotvarkė',
+    },
+    weekText: 'SAV',
+    allDayText: 'Visą dieną',
+    moreLinkText: 'daugiau',
+    noEventsText: 'Nėra įvykių rodyti',
+  };
+
+  var l42 = {
+    code: 'lv',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Iepr.',
+      next: 'Nāk.',
+      today: 'Šodien',
+      month: 'Mēnesis',
+      week: 'Nedēļa',
+      day: 'Diena',
+      list: 'Dienas kārtība',
+    },
+    weekText: 'Ned.',
+    allDayText: 'Visu dienu',
+    moreLinkText(n) {
+      return '+vēl ' + n
+    },
+    noEventsText: 'Nav notikumu',
+  };
+
+  var l43 = {
+    code: 'mk',
+    buttonText: {
+      prev: 'претходно',
+      next: 'следно',
+      today: 'Денес',
+      month: 'Месец',
+      week: 'Недела',
+      day: 'Ден',
+      list: 'График',
+    },
+    weekText: 'Сед',
+    allDayText: 'Цел ден',
+    moreLinkText(n) {
+      return '+повеќе ' + n
+    },
+    noEventsText: 'Нема настани за прикажување',
+  };
+
+  var l44 = {
+    code: 'ms',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Sebelum',
+      next: 'Selepas',
+      today: 'hari ini',
+      month: 'Bulan',
+      week: 'Minggu',
+      day: 'Hari',
+      list: 'Agenda',
+    },
+    weekText: 'Mg',
+    allDayText: 'Sepanjang hari',
+    moreLinkText(n) {
+      return 'masih ada ' + n + ' acara'
+    },
+    noEventsText: 'Tiada peristiwa untuk dipaparkan',
+  };
+
+  var l45 = {
+    code: 'nb',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Forrige',
+      next: 'Neste',
+      today: 'I dag',
+      month: 'Måned',
+      week: 'Uke',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    weekText: 'Uke',
+    allDayText: 'Hele dagen',
+    moreLinkText: 'til',
+    noEventsText: 'Ingen hendelser å vise',
+  };
+
+  var l46 = {
+    code: 'ne', // code for nepal
+    week: {
+      dow: 7, // Sunday is the first day of the week.
+      doy: 1, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'अघिल्लो',
+      next: 'अर्को',
+      today: 'आज',
+      month: 'महिना',
+      week: 'हप्ता',
+      day: 'दिन',
+      list: 'सूची',
+    },
+    weekText: 'हप्ता',
+    allDayText: 'दिनभरि',
+    moreLinkText: 'थप लिंक',
+    noEventsText: 'देखाउनको लागि कुनै घटनाहरू छैनन्',
+  };
+
+  var l47 = {
+    code: 'nl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Voorgaand',
+      next: 'Volgende',
+      today: 'Vandaag',
+      year: 'Jaar',
+      month: 'Maand',
+      week: 'Week',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    allDayText: 'Hele dag',
+    moreLinkText: 'extra',
+    noEventsText: 'Geen evenementen om te laten zien',
+  };
+
+  var l48 = {
+    code: 'nn',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Førre',
+      next: 'Neste',
+      today: 'I dag',
+      month: 'Månad',
+      week: 'Veke',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    weekText: 'Veke',
+    allDayText: 'Heile dagen',
+    moreLinkText: 'til',
+    noEventsText: 'Ingen hendelser å vise',
+  };
+
+  var l49 = {
+    code: 'pl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Poprzedni',
+      next: 'Następny',
+      today: 'Dziś',
+      month: 'Miesiąc',
+      week: 'Tydzień',
+      day: 'Dzień',
+      list: 'Plan dnia',
+    },
+    weekText: 'Tydz',
+    allDayText: 'Cały dzień',
+    moreLinkText: 'więcej',
+    noEventsText: 'Brak wydarzeń do wyświetlenia',
+  };
+
+  var l50 = {
+    code: 'pt-br',
+    buttonText: {
+      prev: 'Anterior',
+      next: 'Próximo',
+      today: 'Hoje',
+      month: 'Mês',
+      week: 'Semana',
+      day: 'Dia',
+      list: 'Lista',
+    },
+    weekText: 'Sm',
+    allDayText: 'dia inteiro',
+    moreLinkText(n) {
+      return 'mais +' + n
+    },
+    noEventsText: 'Não há eventos para mostrar',
+  };
+
+  var l51 = {
+    code: 'pt',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Anterior',
+      next: 'Seguinte',
+      today: 'Hoje',
+      month: 'Mês',
+      week: 'Semana',
+      day: 'Dia',
+      list: 'Agenda',
+    },
+    weekText: 'Sem',
+    allDayText: 'Todo o dia',
+    moreLinkText: 'mais',
+    noEventsText: 'Não há eventos para mostrar',
+  };
+
+  var l52 = {
+    code: 'ro',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'precedentă',
+      next: 'următoare',
+      today: 'Azi',
+      month: 'Lună',
+      week: 'Săptămână',
+      day: 'Zi',
+      list: 'Agendă',
+    },
+    weekText: 'Săpt',
+    allDayText: 'Toată ziua',
+    moreLinkText(n) {
+      return '+alte ' + n
+    },
+    noEventsText: 'Nu există evenimente de afișat',
+  };
+
+  var l53 = {
+    code: 'ru',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Пред',
+      next: 'След',
+      today: 'Сегодня',
+      month: 'Месяц',
+      week: 'Неделя',
+      day: 'День',
+      list: 'Повестка дня',
+    },
+    weekText: 'Нед',
+    allDayText: 'Весь день',
+    moreLinkText(n) {
+      return '+ ещё ' + n
+    },
+    noEventsText: 'Нет событий для отображения',
+  };
+
+  var l54 = {
+    code: 'sk',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Predchádzajúci',
+      next: 'Nasledujúci',
+      today: 'Dnes',
+      month: 'Mesiac',
+      week: 'Týždeň',
+      day: 'Deň',
+      list: 'Rozvrh',
+    },
+    weekText: 'Ty',
+    allDayText: 'Celý deň',
+    moreLinkText(n) {
+      return '+ďalšie: ' + n
+    },
+    noEventsText: 'Žiadne akcie na zobrazenie',
+  };
+
+  var l55 = {
+    code: 'sl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prejšnji',
+      next: 'Naslednji',
+      today: 'Trenutni',
+      month: 'Mesec',
+      week: 'Teden',
+      day: 'Dan',
+      list: 'Dnevni red',
+    },
+    weekText: 'Teden',
+    allDayText: 'Ves dan',
+    moreLinkText: 'več',
+    noEventsText: 'Ni dogodkov za prikaz',
+  };
+
+  var l56 = {
+    code: 'sq',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'mbrapa',
+      next: 'Përpara',
+      today: 'sot',
+      month: 'Muaj',
+      week: 'Javë',
+      day: 'Ditë',
+      list: 'Listë',
+    },
+    weekText: 'Ja',
+    allDayText: 'Gjithë ditën',
+    moreLinkText(n) {
+      return '+më tepër ' + n
+    },
+    noEventsText: 'Nuk ka evente për të shfaqur',
+  };
+
+  var l57 = {
+    code: 'sr-cyrl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Претходна',
+      next: 'следећи',
+      today: 'Данас',
+      month: 'Месец',
+      week: 'Недеља',
+      day: 'Дан',
+      list: 'Планер',
+    },
+    weekText: 'Сед',
+    allDayText: 'Цео дан',
+    moreLinkText(n) {
+      return '+ још ' + n
+    },
+    noEventsText: 'Нема догађаја за приказ',
+  };
+
+  var l58 = {
+    code: 'sr',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prethodna',
+      next: 'Sledeći',
+      today: 'Danas',
+      month: 'Mеsеc',
+      week: 'Nеdеlja',
+      day: 'Dan',
+      list: 'Planеr',
+    },
+    weekText: 'Sed',
+    allDayText: 'Cеo dan',
+    moreLinkText(n) {
+      return '+ još ' + n
+    },
+    noEventsText: 'Nеma događaja za prikaz',
+  };
+
+  var l59 = {
+    code: 'sv',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Förra',
+      next: 'Nästa',
+      today: 'Idag',
+      month: 'Månad',
+      week: 'Vecka',
+      day: 'Dag',
+      list: 'Program',
+    },
+    weekText: 'v.',
+    allDayText: 'Heldag',
+    moreLinkText: 'till',
+    noEventsText: 'Inga händelser att visa',
+  };
+
+  var l60 = {
+    code: 'th',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'ก่อนหน้า',
+      next: 'ถัดไป',
+      prevYear: 'ปีก่อนหน้า',
+      nextYear: 'ปีถัดไป',
+      year: 'ปี',
+      today: 'วันนี้',
+      month: 'เดือน',
+      week: 'สัปดาห์',
+      day: 'วัน',
+      list: 'กำหนดการ',
+    },
+    weekText: 'สัปดาห์',
+    allDayText: 'ตลอดวัน',
+    moreLinkText: 'เพิ่มเติม',
+    noEventsText: 'ไม่มีกิจกรรมที่จะแสดง',
+  };
+
+  var l61 = {
+    code: 'tr',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'geri',
+      next: 'ileri',
+      today: 'bugün',
+      month: 'Ay',
+      week: 'Hafta',
+      day: 'Gün',
+      list: 'Ajanda',
+    },
+    weekText: 'Hf',
+    allDayText: 'Tüm gün',
+    moreLinkText: 'daha fazla',
+    noEventsText: 'Gösterilecek etkinlik yok',
+  };
+
+  var l62 = {
+    code: 'ug',
+    buttonText: {
+      month: 'ئاي',
+      week: 'ھەپتە',
+      day: 'كۈن',
+      list: 'كۈنتەرتىپ',
+    },
+    allDayText: 'پۈتۈن كۈن',
+  };
+
+  var l63 = {
+    code: 'uk',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Попередній',
+      next: 'далі',
+      today: 'Сьогодні',
+      month: 'Місяць',
+      week: 'Тиждень',
+      day: 'День',
+      list: 'Порядок денний',
+    },
+    weekText: 'Тиж',
+    allDayText: 'Увесь день',
+    moreLinkText(n) {
+      return '+ще ' + n + '...'
+    },
+    noEventsText: 'Немає подій для відображення',
+  };
+
+  var l64 = {
+    code: 'uz',
+    buttonText: {
+      month: 'Oy',
+      week: 'Xafta',
+      day: 'Kun',
+      list: 'Kun tartibi',
+    },
+    allDayText: "Kun bo'yi",
+    moreLinkText(n) {
+      return '+ yana ' + n
+    },
+    noEventsText: "Ko'rsatish uchun voqealar yo'q",
+  };
+
+  var l65 = {
+    code: 'vi',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Trước',
+      next: 'Tiếp',
+      today: 'Hôm nay',
+      month: 'Tháng',
+      week: 'Tuần',
+      day: 'Ngày',
+      list: 'Lịch biểu',
+    },
+    weekText: 'Tu',
+    allDayText: 'Cả ngày',
+    moreLinkText(n) {
+      return '+ thêm ' + n
+    },
+    noEventsText: 'Không có sự kiện để hiển thị',
+  };
+
+  var l66 = {
+    code: 'zh-cn',
+    week: {
+      // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: '上月',
+      next: '下月',
+      today: '今天',
+      month: '月',
+      week: '周',
+      day: '日',
+      list: '日程',
+    },
+    weekText: '周',
+    allDayText: '全天',
+    moreLinkText(n) {
+      return '另外 ' + n + ' 个'
+    },
+    noEventsText: '没有事件显示',
+  };
+
+  var l67 = {
+    code: 'zh-tw',
+    buttonText: {
+      prev: '上月',
+      next: '下月',
+      today: '今天',
+      month: '月',
+      week: '週',
+      day: '天',
+      list: '活動列表',
+    },
+    weekText: '周',
+    allDayText: '整天',
+    moreLinkText: '顯示更多',
+    noEventsText: '没有任何活動',
+  };
+
+  /* eslint max-len: off */
+
+  var localesAll = [
+    l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, l61, l62, l63, l64, l65, l66, l67, 
+  ];
+
+  return localesAll;
+
+}());

File diff suppressed because it is too large
+ 0 - 0
app/lib/locales-all.min.js


+ 27 - 0
app/lib/locales/af.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var af = {
+    code: 'af',
+    week: {
+      dow: 1, // Maandag is die eerste dag van die week.
+      doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+    },
+    buttonText: {
+      prev: 'Vorige',
+      next: 'Volgende',
+      today: 'Vandag',
+      year: 'Jaar',
+      month: 'Maand',
+      week: 'Week',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    allDayText: 'Heeldag',
+    moreLinkText: 'Addisionele',
+    noEventsText: 'Daar is geen gebeurtenisse nie',
+  };
+
+  return af;
+
+}());

+ 28 - 0
app/lib/locales/ar-dz.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arDz = {
+    code: 'ar-dz',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 4, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  return arDz;
+
+}());

+ 28 - 0
app/lib/locales/ar-kw.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arKw = {
+    code: 'ar-kw',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  return arKw;
+
+}());

+ 28 - 0
app/lib/locales/ar-ly.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arLy = {
+    code: 'ar-ly',
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  return arLy;
+
+}());

+ 28 - 0
app/lib/locales/ar-ma.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arMa = {
+    code: 'ar-ma',
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  return arMa;
+
+}());

+ 28 - 0
app/lib/locales/ar-sa.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arSa = {
+    code: 'ar-sa',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  return arSa;
+
+}());

+ 28 - 0
app/lib/locales/ar-tn.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arTn = {
+    code: 'ar-tn',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  return arTn;
+
+}());

+ 28 - 0
app/lib/locales/ar.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ar = {
+    code: 'ar',
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'السابق',
+      next: 'التالي',
+      today: 'اليوم',
+      month: 'شهر',
+      week: 'أسبوع',
+      day: 'يوم',
+      list: 'أجندة',
+    },
+    weekText: 'أسبوع',
+    allDayText: 'اليوم كله',
+    moreLinkText: 'أخرى',
+    noEventsText: 'أي أحداث لعرض',
+  };
+
+  return ar;
+
+}());

+ 29 - 0
app/lib/locales/az.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var az = {
+    code: 'az',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Əvvəl',
+      next: 'Sonra',
+      today: 'Bu Gün',
+      month: 'Ay',
+      week: 'Həftə',
+      day: 'Gün',
+      list: 'Gündəm',
+    },
+    weekText: 'Həftə',
+    allDayText: 'Bütün Gün',
+    moreLinkText(n) {
+      return '+ daha çox ' + n
+    },
+    noEventsText: 'Göstərmək üçün hadisə yoxdur',
+  };
+
+  return az;
+
+}());

+ 28 - 0
app/lib/locales/bg.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var bg = {
+    code: 'bg',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'назад',
+      next: 'напред',
+      today: 'днес',
+      month: 'Месец',
+      week: 'Седмица',
+      day: 'Ден',
+      list: 'График',
+    },
+    allDayText: 'Цял ден',
+    moreLinkText(n) {
+      return '+още ' + n
+    },
+    noEventsText: 'Няма събития за показване',
+  };
+
+  return bg;
+
+}());

+ 29 - 0
app/lib/locales/bs.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var bs = {
+    code: 'bs',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prošli',
+      next: 'Sljedeći',
+      today: 'Danas',
+      month: 'Mjesec',
+      week: 'Sedmica',
+      day: 'Dan',
+      list: 'Raspored',
+    },
+    weekText: 'Sed',
+    allDayText: 'Cijeli dan',
+    moreLinkText(n) {
+      return '+ još ' + n
+    },
+    noEventsText: 'Nema događaja za prikazivanje',
+  };
+
+  return bs;
+
+}());

+ 27 - 0
app/lib/locales/ca.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ca = {
+    code: 'ca',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Anterior',
+      next: 'Següent',
+      today: 'Avui',
+      month: 'Mes',
+      week: 'Setmana',
+      day: 'Dia',
+      list: 'Agenda',
+    },
+    weekText: 'Set',
+    allDayText: 'Tot el dia',
+    moreLinkText: 'més',
+    noEventsText: 'No hi ha esdeveniments per mostrar',
+  };
+
+  return ca;
+
+}());

+ 29 - 0
app/lib/locales/cs.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var cs = {
+    code: 'cs',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Dříve',
+      next: 'Později',
+      today: 'Nyní',
+      month: 'Měsíc',
+      week: 'Týden',
+      day: 'Den',
+      list: 'Agenda',
+    },
+    weekText: 'Týd',
+    allDayText: 'Celý den',
+    moreLinkText(n) {
+      return '+další: ' + n
+    },
+    noEventsText: 'Žádné akce k zobrazení',
+  };
+
+  return cs;
+
+}());

+ 27 - 0
app/lib/locales/da.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var da = {
+    code: 'da',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Forrige',
+      next: 'Næste',
+      today: 'I dag',
+      month: 'Måned',
+      week: 'Uge',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    weekText: 'Uge',
+    allDayText: 'Hele dagen',
+    moreLinkText: 'flere',
+    noEventsText: 'Ingen arrangementer at vise',
+  };
+
+  return da;
+
+}());

+ 30 - 0
app/lib/locales/de.js

@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var de = {
+    code: 'de',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Zurück',
+      next: 'Vor',
+      today: 'Heute',
+      year: 'Jahr',
+      month: 'Monat',
+      week: 'Woche',
+      day: 'Tag',
+      list: 'Terminübersicht',
+    },
+    weekText: 'KW',
+    allDayText: 'Ganztägig',
+    moreLinkText(n) {
+      return '+ weitere ' + n
+    },
+    noEventsText: 'Keine Ereignisse anzuzeigen',
+  };
+
+  return de;
+
+}());

+ 27 - 0
app/lib/locales/el.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var el = {
+    code: 'el',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Προηγούμενος',
+      next: 'Επόμενος',
+      today: 'Σήμερα',
+      month: 'Μήνας',
+      week: 'Εβδομάδα',
+      day: 'Ημέρα',
+      list: 'Ατζέντα',
+    },
+    weekText: 'Εβδ',
+    allDayText: 'Ολοήμερο',
+    moreLinkText: 'περισσότερα',
+    noEventsText: 'Δεν υπάρχουν γεγονότα προς εμφάνιση',
+  };
+
+  return el;
+
+}());

+ 14 - 0
app/lib/locales/en-au.js

@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enAu = {
+    code: 'en-au',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+  };
+
+  return enAu;
+
+}());

+ 14 - 0
app/lib/locales/en-gb.js

@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enGb = {
+    code: 'en-gb',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+  };
+
+  return enGb;
+
+}());

+ 14 - 0
app/lib/locales/en-nz.js

@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enNz = {
+    code: 'en-nz',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+  };
+
+  return enNz;
+
+}());

+ 27 - 0
app/lib/locales/es-us.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var esUs = {
+    code: 'es',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Ant',
+      next: 'Sig',
+      today: 'Hoy',
+      month: 'Mes',
+      week: 'Semana',
+      day: 'Día',
+      list: 'Agenda',
+    },
+    weekText: 'Sm',
+    allDayText: 'Todo el día',
+    moreLinkText: 'más',
+    noEventsText: 'No hay eventos para mostrar',
+  };
+
+  return esUs;
+
+}());

+ 27 - 0
app/lib/locales/es.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var es = {
+    code: 'es',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Ant',
+      next: 'Sig',
+      today: 'Hoy',
+      month: 'Mes',
+      week: 'Semana',
+      day: 'Día',
+      list: 'Agenda',
+    },
+    weekText: 'Sm',
+    allDayText: 'Todo el día',
+    moreLinkText: 'más',
+    noEventsText: 'No hay eventos para mostrar',
+  };
+
+  return es;
+
+}());

+ 29 - 0
app/lib/locales/et.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var et = {
+    code: 'et',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Eelnev',
+      next: 'Järgnev',
+      today: 'Täna',
+      month: 'Kuu',
+      week: 'Nädal',
+      day: 'Päev',
+      list: 'Päevakord',
+    },
+    weekText: 'näd',
+    allDayText: 'Kogu päev',
+    moreLinkText(n) {
+      return '+ veel ' + n
+    },
+    noEventsText: 'Kuvamiseks puuduvad sündmused',
+  };
+
+  return et;
+
+}());

+ 27 - 0
app/lib/locales/eu.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var eu = {
+    code: 'eu',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Aur',
+      next: 'Hur',
+      today: 'Gaur',
+      month: 'Hilabetea',
+      week: 'Astea',
+      day: 'Eguna',
+      list: 'Agenda',
+    },
+    weekText: 'As',
+    allDayText: 'Egun osoa',
+    moreLinkText: 'gehiago',
+    noEventsText: 'Ez dago ekitaldirik erakusteko',
+  };
+
+  return eu;
+
+}());

+ 30 - 0
app/lib/locales/fa.js

@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fa = {
+    code: 'fa',
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12, // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: 'قبلی',
+      next: 'بعدی',
+      today: 'امروز',
+      month: 'ماه',
+      week: 'هفته',
+      day: 'روز',
+      list: 'برنامه',
+    },
+    weekText: 'هف',
+    allDayText: 'تمام روز',
+    moreLinkText(n) {
+      return 'بیش از ' + n
+    },
+    noEventsText: 'هیچ رویدادی به نمایش',
+  };
+
+  return fa;
+
+}());

+ 27 - 0
app/lib/locales/fi.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fi = {
+    code: 'fi',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Edellinen',
+      next: 'Seuraava',
+      today: 'Tänään',
+      month: 'Kuukausi',
+      week: 'Viikko',
+      day: 'Päivä',
+      list: 'Tapahtumat',
+    },
+    weekText: 'Vk',
+    allDayText: 'Koko päivä',
+    moreLinkText: 'lisää',
+    noEventsText: 'Ei näytettäviä tapahtumia',
+  };
+
+  return fi;
+
+}());

+ 24 - 0
app/lib/locales/fr-ca.js

@@ -0,0 +1,24 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var frCa = {
+    code: 'fr',
+    buttonText: {
+      prev: 'Précédent',
+      next: 'Suivant',
+      today: "Aujourd'hui",
+      year: 'Année',
+      month: 'Mois',
+      week: 'Semaine',
+      day: 'Jour',
+      list: 'Mon planning',
+    },
+    weekText: 'Sem.',
+    allDayText: 'Toute la journée',
+    moreLinkText: 'en plus',
+    noEventsText: 'Aucun événement à afficher',
+  };
+
+  return frCa;
+
+}());

+ 28 - 0
app/lib/locales/fr-ch.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var frCh = {
+    code: 'fr-ch',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Précédent',
+      next: 'Suivant',
+      today: 'Courant',
+      year: 'Année',
+      month: 'Mois',
+      week: 'Semaine',
+      day: 'Jour',
+      list: 'Mon planning',
+    },
+    weekText: 'Sm',
+    allDayText: 'Toute la journée',
+    moreLinkText: 'en plus',
+    noEventsText: 'Aucun événement à afficher',
+  };
+
+  return frCh;
+
+}());

+ 28 - 0
app/lib/locales/fr.js

@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fr = {
+    code: 'fr',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Précédent',
+      next: 'Suivant',
+      today: "Aujourd'hui",
+      year: 'Année',
+      month: 'Mois',
+      week: 'Semaine',
+      day: 'Jour',
+      list: 'Planning',
+    },
+    weekText: 'Sem.',
+    allDayText: 'Toute la journée',
+    moreLinkText: 'en plus',
+    noEventsText: 'Aucun événement à afficher',
+  };
+
+  return fr;
+
+}());

+ 27 - 0
app/lib/locales/gl.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var gl = {
+    code: 'gl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Ant',
+      next: 'Seg',
+      today: 'Hoxe',
+      month: 'Mes',
+      week: 'Semana',
+      day: 'Día',
+      list: 'Axenda',
+    },
+    weekText: 'Sm',
+    allDayText: 'Todo o día',
+    moreLinkText: 'máis',
+    noEventsText: 'Non hai eventos para amosar',
+  };
+
+  return gl;
+
+}());

+ 24 - 0
app/lib/locales/he.js

@@ -0,0 +1,24 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var he = {
+    code: 'he',
+    direction: 'rtl',
+    buttonText: {
+      prev: 'הקודם',
+      next: 'הבא',
+      today: 'היום',
+      month: 'חודש',
+      week: 'שבוע',
+      day: 'יום',
+      list: 'סדר יום',
+    },
+    allDayText: 'כל היום',
+    moreLinkText: 'אחר',
+    noEventsText: 'אין אירועים להצגה',
+    weekText: 'שבוע',
+  };
+
+  return he;
+
+}());

+ 29 - 0
app/lib/locales/hi.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hi = {
+    code: 'hi',
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'पिछला',
+      next: 'अगला',
+      today: 'आज',
+      month: 'महीना',
+      week: 'सप्ताह',
+      day: 'दिन',
+      list: 'कार्यसूची',
+    },
+    weekText: 'हफ्ता',
+    allDayText: 'सभी दिन',
+    moreLinkText(n) {
+      return '+अधिक ' + n
+    },
+    noEventsText: 'कोई घटनाओं को प्रदर्शित करने के लिए',
+  };
+
+  return hi;
+
+}());

+ 29 - 0
app/lib/locales/hr.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hr = {
+    code: 'hr',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prijašnji',
+      next: 'Sljedeći',
+      today: 'Danas',
+      month: 'Mjesec',
+      week: 'Tjedan',
+      day: 'Dan',
+      list: 'Raspored',
+    },
+    weekText: 'Tje',
+    allDayText: 'Cijeli dan',
+    moreLinkText(n) {
+      return '+ još ' + n
+    },
+    noEventsText: 'Nema događaja za prikaz',
+  };
+
+  return hr;
+
+}());

+ 27 - 0
app/lib/locales/hu.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hu = {
+    code: 'hu',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'vissza',
+      next: 'előre',
+      today: 'ma',
+      month: 'Hónap',
+      week: 'Hét',
+      day: 'Nap',
+      list: 'Napló',
+    },
+    weekText: 'Hét',
+    allDayText: 'Egész nap',
+    moreLinkText: 'további',
+    noEventsText: 'Nincs megjeleníthető esemény',
+  };
+
+  return hu;
+
+}());

+ 27 - 0
app/lib/locales/id.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var id = {
+    code: 'id',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'mundur',
+      next: 'maju',
+      today: 'hari ini',
+      month: 'Bulan',
+      week: 'Minggu',
+      day: 'Hari',
+      list: 'Agenda',
+    },
+    weekText: 'Mg',
+    allDayText: 'Sehari penuh',
+    moreLinkText: 'lebih',
+    noEventsText: 'Tidak ada acara untuk ditampilkan',
+  };
+
+  return id;
+
+}());

+ 27 - 0
app/lib/locales/is.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var is = {
+    code: 'is',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Fyrri',
+      next: 'Næsti',
+      today: 'Í dag',
+      month: 'Mánuður',
+      week: 'Vika',
+      day: 'Dagur',
+      list: 'Dagskrá',
+    },
+    weekText: 'Vika',
+    allDayText: 'Allan daginn',
+    moreLinkText: 'meira',
+    noEventsText: 'Engir viðburðir til að sýna',
+  };
+
+  return is;
+
+}());

+ 29 - 0
app/lib/locales/it.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var it = {
+    code: 'it',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prec',
+      next: 'Succ',
+      today: 'Oggi',
+      month: 'Mese',
+      week: 'Settimana',
+      day: 'Giorno',
+      list: 'Agenda',
+    },
+    weekText: 'Sm',
+    allDayText: 'Tutto il giorno',
+    moreLinkText(n) {
+      return '+altri ' + n
+    },
+    noEventsText: 'Non ci sono eventi da visualizzare',
+  };
+
+  return it;
+
+}());

+ 25 - 0
app/lib/locales/ja.js

@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ja = {
+    code: 'ja',
+    buttonText: {
+      prev: '前',
+      next: '次',
+      today: '今日',
+      month: '月',
+      week: '週',
+      day: '日',
+      list: '予定リスト',
+    },
+    weekText: '週',
+    allDayText: '終日',
+    moreLinkText(n) {
+      return '他 ' + n + ' 件'
+    },
+    noEventsText: '表示する予定はありません',
+  };
+
+  return ja;
+
+}());

+ 29 - 0
app/lib/locales/ka.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ka = {
+    code: 'ka',
+    week: {
+      dow: 1,
+      doy: 7,
+    },
+    buttonText: {
+      prev: 'წინა',
+      next: 'შემდეგი',
+      today: 'დღეს',
+      month: 'თვე',
+      week: 'კვირა',
+      day: 'დღე',
+      list: 'დღის წესრიგი',
+    },
+    weekText: 'კვ',
+    allDayText: 'მთელი დღე',
+    moreLinkText(n) {
+      return '+ კიდევ ' + n
+    },
+    noEventsText: 'ღონისძიებები არ არის',
+  };
+
+  return ka;
+
+}());

+ 29 - 0
app/lib/locales/kk.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var kk = {
+    code: 'kk',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Алдыңғы',
+      next: 'Келесі',
+      today: 'Бүгін',
+      month: 'Ай',
+      week: 'Апта',
+      day: 'Күн',
+      list: 'Күн тәртібі',
+    },
+    weekText: 'Не',
+    allDayText: 'Күні бойы',
+    moreLinkText(n) {
+      return '+ тағы ' + n
+    },
+    noEventsText: 'Көрсету үшін оқиғалар жоқ',
+  };
+
+  return kk;
+
+}());

+ 23 - 0
app/lib/locales/ko.js

@@ -0,0 +1,23 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ko = {
+    code: 'ko',
+    buttonText: {
+      prev: '이전달',
+      next: '다음달',
+      today: '오늘',
+      month: '월',
+      week: '주',
+      day: '일',
+      list: '일정목록',
+    },
+    weekText: '주',
+    allDayText: '종일',
+    moreLinkText: '개',
+    noEventsText: '일정이 없습니다',
+  };
+
+  return ko;
+
+}());

+ 27 - 0
app/lib/locales/lb.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lb = {
+    code: 'lb',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Zréck',
+      next: 'Weider',
+      today: 'Haut',
+      month: 'Mount',
+      week: 'Woch',
+      day: 'Dag',
+      list: 'Terminiwwersiicht',
+    },
+    weekText: 'W',
+    allDayText: 'Ganzen Dag',
+    moreLinkText: 'méi',
+    noEventsText: 'Nee Evenementer ze affichéieren',
+  };
+
+  return lb;
+
+}());

+ 27 - 0
app/lib/locales/lt.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lt = {
+    code: 'lt',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Atgal',
+      next: 'Pirmyn',
+      today: 'Šiandien',
+      month: 'Mėnuo',
+      week: 'Savaitė',
+      day: 'Diena',
+      list: 'Darbotvarkė',
+    },
+    weekText: 'SAV',
+    allDayText: 'Visą dieną',
+    moreLinkText: 'daugiau',
+    noEventsText: 'Nėra įvykių rodyti',
+  };
+
+  return lt;
+
+}());

+ 29 - 0
app/lib/locales/lv.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lv = {
+    code: 'lv',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Iepr.',
+      next: 'Nāk.',
+      today: 'Šodien',
+      month: 'Mēnesis',
+      week: 'Nedēļa',
+      day: 'Diena',
+      list: 'Dienas kārtība',
+    },
+    weekText: 'Ned.',
+    allDayText: 'Visu dienu',
+    moreLinkText(n) {
+      return '+vēl ' + n
+    },
+    noEventsText: 'Nav notikumu',
+  };
+
+  return lv;
+
+}());

+ 25 - 0
app/lib/locales/mk.js

@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var mk = {
+    code: 'mk',
+    buttonText: {
+      prev: 'претходно',
+      next: 'следно',
+      today: 'Денес',
+      month: 'Месец',
+      week: 'Недела',
+      day: 'Ден',
+      list: 'График',
+    },
+    weekText: 'Сед',
+    allDayText: 'Цел ден',
+    moreLinkText(n) {
+      return '+повеќе ' + n
+    },
+    noEventsText: 'Нема настани за прикажување',
+  };
+
+  return mk;
+
+}());

+ 29 - 0
app/lib/locales/ms.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ms = {
+    code: 'ms',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Sebelum',
+      next: 'Selepas',
+      today: 'hari ini',
+      month: 'Bulan',
+      week: 'Minggu',
+      day: 'Hari',
+      list: 'Agenda',
+    },
+    weekText: 'Mg',
+    allDayText: 'Sepanjang hari',
+    moreLinkText(n) {
+      return 'masih ada ' + n + ' acara'
+    },
+    noEventsText: 'Tiada peristiwa untuk dipaparkan',
+  };
+
+  return ms;
+
+}());

+ 27 - 0
app/lib/locales/nb.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nb = {
+    code: 'nb',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Forrige',
+      next: 'Neste',
+      today: 'I dag',
+      month: 'Måned',
+      week: 'Uke',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    weekText: 'Uke',
+    allDayText: 'Hele dagen',
+    moreLinkText: 'til',
+    noEventsText: 'Ingen hendelser å vise',
+  };
+
+  return nb;
+
+}());

+ 27 - 0
app/lib/locales/ne.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ne = {
+    code: 'ne', // code for nepal
+    week: {
+      dow: 7, // Sunday is the first day of the week.
+      doy: 1, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'अघिल्लो',
+      next: 'अर्को',
+      today: 'आज',
+      month: 'महिना',
+      week: 'हप्ता',
+      day: 'दिन',
+      list: 'सूची',
+    },
+    weekText: 'हप्ता',
+    allDayText: 'दिनभरि',
+    moreLinkText: 'थप लिंक',
+    noEventsText: 'देखाउनको लागि कुनै घटनाहरू छैनन्',
+  };
+
+  return ne;
+
+}());

+ 27 - 0
app/lib/locales/nl.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nl = {
+    code: 'nl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Voorgaand',
+      next: 'Volgende',
+      today: 'Vandaag',
+      year: 'Jaar',
+      month: 'Maand',
+      week: 'Week',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    allDayText: 'Hele dag',
+    moreLinkText: 'extra',
+    noEventsText: 'Geen evenementen om te laten zien',
+  };
+
+  return nl;
+
+}());

+ 27 - 0
app/lib/locales/nn.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nn = {
+    code: 'nn',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Førre',
+      next: 'Neste',
+      today: 'I dag',
+      month: 'Månad',
+      week: 'Veke',
+      day: 'Dag',
+      list: 'Agenda',
+    },
+    weekText: 'Veke',
+    allDayText: 'Heile dagen',
+    moreLinkText: 'til',
+    noEventsText: 'Ingen hendelser å vise',
+  };
+
+  return nn;
+
+}());

+ 27 - 0
app/lib/locales/pl.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var pl = {
+    code: 'pl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Poprzedni',
+      next: 'Następny',
+      today: 'Dziś',
+      month: 'Miesiąc',
+      week: 'Tydzień',
+      day: 'Dzień',
+      list: 'Plan dnia',
+    },
+    weekText: 'Tydz',
+    allDayText: 'Cały dzień',
+    moreLinkText: 'więcej',
+    noEventsText: 'Brak wydarzeń do wyświetlenia',
+  };
+
+  return pl;
+
+}());

+ 25 - 0
app/lib/locales/pt-br.js

@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ptBr = {
+    code: 'pt-br',
+    buttonText: {
+      prev: 'Anterior',
+      next: 'Próximo',
+      today: 'Hoje',
+      month: 'Mês',
+      week: 'Semana',
+      day: 'Dia',
+      list: 'Lista',
+    },
+    weekText: 'Sm',
+    allDayText: 'dia inteiro',
+    moreLinkText(n) {
+      return 'mais +' + n
+    },
+    noEventsText: 'Não há eventos para mostrar',
+  };
+
+  return ptBr;
+
+}());

+ 27 - 0
app/lib/locales/pt.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var pt = {
+    code: 'pt',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Anterior',
+      next: 'Seguinte',
+      today: 'Hoje',
+      month: 'Mês',
+      week: 'Semana',
+      day: 'Dia',
+      list: 'Agenda',
+    },
+    weekText: 'Sem',
+    allDayText: 'Todo o dia',
+    moreLinkText: 'mais',
+    noEventsText: 'Não há eventos para mostrar',
+  };
+
+  return pt;
+
+}());

+ 29 - 0
app/lib/locales/ro.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ro = {
+    code: 'ro',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'precedentă',
+      next: 'următoare',
+      today: 'Azi',
+      month: 'Lună',
+      week: 'Săptămână',
+      day: 'Zi',
+      list: 'Agendă',
+    },
+    weekText: 'Săpt',
+    allDayText: 'Toată ziua',
+    moreLinkText(n) {
+      return '+alte ' + n
+    },
+    noEventsText: 'Nu există evenimente de afișat',
+  };
+
+  return ro;
+
+}());

+ 29 - 0
app/lib/locales/ru.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ru = {
+    code: 'ru',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Пред',
+      next: 'След',
+      today: 'Сегодня',
+      month: 'Месяц',
+      week: 'Неделя',
+      day: 'День',
+      list: 'Повестка дня',
+    },
+    weekText: 'Нед',
+    allDayText: 'Весь день',
+    moreLinkText(n) {
+      return '+ ещё ' + n
+    },
+    noEventsText: 'Нет событий для отображения',
+  };
+
+  return ru;
+
+}());

+ 29 - 0
app/lib/locales/sk.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sk = {
+    code: 'sk',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Predchádzajúci',
+      next: 'Nasledujúci',
+      today: 'Dnes',
+      month: 'Mesiac',
+      week: 'Týždeň',
+      day: 'Deň',
+      list: 'Rozvrh',
+    },
+    weekText: 'Ty',
+    allDayText: 'Celý deň',
+    moreLinkText(n) {
+      return '+ďalšie: ' + n
+    },
+    noEventsText: 'Žiadne akcie na zobrazenie',
+  };
+
+  return sk;
+
+}());

+ 27 - 0
app/lib/locales/sl.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sl = {
+    code: 'sl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prejšnji',
+      next: 'Naslednji',
+      today: 'Trenutni',
+      month: 'Mesec',
+      week: 'Teden',
+      day: 'Dan',
+      list: 'Dnevni red',
+    },
+    weekText: 'Teden',
+    allDayText: 'Ves dan',
+    moreLinkText: 'več',
+    noEventsText: 'Ni dogodkov za prikaz',
+  };
+
+  return sl;
+
+}());

+ 29 - 0
app/lib/locales/sq.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sq = {
+    code: 'sq',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'mbrapa',
+      next: 'Përpara',
+      today: 'sot',
+      month: 'Muaj',
+      week: 'Javë',
+      day: 'Ditë',
+      list: 'Listë',
+    },
+    weekText: 'Ja',
+    allDayText: 'Gjithë ditën',
+    moreLinkText(n) {
+      return '+më tepër ' + n
+    },
+    noEventsText: 'Nuk ka evente për të shfaqur',
+  };
+
+  return sq;
+
+}());

+ 29 - 0
app/lib/locales/sr-cyrl.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var srCyrl = {
+    code: 'sr-cyrl',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Претходна',
+      next: 'следећи',
+      today: 'Данас',
+      month: 'Месец',
+      week: 'Недеља',
+      day: 'Дан',
+      list: 'Планер',
+    },
+    weekText: 'Сед',
+    allDayText: 'Цео дан',
+    moreLinkText(n) {
+      return '+ још ' + n
+    },
+    noEventsText: 'Нема догађаја за приказ',
+  };
+
+  return srCyrl;
+
+}());

+ 29 - 0
app/lib/locales/sr.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sr = {
+    code: 'sr',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Prethodna',
+      next: 'Sledeći',
+      today: 'Danas',
+      month: 'Mеsеc',
+      week: 'Nеdеlja',
+      day: 'Dan',
+      list: 'Planеr',
+    },
+    weekText: 'Sed',
+    allDayText: 'Cеo dan',
+    moreLinkText(n) {
+      return '+ još ' + n
+    },
+    noEventsText: 'Nеma događaja za prikaz',
+  };
+
+  return sr;
+
+}());

+ 27 - 0
app/lib/locales/sv.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sv = {
+    code: 'sv',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Förra',
+      next: 'Nästa',
+      today: 'Idag',
+      month: 'Månad',
+      week: 'Vecka',
+      day: 'Dag',
+      list: 'Program',
+    },
+    weekText: 'v.',
+    allDayText: 'Heldag',
+    moreLinkText: 'till',
+    noEventsText: 'Inga händelser att visa',
+  };
+
+  return sv;
+
+}());

+ 30 - 0
app/lib/locales/th.js

@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var th = {
+    code: 'th',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'ก่อนหน้า',
+      next: 'ถัดไป',
+      prevYear: 'ปีก่อนหน้า',
+      nextYear: 'ปีถัดไป',
+      year: 'ปี',
+      today: 'วันนี้',
+      month: 'เดือน',
+      week: 'สัปดาห์',
+      day: 'วัน',
+      list: 'กำหนดการ',
+    },
+    weekText: 'สัปดาห์',
+    allDayText: 'ตลอดวัน',
+    moreLinkText: 'เพิ่มเติม',
+    noEventsText: 'ไม่มีกิจกรรมที่จะแสดง',
+  };
+
+  return th;
+
+}());

+ 27 - 0
app/lib/locales/tr.js

@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var tr = {
+    code: 'tr',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'geri',
+      next: 'ileri',
+      today: 'bugün',
+      month: 'Ay',
+      week: 'Hafta',
+      day: 'Gün',
+      list: 'Ajanda',
+    },
+    weekText: 'Hf',
+    allDayText: 'Tüm gün',
+    moreLinkText: 'daha fazla',
+    noEventsText: 'Gösterilecek etkinlik yok',
+  };
+
+  return tr;
+
+}());

+ 17 - 0
app/lib/locales/ug.js

@@ -0,0 +1,17 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ug = {
+    code: 'ug',
+    buttonText: {
+      month: 'ئاي',
+      week: 'ھەپتە',
+      day: 'كۈن',
+      list: 'كۈنتەرتىپ',
+    },
+    allDayText: 'پۈتۈن كۈن',
+  };
+
+  return ug;
+
+}());

+ 29 - 0
app/lib/locales/uk.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var uk = {
+    code: 'uk',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7, // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Попередній',
+      next: 'далі',
+      today: 'Сьогодні',
+      month: 'Місяць',
+      week: 'Тиждень',
+      day: 'День',
+      list: 'Порядок денний',
+    },
+    weekText: 'Тиж',
+    allDayText: 'Увесь день',
+    moreLinkText(n) {
+      return '+ще ' + n + '...'
+    },
+    noEventsText: 'Немає подій для відображення',
+  };
+
+  return uk;
+
+}());

+ 21 - 0
app/lib/locales/uz.js

@@ -0,0 +1,21 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var uz = {
+    code: 'uz',
+    buttonText: {
+      month: 'Oy',
+      week: 'Xafta',
+      day: 'Kun',
+      list: 'Kun tartibi',
+    },
+    allDayText: "Kun bo'yi",
+    moreLinkText(n) {
+      return '+ yana ' + n
+    },
+    noEventsText: "Ko'rsatish uchun voqealar yo'q",
+  };
+
+  return uz;
+
+}());

+ 29 - 0
app/lib/locales/vi.js

@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var vi = {
+    code: 'vi',
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: 'Trước',
+      next: 'Tiếp',
+      today: 'Hôm nay',
+      month: 'Tháng',
+      week: 'Tuần',
+      day: 'Ngày',
+      list: 'Lịch biểu',
+    },
+    weekText: 'Tu',
+    allDayText: 'Cả ngày',
+    moreLinkText(n) {
+      return '+ thêm ' + n
+    },
+    noEventsText: 'Không có sự kiện để hiển thị',
+  };
+
+  return vi;
+
+}());

+ 30 - 0
app/lib/locales/zh-cn.js

@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var zhCn = {
+    code: 'zh-cn',
+    week: {
+      // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+      dow: 1, // Monday is the first day of the week.
+      doy: 4, // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: '上月',
+      next: '下月',
+      today: '今天',
+      month: '月',
+      week: '周',
+      day: '日',
+      list: '日程',
+    },
+    weekText: '周',
+    allDayText: '全天',
+    moreLinkText(n) {
+      return '另外 ' + n + ' 个'
+    },
+    noEventsText: '没有事件显示',
+  };
+
+  return zhCn;
+
+}());

+ 23 - 0
app/lib/locales/zh-tw.js

@@ -0,0 +1,23 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var zhTw = {
+    code: 'zh-tw',
+    buttonText: {
+      prev: '上月',
+      next: '下月',
+      today: '今天',
+      month: '月',
+      week: '週',
+      day: '天',
+      list: '活動列表',
+    },
+    weekText: '周',
+    allDayText: '整天',
+    moreLinkText: '顯示更多',
+    noEventsText: '没有任何活動',
+  };
+
+  return zhTw;
+
+}());

+ 355 - 0
app/lib/lune.js

@@ -0,0 +1,355 @@
+/**
+ * This library calculates the current phase of the moon
+ * as well as finds the dates of the recent moon phases.
+ *
+ * Some functionality is ported from python version found here:
+ * https://bazaar.launchpad.net/~keturn/py-moon-phase/trunk/annotate/head:/moon.py
+ *
+ * Some functionality is taken from Astronomical Algorithms, 2nd ed.
+ *
+ * Some functionality is taken from the US Naval Observatory, described here:
+ * https://aa.usno.navy.mil/faq/docs/SunApprox.php
+ *
+ * Author: Ryan Seys (https://github.com/ryanseys)
+ * Author: Jay LaPorte (https://github.com/ironwallaby)
+ */
+
+'use strict'
+
+const julian = require('./julian')
+
+// Phases of the moon & precision
+const NEW = 0
+const FIRST = 1
+const FULL = 2
+const LAST = 3
+const PHASE_MASK = 3
+
+// Astronomical Constants
+// Semi-major axis of Earth's orbit, in kilometers
+const SUN_SMAXIS = 1.49585e8
+
+// SUN_SMAXIS premultiplied by the angular size of the Sun from the Earth
+const SUN_ANGULAR_SIZE_SMAXIS = SUN_SMAXIS * 0.533128
+
+// Semi-major axis of the Moon's orbit, in kilometers
+const MOON_SMAXIS = 384401.0
+
+// MOON_SMAXIS premultiplied by the angular size of the Moon from the Earth
+const MOON_ANGULAR_SIZE_SMAXIS = MOON_SMAXIS * 0.5181
+
+// Synodic month (new Moon to new Moon), in days
+const SYNODIC_MONTH = 29.53058868
+
+/**
+ * Convert degrees to radians
+ * @param  {Number} d Angle in degrees
+ * @return {Number}   Angle in radians
+ */
+function torad (d) {
+  return (Math.PI / 180.0) * d
+}
+
+/**
+ * Convert radians to degrees
+ * @param  {Number} r Angle in radians
+ * @return {Number}   Angle in degrees
+ */
+function dsin (d) {
+  return Math.sin(torad(d))
+}
+
+function dcos (d) {
+  return Math.cos(torad(d))
+}
+
+/**
+ * Convert astronomical units to kilometers
+ * @param  {Number} au Distance in astronomical units
+ * @return {Number}    Distance in kilometers
+ */
+function tokm (au) {
+  return 149597870.700 * au
+}
+
+/**
+ * Finds the phase information for specific date.
+ * @param  {Date}   date Date to get phase information of.
+ * @return {Object}      Phase data
+ */
+function phase (date) {
+  if (!date) {
+    date = new Date()
+  }
+  if (!(date instanceof Date)) {
+    throw new TypeError('Invalid parameter')
+  }
+  if (Number.isNaN(date.getTime())) {
+    throw new RangeError('Invalid Date')
+  }
+
+  // t is the time in "Julian centuries" of 36525 days starting from 2000-01-01
+  // (Note the 0.3 is because the UNIX epoch is on 1970-01-01 and that's 3/10th
+  // of a century before 2000-01-01, which I find cute :3 )
+  const t = date.getTime() * (1 / 3155760000000) - 0.3
+
+  // lunar mean elongation (Astronomical Algorithms, 2nd ed., p. 338)
+  const d = 297.8501921 + t * (445267.1114034 + t * (-0.0018819 + t * ((1 / 545868) + t * (-1 / 113065000))))
+
+  // solar mean anomaly (p. 338)
+  const m = 357.5291092 + t * (35999.0502909 + t * (-0.0001536 + t * (1 / 24490000)))
+
+  // lunar mean anomaly (p. 338)
+  const n = 134.9633964 + t * (477198.8675055 + t * (0.0087414 + t * ((1 / 69699) + t * (-1 / 14712000))))
+
+  // derive sines and cosines necessary for the below calculations
+  const sind = dsin(d)
+  const sinm = dsin(m)
+  const sinn = dsin(n)
+  const cosd = dcos(d)
+  const cosm = dcos(m)
+  const cosn = dcos(n)
+
+  // use trigonometric identities to derive the remainder of the sines and
+  // cosines we need. this reduces us from needing 14 sin/cos calls to only 7,
+  // and makes the lunar distance and solar distance essentially free.
+  // http://mathworld.wolfram.com/Double-AngleFormulas.html
+  // http://mathworld.wolfram.com/TrigonometricAdditionFormulas.html
+  const sin2d = 2 * sind * cosd // sin(2d)
+  const sin2n = 2 * sinn * cosn // sin(2n)
+  const cos2d = 2 * cosd * cosd - 1 // cos(2d)
+  const cos2m = 2 * cosm * cosm - 1 // cos(2m)
+  const cos2n = 2 * cosn * cosn - 1 // cos(2n)
+  const sin2dn = sin2d * cosn - cos2d * sinn // sin(2d - n)
+  const cos2dn = cos2d * cosn + sin2d * sinn // cos(2d - n)
+
+  // lunar phase angle (p. 346)
+  const i = 180 - d - 6.289 * sinn + 2.100 * sinm - 1.274 * sin2dn - 0.658 * sin2d - 0.214 * sin2n - 0.110 * sind
+
+  // fractional illumination (p. 345)
+  const illumination = dcos(i) * 0.5 + 0.5
+
+  // fractional lunar phase
+  let phase = 0.5 - i * (1 / 360)
+  phase -= Math.floor(phase)
+
+  // lunar distance (p. 339-342)
+  // XXX: the book is not clear on how many terms to use for a given level of
+  // accuracy! I used all the easy ones that we already have for free above,
+  // but I imagine this is more than necessary...
+  const moonDistance = 385000.56 - 20905.355 * cosn - 3699.111 * cos2dn - 2955.968 * cos2d - 569.925 * cos2n + 108.743 * cosd
+
+  // solar distance
+  // https://aa.usno.navy.mil/faq/docs/SunApprox.php
+  const sunDistance = tokm(1.00014 - 0.01671 * cosm - 0.00014 * cos2m)
+
+  return {
+    phase: phase,
+    illuminated: illumination,
+    age: phase * SYNODIC_MONTH,
+    distance: moonDistance,
+    angular_diameter: MOON_ANGULAR_SIZE_SMAXIS / moonDistance,
+    sun_distance: sunDistance,
+    sun_angular_diameter: SUN_ANGULAR_SIZE_SMAXIS / sunDistance
+  }
+}
+
+/**
+ * Calculates time of the mean new Moon for a given base date.
+ * This argument K to this function is the precomputed synodic month
+ * index, given by:
+ *   K = (year - 1900) * 12.3685
+ * where year is expressed as a year and fractional year.
+ * @param  {Date} sdate   Start date
+ * @param  {[type]} k     [description]
+ * @return {[type]}       [description]
+ */
+function meanphase (sdate, k) {
+  // Time in Julian centuries from 1900 January 12 noon UTC
+  const delta = (sdate - -2208945600000.0) / 86400000.0
+  const t = delta / 36525
+  return 2415020.75933 +
+    SYNODIC_MONTH * k +
+    (0.0001178 - 0.000000155 * t) * t * t +
+    0.00033 * dsin(166.56 + (132.87 - 0.009173 * t) * t)
+}
+
+/**
+ * Given a K value used to determine the mean phase of the new moon, and a
+ * phase selector (0, 1, 2, 3), obtain the true, corrected phase time.
+ * @param  {[type]} k      [description]
+ * @param  {[type]} tphase [description]
+ * @return {[type]}        [description]
+ */
+function truephase (k, tphase) {
+  // restrict tphase to (0, 1, 2, 3)
+  tphase = tphase & PHASE_MASK
+
+  // add phase to new moon time
+  k = k + 0.25 * tphase
+
+  // Time in Julian centuries from 1900 January 0.5
+  const t = (1.0 / 1236.85) * k
+
+  // Mean time of phase
+  let pt = 2415020.75933 +
+    SYNODIC_MONTH * k +
+    (0.0001178 - 0.000000155 * t) * t * t +
+    0.00033 * dsin(166.56 + (132.87 - 0.009173 * t) * t)
+
+  // Sun's mean anomaly
+  const m = 359.2242 + 29.10535608 * k - (0.0000333 - 0.00000347 * t) * t * t
+
+  // Moon's mean anomaly
+  const mprime = 306.0253 + 385.81691806 * k + (0.0107306 + 0.00001236 * t) * t * t
+
+  // Moon's argument of latitude
+  const f = 21.2964 + 390.67050646 * k - (0.0016528 - 0.00000239 * t) * t * t
+
+  // use different correction equations depending on the phase being sought
+  switch (tphase) {
+    // new and full moon use one correction
+    case NEW:
+    case FULL:
+      pt += (0.1734 - 0.000393 * t) * dsin(m) +
+        0.0021 * dsin(2 * m) -
+        0.4068 * dsin(mprime) +
+        0.0161 * dsin(2 * mprime) -
+        0.0004 * dsin(3 * mprime) +
+        0.0104 * dsin(2 * f) -
+        0.0051 * dsin(m + mprime) -
+        0.0074 * dsin(m - mprime) +
+        0.0004 * dsin(2 * f + m) -
+        0.0004 * dsin(2 * f - m) -
+        0.0006 * dsin(2 * f + mprime) +
+        0.0010 * dsin(2 * f - mprime) +
+        0.0005 * dsin(m + 2 * mprime)
+      break
+
+    // first and last quarter moon use a different correction
+    case FIRST:
+    case LAST:
+      pt += (0.1721 - 0.0004 * t) * dsin(m) +
+        0.0021 * dsin(2 * m) -
+        0.6280 * dsin(mprime) +
+        0.0089 * dsin(2 * mprime) -
+        0.0004 * dsin(3 * mprime) +
+        0.0079 * dsin(2 * f) -
+        0.0119 * dsin(m + mprime) -
+        0.0047 * dsin(m - mprime) +
+        0.0003 * dsin(2 * f + m) -
+        0.0004 * dsin(2 * f - m) -
+        0.0006 * dsin(2 * f + mprime) +
+        0.0021 * dsin(2 * f - mprime) +
+        0.0003 * dsin(m + 2 * mprime) +
+        0.0004 * dsin(m - 2 * mprime) -
+        0.0003 * dsin(2 * m + mprime)
+
+      // the sign of the last term depends on whether we're looking for a first
+      // or last quarter moon!
+      const sign = (tphase < FULL) ? +1 : -1
+      pt += sign * (0.0028 - 0.0004 * dcos(m) + 0.0003 * dcos(mprime))
+
+      break
+  }
+
+  return julian.toDate(pt)
+}
+
+/**
+ * Find time of phases of the moon which surround the current date.
+ * Five phases are found, starting and ending with the new moons
+ * which bound the current lunation.
+ * @param  {Date} sdate Date to start hunting from (defaults to current date)
+ * @return {Object}     Object containing recent past and future phases
+ */
+function phaseHunt (sdate) {
+  if (!sdate) {
+    sdate = new Date()
+  }
+  if (!(sdate instanceof Date)) {
+    throw new TypeError('Invalid parameter')
+  }
+  if (Number.isNaN(sdate.getTime())) {
+    throw new RangeError('Invalid Date')
+  }
+
+  let adate = new Date(sdate.getTime() - (45 * 86400000)) // 45 days prior
+  let k1 = Math.floor(12.3685 * (adate.getFullYear() + (1.0 / 12.0) * adate.getMonth() - 1900))
+  let nt1 = meanphase(adate.getTime(), k1)
+
+  sdate = julian.fromDate(sdate)
+  adate = nt1 + SYNODIC_MONTH
+  let k2 = k1 + 1
+  let nt2 = meanphase(adate, k2)
+  while (nt1 > sdate || sdate >= nt2) {
+    adate += SYNODIC_MONTH
+    k1++
+    k2++
+    nt1 = nt2
+    nt2 = meanphase(adate, k2)
+  }
+
+  return {
+    new_date: truephase(k1, NEW),
+    q1_date: truephase(k1, FIRST),
+    full_date: truephase(k1, FULL),
+    q3_date: truephase(k1, LAST),
+    nextnew_date: truephase(k2, NEW)
+  }
+}
+
+function phaseRange (start, end, phase) {
+  if (!(start instanceof Date)) {
+    throw new TypeError('First argument must be a Date object.')
+  }
+  if (Number.isNaN(start.getTime())) {
+    throw new RangeError('First argument not a valid date.')
+  }
+  if (!(end instanceof Date)) {
+    throw new TypeError('Second argument must be a Date object.')
+  }
+  if (Number.isNaN(end.getTime())) {
+    throw new RangeError('Second argument not a valid date.')
+  }
+
+  if (end - start < 0) {
+    let temp = end
+    end = start
+    start = temp
+  }
+
+  start = start.getTime()
+  end = end.getTime()
+
+  let t = start - 45 * 86400000
+
+  let k
+  {
+    const d = new Date(t)
+    k = Math.floor(12.3685 * (d.getFullYear() + (1.0 / 12.0) * d.getMonth() - 1900))
+  }
+
+  let date = truephase(k, phase)
+  // skip every phase before starting date
+  while (date.getTime() < start) {
+    k++
+    date = truephase(k, phase)
+  }
+  // add every phase before (or on!) ending date to a list, and return it
+  const list = []
+  while (date.getTime() <= end) {
+    list.push(date)
+    k++
+    date = truephase(k, phase)
+  }
+  return list
+}
+
+exports.PHASE_NEW = NEW
+exports.PHASE_FIRST = FIRST
+exports.PHASE_FULL = FULL
+exports.PHASE_LAST = LAST
+exports.phase = phase
+exports.phase_hunt = phaseHunt
+exports.phase_range = phaseRange

File diff suppressed because it is too large
+ 71 - 0
app/lib/main.css


File diff suppressed because it is too large
+ 56 - 0
app/lib/main.js


File diff suppressed because it is too large
+ 0 - 0
app/lib/main.min.css


File diff suppressed because it is too large
+ 5 - 0
app/lib/main.min.js


Some files were not shown because too many files changed in this diff