diff --git a/html/src/localization/strings/en.json b/html/src/localization/strings/en.json
index 375f0f9a..f96ff2f0 100644
--- a/html/src/localization/strings/en.json
+++ b/html/src/localization/strings/en.json
@@ -1360,5 +1360,17 @@
"count": "Count",
"action": "Action"
}
+ },
+ "vr": {
+ "status": {
+ "timer": "Timer:",
+ "players": "Players:",
+ "cpu": "CPU:",
+ "online": "Online:",
+ "devices": {
+ "left": "L:",
+ "right": "R:"
+ }
+ }
}
}
diff --git a/html/src/localization/strings/zh_TW.json b/html/src/localization/strings/zh_TW.json
index 1de0ef37..90b7d345 100644
--- a/html/src/localization/strings/zh_TW.json
+++ b/html/src/localization/strings/zh_TW.json
@@ -1360,5 +1360,17 @@
"count": "次數",
"action": "動作"
}
+ },
+ "vr": {
+ "status": {
+ "timer": "時長:",
+ "players": "玩家人數:",
+ "cpu": "CPU:",
+ "online": "線上:",
+ "devices": {
+ "left": "左:",
+ "right": "右:"
+ }
+ }
}
}
diff --git a/html/src/vr.js b/html/src/vr.js
index 7e7b5c16..ccc5f57b 100644
--- a/html/src/vr.js
+++ b/html/src/vr.js
@@ -8,10 +8,12 @@ import '@fontsource/noto-sans-kr';
import '@fontsource/noto-sans-jp';
import Noty from 'noty';
import Vue from 'vue';
+import VueI18n from 'vue-i18n';
import ElementUI from 'element-ui';
import locale from 'element-ui/lib/locale/lang/en';
import * as workerTimers from 'worker-timers';
import MarqueeText from 'vue-marquee-text-component';
+import * as localizedStrings from './localization/localizedStrings.js';
Vue.component('marquee-text', MarqueeText);
(async function () {
@@ -29,6 +31,14 @@ Vue.component('marquee-text', MarqueeText);
timeout: 3000
});
+ Vue.use(VueI18n);
+
+ var i18n = new VueI18n({
+ locale: 'en',
+ fallbackLocale: 'en',
+ messages: localizedStrings
+ });
+
Vue.use(ElementUI, {
locale
});
@@ -163,6 +173,7 @@ Vue.component('marquee-text', MarqueeText);
};
var $app = {
+ i18n,
data: {
// 1 = 대시보드랑 손목에 보이는거
// 2 = 항상 화면에 보이는 거
@@ -675,6 +686,38 @@ Vue.component('marquee-text', MarqueeText);
Vue.filter('formatDate', formatDate);
};
+ // App: Language
+
+ $app.data.appLanguage = 'en';
+ /*
+ if (configRepository.getString('VRCX_appLanguage')) {
+ $app.data.appLanguage = configRepository.getString('VRCX_appLanguage');
+ i18n.locale = $app.data.appLanguage;
+ } else {
+ AppApi.CurrentLanguage().then((result) => {
+ if (!result) {
+ console.error('Failed to get current language');
+ $app.changeAppLanguage('en');
+ return;
+ }
+ var lang = result.split('-')[0];
+ i18n.availableLocales.forEach((ref) => {
+ var refLang = ref.split('_')[0];
+ if (refLang === lang) {
+ $app.changeAppLanguage(ref);
+ }
+ });
+ });
+ }
+
+ $app.methods.changeAppLanguage = function (language) {
+ console.log('Language changed:', language);
+ this.appLanguage = language;
+ i18n.locale = language;
+ configRepository.setString('VRCX_appLanguage', language);
+ };
+ */
+
$app = new Vue($app);
window.$app = $app;
})();
diff --git a/html/src/vr.pug b/html/src/vr.pug
index 9466541f..742b3265 100644
--- a/html/src/vr.pug
+++ b/html/src/vr.pug
@@ -30,14 +30,14 @@ html
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | #[span.name(v-text="feed.displayName")] ✔
+ | #[span.name(v-text="feed.displayName")] ✔
template(v-if="feed.worldName")
| #[location(:location="feed.location" :hint="feed.worldName")]
div(v-else-if="feed.type === 'Status'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | #[span.name(v-text="feed.displayName")]
+ | #[span.name(v-text="feed.displayName")]
template(v-if="feed.statusDescription === feed.previousStatusDescription")
i.x-user-status(:class="statusClass(feed.previousStatus)")
i.el-icon-right
@@ -69,7 +69,7 @@ html
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | 🎵 #[span.name(v-text="feed.displayName")]
+ | 🎵 #[span.name(v-text="feed.displayName")]
template(v-if="feed.videoName")
| #[span(v-text="feed.videoName")]
template(v-else)
@@ -144,7 +144,7 @@ html
span.extra
span.time {{ feed.created_at | formatDate }}
template(v-if="feed.displayName")
- | ✨ #[span.name(v-text="feed.displayName")]
+ | ✨ #[span.name(v-text="feed.displayName")]
| #[location(:location="feed.instanceId" :hint="feed.worldName")]
template(v-else)
| ✨ User has spawned a portal
@@ -152,7 +152,7 @@ html
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | 🧍 #[span.name(v-text="feed.displayName")]
+ | 🧍 #[span.name(v-text="feed.displayName")]
template(v-if="feed.releaseStatus === 'public'")
| #[i.x-user-status.online]
template(v-else)
@@ -229,14 +229,14 @@ html
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | #[span.name(v-text="feed.displayName")] has logged in
+ | #[span.name(v-text="feed.displayName")] has logged in
template(v-if="feed.worldName")
| to #[location(:location="feed.location" :hint="feed.worldName")]
div(v-else-if="feed.type === 'Status'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | #[span.name(v-text="feed.displayName")]
+ | #[span.name(v-text="feed.displayName")]
template(v-if="feed.statusDescription === feed.previousStatusDescription")
i.x-user-status(:class="statusClass(feed.previousStatus)")
i.el-icon-right
@@ -267,7 +267,7 @@ html
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | #[span.name(v-text="feed.displayName")] changed video to
+ | #[span.name(v-text="feed.displayName")] changed video to
template(v-if="feed.videoName")
| #[span(v-text="feed.videoName")]
template(v-else)
@@ -342,7 +342,7 @@ html
span.extra
span.time {{ feed.created_at | formatDate }}
template(v-if="feed.displayName")
- | #[span.name(v-text="feed.displayName")] has spawned a portal to
+ | #[span.name(v-text="feed.displayName")] has spawned a portal to
| #[location(:location="feed.instanceId" :hint="feed.worldName")]
template(v-else)
| User has spawned a portal
@@ -350,7 +350,7 @@ html
.detail
span.extra
span.time {{ feed.created_at | formatDate }}
- | #[span.name(v-text="feed.displayName")] changed into avatar
+ | #[span.name(v-text="feed.displayName")] changed into avatar
template(v-if="feed.releaseStatus === 'public'")
| #[i.x-user-status.online]
template(v-else)
@@ -423,13 +423,13 @@ html
img(v-else-if="device[2] < 20" src="images/controller_status_ready_low.png" style="width:32px;height:32px")
img(v-else src="images/controller_status_ready.png" style="width:32px;height:32px")
br
- span L:{{ device[2] }}%
+ span {{ $t('vr.status.devices.left') }}{{ device[2] }}%
template(v-else-if="device[0] === 'rightController'")
img(v-if="device[1] !== 'connected'" src="images/controller_status_off.png" style="width:32px;height:32px")
img(v-else-if="device[2] < 20" src="images/controller_status_ready_low.png" style="width:32px;height:32px")
img(v-else src="images/controller_status_ready.png" style="width:32px;height:32px")
br
- span R:{{ device[2] }}%
+ span {{ $t('vr.status.devices.right') }}{{ device[2] }}%
template(v-else-if="device[0] === 'controller'")
img(v-if="device[1] !== 'connected'" src="images/controller_status_off.png" style="width:32px;height:32px")
img(v-else-if="device[2] < 20" src="images/controller_status_ready_low.png" style="width:32px;height:32px")
@@ -463,17 +463,17 @@ html
span(style="display:inline-block") {{ lastLocation.playerList.length }}
span(style="display:inline-block;font-weight:bold") {{ lastLocation.friendList.length !== 0 ? ` (${lastLocation.friendList.length})` : ''}}
template(v-else)
- span(style="float:right") Timer: {{ lastLocationTimer }}
+ span(style="float:right") {{ $t('vr.status.timer') }} {{ lastLocationTimer }}
template(v-if="onlineForTimer")
| / {{ onlineForTimer }}
template(v-if="pcUptime")
| / {{ pcUptime }}
- span(style="display:inline-block") Players: {{ lastLocation.playerList.length }}
+ span(style="display:inline-block") {{ $t('vr.status.players') }} {{ lastLocation.playerList.length }}
span(style="display:inline-block;font-weight:bold") {{ lastLocation.friendList.length !== 0 ? ` (${lastLocation.friendList.length})` : ''}}
br
span(style="float:right") {{ currentTime }}
- span(v-if="config && !config.hideCpuUsageFromFeed" style="display:inline-block;margin-right:5px") CPU: {{ cpuUsage }}%
- span(style="display:inline-block") Online: {{ onlineFriendCount }}
+ span(v-if="config && !config.hideCpuUsageFromFeed" style="display:inline-block;margin-right:5px") {{ $t('vr.status.cpu') }} {{ cpuUsage }}%
+ span(style="display:inline-block") {{ $t('vr.status.online') }} {{ onlineFriendCount }}
template(v-else)
svg(class="np-progress-circle")
circle(class="np-progress-circle-stroke" cx="60" cy="60" stroke="white" r="30" fill="transparent" stroke-width="60")