diff --git a/app/config/locale/templates/zh.email.auth.confirm.tpl b/app/config/locale/templates/zh.email.auth.confirm.tpl
new file mode 100644
index 0000000000..a557d451c7
--- /dev/null
+++ b/app/config/locale/templates/zh.email.auth.confirm.tpl
@@ -0,0 +1,24 @@
+
+
+
+ {{name}} 你好,
+
+
+ 请点击下方的链接验证你的电子邮箱地址。
+
+
{{redirect}}
+
+
+ 如果你没有请求验证本邮箱,请忽略这份邮件。
+
+
+ 谢谢。
+
+ 来自 {{project}}
+
\ No newline at end of file
diff --git a/app/config/locale/templates/zh.email.auth.invitation.tpl b/app/config/locale/templates/zh.email.auth.invitation.tpl
new file mode 100644
index 0000000000..7ee56a401a
--- /dev/null
+++ b/app/config/locale/templates/zh.email.auth.invitation.tpl
@@ -0,0 +1,27 @@
+
+
+
+ 你好,
+
+
+
{{owner}}邀请您加入{{project}}项目的
{{team}}小组。
+
+
+ 请点击下方的链接加入{{team}}小组:
+
+
{{redirect}}
+
+
+ 如果您没有加入该小组的计划,请忽略本邮件。
+
+
+ 谢谢。
+
+ 来自 {{project}}
+
diff --git a/app/config/locale/templates/zh.email.auth.recovery.tpl b/app/config/locale/templates/zh.email.auth.recovery.tpl
new file mode 100644
index 0000000000..8a473b5537
--- /dev/null
+++ b/app/config/locale/templates/zh.email.auth.recovery.tpl
@@ -0,0 +1,25 @@
+
+
+
+ {{name}} 你好,
+
+
+ 请点击下方的链接重新设置{{project}}的密码。
+ Follow this link to reset your {{project}} password.
+
+
{{redirect}}
+
+
+ 如果您未曾申请重设密码,请忽略本邮件。
+
+
+ 谢谢。
+
+ 来自 {{project}}
+
diff --git a/app/config/locale/zh.continents.php b/app/config/locale/zh.continents.php
new file mode 100644
index 0000000000..625302189e
--- /dev/null
+++ b/app/config/locale/zh.continents.php
@@ -0,0 +1,11 @@
+ '非洲',
+ 'AN' => '南极洲',
+ 'AS' => '亚洲',
+ 'EU' => '欧洲',
+ 'NA' => '北美洲',
+ 'OC' => '大洋洲',
+ 'SA' => '南美洲',
+];
diff --git a/app/config/locale/zh.countries.php b/app/config/locale/zh.countries.php
new file mode 100644
index 0000000000..c5c7224584
--- /dev/null
+++ b/app/config/locale/zh.countries.php
@@ -0,0 +1,198 @@
+ '阿富汗',
+ 'AO' => '安哥拉',
+ 'AL' => '阿尔巴尼亚',
+ 'AD' => '安道尔',
+ 'AE' => '阿拉伯联合酋长国',
+ 'AR' => '阿根廷',
+ 'AM' => '亚美尼亚',
+ 'AG' => '安提瓜和巴布达',
+ 'AU' => '澳大利亚',
+ 'AT' => '奥地利',
+ 'AZ' => '阿塞拜疆',
+ 'BI' => '布隆迪',
+ 'BE' => '比利时',
+ 'BJ' => '贝宁',
+ 'BF' => '布基纳法索',
+ 'BD' => '孟加拉国',
+ 'BG' => '保加利亚',
+ 'BH' => '巴林',
+ 'BS' => '巴哈马',
+ 'BA' => '波黑',
+ 'BY' => '白罗斯',
+ 'BZ' => '伯利兹',
+ 'BO' => '玻利维亚',
+ 'BR' => '巴西',
+ 'BB' => '巴巴多斯',
+ 'BN' => '文莱',
+ 'BT' => '不丹',
+ 'BW' => '博茨瓦纳',
+ 'CF' => '中非共和国',
+ 'CA' => '加拿大',
+ 'CH' => '瑞士',
+ 'CL' => '智利',
+ 'CN' => '中国',
+ 'CI' => '象牙海岸',
+ 'CM' => '喀麦隆',
+ 'CD' => '刚果民主共和国',
+ 'CG' => '刚果共和国',
+ 'CO' => '哥伦比亚',
+ 'KM' => '科摩',
+ 'CV' => '佛得角',
+ 'CR' => '哥斯达黎加',
+ 'CU' => '古巴',
+ 'CY' => '塞浦路斯',
+ 'CZ' => '捷克',
+ 'DE' => '德国',
+ 'DJ' => '吉布提',
+ 'DM' => '多米尼克',
+ 'DK' => '丹麦',
+ 'DO' => '多明尼加共和国',
+ 'DZ' => '阿尔及利亚',
+ 'EC' => '厄瓜多尔',
+ 'EG' => '埃及',
+ 'ER' => '厄立特里亚',
+ 'ES' => '西班牙',
+ 'EE' => '爱沙尼亚',
+ 'ET' => '埃塞俄比亚',
+ 'FI' => '芬兰',
+ 'FJ' => '斐济',
+ 'FR' => '法国',
+ 'FM' => '密克罗尼西亚',
+ 'GA' => '加蓬',
+ 'GB' => '英国',
+ 'GE' => '格鲁吉亚',
+ 'GH' => '加纳',
+ 'GN' => '几内亚',
+ 'GM' => '冈比亚',
+ 'GW' => '几内亚比绍',
+ 'GQ' => '赤道几内亚',
+ 'GR' => '希腊',
+ 'GD' => '格林纳达',
+ 'GT' => '危地马拉',
+ 'GY' => '圭亚那',
+ 'HN' => '洪都拉斯',
+ 'HR' => '克罗地亚',
+ 'HT' => '海地',
+ 'HU' => '匈牙利',
+ 'ID' => '印度尼西亚',
+ 'IN' => '印度',
+ 'IE' => '爱尔兰',
+ 'IR' => '伊朗',
+ 'IQ' => '伊拉克',
+ 'IS' => '冰岛',
+ 'IL' => '以色列',
+ 'IT' => '意大利',
+ 'JM' => '牙买加',
+ 'JO' => '约旦',
+ 'JP' => '日本',
+ 'KZ' => '哈萨克斯坦',
+ 'KE' => '肯尼亚',
+ 'KG' => '吉尔吉斯斯坦',
+ 'KH' => '柬埔寨',
+ 'KI' => '基里巴斯',
+ 'KN' => '圣基茨和尼维斯',
+ 'KR' => '韩国',
+ 'KW' => '科威特',
+ 'LA' => '老挝',
+ 'LB' => '黎巴嫩',
+ 'LR' => '利比里亚',
+ 'LY' => '利比亚',
+ 'LC' => '圣卢西亚',
+ 'LI' => '列支敦士登',
+ 'LK' => '斯里兰卡',
+ 'LS' => '莱索托',
+ 'LT' => '立陶宛',
+ 'LU' => '卢森堡',
+ 'LV' => '拉脱维亚',
+ 'MA' => '摩洛哥',
+ 'MC' => '摩纳哥',
+ 'MD' => '摩尔多瓦',
+ 'MG' => '马达加斯加',
+ 'MV' => '马尔代夫',
+ 'MX' => '墨西哥',
+ 'MH' => '马绍尔群岛',
+ 'MK' => '马其顿共和国',
+ 'ML' => '马里',
+ 'MT' => '马耳他',
+ 'MM' => '缅甸',
+ 'ME' => '黑山',
+ 'MN' => '蒙古',
+ 'MZ' => '莫桑比克',
+ 'MR' => '毛里塔尼亚',
+ 'MU' => '毛里求斯',
+ 'MW' => '马拉维',
+ 'MY' => '马来西亚',
+ 'NA' => '纳米比亚',
+ 'NE' => '尼日尔',
+ 'NG' => '尼日利亚',
+ 'NI' => '尼加拉瓜',
+ 'NL' => '荷兰',
+ 'NO' => '挪威',
+ 'NP' => '尼泊尔',
+ 'NR' => '瑙鲁',
+ 'NZ' => '新西兰',
+ 'OM' => '阿曼',
+ 'PK' => '巴基斯坦',
+ 'PA' => '巴拿马',
+ 'PE' => '秘鲁',
+ 'PH' => '菲律宾',
+ 'PW' => '帕劳',
+ 'PG' => '巴布亚新几内亚',
+ 'PL' => '波兰',
+ 'KP' => '北朝鲜',
+ 'PT' => '葡萄牙',
+ 'PY' => '巴拉圭',
+ 'QA' => '卡塔尔',
+ 'RO' => '罗马尼亚',
+ 'RU' => '俄罗斯',
+ 'RW' => '卢旺达',
+ 'SA' => '沙特阿拉伯',
+ 'SD' => '苏丹',
+ 'SN' => '塞内加尔',
+ 'SG' => '新加坡',
+ 'SB' => '所罗门群岛',
+ 'SL' => '塞拉利昂',
+ 'SV' => '萨尔瓦多',
+ 'SM' => '圣马力诺',
+ 'SO' => '索马里',
+ 'RS' => '塞尔维亚',
+ 'SS' => '南苏丹',
+ 'ST' => '圣多美和普林西比',
+ 'SR' => '苏里南',
+ 'SK' => '斯洛伐克',
+ 'SI' => '斯洛文尼亚',
+ 'SE' => '瑞典',
+ 'SZ' => '斯威士兰',
+ 'SC' => '塞舌尔',
+ 'SY' => '叙利亚',
+ 'TD' => '乍得',
+ 'TG' => '多哥',
+ 'TH' => '泰国',
+ 'TJ' => '塔吉克斯坦',
+ 'TM' => '土库曼斯坦',
+ 'TL' => '东帝汶',
+ 'TO' => '汤加',
+ 'TT' => '特立尼达和多巴哥',
+ 'TN' => '突尼斯',
+ 'TR' => '土耳其',
+ 'TV' => '图瓦卢',
+ 'TZ' => '坦桑尼亚',
+ 'UG' => '乌干达',
+ 'UA' => '乌克兰',
+ 'UY' => '乌拉圭',
+ 'US' => '美国',
+ 'UZ' => '乌兹别克斯',
+ 'VA' => '梵蒂冈',
+ 'VC' => '圣文森特和格林纳丁斯',
+ 'VE' => '委内瑞拉',
+ 'VN' => '越南',
+ 'VU' => '瓦努阿图',
+ 'WS' => '萨摩亚',
+ 'YE' => '也门',
+ 'ZA' => '南非',
+ 'ZM' => '赞比亚',
+ 'ZW' => '津巴布韦',
+];
diff --git a/app/config/locale/zh.php b/app/config/locale/zh.php
new file mode 100644
index 0000000000..b4499416fe
--- /dev/null
+++ b/app/config/locale/zh.php
@@ -0,0 +1,21 @@
+ '"懂得取舍,方显睿智。"', // This is the line printed in the homepage and console 'view-source'
+ 'settings.locale' => 'zh',
+ 'settings.direction' => 'ltr',
+
+ // Service - Users
+ 'auth.emails.team' => '%s 小组',
+ 'auth.emails.confirm.title' => '账户确认',
+ 'auth.emails.confirm.body' => 'zh.email.auth.confirm.tpl',
+ 'auth.emails.recovery.title' => '重设密码',
+ 'auth.emails.recovery.body' => 'zh.email.auth.recovery.tpl',
+ 'auth.emails.invitation.title' => '邀请加入%s小组(%s)', // I used brackets to keep the order
+ 'auth.emails.invitation.body' => 'zh.email.auth.invitation.tpl',
+
+ 'locale.country.unknown' => '未知',
+
+ 'countries' => include 'zh.countries.php',
+ 'continents' => include 'zh.continents.php',
+];
diff --git a/app/init.php b/app/init.php
index 59e1bba8ae..30d45e602c 100644
--- a/app/init.php
+++ b/app/init.php
@@ -24,7 +24,7 @@ const APP_EMAIL_TEAM = 'team@'.APP_DOMAIN;
const APP_EMAIL_SECURITY = 'security@'.APP_DOMAIN;
const APP_USERAGENT = APP_NAME.'-Server/%s Please report abuse at '.APP_EMAIL_SECURITY;
const APP_MODE_ADMIN = 'admin';
-const APP_LOCALES = ['cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', /* 'no',*/ 'pt-br', 'pt-pt', 'ro', 'tr', 'ua'];
+const APP_LOCALES = ['cat', 'de', 'en', 'es', 'fi', 'fr', 'gr', 'he', 'hi', 'id', 'it', 'nl', /* 'no',*/ 'pt-br', 'pt-pt', 'ro', 'tr', 'ua', 'zh'];
const APP_PAGING_LIMIT = 15;
$register = new Registry();
@@ -146,6 +146,7 @@ Locale::setLanguage('ro', include __DIR__.'/config/locale/ro.php');
Locale::setLanguage('ru', include __DIR__ . '/config/locale/ru.php');
Locale::setLanguage('tr', include __DIR__.'/config/locale/tr.php');
Locale::setLanguage('ua', include __DIR__.'/config/locale/ua.php');
+Locale::setLanguage('zh', include __DIR__.'/config/locale/zh.php');
if (in_array($locale, APP_LOCALES)) {
Locale::setDefault($locale);