diff --git a/messages/de-DE.json b/messages/de-DE.json
index 6c01f148..4e30c287 100644
--- a/messages/de-DE.json
+++ b/messages/de-DE.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/en-US.json b/messages/en-US.json
index 3648012d..d0ec9589 100644
--- a/messages/en-US.json
+++ b/messages/en-US.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/es.json b/messages/es.json
index 8bdc42fd..393c5a41 100644
--- a/messages/es.json
+++ b/messages/es.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/fi.json b/messages/fi.json
index 97365e7f..bc5c8353 100644
--- a/messages/fi.json
+++ b/messages/fi.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/fr-FR.json b/messages/fr-FR.json
index cc0649b1..e954d14b 100644
--- a/messages/fr-FR.json
+++ b/messages/fr-FR.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/it-IT.json b/messages/it-IT.json
index 78dba416..73e59f65 100644
--- a/messages/it-IT.json
+++ b/messages/it-IT.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/pl-PL.json b/messages/pl-PL.json
index 22aba12e..d61c9c23 100644
--- a/messages/pl-PL.json
+++ b/messages/pl-PL.json
@@ -300,6 +300,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/ro.json b/messages/ro.json
index ec4d8dfb..e5c8256e 100644
--- a/messages/ro.json
+++ b/messages/ro.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/ru-RU.json b/messages/ru-RU.json
index e9679f5e..72761230 100644
--- a/messages/ru-RU.json
+++ b/messages/ru-RU.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/ua-UA.json b/messages/ua-UA.json
index 4a7d773a..6fa6e75f 100644
--- a/messages/ua-UA.json
+++ b/messages/ua-UA.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文 (Traditional Chinese)",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/zh-CN.json b/messages/zh-CN.json
index a0d0b0c6..6d1ed4c5 100644
--- a/messages/zh-CN.json
+++ b/messages/zh-CN.json
@@ -301,6 +301,7 @@
"es": "Español",
"de-DE": "Deutsch",
"zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文",
"pl-PL": "Polski",
"ru-RU": "Русский",
"it-IT": "Italiano",
diff --git a/messages/zh-TW.json b/messages/zh-TW.json
new file mode 100644
index 00000000..1a598e70
--- /dev/null
+++ b/messages/zh-TW.json
@@ -0,0 +1,402 @@
+{
+ "Homepage": {
+ "title": "跟朋友和家人一起共享消費紀錄",
+ "description": "歡迎開始全新的Spliit",
+ "button": {
+ "groups": "前往群組",
+ "github": "GitHub"
+ }
+ },
+ "Header": {
+ "groups": "群組"
+ },
+ "Footer": {
+ "madeIn": "來自 🇨🇦 加拿大魁北克蒙特婁",
+ "builtBy": "由 Sebastien Castiel 以及 社群貢獻者 共同創建維護"
+ },
+ "Expenses": {
+ "title": "消費",
+ "description": "這裡是您為群組建立的消費。",
+ "create": "新增消費紀錄",
+ "createFirst": "新增第一筆消費紀錄",
+ "noExpenses": "你的群組內目前沒有任何消費紀錄。",
+ "exportJson": "匯出為 JSON",
+ "searchPlaceholder": "搜尋消費紀錄……",
+ "ActiveUserModal": {
+ "title": "你是誰?",
+ "description": "告訴我們您在群組中的身份,以調整我們顯示資訊的方式。",
+ "nobody": "我不想選擇任何人",
+ "save": "儲存更改",
+ "footer": "此設定可稍後在群組設定中更改。"
+ },
+ "Groups": {
+ "upcoming": "即將到來",
+ "thisWeek": "本週",
+ "earlierThisMonth": "本月稍早",
+ "lastMonth": "上個月",
+ "earlierThisYear": "今年稍早",
+ "lastYera": "去年",
+ "older": "更早"
+ }
+ },
+ "ExpenseCard": {
+ "paidBy": "由 {paidBy} 支付 。",
+ "receivedBy": "由 {paidBy} 收取 。",
+ "yourBalance": "你的餘額:"
+ },
+ "Groups": {
+ "myGroups": "我的群組",
+ "create": "建立",
+ "loadingRecent": "讀取最近的群組……",
+ "NoRecent": {
+ "description": "你最近沒有訪問過任何群組。",
+ "create": "建立一個新群組",
+ "orAsk": "或請朋友發送已建立的群組鏈接。"
+ },
+ "recent": "最近的群組",
+ "starred": "已加星標的群組",
+ "archived": "已封存的群組",
+ "archive": "將群組封存",
+ "unarchive": "取消封存群組",
+ "removeRecent": "從最近的群組中移除",
+ "RecentRemovedToast": {
+ "title": "群組已被移除",
+ "description": "該群組已從您的最近群組列表中移除。",
+ "undoAlt": "撤銷移除群組",
+ "undo": "取消操作"
+ },
+ "AddByURL": {
+ "button": "透過連結加入",
+ "title": "透過連結加入群組",
+ "description": "如果某個群組已與您分享,您可以在此處貼上其網址以添加到群組列表中。",
+ "error": "哇哇,我們無法從您提供的網址中找到有效群組……"
+ },
+ "NotFound": {
+ "text": "該群組不存在。",
+ "link": "前往最近訪問的群組"
+ }
+ },
+ "GroupForm": {
+ "title": "群組資訊",
+ "NameField": {
+ "label": "群組名稱",
+ "placeholder": "暑假出遊",
+ "description": "輸入群組的名稱。"
+ },
+ "InformationField": {
+ "label": "群組資訊",
+ "placeholder": "對群組成員有關的資訊是什麼?"
+ },
+ "CurrencyField": {
+ "label": "貨幣符號",
+ "placeholder": "$, €, £…",
+ "description": "我們根據它來顯示相應的金額。"
+ },
+ "Participants": {
+ "title": "群組成員",
+ "description": "輸入每位成員的名稱。",
+ "protectedParticipant": "此成員已有登記支出,無法刪除。",
+ "new": "新增",
+ "add": "新增群組成員",
+ "John": "林俊凱",
+ "Jane": "陳怡婷",
+ "Jack": "張文傑"
+ },
+ "Settings": {
+ "title": "客製化設定",
+ "description": "這些設定是針對每台設備設置的,用於客製化您的體驗。",
+ "ActiveUserField": {
+ "label": "當前使用者",
+ "placeholder": "選擇一位群組成員",
+ "none": "無",
+ "description": "用於支付消費的預設用戶"
+ },
+ "save": "保存",
+ "saving": "保存中……",
+ "create": "建立",
+ "creating": "建立中……",
+ "cancel": "取消"
+ }
+ },
+ "ExpenseForm": {
+ "Income": {
+ "create": "新增收入",
+ "edit": "編輯收入",
+ "TitleField": {
+ "label": "收入標題",
+ "placeholder": "禮拜一晚餐",
+ "description": "輸入此筆收入的描述。"
+ },
+ "DateField": {
+ "label": "收入日期",
+ "description": "輸入收到這筆收入的日期。"
+ },
+ "categoryFieldDescription": "選擇收入類別。",
+ "paidByField": {
+ "label": "接收人",
+ "description": "選擇接收這筆收入的成員。"
+ },
+ "paidFor": {
+ "title": "應接收人",
+ "description": "選擇應參與此筆收入的成員。"
+ },
+ "splitModeDescription": "選擇如何分配此筆收入。",
+ "attachDescription": "查看/附上此筆收入的收據。"
+ },
+ "Expense": {
+ "create": "新增消費紀錄",
+ "edit": "編輯消費紀錄",
+ "TitleField": {
+ "label": "支出標題",
+ "placeholder": "週一晚餐",
+ "description": "輸入此筆消費的描述。"
+ },
+ "DateField": {
+ "label": "消費日期",
+ "description": "輸入支付此消費的日期。"
+ },
+ "categoryFieldDescription": "選擇消費類別。",
+ "paidByField": {
+ "label": "支付人",
+ "description": "选择支付这笔消费的群组成员。"
+ },
+ "paidFor": {
+ "title": "應支付人",
+ "description": "選擇需參與此筆消費的成員。"
+ },
+ "splitModeDescription": "選擇如何分配此筆消費。",
+ "attachDescription": "查看/附上此筆消費的收據。"
+ },
+ "amountField": {
+ "label": "金額"
+ },
+ "isReimbursementField": {
+ "label": "這是一筆報銷款"
+ },
+ "categoryField": {
+ "label": "類別"
+ },
+ "notesField": {
+ "label": "備註"
+ },
+ "selectNone": "取消全選",
+ "selectAll": "全選",
+ "shares": "份額",
+ "advancedOptions": "進階分帳選項……",
+ "SplitModeField": {
+ "label": "分帳方式",
+ "evenly": "平均分配",
+ "byShares": "自訂份額",
+ "byPercentage": "自訂百分比",
+ "byAmount": "自訂金額",
+ "saveAsDefault": "儲存為預設分帳方式"
+ },
+ "DeletePopup": {
+ "label": "刪除",
+ "title": "要刪除這筆消費嗎?",
+ "description": "確定要刪除這筆消費嗎?刪除後無法回復哦。",
+ "yes": "確定",
+ "cancel": "取消"
+ },
+ "attachDocuments": "附件",
+ "create": "新增",
+ "creating": "新增中……",
+ "save": "儲存",
+ "saving": "儲存中……",
+ "cancel": "取消",
+ "reimbursement": "報銷"
+ },
+ "ExpenseDocumentsInput": {
+ "TooBigToast": {
+ "title": "文件過大",
+ "description": "可以上傳的最大文件大小為 {maxSize}。這份文件大小為 ${size}。"
+ },
+ "ErrorToast": {
+ "title": "上傳文件時發生錯誤",
+ "description": "上傳文件時發生錯誤,請再試一次或更換文件。",
+ "retry": "重試"
+ }
+ },
+ "CreateFromReceipt": {
+ "Dialog": {
+ "triggerTitle": "從收據中新增消費紀錄",
+ "title": "從收據中新增消費紀錄",
+ "description": "從收據照片上抓取消費明細。",
+ "body": "上傳收據的圖片,我們會試圖解析其中的支出",
+ "selectImage": "選擇圖片……",
+ "titleLabel": "標題:",
+ "categoryLabel": "類別:",
+ "amountLabel": "金額:",
+ "dateLabel": "日期:",
+ "editNext": "可於後續編輯消費明細。",
+ "continue": "繼續"
+ },
+ "unknown": "未知",
+ "TooBigToast": {
+ "title": "文件過大",
+ "description": "可以上傳的最大文件大小為 {maxSize}。這份文件大小為 ${size}。"
+ },
+ "ErrorToast": {
+ "title": "上傳文件時發生錯誤",
+ "description": "上傳文件時發生錯誤,請再試一次或更換文件。",
+ "retry": "重試"
+ }
+ },
+ "Balances": {
+ "title": "總覽",
+ "description": "這是每個成員已支付及需支付的金額",
+ "Reimbursements": {
+ "title": "建議核銷",
+ "description": "這是建議的銷帳方式",
+ "noImbursements": "看起來你的群組目前不需要銷帳😁",
+ "owes": "{from} 欠 {to}",
+ "markAsPaid": "標記為已支付"
+ }
+ },
+ "Stats": {
+ "title": "統計",
+ "Totals": {
+ "title": "總計",
+ "description": "整個群組的花費總計。",
+ "groupSpendings": "群組總開銷",
+ "groupEarnings": "群組總收入",
+ "yourSpendings": "你的總開銷",
+ "yourEarnings": "你的總收入",
+ "yourShare": "你的總計份額"
+ }
+ },
+ "Activity": {
+ "title": "明細",
+ "description": "群組所有活動總覽",
+ "noActivity": "你的全組目前沒有任何活動",
+ "someone": "某人",
+ "settingsModified": "群組設定已被{participant}更改。",
+ "expenseCreated": "消費 {expense} 由 {participant} 新增。",
+ "expenseUpdated": "消費 {expense} 由 {participant} 更新。",
+ "expenseDeleted": "消費 {expense} 由 {participant} 刪除。",
+ "Groups": {
+ "today": "今天",
+ "yesterday": "昨天",
+ "earlierThisWeek": "本週稍早",
+ "lastWeek": "上週",
+ "earlierThisMonth": "本月稍早",
+ "lastMonth": "上個月",
+ "earlierThisYear": "今年稍早",
+ "lastYear": "去年",
+ "older": "更早"
+ }
+ },
+ "Information": {
+ "title": "資訊",
+ "description": "可在此添加群組相關資訊、公告及說明等。",
+ "empty": "目前沒有群組資訊。"
+ },
+ "Settings": {
+ "title": "設定"
+ },
+ "Locale": {
+ "en-US": "English",
+ "fi": "Suomi",
+ "fr-FR": "Français",
+ "es": "Español",
+ "de-DE": "Deutsch",
+ "zh-CN": "Chinese (Simplified)",
+ "zh-TW": "正體中文",
+ "pl-PL": "Polski",
+ "ru-RU": "Русский",
+ "it-IT": "Italiano",
+ "ua-UA": "Українська",
+ "ro": "Română"
+ },
+ "Share": {
+ "title": "分享",
+ "description": "將此網址分享給其他人以加入群組並查看及新增消費紀錄",
+ "warning": "警告!",
+ "warningHelp": "任何有此連結的人都可以看到及編輯消費紀錄。請小心使用!"
+ },
+ "SchemaErrors": {
+ "min1": "請輸入至少 1 個字。",
+ "min2": "請輸入至少 2 個字。",
+ "max5": "請輸入至少 5 個字。",
+ "max50": "請輸入至少 50 個字。",
+ "duplicateParticipantName": "此名稱已被使用",
+ "titleRequired": "請輸入標題。",
+ "invalidNumber": "數值無效。",
+ "amountRequired": "必須輸入一個金額。",
+ "amountNotZero": "金額不可為 0。",
+ "amountTenMillion": "金額需小於 10,000,000。",
+ "paidByRequired": "必須選擇一個成員。",
+ "paidForMin1": "這筆消費必須包含至少一個成員。",
+ "noZeroShares": "份額需大於 0。",
+ "amountSum": "金額總計必須等於消費金額。",
+ "percentageSum": "百分比加總必須等於 100。"
+ },
+ "Categories": {
+ "search": "搜尋類別……",
+ "noCategory": "未找到類別。",
+ "Uncategorized": {
+ "heading": "未分類",
+ "General": "一般",
+ "Payment": "支付"
+ },
+ "Entertainment": {
+ "heading": "娛樂",
+ "Entertainment": "娛樂",
+ "Games": "遊戲",
+ "Movies": "電影",
+ "Music": "音樂",
+ "Sports": "運動"
+ },
+ "Food and Drink": {
+ "heading": "飲食",
+ "Food and Drink": "飲食",
+ "Dining Out": "外食",
+ "Groceries": "食材",
+ "Liquor": "酒水"
+ },
+ "Home": {
+ "heading": "居家",
+ "Home": "居家",
+ "Electronics": "電子產品",
+ "Furniture": "家具",
+ "Household Supplies": "日用品",
+ "Maintenance": "維護",
+ "Mortgage": "貸款",
+ "Pets": "寵物",
+ "Rent": "租金",
+ "Services": "服務"
+ },
+ "Life": {
+ "heading": "生活",
+ "Childcare": "育兒",
+ "Clothing": "衣服",
+ "Education": "教育",
+ "Gifts": "禮物",
+ "Insurance": "保險",
+ "Medical Expenses": "醫療支出",
+ "Taxes": "稅"
+ },
+ "Transportation": {
+ "heading": "交通",
+ "Transportation": "交通",
+ "Bicycle": "自行車",
+ "Bus/Train": "公車/火車",
+ "Car": "汽車",
+ "Gas/Fuel": "油錢/燃料",
+ "Hotel": "旅館/住宿",
+ "Parking": "停車",
+ "Plane": "飛機",
+ "Taxi": "計程車"
+ },
+ "Utilities": {
+ "heading": "日常帳單",
+ "Utilities": "日常帳單",
+ "Cleaning": "清潔費",
+ "Electricity": "電費",
+ "Heat/Gas": "暖氣/瓦斯",
+ "Trash": "垃圾費",
+ "TV/Phone/Internet": "電視/電話/網路",
+ "Water": "水費"
+ }
+ }
+}
diff --git a/src/i18n.ts b/src/i18n.ts
index fd2eb6a8..1e73861d 100644
--- a/src/i18n.ts
+++ b/src/i18n.ts
@@ -8,6 +8,7 @@ export const locales = [
'es',
'de-DE',
'zh-CN',
+ 'zh-TW',
'ru-RU',
'it-IT',
'ua-UA',