diff --git a/src/i18n.ts b/src/i18n.ts
index 23840e89..fcbe584c 100644
--- a/src/i18n.ts
+++ b/src/i18n.ts
@@ -2,16 +2,21 @@ import LanguageDetector from "i18next-browser-languagedetector";
 
 export const languages = [
   { lng: "en", label: "English", data: require("./locales/en.json") },
-  { lng: "de", label: "Deutsch", data: require("./locales/de.json") },
-  { lng: "es", label: "Español", data: require("./locales/es.json") },
-  { lng: "fr", label: "Français", data: require("./locales/fr.json") },
-  { lng: "id", label: "Bahasa Indonesia", data: require("./locales/id.json") },
-  { lng: "no", label: "Norsk", data: require("./locales/no.json") },
-  { lng: "pl", label: "Polski", data: require("./locales/pl.json") },
-  { lng: "pt", label: "Português", data: require("./locales/pt.json") },
-  { lng: "ru", label: "Русский", data: require("./locales/ru.json") },
-  { lng: "tr", label: "Türkçe", data: require("./locales/tr.json") },
-  { lng: "ko", label: "한국어", data: require("./locales/ko.json") },
+  { lng: "de-DE", label: "Deutsch", data: require("./locales/de-DE.json") },
+  { lng: "es-ES", label: "Español", data: require("./locales/es-ES.json") },
+  { lng: "fr-FR", label: "Français", data: require("./locales/fr-FR.json") },
+  {
+    lng: "id-ID",
+    label: "Bahasa Indonesia",
+    data: require("./locales/id-ID.json"),
+  },
+  { lng: "no-No", label: "Norsk", data: require("./locales/no-NO.json") },
+  { lng: "pl-PL", label: "Polski", data: require("./locales/pl-PL.json") },
+  { lng: "pt-PT", label: "Português", data: require("./locales/pt-PT.json") },
+  { lng: "ru-RU", label: "Русский", data: require("./locales/ru-RU.json") },
+  { lng: "tr-TR", label: "Türkçe", data: require("./locales/tr-TR.json") },
+  { lng: "ko-KR", label: "한국어", data: require("./locales/ko-KR.json") },
+  { lng: "zh-TW", label: "繁體中文", data: require("./locales/zh-TW.json") },
 ];
 
 let currentLanguage = languages[0];
diff --git a/src/locales/de.json b/src/locales/de-DE.json
similarity index 100%
rename from src/locales/de.json
rename to src/locales/de-DE.json
diff --git a/src/locales/es.json b/src/locales/es-ES.json
similarity index 100%
rename from src/locales/es.json
rename to src/locales/es-ES.json
diff --git a/src/locales/fr.json b/src/locales/fr-FR.json
similarity index 100%
rename from src/locales/fr.json
rename to src/locales/fr-FR.json
diff --git a/src/locales/id.json b/src/locales/id-ID.json
similarity index 100%
rename from src/locales/id.json
rename to src/locales/id-ID.json
diff --git a/src/locales/ko.json b/src/locales/ko-KR.json
similarity index 100%
rename from src/locales/ko.json
rename to src/locales/ko-KR.json
diff --git a/src/locales/no.json b/src/locales/no-NO.json
similarity index 100%
rename from src/locales/no.json
rename to src/locales/no-NO.json
diff --git a/src/locales/pl.json b/src/locales/pl-PL.json
similarity index 100%
rename from src/locales/pl.json
rename to src/locales/pl-PL.json
diff --git a/src/locales/pt.json b/src/locales/pt-PT.json
similarity index 100%
rename from src/locales/pt.json
rename to src/locales/pt-PT.json
diff --git a/src/locales/ru.json b/src/locales/ru-RU.json
similarity index 100%
rename from src/locales/ru.json
rename to src/locales/ru-RU.json
diff --git a/src/locales/tr.json b/src/locales/tr-TR.json
similarity index 100%
rename from src/locales/tr.json
rename to src/locales/tr-TR.json
diff --git a/src/locales/zh.json b/src/locales/zh-CN.json
similarity index 100%
rename from src/locales/zh.json
rename to src/locales/zh-CN.json
diff --git a/src/locales/zh-TW.json b/src/locales/zh-TW.json
new file mode 100644
index 00000000..ce628c59
--- /dev/null
+++ b/src/locales/zh-TW.json
@@ -0,0 +1,124 @@
+{
+  "labels": {
+    "paste": "貼上",
+    "selectAll": "選擇全部",
+    "copy": "複製",
+    "copyAsPng": "複製為 PNG 到剪貼板",
+    "bringForward": "往前移動一層",
+    "sendToBack": "移動至最底層",
+    "bringToFront": "移動至最上層",
+    "sendBackward": "往後移動一層",
+    "delete": "刪除",
+    "copyStyles": "複製樣式",
+    "pasteStyles": "貼上樣式",
+    "stroke": "邊框",
+    "background": "背景",
+    "fill": "填充",
+    "strokeWidth": "邊框寬度",
+    "sloppiness": "Sloppiness",
+    "opacity": "透明度",
+    "fontSize": "字體大小",
+    "fontFamily": "字體",
+    "onlySelected": "Only selected",
+    "withBackground": "With Background",
+    "handDrawn": "手寫",
+    "normal": "正常",
+    "code": "程式碼",
+    "small": "Small",
+    "medium": "Medium",
+    "large": "Large",
+    "veryLarge": "Very Large",
+    "solid": "Solid",
+    "hachure": "Hachure",
+    "crossHatch": "Cross-Hatch",
+    "thin": "細",
+    "bold": "粗",
+    "extraBold": "特粗",
+    "architect": "Architect",
+    "artist": "Artist",
+    "cartoonist": "Cartoonist",
+    "fileTitle": "檔案名稱",
+    "colorPicker": "色彩選擇工具",
+    "canvasBackground": "Canvas 背景",
+    "drawingCanvas": "繪製 Canvas",
+    "layers": "圖層",
+    "language": "語系",
+    "createRoom": "分享即時協作會議",
+    "duplicateSelection": "複製所有已選擇的元素"
+  },
+  "buttons": {
+    "clearReset": "重置 canvas",
+    "export": "輸出",
+    "exportToPng": "輸出成 PNG",
+    "exportToSvg": "輸出成 SVG",
+    "copyToClipboard": "複製到剪貼板",
+    "save": "儲存",
+    "load": "載入",
+    "getShareableLink": "取得共享連結",
+    "close": "關閉",
+    "selectLanguage": "選擇語系",
+    "scrollBackToContent": "滾動回到內容",
+    "zoomIn": "放大",
+    "zoomOut": "縮小",
+    "resetZoom": "重設縮放",
+    "menu": "選單",
+    "done": "完成",
+    "edit": "編輯",
+    "undo": "復原",
+    "redo": "重做",
+    "roomDialog": "分享即時協作會議",
+    "createNewRoom": "建立新的會議室"
+  },
+  "alerts": {
+    "clearReset": "這將會清除整個 canvas。你確定嗎?",
+    "couldNotCreateShareableLink": "無法建立共享連結",
+    "importBackendFailed": "從後端導入失敗。",
+    "cannotExportEmptyCanvas": "無法輸出空白的 canvas。",
+    "couldNotCopyToClipboard": "無法複製到剪貼簿。嘗試使用 Chrome 瀏覽器。",
+    "decryptFailed": "無法解密資料。",
+    "uploadedSecurly": "上傳已通過 end-to-end 加密,意思是 Excalidraw 伺服器和第三方無法讀取其內容。"
+  },
+  "toolBar": {
+    "selection": "選擇",
+    "rectangle": "長方形",
+    "diamond": "菱形",
+    "ellipse": "橢圓",
+    "arrow": "箭頭",
+    "line": "線條",
+    "text": "文字",
+    "lock": "繪圖後使所選工具保持活動狀態"
+  },
+  "headings": {
+    "canvasActions": "Canvas actions",
+    "selectedShapeActions": "Selected shape actions",
+    "shapes": "Shapes"
+  },
+  "hints": {
+    "linearElement": "Click to start multiple points, drag for single line",
+    "linearElementMulti": "按下 Escape 或 Enter 來完成",
+    "resize": "當你再調整大小時可以按住 SHIFT 來約束比例"
+  },
+  "errorSplash": {
+    "headingMain_pre": "Encountered an error. Try ",
+    "headingMain_button": "reloading the page.",
+    "clearCanvasMessage": "If reloading doesn't work, try ",
+    "clearCanvasMessage_button": "clearing the canvas.",
+    "clearCanvasCaveat": " This will result in loss of work ",
+    "openIssueMessage_pre": "Before doing so, we'd appreciate if you opened an issue on our ",
+    "openIssueMessage_button": "bug tracker.",
+    "openIssueMessage_post": " Please include the following error stack trace (and if it's not private, also the scene content):",
+    "errorStack": "Error stack trace:",
+    "errorStack_loading": "Loading data. please wait...",
+    "sceneContent": "Scene content:"
+  },
+  "roomDialog": {
+    "desc_intro": "你可以邀請其他人到你的目前的畫面與你合作。",
+    "desc_privacy": "別擔心,此會議使用 end-to-end 加密,因此無論你畫了什麼都會保持私密,甚至連我們的伺服器都無法看到。",
+    "button_startSession": "啟動會議",
+    "button_stopSession": "暫停會議",
+    "desc_inProgressIntro": "即時協作會議正在進行中。",
+    "desc_persistenceWarning": "注意,畫面的資料是透過 P2P 方式與協作者之間共享,不會保留在我們的伺服器。因此,如果所有人中斷連線時,將會遺失資料,除非將資料導出成檔案或是一個可共享的連結。",
+    "desc_shareLink": "與要協作的任何人分享此連結:",
+    "desc_exitSession": "停止會議將會中斷你與會議室的連線,但你可以繼續在本機端繼續處理工作。注意,這不會影響到其他人,他們仍然可以在他們自己的版本上繼續協作。"
+  }
+}