diff --git a/package.json b/package.json
index 4b3401c36..fe53a2c21 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "calckey",
-	"version": "12.119.0-calc.12.7",
+	"version": "12.119.0-calc.12.8",
 	"codename": "aqua",
 	"repository": {
 		"type": "git",
diff --git a/packages/client/src/components/MkContainer.vue b/packages/client/src/components/MkContainer.vue
index 03a2b40ce..f1dce7284 100644
--- a/packages/client/src/components/MkContainer.vue
+++ b/packages/client/src/components/MkContainer.vue
@@ -74,6 +74,7 @@ export default defineComponent({
 			showBody: this.expanded,
 			omitted: null,
 			ignoreOmit: false,
+			i18n,
 		};
 	},
 	mounted() {
diff --git a/packages/client/src/components/MkFormDialog.vue b/packages/client/src/components/MkFormDialog.vue
index 7c3f6b1fb..a92f39d5d 100644
--- a/packages/client/src/components/MkFormDialog.vue
+++ b/packages/client/src/components/MkFormDialog.vue
@@ -94,6 +94,7 @@ export default defineComponent({
 	data() {
 		return {
 			values: {},
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/components/MkMediaCaption.vue b/packages/client/src/components/MkMediaCaption.vue
index 8d7861ea1..1a1cc5e61 100644
--- a/packages/client/src/components/MkMediaCaption.vue
+++ b/packages/client/src/components/MkMediaCaption.vue
@@ -79,7 +79,8 @@ export default defineComponent({
 
 	data() {
 		return {
-			inputValue: this.input.default ? this.input.default : null
+			inputValue: this.input.default ? this.input.default : null,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/components/MkPostFormAttaches.vue b/packages/client/src/components/MkPostFormAttaches.vue
index 56bbef3f2..8aba4a99a 100644
--- a/packages/client/src/components/MkPostFormAttaches.vue
+++ b/packages/client/src/components/MkPostFormAttaches.vue
@@ -42,6 +42,7 @@ export default defineComponent({
 	data() {
 		return {
 			menu: null as Promise<null> | null,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/pages/about.emojis.vue b/packages/client/src/pages/about.emojis.vue
index eae1f5ba7..f5c950789 100644
--- a/packages/client/src/pages/about.emojis.vue
+++ b/packages/client/src/pages/about.emojis.vue
@@ -58,6 +58,7 @@ export default defineComponent({
 			tags: emojiTags,
 			selectedTags: new Set(),
 			searchEmojis: null,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/pages/admin/metrics.vue b/packages/client/src/pages/admin/metrics.vue
index 79667d6ab..4309ecce6 100644
--- a/packages/client/src/pages/admin/metrics.vue
+++ b/packages/client/src/pages/admin/metrics.vue
@@ -133,6 +133,7 @@ export default defineComponent({
 			overviewHeight: '1fr',
 			queueHeight: '1fr',
 			paused: false,
+			i18n,
 		};
 	},
 
@@ -205,7 +206,7 @@ export default defineComponent({
 						pointRadius: 0,
 						tension: 0,
 						borderWidth: 2,
-						borderColor: '#935dbf',
+						borderColor: '#ebbcba',
 						borderDash: [5, 5],
 						fill: false,
 						data: [],
diff --git a/packages/client/src/pages/page-editor/page-editor.container.vue b/packages/client/src/pages/page-editor/page-editor.container.vue
index d959551bf..c979c1660 100644
--- a/packages/client/src/pages/page-editor/page-editor.container.vue
+++ b/packages/client/src/pages/page-editor/page-editor.container.vue
@@ -81,11 +81,11 @@ export default defineComponent({
 	}
 
 	&.warn {
-		border: solid 2px #dec44c;
+		border: solid 2px #f6c177;
 	}
 
 	&.error {
-		border: solid 2px #f00;
+		border: solid 2px #eb6f92;
 	}
 
 	& + .cpjygsrt {
@@ -131,14 +131,14 @@ export default defineComponent({
 	}
 
 	> .warn {
-		color: #b19e49;
+		color: #ea9d34;
 		margin: 0;
 		padding: 16px 16px 0 16px;
 		font-size: 14px;
 	}
 
 	> .error {
-		color: #f00;
+		color: #b4637a;
 		margin: 0;
 		padding: 16px 16px 0 16px;
 		font-size: 14px;
diff --git a/packages/client/src/pages/welcome.entrance.b.vue b/packages/client/src/pages/welcome.entrance.b.vue
index b6b917d82..7bcaa17ee 100644
--- a/packages/client/src/pages/welcome.entrance.b.vue
+++ b/packages/client/src/pages/welcome.entrance.b.vue
@@ -65,6 +65,7 @@ export default defineComponent({
 			stats: null,
 			tags: [],
 			onlineUsersCount: null,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/pages/welcome.entrance.c.vue b/packages/client/src/pages/welcome.entrance.c.vue
index ba5b9bf0f..a61c9ebc9 100644
--- a/packages/client/src/pages/welcome.entrance.c.vue
+++ b/packages/client/src/pages/welcome.entrance.c.vue
@@ -85,6 +85,7 @@ export default defineComponent({
 			stats: null,
 			tags: [],
 			onlineUsersCount: null,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/ui/classic.header.vue b/packages/client/src/ui/classic.header.vue
index 05b666ed5..8bb2c36e1 100644
--- a/packages/client/src/ui/classic.header.vue
+++ b/packages/client/src/ui/classic.header.vue
@@ -60,6 +60,7 @@ export default defineComponent({
 			connection: null,
 			navbarItemDef: navbarItemDef,
 			settingsWindowed: false,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/ui/classic.sidebar.vue b/packages/client/src/ui/classic.sidebar.vue
index e7f825700..e4e1d4d88 100644
--- a/packages/client/src/ui/classic.sidebar.vue
+++ b/packages/client/src/ui/classic.sidebar.vue
@@ -66,6 +66,7 @@ export default defineComponent({
 			navbarItemDef: navbarItemDef,
 			iconOnly: false,
 			settingsWindowed: false,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/ui/classic.widgets.vue b/packages/client/src/ui/classic.widgets.vue
index 05da33135..04ca34b55 100644
--- a/packages/client/src/ui/classic.widgets.vue
+++ b/packages/client/src/ui/classic.widgets.vue
@@ -29,6 +29,7 @@ export default defineComponent({
 	data() {
 		return {
 			editMode: false,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/ui/visitor.vue b/packages/client/src/ui/visitor.vue
index ec9150d34..767c9ddbb 100644
--- a/packages/client/src/ui/visitor.vue
+++ b/packages/client/src/ui/visitor.vue
@@ -8,6 +8,7 @@ import { defineComponent, defineAsyncComponent } from 'vue';
 import DesignA from './visitor/a.vue';
 import DesignB from './visitor/b.vue';
 import XCommon from './_common_/common.vue';
+import { i18n } from '@/i18n';
 
 export default defineComponent({
 	components: {
diff --git a/packages/client/src/ui/visitor/a.vue b/packages/client/src/ui/visitor/a.vue
index 06b4a1fd0..6048535b7 100644
--- a/packages/client/src/ui/visitor/a.vue
+++ b/packages/client/src/ui/visitor/a.vue
@@ -70,6 +70,7 @@ export default defineComponent({
 			},
 			mainRouter,
 			isDesktop: window.innerWidth >= DESKTOP_THRESHOLD,
+			i18n,
 		};
 	},
 
diff --git a/packages/client/src/ui/visitor/header.vue b/packages/client/src/ui/visitor/header.vue
index 79e4a4291..0eb7f1c89 100644
--- a/packages/client/src/ui/visitor/header.vue
+++ b/packages/client/src/ui/visitor/header.vue
@@ -61,6 +61,7 @@ export default defineComponent({
 		return {
 			narrow: null,
 			showMenu: false,
+			i18n,
 			isTimelineAvailable: !instance.disableLocalTimeline || !instance.disableRecommendedTimeline || !instance.disableGlobalTimeline,
 		};
 	},
diff --git a/packages/client/src/ui/visitor/kanban.vue b/packages/client/src/ui/visitor/kanban.vue
index d3f310f17..74f8761ce 100644
--- a/packages/client/src/ui/visitor/kanban.vue
+++ b/packages/client/src/ui/visitor/kanban.vue
@@ -82,6 +82,7 @@ export default defineComponent({
 				endpoint: 'announcements',
 				limit: 10,
 			},
+			i18n,
 		};
 	},