diff --git a/locales/ja.yml b/locales/ja.yml
index d71251d203..5040c135d6 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -191,6 +191,12 @@ common/views/widgets/server.vue:
   title: "サーバー情報"
   toggle: "表示を切り替え"
 
+desktop/views/components/activity.chart.vue:
+  total: "Black ... Total"
+  notes: "Blue ... Notes"
+  replies: "Red ... Replies"
+  renotes: "Green ... Renotes"
+
 desktop/views/components/activity.vue:
   title: "アクティビティ"
   toggle: "表示を切り替え"
@@ -201,6 +207,23 @@ desktop/views/components/calendar.vue:
   next: "次の月"
   go: "クリックして時間遡行"
 
+desktop/views/components/choose-file-from-drive-window.vue:
+  choose-file: "ファイル選択中"
+  upload: "PCからドライブにファイルをアップロード"
+  cancel: "キャンセル"
+  ok: "決定"
+  choose-prompt: "ファイルを選択"
+
+desktop/views/components/choose-folder-from-drive-window.vue:
+  cancel: "キャンセル"
+  ok: "決定"
+  choose-prompt: "フォルダを選択"
+
+desktop/views/components/crop-window.vue:
+  skip: "クロップをスキップ"
+  cancel: "キャンセル"
+  ok: "決定"
+
 desktop/views/components/drive-window.vue:
   used: "使用中"
   drive: "ドライブ"
@@ -257,6 +280,32 @@ desktop/views/components/drive.vue:
     upload: "ファイルをアップロード"
     url-upload: "URLからアップロード"
 
+desktop/views/components/follow-button.vue:
+  unfollow: "フォロー解除"
+  follow: "フォローする"
+
+desktop/views/components/followers-window.vue:
+  followers: "{} のフォロワー"
+
+desktop/views/components/followers.vue:
+  empty: "フォロワーはいないようです。"
+
+desktop/views/components/following-window.vue:
+  following: "{} のフォロー"
+
+desktop/views/components/following.vue:
+  empty: "フォロー中のユーザーはいないようです。"
+
+desktop/views/components/friends-maker.vue:
+  title: "気になるユーザーをフォロー:"
+  empty: "おすすめのユーザーは見つかりませんでした。"
+  fetching: "読み込んでいます"
+  refresh: "もっと見る"
+  close: "閉じる"
+
+desktop/views/components/game-window.vue:
+  game: "オセロ"
+
 desktop/views/components/home.vue:
   done: "完了"
   add-widget: "ウィジェットを追加:"
@@ -283,9 +332,25 @@ desktop/views/components/home.vue:
   tips: "ヒント"
   add: "追加"
 
+desktop/views/input-dialog.vue:
+  cancel: "キャンセル"
+  ok: "決定"
+
+desktop/views/components/mentions.vue:
+  all: "すべて"
+  followed: "フォロー中"
+  empty: "あなた宛ての投稿はありません。"
+  empty-followed: "あなたがフォローしているユーザーからの言及はありません。"
+
+desktop/views/components/messaging-room-window.vue:
+  title: "メッセージ:"
+
 desktop/views/components/messaging-window.vue:
   title: "メッセージ"
 
+desktop/views/components/note-detail.sub.vue:
+  private: "(この投稿は非公開です)"
+
 desktop/views/components/notes.note.vue:
   reposted-by: "{}がRenote"
   reply: "返信"
@@ -293,6 +358,10 @@ desktop/views/components/notes.note.vue:
   add-reaction: "リアクション"
   detail: "詳細"
 
+desktop/views/components/notes.vue:
+  error: "読み込みに失敗しました。"
+  retry: "リトライ"
+
 desktop/views/components/notifications.vue:
   more: "もっと見る"
   empty: "ありません!"
@@ -324,6 +393,9 @@ desktop/views/components/post-form-window.vue:
   attaches: "添付: {}メディア"
   uploading-media: "{}個のメディアをアップロード中"
 
+desktop/views/components/progress-dialog.vue:
+  waiting: "待機中"
+
 desktop/views/components/renote-form.vue:
   quote: "引用する..."
   cancel: "キャンセル"
@@ -348,6 +420,80 @@ desktop/views/components/settings.vue:
   other: "その他"
   license: "ライセンス"
 
+  behaviour: "動作"
+  fetch-on-scroll: "スクロールで自動読み込み"
+  fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
+  auto-popout: "ウィンドウの自動ポップアウト"
+  auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
+  advanced: "詳細設定"
+  api-via-stream: "ストリームを経由したAPIリクエスト"
+  api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
+
+  display: "デザインと表示"
+  customize: "ホームをカスタマイズ"
+  dark-mode: "ダークモード"
+  circle-icons: "円形のアイコンを使用"
+  gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用"
+  post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
+  show-reply-target: "リプライ先を表示する"
+  show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
+  show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
+  show-maps: "マップの自動展開"
+  show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。"
+
+  sound: "サウンド"
+  enable-sounds: "サウンドを有効にする"
+  enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
+  volume: "ボリューム"
+  test: "テスト"
+
+  mobile: "モバイル"
+  disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+
+  language: "言語"
+  pick-language: "言語を選択"
+  recommended: "推奨"
+  auto: "自動"
+  specify-language: "言語を指定"
+  language-desc: "変更はページの再度読み込み後に反映されます。"
+
+  cache: "キャッシュ"
+  clean-cache: "クリーンアップ"
+  cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
+  cache-cleared: "キャッシュを削除しました"
+  cache-cleared-desc: "ページを再度読み込みしてください。"
+
+  auto-watch: "投稿の自動ウォッチ"
+  auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
+
+  about: "Misskeyについて"
+  operator: "このサーバーの運営者"
+
+  update: "Misskey Update"
+  version: "バージョン:"
+  latest-version: "最新のバージョン:"
+  update-checking: "アップデートを確認中"
+  do-update: "アップデートを確認"
+  update-settings: "詳細設定"
+  prevent-update: "アップデートを延期する(非推奨)"
+  prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
+  no-updates: "利用可能な更新はありません"
+  no-updates-desc: "お使いのMisskeyは最新です。"
+  update-available: "新しいバージョンが利用可能です"
+  update-available-desc: "ページを再度読み込みすると更新が適用されます。"
+
+  advanced-settings: "高度な設定"
+  debug-mode: "デバッグモードを有効にする"
+  debug-mode-desc: "この設定はブラウザに記憶されます。"
+  use-raw-script: "生のスクリプトを読み込む"
+  use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
+  source-info: "Misskeyはソースマップも提供しています。"
+  experimental: "実験的機能を有効にする"
+  experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
+  tools: "ツール"
+  task-manager: "タスクマネージャ"
+  third-parties: "サードパーティ"
+
 desktop/views/components/settings.2fa.vue:
   intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
   detail: "詳細..."
@@ -398,6 +544,9 @@ desktop/views/components/settings.profile.vue:
   birthday: "誕生日"
   save: "保存"
 
+desktop/views/components/taskmanager.vue:
+  title: "タスクマネージャ"
+
 desktop/views/components/timeline.vue:
   home: "ホーム"
   local: "ローカル"
diff --git a/src/client/app/desktop/views/components/activity.chart.vue b/src/client/app/desktop/views/components/activity.chart.vue
index 175c5d37ed..ff489d988b 100644
--- a/src/client/app/desktop/views/components/activity.chart.vue
+++ b/src/client/app/desktop/views/components/activity.chart.vue
@@ -1,6 +1,6 @@
 <template>
 <svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" preserveAspectRatio="none" @mousedown.prevent="onMousedown">
-	<title>Black ... Total<br/>Blue ... Notes<br/>Red ... Replies<br/>Green ... Renotes</title>
+	<title>%i18n:@total%<br/>%i18n:@notes%<br/>%i18n:@replies%<br/>%i18n:@renotes%</title>
 	<polyline
 		:points="pointsNote"
 		fill="none"
diff --git a/src/client/app/desktop/views/components/choose-file-from-drive-window.vue b/src/client/app/desktop/views/components/choose-file-from-drive-window.vue
index 9a1e9c958a..30e59429d2 100644
--- a/src/client/app/desktop/views/components/choose-file-from-drive-window.vue
+++ b/src/client/app/desktop/views/components/choose-file-from-drive-window.vue
@@ -2,7 +2,7 @@
 <mk-window ref="window" is-modal width="800px" height="500px" @closed="$destroy">
 	<span slot="header">
 		<span v-html="title" :class="$style.title"></span>
-		<span :class="$style.count" v-if="multiple && files.length > 0">({{ files.length }}ファイル選択中)</span>
+		<span :class="$style.count" v-if="multiple && files.length > 0">({{ files.length }}%i18n:@choose-file%)</span>
 	</span>
 
 	<mk-drive
@@ -13,9 +13,9 @@
 		@change-selection="onChangeSelection"
 	/>
 	<div :class="$style.footer">
-		<button :class="$style.upload" title="PCからドライブにファイルをアップロード" @click="upload">%fa:upload%</button>
-		<button :class="$style.cancel" @click="cancel">キャンセル</button>
-		<button :class="$style.ok" :disabled="multiple && files.length == 0" @click="ok">決定</button>
+		<button :class="$style.upload" title="%i18n:@upload%" @click="upload">%fa:upload%</button>
+		<button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
+		<button :class="$style.ok" :disabled="multiple && files.length == 0" @click="ok">%i18n:@ok%</button>
 	</div>
 </mk-window>
 </template>
@@ -28,7 +28,7 @@ export default Vue.extend({
 			default: false
 		},
 		title: {
-			default: '%fa:R file%ファイルを選択'
+			default: '%fa:R file%%i18n:@choose-prompt%s'
 		}
 	},
 	data() {
@@ -177,4 +177,3 @@ export default Vue.extend({
 		border-color #dcdcdc
 
 </style>
-
diff --git a/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue b/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue
index f99533176d..0c4643fdcb 100644
--- a/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue
+++ b/src/client/app/desktop/views/components/choose-folder-from-drive-window.vue
@@ -10,8 +10,8 @@
 		:multiple="false"
 	/>
 	<div :class="$style.footer">
-		<button :class="$style.cancel" @click="cancel">キャンセル</button>
-		<button :class="$style.ok" @click="ok">決定</button>
+		<button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
+		<button :class="$style.ok" @click="ok">%i18n:@ok%</button>
 	</div>
 </mk-window>
 </template>
@@ -21,7 +21,7 @@ import Vue from 'vue';
 export default Vue.extend({
 	props: {
 		title: {
-			default: '%fa:R folder%フォルダを選択'
+			default: '%fa:R folder%%i18n:@choose-prompt%'
 		}
 	},
 	methods: {
diff --git a/src/client/app/desktop/views/components/crop-window.vue b/src/client/app/desktop/views/components/crop-window.vue
index eb6a55d959..4fa258549f 100644
--- a/src/client/app/desktop/views/components/crop-window.vue
+++ b/src/client/app/desktop/views/components/crop-window.vue
@@ -10,9 +10,9 @@
 			/>
 		</div>
 		<div :class="$style.actions">
-			<button :class="$style.skip" @click="skip">クロップをスキップ</button>
-			<button :class="$style.cancel" @click="cancel">キャンセル</button>
-			<button :class="$style.ok" @click="ok">決定</button>
+			<button :class="$style.skip" @click="skip">%i18n:@skip%</button>
+			<button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
+			<button :class="$style.ok" @click="ok">%i18n:@ok%</button>
 		</div>
 	</mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/follow-button.vue b/src/client/app/desktop/views/components/follow-button.vue
index 60c6129f61..dae7604957 100644
--- a/src/client/app/desktop/views/components/follow-button.vue
+++ b/src/client/app/desktop/views/components/follow-button.vue
@@ -3,15 +3,15 @@
 	:class="{ wait, follow: !user.isFollowing, unfollow: user.isFollowing, big: size == 'big' }"
 	@click="onClick"
 	:disabled="wait"
-	:title="user.isFollowing ? 'フォロー解除' : 'フォローする'"
+	:title="user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%'"
 >
 	<template v-if="!wait && user.isFollowing">
 		<template v-if="size == 'compact'">%fa:minus%</template>
-		<template v-if="size == 'big'">%fa:minus%フォロー解除</template>
+		<template v-if="size == 'big'">%fa:minus%%i18n:@unfollow%</template>
 	</template>
 	<template v-if="!wait && !user.isFollowing">
 		<template v-if="size == 'compact'">%fa:plus%</template>
-		<template v-if="size == 'big'">%fa:plus%フォロー</template>
+		<template v-if="size == 'big'">%fa:plus%%i18n:@follow%</template>
 	</template>
 	<template v-if="wait">%fa:spinner .pulse .fw%</template>
 </button>
diff --git a/src/client/app/desktop/views/components/followers-window.vue b/src/client/app/desktop/views/components/followers-window.vue
index 16206299d7..f3eec13e0b 100644
--- a/src/client/app/desktop/views/components/followers-window.vue
+++ b/src/client/app/desktop/views/components/followers-window.vue
@@ -1,7 +1,7 @@
 <template>
 <mk-window width="400px" height="550px" @closed="$destroy">
 	<span slot="header" :class="$style.header">
-		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ user | userName }}のフォロワー
+		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@followers%.replace('{}', {{ user | userName }})
 	</span>
 	<mk-followers :user="user"/>
 </mk-window>
diff --git a/src/client/app/desktop/views/components/followers.vue b/src/client/app/desktop/views/components/followers.vue
index a1b98995d8..1ef9f69771 100644
--- a/src/client/app/desktop/views/components/followers.vue
+++ b/src/client/app/desktop/views/components/followers.vue
@@ -4,7 +4,7 @@
 	:count="user.followersCount"
 	:you-know-count="user.followersYouKnowCount"
 >
-	フォロワーはいないようです。
+	%i18n:@empty%
 </mk-users-list>
 </template>
 
diff --git a/src/client/app/desktop/views/components/following-window.vue b/src/client/app/desktop/views/components/following-window.vue
index cc3d77198e..153819b12e 100644
--- a/src/client/app/desktop/views/components/following-window.vue
+++ b/src/client/app/desktop/views/components/following-window.vue
@@ -1,7 +1,7 @@
 <template>
 <mk-window width="400px" height="550px" @closed="$destroy">
 	<span slot="header" :class="$style.header">
-		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ user | userName }}のフォロー
+		<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@following%.replace('{}', {{ user | userName }})
 	</span>
 	<mk-following :user="user"/>
 </mk-window>
diff --git a/src/client/app/desktop/views/components/following.vue b/src/client/app/desktop/views/components/following.vue
index b7aedda84f..d55ce1c0d4 100644
--- a/src/client/app/desktop/views/components/following.vue
+++ b/src/client/app/desktop/views/components/following.vue
@@ -4,7 +4,7 @@
 	:count="user.followingCount"
 	:you-know-count="user.followingYouKnowCount"
 >
-	フォロー中のユーザーはいないようです。
+	%i18n:@empty%
 </mk-users-list>
 </template>
 
diff --git a/src/client/app/desktop/views/components/friends-maker.vue b/src/client/app/desktop/views/components/friends-maker.vue
index 3c1f8b8257..7dfd9e4359 100644
--- a/src/client/app/desktop/views/components/friends-maker.vue
+++ b/src/client/app/desktop/views/components/friends-maker.vue
@@ -1,6 +1,6 @@
 <template>
 <div class="mk-friends-maker">
-	<p class="title">気になるユーザーをフォロー:</p>
+	<p class="title">%i18n:@title%</p>
 	<div class="users" v-if="!fetching && users.length > 0">
 		<div class="user" v-for="user in users" :key="user.id">
 			<mk-avatar class="avatar" :user="user" target="_blank"/>
@@ -11,10 +11,10 @@
 			<mk-follow-button :user="user"/>
 		</div>
 	</div>
-	<p class="empty" v-if="!fetching && users.length == 0">おすすめのユーザーは見つかりませんでした。</p>
-	<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%読み込んでいます<mk-ellipsis/></p>
-	<a class="refresh" @click="refresh">もっと見る</a>
-	<button class="close" @click="$destroy()" title="閉じる">%fa:times%</button>
+	<p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p>
+	<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@fetching%<mk-ellipsis/></p>
+	<a class="refresh" @click="refresh">%i18n:@refresh%</a>
+	<button class="close" @click="$destroy()" title="%i18n:@close%">%fa:times%</button>
 </div>
 </template>
 
diff --git a/src/client/app/desktop/views/components/game-window.vue b/src/client/app/desktop/views/components/game-window.vue
index 3c8bf40e12..c3c0f90075 100644
--- a/src/client/app/desktop/views/components/game-window.vue
+++ b/src/client/app/desktop/views/components/game-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy">
-	<span slot="header" :class="$style.header">%fa:gamepad%オセロ</span>
+	<span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span>
 	<mk-othello :class="$style.content" @gamed="g => game = g"/>
 </mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/input-dialog.vue b/src/client/app/desktop/views/components/input-dialog.vue
index e939fc1903..e2cf4e48fd 100644
--- a/src/client/app/desktop/views/components/input-dialog.vue
+++ b/src/client/app/desktop/views/components/input-dialog.vue
@@ -8,8 +8,8 @@
 		<input ref="text" v-model="text" :type="type" @keydown="onKeydown" :placeholder="placeholder"/>
 	</div>
 	<div :class="$style.actions">
-		<button :class="$style.cancel" @click="cancel">キャンセル</button>
-		<button :class="$style.ok" :disabled="!allowEmpty && text.length == 0" @click="ok">決定</button>
+		<button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
+		<button :class="$style.ok" :disabled="!allowEmpty && text.length == 0" @click="ok">%i18n:@ok%</button>
 	</div>
 </mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/mentions.vue b/src/client/app/desktop/views/components/mentions.vue
index 66bdab5c08..23fb7cccd4 100644
--- a/src/client/app/desktop/views/components/mentions.vue
+++ b/src/client/app/desktop/views/components/mentions.vue
@@ -1,16 +1,16 @@
 <template>
 <div class="mk-mentions">
 	<header>
-		<span :data-active="mode == 'all'" @click="mode = 'all'">すべて</span>
-		<span :data-active="mode == 'following'" @click="mode = 'following'">フォロー中</span>
+		<span :data-active="mode == 'all'" @click="mode = 'all'">%i18n:@all%</span>
+		<span :data-active="mode == 'following'" @click="mode = 'following'">%i18n:@followed%</span>
 	</header>
 	<div class="fetching" v-if="fetching">
 		<mk-ellipsis-icon/>
 	</div>
 	<p class="empty" v-if="notes.length == 0 && !fetching">
 		%fa:R comments%
-		<span v-if="mode == 'all'">あなた宛ての投稿はありません。</span>
-		<span v-if="mode == 'following'">あなたがフォローしているユーザーからの言及はありません。</span>
+		<span v-if="mode == 'all'">%i18n:@empty%</span>
+		<span v-if="mode == 'following'">%i18n:@empty-followed%</span>
 	</p>
 	<mk-notes :notes="notes" ref="timeline"/>
 </div>
diff --git a/src/client/app/desktop/views/components/messaging-room-window.vue b/src/client/app/desktop/views/components/messaging-room-window.vue
index dbe3266734..cbb58b5e99 100644
--- a/src/client/app/desktop/views/components/messaging-room-window.vue
+++ b/src/client/app/desktop/views/components/messaging-room-window.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="$destroy">
-	<span slot="header" :class="$style.header">%fa:comments%メッセージ: {{ user | userName }}</span>
+	<span slot="header" :class="$style.header">%fa:comments%%i18n:@title% {{ user | userName }}</span>
 	<mk-messaging-room :user="user" :class="$style.content"/>
 </mk-window>
 </template>
diff --git a/src/client/app/desktop/views/components/note-detail.sub.vue b/src/client/app/desktop/views/components/note-detail.sub.vue
index 32119da50d..c798b41b25 100644
--- a/src/client/app/desktop/views/components/note-detail.sub.vue
+++ b/src/client/app/desktop/views/components/note-detail.sub.vue
@@ -15,7 +15,7 @@
 		</header>
 		<div class="body">
 			<div class="text">
-				<span v-if="note.isHidden" style="opacity: 0.5">(この投稿は非公開です)</span>
+				<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
 				<mk-note-html v-if="note.text" :text="note.text" :i="os.i"/>
 			</div>
 			<div class="media" v-if="note.mediaIds.length > 0">
diff --git a/src/client/app/desktop/views/components/notes.vue b/src/client/app/desktop/views/components/notes.vue
index 7e80e6f74a..c041e5278c 100644
--- a/src/client/app/desktop/views/components/notes.vue
+++ b/src/client/app/desktop/views/components/notes.vue
@@ -5,8 +5,8 @@
 	<slot name="empty" v-if="notes.length == 0 && !fetching && requestInitPromise == null"></slot>
 
 	<div v-if="!fetching && requestInitPromise != null">
-		<p>読み込みに失敗しました。</p>
-		<button @click="resolveInitPromise">リトライ</button>
+		<p>%i18n:@error%</p>
+		<button @click="resolveInitPromise">%i18n:@retry%</button>
 	</div>
 
 	<transition-group name="mk-notes" class="transition">
diff --git a/src/client/app/desktop/views/components/progress-dialog.vue b/src/client/app/desktop/views/components/progress-dialog.vue
index a4292e1aec..2f59733d99 100644
--- a/src/client/app/desktop/views/components/progress-dialog.vue
+++ b/src/client/app/desktop/views/components/progress-dialog.vue
@@ -2,7 +2,7 @@
 <mk-window ref="window" :is-modal="false" :can-close="false" width="500px" @closed="$destroy">
 	<span slot="header">{{ title }}<mk-ellipsis/></span>
 	<div :class="$style.body">
-		<p :class="$style.init" v-if="isNaN(value)">待機中<mk-ellipsis/></p>
+		<p :class="$style.init" v-if="isNaN(value)">%i18n:@waiting%<mk-ellipsis/></p>
 		<p :class="$style.percentage" v-if="!isNaN(value)">{{ Math.floor((value / max) * 100) }}</p>
 		<progress :class="$style.progress"
 			v-if="!isNaN(value) && value < max"
diff --git a/src/client/app/desktop/views/components/settings.vue b/src/client/app/desktop/views/components/settings.vue
index 4e5e281fd0..9510752f7b 100644
--- a/src/client/app/desktop/views/components/settings.vue
+++ b/src/client/app/desktop/views/components/settings.vue
@@ -19,91 +19,91 @@
 		</section>
 
 		<section class="web" v-show="page == 'web'">
-			<h1>動作</h1>
-			<mk-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll" text="スクロールで自動読み込み">
-				<span>ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。</span>
+			<h1>%i18n:@behaviour%</h1>
+			<mk-switch v-model="clientSettings.fetchOnScroll" @change="onChangeFetchOnScroll" text="%i18n:@fetch-on-scroll%>
+				<span>%i18n:@fetch-on-scroll-desc%</span>
 			</mk-switch>
-			<mk-switch v-model="autoPopout" text="ウィンドウの自動ポップアウト">
-				<span>ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。</span>
+			<mk-switch v-model="autoPopout" text="%i18n:@auto-popout%">
+				<span>%i18n:@auto-popout-desc%</span>
 			</mk-switch>
 			<details>
-				<summary>詳細設定</summary>
-				<mk-switch v-model="apiViaStream" text="ストリームを経由したAPIリクエスト">
-					<span>この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。</span>
+				<summary>%i18n:@advanced%</summary>
+				<mk-switch v-model="apiViaStream" text="%i18n:@api-via-stream%">
+					<span>%i18n:@api-via-stream-desc%</span>
 				</mk-switch>
 			</details>
 		</section>
 
 		<section class="web" v-show="page == 'web'">
-			<h1>デザインと表示</h1>
+			<h1>%i18n:@display%</h1>
 			<div class="div">
-				<button class="ui button" @click="customizeHome" style="margin-bottom: 16px">ホームをカスタマイズ</button>
+				<button class="ui button" @click="customizeHome" style="margin-bottom: 16px">%i18n:@customize%</button>
 			</div>
 			<div class="div">
-				<mk-switch v-model="darkmode" text="ダークモード"/>
-				<mk-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons" text="円形のアイコンを使用"/>
-				<mk-switch v-model="clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="ウィンドウのタイトルバーにグラデーションを使用"/>
+				<mk-switch v-model="darkmode" text="%i18n:@dark-mode%"/>
+				<mk-switch v-model="clientSettings.circleIcons" @change="onChangeCircleIcons" text="%i18n:@circle-icons%"/>
+				<mk-switch v-model="clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="%i18n:@gradient-window-header%"/>
 			</div>
-			<mk-switch v-model="clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="タイムライン上部に投稿フォームを表示する"/>
-			<mk-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="リプライ先を表示する"/>
-			<mk-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes" text="自分の行ったRenoteをタイムラインに表示する"/>
-			<mk-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="Renoteされた自分の投稿をタイムラインに表示する"/>
-			<mk-switch v-model="clientSettings.showMaps" @change="onChangeShowMaps" text="マップの自動展開">
-				<span>位置情報が添付された投稿のマップを自動的に展開します。</span>
+			<mk-switch v-model="clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="%i18n:@post-form-on-timeline%"/>
+			<mk-switch v-model="clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="%i18n:@show-reply-target%"/>
+			<mk-switch v-model="clientSettings.showMyRenotes" @change="onChangeShowMyRenotes" text="%i18n:@show-my-renotes%"/>
+			<mk-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes" text="%i18n:@show-renoted-my-notes%"/>
+			<mk-switch v-model="clientSettings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
+				<span>%i18n:@show-maps-desc%</span>
 			</mk-switch>
 		</section>
 
 		<section class="web" v-show="page == 'web'">
-			<h1>サウンド</h1>
-			<mk-switch v-model="enableSounds" text="サウンドを有効にする">
-				<span>投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。</span>
+			<h1>%i18n:@sound%</h1>
+			<mk-switch v-model="enableSounds" text="%i18n:@enable-sounds%">
+				<span>%i18n:@enable-sounds-desc%</span>
 			</mk-switch>
-			<label>ボリューム</label>
+			<label>%i18n:@volume%</label>
 			<el-slider
 				v-model="soundVolume"
 				:show-input="true"
 				:format-tooltip="v => `${v}%`"
 				:disabled="!enableSounds"
 			/>
-			<button class="ui button" @click="soundTest">%fa:volume-up% テスト</button>
+			<button class="ui button" @click="soundTest">%fa:volume-up% %i18n:@test%</button>
 		</section>
 
 		<section class="web" v-show="page == 'web'">
-			<h1>モバイル</h1>
-			<mk-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile" text="「モバイルからの投稿」フラグを付けない"/>
+			<h1>%i18n:@mobile%</h1>
+			<mk-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile" text="%i18n:@disable-via-mobile%"/>
 		</section>
 
 		<section class="web" v-show="page == 'web'">
-			<h1>言語</h1>
-			<el-select v-model="lang" placeholder="言語を選択">
-				<el-option-group label="推奨">
-					<el-option label="自動" value=""/>
+			<h1>%i18n:@language%</h1>
+			<el-select v-model="lang" placeholder="%i18n:@pick-language%">
+				<el-option-group label="%i18n:@recommended%">
+					<el-option label="%i18n:@auto%" value=""/>
 				</el-option-group>
-				<el-option-group label="言語を指定">
-					<el-option label="ja" value="ja"/>
-					<el-option label="en" value="en"/>
-					<el-option label="fr" value="fr"/>
-					<el-option label="pl" value="pl"/>
-					<el-option label="de" value="de"/>
+				<el-option-group label="%i18n:@specify-language%">
+					<el-option label="日本語" value="ja"/>
+					<el-option label="English" value="en"/>
+					<el-option label="Français" value="fr"/>
+					<el-option label="Polski" value="pl"/>
+					<el-option label="Deutsch" value="de"/>
 				</el-option-group>
 			</el-select>
 			<div class="none ui info">
-				<p>%fa:info-circle%変更はページの再度読み込み後に反映されます。</p>
+				<p>%fa:info-circle%%i18n:@language-desc%</p>
 			</div>
 		</section>
 
 		<section class="web" v-show="page == 'web'">
-			<h1>キャッシュ</h1>
-			<button class="ui button" @click="clean">クリーンアップ</button>
+			<h1>%i18n:@cache%</h1>
+			<button class="ui button" @click="clean">%i18n:@clean-cache%</button>
 			<div class="none ui info warn">
-				<p>%fa:exclamation-triangle%クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。</p>
+				<p>%fa:exclamation-triangle%%i18n:@cache-warn%</p>
 			</div>
 		</section>
 
 		<section class="notification" v-show="page == 'notification'">
 			<h1>%i18n:@notification%</h1>
-			<mk-switch v-model="os.i.settings.autoWatch" @change="onChangeAutoWatch" text="投稿の自動ウォッチ">
-				<span>リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。</span>
+			<mk-switch v-model="os.i.settings.autoWatch" @change="onChangeAutoWatch" text="%i18n:@auto-watch%">
+				<span>%i18n:@auto-watch-desc%</span>
 			</mk-switch>
 		</section>
 
@@ -148,57 +148,57 @@
 		</section>
 
 		<section class="other" v-show="page == 'other'">
-			<h1>Misskeyについて</h1>
-			<p v-if="meta">このサーバーの運営者: <i><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></i></p>
+			<h1>%i18n:@about%</h1>
+			<p v-if="meta">%i18n:@operator%: <i><a :href="meta.maintainer.url" target="_blank">{{ meta.maintainer.name }}</a></i></p>
 		</section>
 
 		<section class="other" v-show="page == 'other'">
-			<h1>Misskey Update</h1>
+			<h1>%i18n:@update%</h1>
 			<p>
-				<span>バージョン: <i>{{ version }}</i></span>
+				<span>%i18n:@version% <i>{{ version }}</i></span>
 				<template v-if="latestVersion !== undefined">
 					<br>
-					<span>最新のバージョン: <i>{{ latestVersion ? latestVersion : version }}</i></span>
+					<span>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></span>
 				</template>
 			</p>
 			<button class="ui button block" @click="checkForUpdate" :disabled="checkingForUpdate">
-				<template v-if="checkingForUpdate">アップデートを確認中<mk-ellipsis/></template>
-				<template v-else>アップデートを確認</template>
+				<template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template>
+				<template v-else>%i18n:@do-update%</template>
 			</button>
 			<details>
-				<summary>詳細設定</summary>
-				<mk-switch v-model="preventUpdate" text="アップデートを延期する(非推奨)">
-					<span>この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。</span>
+				<summary>%i18n:@update-settings%</summary>
+				<mk-switch v-model="preventUpdate" text="%i18n:@prevent-update%>
+					<span>%i18n:@prevent-update-desc%</span>
 				</mk-switch>
 			</details>
 		</section>
 
 		<section class="other" v-show="page == 'other'">
-			<h1>高度な設定</h1>
-			<mk-switch v-model="debug" text="デバッグモードを有効にする">
-				<span>この設定はブラウザに記憶されます。</span>
+			<h1>%i18n:@advanced-settings%</h1>
+			<mk-switch v-model="debug" text="%i18n:@debug-mode%">
+				<span>%i18n:@debug-mode-desc%</span>
 			</mk-switch>
 			<template v-if="debug">
-				<mk-switch v-model="useRawScript" text="生のスクリプトを読み込む">
-					<span>圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。</span>
+				<mk-switch v-model="useRawScript" text="%i18n:@use-raw-script%">
+					<span>%i18n:@use-raw-script-desc%</span>
 				</mk-switch>
 				<div class="none ui info">
-				<p>%fa:info-circle%Misskeyはソースマップも提供しています。</p>
+				<p>%fa:info-circle%%i18n:@source-info%</p>
 			</div>
 			</template>
-			<mk-switch v-model="enableExperimental" text="実験的機能を有効にする">
-				<span>実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。</span>
+			<mk-switch v-model="enableExperimental" text="%i18n:@experimental%">
+				<span>%i18n:@experimental-desc%</span>
 			</mk-switch>
 			<details v-if="debug">
-				<summary>ツール</summary>
-				<button class="ui button block" @click="taskmngr">タスクマネージャ</button>
+				<summary>%i18n:@tools%</summary>
+				<button class="ui button block" @click="taskmngr">%i18n:@task-manager%</button>
 			</details>
 		</section>
 
 		<section class="other" v-show="page == 'other'">
 			<h1>%i18n:@license%</h1>
 			<div v-html="license"></div>
-			<a :href="licenseUrl" target="_blank">サードパーティ</a>
+			<a :href="licenseUrl" target="_blank">%i18n:@third-parties%</a>
 		</section>
 	</div>
 </div>
@@ -371,13 +371,13 @@ export default Vue.extend({
 				this.latestVersion = newer;
 				if (newer == null) {
 					(this as any).apis.dialog({
-						title: '利用可能な更新はありません',
-						text: 'お使いのMisskeyは最新です。'
+						title: '%i18n:@no-updates%',
+						text: '%i18n:@no-updates-desc%'
 					});
 				} else {
 					(this as any).apis.dialog({
-						title: '新しいバージョンが利用可能です',
-						text: 'ページを再度読み込みすると更新が適用されます。'
+						title: '%i18n:@update-available%',
+						text: '%i18n:@update-available-desc%'
 					});
 				}
 			});
@@ -385,8 +385,8 @@ export default Vue.extend({
 		clean() {
 			localStorage.clear();
 			(this as any).apis.dialog({
-				title: 'キャッシュを削除しました',
-				text: 'ページを再度読み込みしてください。'
+				title: '%i18n:@cache-cleared%',
+				text: '%i18n:@caache-cleared-desc%'
 			});
 		},
 		soundTest() {
diff --git a/src/client/app/desktop/views/components/taskmanager.vue b/src/client/app/desktop/views/components/taskmanager.vue
index a00fabb047..1f1385add8 100644
--- a/src/client/app/desktop/views/components/taskmanager.vue
+++ b/src/client/app/desktop/views/components/taskmanager.vue
@@ -1,6 +1,6 @@
 <template>
 <mk-window ref="window" width="750px" height="500px" @closed="$destroy" name="TaskManager">
-	<span slot="header" :class="$style.header">%fa:stethoscope%タスクマネージャ</span>
+	<span slot="header" :class="$style.header">%fa:stethoscope%%i18n:@title%</span>
 	<el-tabs :class="$style.content">
 		<el-tab-pane label="Requests">
 			<el-table