diff --git a/AppApi.cs b/AppApi.cs index 69f226a1..2036e111 100644 --- a/AppApi.cs +++ b/AppApi.cs @@ -5,26 +5,26 @@ // For a copy, see . using CefSharp; -using Microsoft.Win32; -using System; -using System.Diagnostics; -using System.Linq; -using System.Management; -using System.Text.RegularExpressions; -using System.Windows.Forms; -using System.IO; -using System.Security.Cryptography; -using System.Net; -using Windows.UI.Notifications; -using Windows.Data.Xml.Dom; using librsync.net; -using System.Net.Sockets; -using System.Text; -using System.Collections.Generic; -using System.Threading; -using System.IO.Pipes; +using Microsoft.Win32; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.IO.Pipes; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Windows.Forms; +using Windows.Data.Xml.Dom; +using Windows.UI.Notifications; namespace VRCX { @@ -410,7 +410,12 @@ namespace VRCX public string CurrentCulture() { - return System.Globalization.CultureInfo.CurrentCulture.ToString(); + return CultureInfo.CurrentCulture.ToString(); + } + + public string CurrentLanguage() + { + return CultureInfo.InstalledUICulture.Name; } public string GetVersion() diff --git a/html/src/app.js b/html/src/app.js index 4fb5704e..7fc69ede 100644 --- a/html/src/app.js +++ b/html/src/app.js @@ -9,7 +9,7 @@ import '@fontsource/noto-sans-jp'; import Noty from 'noty'; import Vue from 'vue'; import VueLazyload from 'vue-lazyload'; -import VueI18n from 'vue-i18n' +import VueI18n from 'vue-i18n'; import {DataTables} from 'vue-data-tables'; import ElementUI from 'element-ui'; import locale from 'element-ui/lib/locale/lang/en'; @@ -211,8 +211,9 @@ speechSynthesis.getVoices(); var i18n = new VueI18n({ locale: 'en', - messages: localizedStrings, - }) + fallbackLocale: 'en', + messages: localizedStrings + }); var $appDarkStyle = document.createElement('link'); $appDarkStyle.disabled = true; @@ -24096,6 +24097,36 @@ speechSynthesis.getVoices(); ); }; + // 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/index.pug b/html/src/index.pug index 13a0ffe7..b737917c 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -1121,6 +1121,13 @@ html el-tab-pane(:label="$t('view.settings.category.appearance')") div.options-container(style="margin-top:0") span.header {{ $t("view.settings.appearance.appearance.header") }} + div.options-container-item + span.name {{ $t('view.settings.appearance.appearance.language') }} + el-dropdown(@click.native.stop trigger="click" size="small") + el-button(size="mini") + span {{ $i18n.messages[appLanguage]?.language }} #[i.el-icon-arrow-down.el-icon--right] + el-dropdown-menu(#default="dropdown") + el-dropdown-item(v-for="(obj, language) in $i18n.messages" v-text="obj.language" @click.native="changeAppLanguage(language)") div.options-container-item span.name {{ $t('view.settings.appearance.appearance.theme_mode') }} el-radio-group(v-model="themeMode" size="mini") diff --git a/html/src/localization/strings/en.json b/html/src/localization/strings/en.json index 733207b6..67ce49f3 100644 --- a/html/src/localization/strings/en.json +++ b/html/src/localization/strings/en.json @@ -227,7 +227,8 @@ "sort_instance_users_by_time": "time", "sort_instance_users_by_alphabet": "alphabetical", "table_max_size": "Table Max Size", - "page_size": "Page Size:" + "page_size": "Page Size:", + "language": "Language" }, "timedate": { "header": "Time/Date",