diff --git a/locales/ja.yml b/locales/ja.yml
index 1e0359254f..6aac8acca2 100644
--- a/locales/ja.yml
+++ b/locales/ja.yml
@@ -11,6 +11,7 @@ common:
     warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
   application-authorization: "アプリの連携"
   close: "閉じる"
+  got-it: "わかった"
   customization-tips:
     title: "カスタマイズのヒント"
     paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
@@ -41,13 +42,6 @@ common:
 
   trash: "ゴミ箱"
 
-  date:
-    full-year: "年"
-    month: "月"
-    day: "日"
-    hours: "時"
-    minutes: "分"
-
   weekday-short:
     sunday: "日"
     monday: "月"
@@ -311,6 +305,8 @@ common/views/components/signin.vue:
   token: "トークン"
   signing-in: "やってます..."
   signin: "サインイン"
+  or: "または"
+  signin-with-twitter: "Twitterでログイン"
 
 common/views/components/signup.vue:
   username: "ユーザー名"
@@ -438,6 +434,18 @@ common/views/pages/follow.vue:
   request-pending: "フォロー許可待ち"
   follow-request: "フォロー申請"
 
+desktop:
+  banner-crop-title: "バナーとして表示する部分を選択"
+  banner: "バナー"
+  uploading-banner: "新しいバナーをアップロードしています"
+  banner-updated: "バナーを更新しました"
+  choose-banner: "バナーにする画像を選択"
+  avatar-crop-title: "アバターとして表示する部分を選択"
+  avatar: "アバター"
+  uploading-avatar: "新しいアバターをアップロードしています"
+  avatar-updated: "アバターを更新しました"
+  choose-avatar: "アバターにする画像を選択"
+
 desktop/views/components/activity.chart.vue:
   total: "Black ... Total"
   notes: "Blue ... Notes"
@@ -855,11 +863,10 @@ desktop/views/components/received-follow-requests-window.vue:
   accept: "承認"
   reject: "拒否"
 
-
-
 desktop/views/components/user-lists-window.vue:
   title: "リスト"
   create-list: "リストを作成"
+  list-name: "リスト名"
 
 desktop/views/components/user-preview.vue:
   notes: "投稿"
@@ -964,6 +971,8 @@ desktop/views/pages/user/user.profile.vue:
   mute: "ミュートする"
   muted: "ミュートしています"
   unmute: "ミュート解除"
+  push-to-a-list: "リストに追加"
+  list-pushed: "{user}を{list}に追加しました。"
 
 desktop/views/pages/user/user.header.vue:
   posts: "投稿"
diff --git a/src/client/app/common/scripts/date-stringify.ts b/src/client/app/common/scripts/date-stringify.ts
deleted file mode 100644
index 2b8e525567..0000000000
--- a/src/client/app/common/scripts/date-stringify.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export default date => {
-	if (typeof date == 'string') date = new Date(date);
-	return (
-		date.getFullYear()    + '%i18n:common.date.full-year%' +
-		(date.getMonth() + 1) + '%i18n:common.date.month%' +
-		date.getDate()        + '%i18n:common.date.day%' +
-		' ' +
-		date.getHours()       + '%i18n:common.date.hours%' +
-		date.getMinutes()     + '%i18n:common.date.minutes%' +
-		' ' +
-		`(${['日', '月', '火', '水', '木', '金', '土'][date.getDay()]})`
-	);
-};
diff --git a/src/client/app/common/views/components/signin.vue b/src/client/app/common/views/components/signin.vue
index 58241cef09..deaeeca6a7 100644
--- a/src/client/app/common/views/components/signin.vue
+++ b/src/client/app/common/views/components/signin.vue
@@ -12,7 +12,7 @@
 	</ui-input>
 	<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
 	<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
-	<p style="margin: 8px 0;">または<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a></p>
+	<p style="margin: 8px 0;">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
 </form>
 </template>
 
diff --git a/src/client/app/desktop/api/update-avatar.ts b/src/client/app/desktop/api/update-avatar.ts
index 887367a24e..83820f92bd 100644
--- a/src/client/app/desktop/api/update-avatar.ts
+++ b/src/client/app/desktop/api/update-avatar.ts
@@ -8,7 +8,7 @@ export default (os: OS) => (cb, file = null) => {
 
 		const w = os.new(CropWindow, {
 			image: file,
-			title: 'アバターとして表示する部分を選択',
+			title: '%i18n:desktop.avatar-crop-title%',
 			aspectRatio: 1 / 1
 		});
 
@@ -18,11 +18,11 @@ export default (os: OS) => (cb, file = null) => {
 			data.append('file', blob, file.name + '.cropped.png');
 
 			os.api('drive/folders/find', {
-				name: 'アイコン'
+				name: '%i18n:desktop.avatar%'
 			}).then(iconFolder => {
 				if (iconFolder.length === 0) {
 					os.api('drive/folders/create', {
-						name: 'アイコン'
+						name: '%i18n:desktop.avatar%'
 					}).then(iconFolder => {
 						upload(data, iconFolder);
 					});
@@ -41,7 +41,7 @@ export default (os: OS) => (cb, file = null) => {
 
 	const upload = (data, folder) => {
 		const dialog = os.new(ProgressDialog, {
-			title: '新しいアバターをアップロードしています'
+			title: '%i18n:desktop.uploading-avatar%'
 		});
 		document.body.appendChild(dialog.$el);
 
@@ -76,10 +76,10 @@ export default (os: OS) => (cb, file = null) => {
 			});
 
 			os.apis.dialog({
-				title: '%fa:info-circle%アバターを更新しました',
-				text: '新しいアバターが反映されるまで時間がかかる場合があります。',
+				title: '%fa:info-circle% %i18n:desktop.avatar-updated%',
+				text: null,
 				actions: [{
-					text: 'わかった'
+					text: '%i18n:common.got-it%'
 				}]
 			});
 
@@ -92,7 +92,7 @@ export default (os: OS) => (cb, file = null) => {
 	} else {
 		os.apis.chooseDriveFile({
 			multiple: false,
-			title: '%fa:image%アバターにする画像を選択'
+			title: '%fa:image% %i18n:desktop.choose-avatar%'
 		}).then(file => {
 			fileSelected(file);
 		});
diff --git a/src/client/app/desktop/api/update-banner.ts b/src/client/app/desktop/api/update-banner.ts
index 4e6dd4e2c7..33c4e306a2 100644
--- a/src/client/app/desktop/api/update-banner.ts
+++ b/src/client/app/desktop/api/update-banner.ts
@@ -8,7 +8,7 @@ export default (os: OS) => {
 	const cropImage = file => new Promise((resolve, reject) => {
 		const w = os.new(CropWindow, {
 			image: file,
-			title: 'バナーとして表示する部分を選択',
+			title: '%i18n:desktop.banner-crop-title%',
 			aspectRatio: 16 / 9
 		});
 
@@ -18,11 +18,11 @@ export default (os: OS) => {
 			data.append('file', blob, file.name + '.cropped.png');
 
 			os.api('drive/folders/find', {
-				name: 'バナー'
+				name: '%i18n:desktop.banner%'
 			}).then(bannerFolder => {
 				if (bannerFolder.length === 0) {
 					os.api('drive/folders/create', {
-						name: 'バナー'
+						name: '%i18n:desktop.banner%'
 					}).then(iconFolder => {
 						resolve(upload(data, iconFolder));
 					});
@@ -43,7 +43,7 @@ export default (os: OS) => {
 
 	const upload = (data, folder) => new Promise((resolve, reject) => {
 		const dialog = os.new(ProgressDialog, {
-			title: '新しいバナーをアップロードしています'
+			title: '%i18n:desktop.uploading-banner%'
 		});
 		document.body.appendChild(dialog.$el);
 
@@ -79,10 +79,10 @@ export default (os: OS) => {
 			});
 
 			os.apis.dialog({
-				title: '%fa:info-circle%バナーを更新しました',
-				text: '新しいバナーが反映されるまで時間がかかる場合があります。',
+				title: '%fa:info-circle% %i18n:desktop.banner-updated%',
+				text: null,
 				actions: [{
-					text: 'わかった'
+					text: '%i18n:common.got-it%'
 				}]
 			});
 
@@ -95,7 +95,7 @@ export default (os: OS) => {
 			? Promise.resolve(file)
 			: os.apis.chooseDriveFile({
 				multiple: false,
-				title: '%fa:image%バナーにする画像を選択'
+				title: '%fa:image% %i18n:desktop.choose-banner%'
 			});
 
 		return selectedFile
diff --git a/src/client/app/desktop/views/components/note-detail.vue b/src/client/app/desktop/views/components/note-detail.vue
index 36a5889220..b6980fae72 100644
--- a/src/client/app/desktop/views/components/note-detail.vue
+++ b/src/client/app/desktop/views/components/note-detail.vue
@@ -79,7 +79,6 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import dateStringify from '../../../common/scripts/date-stringify';
 import parse from '../../../../../mfm/parse';
 
 import MkPostFormWindow from './post-form-window.vue';
@@ -129,7 +128,7 @@ export default Vue.extend({
 				: 0;
 		},
 		title(): string {
-			return dateStringify(this.p.createdAt);
+			return new Date(this.p.createdAt).toLocaleString();
 		},
 		urls(): string[] {
 			if (this.p.text) {
diff --git a/src/client/app/desktop/views/components/note-preview.vue b/src/client/app/desktop/views/components/note-preview.vue
index 2a49557247..c723db98c0 100644
--- a/src/client/app/desktop/views/components/note-preview.vue
+++ b/src/client/app/desktop/views/components/note-preview.vue
@@ -12,7 +12,6 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import dateStringify from '../../../common/scripts/date-stringify';
 
 export default Vue.extend({
 	props: {
@@ -28,7 +27,7 @@ export default Vue.extend({
 	},
 	computed: {
 		title(): string {
-			return dateStringify(this.note.createdAt);
+			return new Date(this.note.createdAt).toLocaleString();
 		}
 	}
 });
diff --git a/src/client/app/desktop/views/components/notes.note.sub.vue b/src/client/app/desktop/views/components/notes.note.sub.vue
index a8186fb7e4..fc851e83e9 100644
--- a/src/client/app/desktop/views/components/notes.note.sub.vue
+++ b/src/client/app/desktop/views/components/notes.note.sub.vue
@@ -12,13 +12,12 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import dateStringify from '../../../common/scripts/date-stringify';
 
 export default Vue.extend({
 	props: ['note'],
 	computed: {
 		title(): string {
-			return dateStringify(this.note.createdAt);
+			return new Date(this.note.createdAt).toLocaleString();
 		}
 	}
 });
diff --git a/src/client/app/desktop/views/components/notes.note.vue b/src/client/app/desktop/views/components/notes.note.vue
index 3aa52f75f0..fbbd524070 100644
--- a/src/client/app/desktop/views/components/notes.note.vue
+++ b/src/client/app/desktop/views/components/notes.note.vue
@@ -71,7 +71,6 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import dateStringify from '../../../common/scripts/date-stringify';
 import parse from '../../../../../mfm/parse';
 
 import MkPostFormWindow from './post-form-window.vue';
@@ -128,7 +127,7 @@ export default Vue.extend({
 		},
 
 		title(): string {
-			return dateStringify(this.p.createdAt);
+			return new Date(this.p.createdAt).toLocaleString();
 		},
 
 		urls(): string[] {
diff --git a/src/client/app/desktop/views/components/user-lists-window.vue b/src/client/app/desktop/views/components/user-lists-window.vue
index 47648c287d..72ae9cf4e4 100644
--- a/src/client/app/desktop/views/components/user-lists-window.vue
+++ b/src/client/app/desktop/views/components/user-lists-window.vue
@@ -27,7 +27,7 @@ export default Vue.extend({
 	methods: {
 		add() {
 			(this as any).apis.input({
-				title: 'リスト名',
+				title: '%i18n:@list-name%',
 			}).then(async title => {
 				const list = await (this as any).api('users/lists/create', {
 					title
diff --git a/src/client/app/desktop/views/pages/user/user.profile.vue b/src/client/app/desktop/views/pages/user/user.profile.vue
index b74dbc7e25..efd5be4672 100644
--- a/src/client/app/desktop/views/pages/user/user.profile.vue
+++ b/src/client/app/desktop/views/pages/user/user.profile.vue
@@ -13,7 +13,7 @@
 			<span v-if="user.isMuted">%fa:eye% %i18n:@unmute%</span>
 			<span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span>
 		</button>
-		<button class="mute ui" @click="list">%fa:list% リストに追加</button>
+		<button class="mute ui" @click="list">%fa:list% %i18n:@push-to-a-list%</button>
 	</div>
 </div>
 </template>
@@ -76,7 +76,7 @@ export default Vue.extend({
 				});
 				(this as any).apis.dialog({
 					title: 'Done!',
-					text: `${this.user.name}を${list.title}に追加しました。`
+					text: '%i18n:@list-pushed%'.replace('{user}', this.user.name).replace('{list}', list.title)
 				});
 			});
 		}
diff --git a/src/client/app/desktop/views/widgets/post-form.vue b/src/client/app/desktop/views/widgets/post-form.vue
index 618d19efc4..19a2790d95 100644
--- a/src/client/app/desktop/views/widgets/post-form.vue
+++ b/src/client/app/desktop/views/widgets/post-form.vue
@@ -55,7 +55,7 @@ export default define({
 			}).then(data => {
 				this.clear();
 			}).catch(err => {
-				alert('失敗した');
+				alert('Something happened');
 			}).then(() => {
 				this.posting = false;
 			});