diff --git a/locales/en.json b/locales/en.json
deleted file mode 100644
index 42c0cb5972..0000000000
--- a/locales/en.json
+++ /dev/null
@@ -1,130 +0,0 @@
-{
-  "common": {
-    "time": {
-      "unknown": "unknown",
-      "future": "future",
-      "just_now": "just now",
-      "seconds_ago": "{}s ago",
-      "minutes_ago": "{}m ago",
-      "hours_ago": "{}h ago",
-      "days_ago": "{}d ago",
-      "weeks_ago": "{}week(s) ago",
-      "months_ago": "{}month(s) ago",
-      "years_ago": "{}year(s) ago"
-    },
-    "reactions": {
-      "like": "Like",
-      "love": "Love",
-      "laugh": "Laugh",
-      "hmm": "Hmm...?",
-      "surprise": "Wow",
-      "congrats": "Congrats!"
-    },
-    "tags": {
-      "mk-stream-indicator": {
-        "connecting": "Connecting",
-        "reconnecting": "Reconnecting",
-        "connected": "Connected"
-      },
-      "mk-reaction-picker": {
-        "choose-reaction": "Pick your reaction"
-      }
-    }
-  },
-  "desktop": {
-    "tags": {
-      "mk-ui-header-nav": {
-        "home": "Home",
-        "messaging": "Messages",
-        "info": "News",
-        "live": "Live"
-      },
-      "mk-ui-header-search": {
-        "placeholder": "Search"
-      },
-      "mk-ui-header-account": {
-        "profile": "Your profile",
-        "drive": "Drive",
-        "mentions": "Mentions",
-        "settings": "Settings",
-        "signout": "Sign out"
-      },
-      "mk-post-form": {
-        "post-placeholder": "What's happening?",
-        "reply-placeholder": "Reply to this post...",
-        "quote-placeholder": "Quote this post...",
-        "post": "Post",
-        "reply": "Reply",
-        "repost": "Repost",
-        "posted": "Posted!",
-        "replied": "Replied!",
-        "reposted": "Reposted!",
-        "post-failed": "Failed to post",
-        "reply-failed": "Failed to reply",
-        "repost-failed": "Failed to repost",
-        "posting": "Posting",
-        "attach-media-from-local": "Attach media from your pc",
-        "attach-media-from-drive": "Attach media from the drive",
-        "attach-cancel": "Cancel attachment",
-        "insert-the-cat": "Insert a cat",
-        "create-poll": "Create a poll",
-        "text-remain": "{} chars remaining"
-      },
-      "mk-post-form-window": {
-        "post": "New post",
-        "reply": "Reply",
-        "attaches": "{} media attached",
-        "uploading-media": "Uploading {} media"
-      },
-      "mk-timeline-post": {
-        "reposted-by": "Reposted by {}",
-        "reply": "Reply",
-        "repost": "Repost",
-        "add-reaction": "Add your reaction",
-        "detail": "Show detail"
-      },
-      "mk-notifications-home-widget": {
-        "title": "Notifications",
-        "settings": "Notification settings"
-      },
-      "mk-user-recommendation-home-widget": {
-        "title": "Recommended users",
-        "refresh": "Show others",
-        "no-one": "No one",
-        "fetching": "Loading"
-      },
-      "mk-recommended-polls-home-widget": {
-        "title": "Polls",
-        "refresh": "Show others",
-        "nothing": "Nothing",
-        "fetching": "Loading"
-      },
-      "mk-trends-home-widget": {
-        "title": "Trend",
-        "refresh": "Show others",
-        "nothing": "Nothing",
-        "fetching": "Loading"
-      },
-      "mk-photo-stream-home-widget": {
-        "title": "Photostream",
-        "initializing": "Loading",
-        "no-photos": "No photos"
-      },
-      "mk-donation-home-widget": {
-        "title": "Donation",
-        "text": "To manage Misskey, we spend money for our domain, server, etc.. There's no incomes for us, so we need your tip. If you're interested, contact {}. Thank you for your contribution!"
-      },
-      "mk-repost-form": {
-        "quote": "Quote...",
-        "cancel": "Cancel",
-        "repost": "Repost",
-        "reposting": "Reposting...",
-        "success": "Reposted!",
-        "failure": "Failed to Repost"
-      },
-      "mk-repost-form-window": {
-        "title": "Are you sure you want to repost this post?"
-      }
-    }
-  }
-}
diff --git a/locales/en.yaml b/locales/en.yaml
new file mode 100644
index 0000000000..ca9232cce0
--- /dev/null
+++ b/locales/en.yaml
@@ -0,0 +1,123 @@
+common:
+  time:
+    unknown: "unknown"
+    future: "future"
+    just_now: "just now"
+    seconds_ago: "{}s ago"
+    minutes_ago: "{}m ago"
+    hours_ago: "{}h ago"
+    days_ago: "{}d ago"
+    weeks_ago: "{}week(s) ago"
+    months_ago: "{}month(s) ago"
+    years_ago: "{}year(s) ago"
+
+  reactions:
+    like: "Like"
+    love: "Love"
+    laugh: "Laugh"
+    hmm: "Hmm...?"
+    surprise: "Wow"
+    congrats: "Congrats!"
+
+  tags:
+    mk-stream-indicator:
+      connecting: "Connecting"
+      reconnecting: "Reconnecting"
+      connected: "Connected"
+
+    mk-reaction-picker:
+      choose-reaction: "Pick your reaction"
+
+desktop:
+  tags:
+    mk-ui-header-nav:
+      home: "Home"
+      messaging: "Messages"
+      info: "News"
+      live: "Live"
+
+    mk-ui-header-search:
+      placeholder: "Search"
+
+    mk-ui-header-account:
+      profile: "Your profile"
+      drive: "Drive"
+      mentions: "Mentions"
+      settings: "Settings"
+      signout: "Sign out"
+
+    mk-post-form:
+      post-placeholder: "What's happening?"
+      reply-placeholder: "Reply to this post..."
+      quote-placeholder: "Quote this post..."
+      post: "Post"
+      reply: "Reply"
+      repost: "Repost"
+      posted: "Posted!"
+      replied: "Replied!"
+      reposted: "Reposted!"
+      post-failed: "Failed to post"
+      reply-failed: "Failed to reply"
+      repost-failed: "Failed to repost"
+      posting: "Posting"
+      attach-media-from-local: "Attach media from your pc"
+      attach-media-from-drive: "Attach media from the drive"
+      attach-cancel: "Cancel attachment"
+      insert-the-cat: "Insert a cat"
+      create-poll: "Create a poll"
+      text-remain: "{} chars remaining"
+
+    mk-post-form-window:
+      post: "New post"
+      reply: "Reply"
+      attaches: "{} media attached"
+      uploading-media: "Uploading {} media"
+
+    mk-timeline-post:
+      reposted-by: "Reposted by {}"
+      reply: "Reply"
+      repost: "Repost"
+      add-reaction: "Add your reaction"
+      detail: "Show detail"
+
+    mk-notifications-home-widget:
+      title: "Notifications"
+      settings: "Notification settings"
+
+    mk-user-recommendation-home-widget:
+      title: "Recommended users"
+      refresh: "Show others"
+      no-one: "No one"
+      fetching: "Loading"
+
+    mk-recommended-polls-home-widget:
+      title: "Polls"
+      refresh: "Show others"
+      nothing: "Nothing"
+      fetching: "Loading"
+
+    mk-trends-home-widget:
+      title: "Trend"
+      refresh: "Show others"
+      nothing: "Nothing"
+      fetching: "Loading"
+
+    mk-photo-stream-home-widget:
+      title: "Photostream"
+      initializing: "Loading"
+      no-photos: "No photos"
+
+    mk-donation-home-widget:
+      title: "Donation"
+      text: "To manage Misskey we spend money for our domain server etc.. There's no incomes for us so we need your tip. If you're interested contact {}. Thank you for your contribution!"
+
+    mk-repost-form:
+      quote: "Quote..."
+      cancel: "Cancel"
+      repost: "Repost"
+      reposting: "Reposting..."
+      success: "Reposted!"
+      failure: "Failed to Repost"
+
+    mk-repost-form-window:
+      title: "Are you sure you want to repost this post?"
diff --git a/locales/ja.json b/locales/ja.json
deleted file mode 100644
index 7177c7f575..0000000000
--- a/locales/ja.json
+++ /dev/null
@@ -1,130 +0,0 @@
-{
-  "common": {
-    "time": {
-      "unknown": "なぞのじかん",
-      "future": "未来",
-      "just_now": "たった今",
-      "seconds_ago": "{}秒前",
-      "minutes_ago": "{}分前",
-      "hours_ago": "{}時間前",
-      "days_ago": "{}日前",
-      "weeks_ago": "{}週間前",
-      "months_ago": "{}ヶ月前",
-      "years_ago": "{}年前"
-    },
-    "reactions": {
-      "like": "いいね",
-      "love": "ハート",
-      "laugh": "笑",
-      "hmm": "ふぅ~む",
-      "surprise": "わお",
-      "congrats": "おめでとう"
-    },
-    "tags": {
-      "mk-stream-indicator": {
-        "connecting": "接続中",
-        "reconnecting": "再接続中",
-        "connected": "接続完了"
-      },
-      "mk-reaction-picker": {
-        "choose-reaction": "リアクションを選択"
-      }
-    }
-  },
-  "desktop": {
-    "tags": {
-      "mk-ui-header-nav": {
-        "home": "ホーム",
-        "messaging": "メッセージ",
-        "info": "お知らせ",
-        "live": "ライブ"
-      },
-      "mk-ui-header-search": {
-        "placeholder": "検索"
-      },
-      "mk-ui-header-account": {
-        "profile": "プロフィール",
-        "drive": "ドライブ",
-        "mentions": "あなた宛て",
-        "settings": "設定",
-        "signout": "サインアウト"
-      },
-      "mk-post-form": {
-        "post-placeholder": "いまどうしてる?",
-        "reply-placeholder": "この投稿への返信...",
-        "quote-placeholder": "この投稿を引用...",
-        "post": "投稿",
-        "reply": "返信",
-        "repost": "Repost",
-        "posted": "投稿しました!",
-        "replied": "返信しました!",
-        "reposted": "Repostしました!",
-        "post-failed": "投稿に失敗しました",
-        "reply-failed": "返信に失敗しました",
-        "repost-failed": "Repostに失敗しました",
-        "posting": "投稿中",
-        "attach-media-from-local": "PCからメディアを添付",
-        "attach-media-from-drive": "ドライブからメディアを添付",
-        "attach-cancel": "添付取り消し",
-        "insert-the-cat": "猫挿入",
-        "create-poll": "投票を作成",
-        "text-remain": "のこり{}文字"
-      },
-      "mk-post-form-window": {
-        "post": "新規投稿",
-        "reply": "返信",
-        "attaches": "添付: {}メディア",
-        "uploading-media": "{}個のメディアをアップロード中"
-      },
-      "mk-timeline-post": {
-        "reposted-by": "{}がRepost",
-        "reply": "返信",
-        "repost": "Repost",
-        "add-reaction": "リアクション",
-        "detail": "詳細"
-      },
-      "mk-notifications-home-widget": {
-        "title": "通知",
-        "settings": "通知の設定"
-      },
-      "mk-user-recommendation-home-widget": {
-        "title": "おすすめユーザー",
-        "refresh": "他を見る",
-        "no-one": "いません!",
-        "fetching": "読み込んでいます"
-      },
-      "mk-recommended-polls-home-widget": {
-        "title": "投票",
-        "refresh": "他を見る",
-        "nothing": "ありません!",
-        "fetching": "読み込んでいます"
-      },
-      "mk-trends-home-widget": {
-        "title": "トレンド",
-        "refresh": "他を見る",
-        "nothing": "ありません!",
-        "fetching": "読み込んでいます"
-      },
-      "mk-photo-stream-home-widget": {
-        "title": "フォトストリーム",
-        "initializing": "読み込んでいます",
-        "no-photos": "写真はありません"
-      },
-      "mk-donation-home-widget": {
-        "title": "寄付のお願い",
-        "text": "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
-      },
-      "mk-repost-form": {
-        "quote": "引用する...",
-        "cancel": "キャンセル",
-        "repost": "Repost",
-        "reposting": "しています...",
-        "success": "Repostしました!",
-        "failure": "Repostに失敗しました"
-      },
-      "mk-repost-form-window": {
-        "title": "この投稿をRepostしますか?"
-      }
-    }
-  }
-}
diff --git a/locales/ja.yaml b/locales/ja.yaml
new file mode 100644
index 0000000000..080556bdc6
--- /dev/null
+++ b/locales/ja.yaml
@@ -0,0 +1,123 @@
+common:
+  time:
+    unknown: "なぞのじかん"
+    future: "未来"
+    just_now: "たった今"
+    seconds_ago: "{}秒前"
+    minutes_ago: "{}分前"
+    hours_ago: "{}時間前"
+    days_ago: "{}日前"
+    weeks_ago: "{}週間前"
+    months_ago: "{}ヶ月前"
+    years_ago: "{}年前"
+
+  reactions:
+    like: "いいね"
+    love: "ハート"
+    laugh: "笑"
+    hmm: "ふぅ~む"
+    surprise: "わお"
+    congrats: "おめでとう"
+
+  tags:
+    mk-stream-indicator:
+      connecting: "接続中"
+      reconnecting: "再接続中"
+      connected: "接続完了"
+
+    mk-reaction-picker:
+      choose-reaction: "リアクションを選択"
+
+desktop:
+  tags:
+    mk-ui-header-nav:
+      home: "ホーム"
+      messaging: "メッセージ"
+      info: "お知らせ"
+      live: "ライブ"
+
+    mk-ui-header-search:
+      placeholder: "検索"
+
+    mk-ui-header-account:
+      profile: "プロフィール"
+      drive: "ドライブ"
+      mentions: "あなた宛て"
+      settings: "設定"
+      signout: "サインアウト"
+
+    mk-post-form:
+      post-placeholder: "いまどうしてる?"
+      reply-placeholder: "この投稿への返信..."
+      quote-placeholder: "この投稿を引用..."
+      post: "投稿"
+      reply: "返信"
+      repost: "Repost"
+      posted: "投稿しました!"
+      replied: "返信しました!"
+      reposted: "Repostしました!"
+      post-failed: "投稿に失敗しました"
+      reply-failed: "返信に失敗しました"
+      repost-failed: "Repostに失敗しました"
+      posting: "投稿中"
+      attach-media-from-local: "PCからメディアを添付"
+      attach-media-from-drive: "ドライブからメディアを添付"
+      attach-cancel: "添付取り消し"
+      insert-the-cat: "猫挿入"
+      create-poll: "投票を作成"
+      text-remain: "のこり{}文字"
+
+    mk-post-form-window:
+      post: "新規投稿"
+      reply: "返信"
+      attaches: "添付:}メディア"
+      uploading-media: "{}個のメディアをアップロード中"
+
+    mk-timeline-post:
+      reposted-by: "{}がRepost"
+      reply: "返信"
+      repost: "Repost"
+      add-reaction: "リアクション"
+      detail: "詳細"
+
+    mk-notifications-home-widget:
+      title: "通知"
+      settings: "通知の設定"
+
+    mk-user-recommendation-home-widget:
+      title: "おすすめユーザー"
+      refresh: "他を見る"
+      no-one: "いません!"
+      fetching: "読み込んでいます"
+
+    mk-recommended-polls-home-widget:
+      title: "投票"
+      refresh: "他を見る"
+      nothing: "ありません!"
+      fetching: "読み込んでいます"
+
+    mk-trends-home-widget:
+      title: "トレンド"
+      refresh: "他を見る"
+      nothing: "ありません!"
+      fetching: "読み込んでいます"
+
+    mk-photo-stream-home-widget:
+      title: "フォトストリーム"
+      initializing: "読み込んでいます"
+      no-photos: "写真はありません"
+
+    mk-donation-home-widget:
+      title: "寄付のお願い"
+      text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。"
+
+    mk-repost-form:
+      quote: "引用する..."
+      cancel: "キャンセル"
+      repost: "Repost"
+      reposting: "しています..."
+      success: "Repostしました!"
+      failure: "Repostに失敗しました"
+
+    mk-repost-form-window:
+      title: "この投稿をRepostしますか?"
diff --git a/webpack.config.ts b/webpack.config.ts
index b501eb1efd..71374daa9e 100644
--- a/webpack.config.ts
+++ b/webpack.config.ts
@@ -2,15 +2,17 @@
  * webpack config
  */
 
+import * as fs from 'fs';
 import * as webpack from 'webpack';
 const StringReplacePlugin = require('string-replace-webpack-plugin');
+import * as yaml from 'js-yaml';
 
 import version from './src/version';
 const constants = require('./src/const.json');
 
 const languages = {
-	'en': require('./locales/en.json'),
-	'ja': require('./locales/ja.json')
+	'en': yaml.safeLoad(fs.readFileSync('./locales/en.yaml', 'utf-8')),
+	'ja': yaml.safeLoad(fs.readFileSync('./locales/ja.yaml', 'utf-8'))
 };
 
 const env = process.env.NODE_ENV;