diff --git a/html/src/app.js b/html/src/app.js
index aa6bface..4d38fafb 100644
--- a/html/src/app.js
+++ b/html/src/app.js
@@ -6419,15 +6419,15 @@ speechSynthesis.getVoices();
$app.methods.promptTOTP = function () {
this.$prompt(
- 'Enter a numeric code from your authenticator app',
- 'Two-factor Authentication',
+ $t('prompt.totp.description'),
+ $t('prompt.totp.header'),
{
distinguishCancelAndClose: true,
- cancelButtonText: 'Use OTP',
- confirmButtonText: 'Verify',
- inputPlaceholder: 'Code',
+ cancelButtonText: $t('prompt.totp.use_otp'),
+ confirmButtonText: $t('prompt.totp.verify'),
+ inputPlaceholder: $t('prompt.totp.input_placeholder'),
inputPattern: /^[0-9]{6}$/,
- inputErrorMessage: 'Invalid Code',
+ inputErrorMessage: $t('prompt.totp.input_error'),
callback: (action, instance) => {
if (action === 'confirm') {
API.verifyTOTP({
@@ -6451,15 +6451,15 @@ speechSynthesis.getVoices();
$app.methods.promptOTP = function () {
this.$prompt(
- 'Enter one of your saved recovery codes',
- 'Two-factor Authentication',
+ $t('prompt.otp.description'),
+ $t('prompt.otp.header'),
{
distinguishCancelAndClose: true,
- cancelButtonText: 'Use TOTP',
- confirmButtonText: 'Verify',
- inputPlaceholder: 'Code',
+ cancelButtonText: $t('prompt.otp.use_otp'),
+ confirmButtonText: $t('prompt.otp.verify'),
+ inputPlaceholder: $t('prompt.otp.input_placeholder'),
inputPattern: /^[a-z0-9]{4}-[a-z0-9]{4}$/,
- inputErrorMessage: 'Invalid Code',
+ inputErrorMessage: $t('prompt.otp.input_error'),
callback: (action, instance) => {
if (action === 'confirm') {
API.verifyOTP({
@@ -6483,15 +6483,15 @@ speechSynthesis.getVoices();
$app.methods.promptEmailOTP = function () {
this.$prompt(
- 'Enter a numeric code that was sent to your email',
- 'Email Two-factor Authentication',
+ $t('prompt.email_otp.description'),
+ $t('prompt.email_otp.header'),
{
distinguishCancelAndClose: true,
- cancelButtonText: 'Cancel',
- confirmButtonText: 'Verify',
- inputPlaceholder: 'Code',
+ cancelButtonText: $t('prompt.email_otp.cancel'),
+ confirmButtonText: $t('prompt.email_otp.verify'),
+ inputPlaceholder: $t('prompt.email_otp.input_placeholder'),
inputPattern: /^[0-9]{6}$/,
- inputErrorMessage: 'Invalid Code',
+ inputErrorMessage: $t('prompt.email_otp.input_error'),
callback: (action, instance) => {
if (action === 'confirm') {
API.verifyEmailOTP({
@@ -6627,8 +6627,8 @@ speechSynthesis.getVoices();
resolve(args.password);
}
$app.$prompt(
- 'Please enter your Primary Password.',
- 'Primary Password Required',
+ $t('prompt.primary_password.description'),
+ $t('prompt.primary_password.header'),
{
inputType: 'password',
inputPattern: /[\s\S]{1,32}/
@@ -6663,8 +6663,8 @@ speechSynthesis.getVoices();
this.enablePrimaryPasswordDialog.visible = true;
} else {
this.$prompt(
- 'Please enter your Primary Password.',
- 'Primary Password Required',
+ $t('prompt.primary_password.description'),
+ $t('prompt.primary_password.header'),
{
inputType: 'password',
inputPattern: /[\s\S]{1,32}/
@@ -6918,8 +6918,8 @@ speechSynthesis.getVoices();
this.enablePrimaryPassword
) {
$app.$prompt(
- 'Please enter your Primary Password.',
- 'Primary Password Required',
+ $t('prompt.primary_password.description'),
+ $t('prompt.primary_password.header'),
{
inputType: 'password',
inputPattern: /[\s\S]{1,32}/
@@ -11793,14 +11793,14 @@ speechSynthesis.getVoices();
};
$app.methods.changeFavoriteGroupName = function (ctx) {
- this.$prompt('Enter a new name', 'Change Group Name', {
+ this.$prompt($t('prompt.change_favorite_group_name.description'), $t('prompt.change_favorite_group_name.header'), {
distinguishCancelAndClose: true,
- cancelButtonText: 'Cancel',
- confirmButtonText: 'Change',
- inputPlaceholder: 'Name',
+ cancelButtonText: $t('prompt.change_favorite_group_name.cancel'),
+ confirmButtonText: $t('prompt.change_favorite_group_name.change'),
+ inputPlaceholder: $t('prompt.change_favorite_group_name.input_placeholder'),
inputValue: ctx.displayName,
inputPattern: /\S+/,
- inputErrorMessage: 'Name is required',
+ inputErrorMessage: $t('prompt.change_favorite_group_name.input_error'),
callback: (action, instance) => {
if (action === 'confirm') {
API.saveFavoriteGroup({
@@ -11809,7 +11809,7 @@ speechSynthesis.getVoices();
displayName: instance.inputValue
}).then((args) => {
this.$message({
- message: 'Group renamed',
+ message: $t('prompt.change_favorite_group_name.message.success'),
type: 'success'
});
return args;
@@ -13465,12 +13465,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptUserIdDialog = function () {
- this.$prompt('Enter a User URL or ID (UUID)', 'Direct Access', {
+ this.$prompt($t('prompt.direct_access_user_id.description'), $t('prompt.direct_access_user_id.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.direct_access_user_id.ok'),
+ cancelButtonText: $t('prompt.direct_access_user_id.cancel'),
inputPattern: /\S+/,
- inputErrorMessage: 'User URL/ID is required',
+ inputErrorMessage: $t('prompt.direct_access_user_id.input_error'),
callback: (action, instance) => {
if (action === 'confirm' && instance.inputValue) {
var testUrl = instance.inputValue.substring(0, 15);
@@ -13480,7 +13480,7 @@ speechSynthesis.getVoices();
this.showUserDialog(userId);
} else {
this.$message({
- message: 'Invalid URL',
+ message: $t('prompt.direct_access_user_id.message.error'),
type: 'error'
});
}
@@ -13493,12 +13493,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptUsernameDialog = function () {
- this.$prompt('Enter a Username', 'Direct Access', {
+ this.$prompt($t('prompt.direct_access_username.description'), $t('prompt.direct_access_username.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.direct_access_username.ok'),
+ cancelButtonText: $t('prompt.direct_access_username.cancel'),
inputPattern: /\S+/,
- inputErrorMessage: 'Username is required',
+ inputErrorMessage: $t('prompt.direct_access_username.input_error'),
callback: (action, instance) => {
if (action === 'confirm' && instance.inputValue) {
this.lookupUser({displayName: instance.inputValue});
@@ -13508,17 +13508,17 @@ speechSynthesis.getVoices();
};
$app.methods.promptWorldDialog = function () {
- this.$prompt('Enter a World URL or ID (UUID)', 'Direct Access', {
+ this.$prompt($t('prompt.direct_access_world_id.description'), $t('prompt.direct_access_world_id.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.direct_access_world_id.ok'),
+ cancelButtonText: $t('prompt.direct_access_world_id.cancel'),
inputPattern: /\S+/,
- inputErrorMessage: 'World URL/ID is required',
+ inputErrorMessage: $t('prompt.direct_access_world_id.input_error'),
callback: (action, instance) => {
if (action === 'confirm' && instance.inputValue) {
if (!this.directAccessWorld(instance.inputValue)) {
this.$message({
- message: 'Invalid URL/id',
+ message: $t('prompt.direct_access_world_id.message.error'),
type: 'error'
});
}
@@ -13528,12 +13528,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptAvatarDialog = function () {
- this.$prompt('Enter a Avatar URL or ID (UUID)', 'Direct Access', {
+ this.$prompt($t('prompt.direct_access_avatar_id.description'), $t('prompt.direct_access_avatar_id.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.direct_access_avatar_id.ok'),
+ cancelButtonText: $t('prompt.direct_access_avatar_id.cancel'),
inputPattern: /\S+/,
- inputErrorMessage: 'Avatar URL/ID is required',
+ inputErrorMessage: $t('prompt.direct_access_avatar_id.input_error'),
callback: (action, instance) => {
if (action === 'confirm' && instance.inputValue) {
var testUrl = instance.inputValue.substring(0, 15);
@@ -13543,7 +13543,7 @@ speechSynthesis.getVoices();
this.showAvatarDialog(avatarId);
} else {
this.$message({
- message: 'Invalid URL',
+ message: $t('prompt.direct_access_avatar_id.message.error'),
type: 'error'
});
}
@@ -13557,20 +13557,20 @@ speechSynthesis.getVoices();
$app.methods.promptOmniDirectDialog = function () {
this.$prompt(
- 'Enter a User/World/Instance/Avatar/Group URL or ID (UUID)',
- 'Direct Access',
+ $t('prompt.direct_access_omni.description'),
+ $t('prompt.direct_access_omni.header'),
{
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.direct_access_omni.ok'),
+ cancelButtonText: $t('prompt.direct_access_omni.cancel'),
inputPattern: /\S+/,
- inputErrorMessage: 'URL/ID is required',
+ inputErrorMessage: $t('prompt.direct_access_omni.input_error'),
callback: (action, instance) => {
if (action === 'confirm' && instance.inputValue) {
var input = instance.inputValue;
if (!this.directAccessParse(input)) {
this.$message({
- message: 'Invalid URL/ID',
+ message: $t('prompt.direct_access_omni.message.error'),
type: 'error'
});
}
@@ -13702,13 +13702,13 @@ speechSynthesis.getVoices();
};
$app.methods.promptNotificationTimeout = function () {
- this.$prompt('Enter amount of seconds', 'Notification Timeout', {
+ this.$prompt($t('prompt.notification_timeout.description'), $t('prompt.notification_timeout.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.notification_timeout.ok'),
+ cancelButtonText: $t('prompt.notification_timeout.cancel'),
inputValue: this.notificationTimeout / 1000,
inputPattern: /\d+$/,
- inputErrorMessage: 'Valid number is required',
+ inputErrorMessage: $t('prompt.notification_timeout.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -13729,13 +13729,13 @@ speechSynthesis.getVoices();
};
$app.methods.promptPhotonOverlayMessageTimeout = function () {
- this.$prompt('Enter amount of seconds', 'Overlay Message Timeout', {
+ this.$prompt($t('prompt.overlay_message_timeout.description'), $t('prompt.overlay_message_timeout.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.overlay_message_timeout.ok'),
+ cancelButtonText: $t('prompt.overlay_message_timeout.cancel'),
inputValue: this.photonOverlayMessageTimeout / 1000,
inputPattern: /\d+$/,
- inputErrorMessage: 'Valid number is required',
+ inputErrorMessage: $t('prompt.overlay_message_timeout.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -13756,12 +13756,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptRenameAvatar = function (avatar) {
- this.$prompt('Enter avatar name', 'Rename Avatar', {
+ this.$prompt($t('prompt.rename_avatar.description'), $t('prompt.rename_avatar.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.rename_avatar.ok'),
+ cancelButtonText: $t('prompt.rename_avatar.cancel'),
inputValue: avatar.ref.name,
- inputErrorMessage: 'Valid name is required',
+ inputErrorMessage: $t('prompt.rename_avatar.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -13772,7 +13772,7 @@ speechSynthesis.getVoices();
name: instance.inputValue
}).then((args) => {
this.$message({
- message: 'Avatar renamed',
+ message: $t('prompt.rename_avatar.message.success'),
type: 'success'
});
return args;
@@ -13783,12 +13783,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptChangeAvatarDescription = function (avatar) {
- this.$prompt('Enter avatar description', 'Change Description', {
+ this.$prompt($t('prompt.change_avatar_description.description'), $t('prompt.change_avatar_description.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.change_avatar_description.ok'),
+ cancelButtonText: $t('prompt.change_avatar_description.cancel'),
inputValue: avatar.ref.description,
- inputErrorMessage: 'Valid description is required',
+ inputErrorMessage: $t('prompt.change_avatar_description.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -13799,7 +13799,7 @@ speechSynthesis.getVoices();
description: instance.inputValue
}).then((args) => {
this.$message({
- message: 'Avatar description changed',
+ message: $t('prompt.change_avatar_description.message.success'),
type: 'success'
});
return args;
@@ -13810,12 +13810,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptRenameWorld = function (world) {
- this.$prompt('Enter world name', 'Rename World', {
+ this.$prompt($t('prompt.rename_world.description'), $t('prompt.rename_world.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.rename_world.ok'),
+ cancelButtonText: $t('prompt.rename_world.cancel'),
inputValue: world.ref.name,
- inputErrorMessage: 'Valid name is required',
+ inputErrorMessage: $t('prompt.rename_world.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -13826,7 +13826,7 @@ speechSynthesis.getVoices();
name: instance.inputValue
}).then((args) => {
this.$message({
- message: 'World renamed',
+ message: $t('prompt.rename_world.message.success'),
type: 'success'
});
return args;
@@ -13837,12 +13837,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptChangeWorldDescription = function (world) {
- this.$prompt('Enter world description', 'Change Description', {
+ this.$prompt($t('prompt.change_world_description.description'), $t('prompt.change_world_description.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.change_world_description.ok'),
+ cancelButtonText: $t('prompt.change_world_description.cancel'),
inputValue: world.ref.description,
- inputErrorMessage: 'Valid description is required',
+ inputErrorMessage: $t('prompt.change_world_description.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -13853,7 +13853,7 @@ speechSynthesis.getVoices();
description: instance.inputValue
}).then((args) => {
this.$message({
- message: 'World description changed',
+ message: $t('prompt.change_world_description.message.success'),
type: 'success'
});
return args;
@@ -13864,13 +13864,13 @@ speechSynthesis.getVoices();
};
$app.methods.promptChangeWorldCapacity = function (world) {
- this.$prompt('Enter world capacity, Max: 40', 'Change Capacity', {
+ this.$prompt($t('prompt.change_world_capacity.description'), $t('prompt.change_world_capacity.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.change_world_capacity.ok'),
+ cancelButtonText: $t('prompt.change_world_capacity.cancel'),
inputValue: world.ref.capacity,
inputPattern: /\d+$/,
- inputErrorMessage: 'Valid number is required',
+ inputErrorMessage: $t('prompt.change_world_capacity.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -13881,7 +13881,7 @@ speechSynthesis.getVoices();
capacity: instance.inputValue
}).then((args) => {
this.$message({
- message: 'World capacity changed',
+ message: $t('prompt.change_world_capacity.message.success'),
type: 'success'
});
return args;
@@ -13892,12 +13892,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptChangeWorldYouTubePreview = function (world) {
- this.$prompt('Enter world YouTube preview', 'Change YouTube Preview', {
+ this.$prompt($t('prompt.change_world_preview.description'), $t('prompt.change_world_preview.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.change_world_preview.ok'),
+ cancelButtonText: $t('prompt.change_world_preview.cancel'),
inputValue: world.ref.previewYoutubeId,
- inputErrorMessage: 'Valid YouTube URL is required',
+ inputErrorMessage: $t('prompt.change_world_preview.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -13916,7 +13916,7 @@ speechSynthesis.getVoices();
}
} catch {
this.$message({
- message: 'Invalid YouTube URL',
+ message: $t('prompt.change_world_preview.message.error'),
type: 'error'
});
return;
@@ -13928,7 +13928,7 @@ speechSynthesis.getVoices();
previewYoutubeId: instance.inputValue
}).then((args) => {
this.$message({
- message: 'World YouTube preview changed',
+ message: $t('prompt.change_world_preview.message.success'),
type: 'success'
});
return args;
@@ -13941,15 +13941,15 @@ speechSynthesis.getVoices();
$app.methods.promptMaxTableSizeDialog = function () {
this.$prompt(
- 'Larger table sizes may impact RAM usage and performance (default: 1000)',
- 'Max Table Size',
+ $t('prompt.change_table_size.description'),
+ $t('prompt.change_table_size.header'),
{
distinguishCancelAndClose: true,
- confirmButtonText: 'Save',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.change_table_size.save'),
+ cancelButtonText: $t('prompt.change_table_size.cancel'),
inputValue: this.maxTableSize,
inputPattern: /\d+$/,
- inputErrorMessage: 'Valid number is required',
+ inputErrorMessage: $t('prompt.change_table_size.input_error'),
callback: (action, instance) => {
if (action === 'confirm' && instance.inputValue) {
this.maxTableSize = instance.inputValue;
@@ -13978,15 +13978,15 @@ speechSynthesis.getVoices();
$app.methods.promptPhotonLobbyTimeoutThreshold = function () {
this.$prompt(
- 'Enter amount of seconds (default: 3)',
- 'User Timeout Threshold',
+ $t('prompt.photon_lobby_timeout.description'),
+ $t('prompt.photon_lobby_timeout.header'),
{
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.photon_lobby_timeout.ok'),
+ cancelButtonText: $t('prompt.photon_lobby_timeout.cancel'),
inputValue: this.photonLobbyTimeoutThreshold / 1000,
inputPattern: /\d+$/,
- inputErrorMessage: 'Valid number is required',
+ inputErrorMessage: $t('prompt.photon_lobby_timeout.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -14008,15 +14008,15 @@ speechSynthesis.getVoices();
$app.methods.promptAutoClearVRCXCacheFrequency = function () {
this.$prompt(
- 'Enter amount of hours, larger values may impact RAM usage and performance (default: 24, disabled: 0)',
- 'Clear VRCX Cache Timer',
+ $t('prompt.auto_clear_cache.description'),
+ $t('prompt.auto_clear_cache.header'),
{
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.auto_clear_cache.ok'),
+ cancelButtonText: $t('prompt.auto_clear_cache.cancel'),
inputValue: this.clearVRCXCacheFrequency / 3600 / 2,
inputPattern: /\d+$/,
- inputErrorMessage: 'Valid number is required',
+ inputErrorMessage: $t('prompt.auto_clear_cache.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
@@ -22675,12 +22675,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptNewLocalWorldFavoriteGroup = function () {
- this.$prompt('Enter a world favorite group name', 'New Group', {
+ this.$prompt($t('prompt.new_local_favorite_group.description'), $t('prompt.new_local_favorite_group.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'OK',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.new_local_favorite_group.ok'),
+ cancelButtonText: $t('prompt.new_local_favorite_group.cancel'),
inputPattern: /\S+/,
- inputErrorMessage: 'Name is required',
+ inputErrorMessage: $t('prompt.new_local_favorite_group.input_error'),
callback: (action, instance) => {
if (action === 'confirm' && instance.inputValue) {
this.newLocalWorldFavoriteGroup(instance.inputValue);
@@ -22692,7 +22692,7 @@ speechSynthesis.getVoices();
$app.methods.newLocalWorldFavoriteGroup = function (group) {
if (this.localWorldFavoriteGroups.includes(group)) {
$app.$message({
- message: `Group already exists with the name ${group}`,
+ message: $t('prompt.new_local_favorite_group.message.error', { name: group }),
type: 'error'
});
return;
@@ -22707,12 +22707,12 @@ speechSynthesis.getVoices();
};
$app.methods.promptLocalWorldFavoriteGroupRename = function (group) {
- this.$prompt('Enter a world favorite group name', 'Rename Group', {
+ this.$prompt($t('prompt.local_favorite_group_rename.description'), $t('prompt.local_favorite_group_rename.header'), {
distinguishCancelAndClose: true,
- confirmButtonText: 'Save',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.local_favorite_group_rename.save'),
+ cancelButtonText: $t('prompt.local_favorite_group_rename.cancel'),
inputPattern: /\S+/,
- inputErrorMessage: 'Name is required',
+ inputErrorMessage: $t('prompt.local_favorite_group_rename.input_error'),
inputValue: group,
callback: (action, instance) => {
if (action === 'confirm' && instance.inputValue) {
@@ -22728,7 +22728,7 @@ speechSynthesis.getVoices();
$app.methods.renameLocalWorldFavoriteGroup = function (newName, group) {
if (this.localWorldFavoriteGroups.includes(newName)) {
$app.$message({
- message: `Group already exists with the name ${newName}`,
+ message: $t('prompt.local_favorite_group_rename.message.error', { name: newName }),
type: 'error'
});
return;
@@ -22818,15 +22818,15 @@ speechSynthesis.getVoices();
$app.methods.promptSetPendingOffline = function () {
this.$prompt(
- 'Set pending offline delay in seconds (default: 110)',
- 'Pending Offline',
+ $t('prompt.pending_offline_delay.description'),
+ $t('prompt.pending_offline_delay.header'),
{
distinguishCancelAndClose: true,
- confirmButtonText: 'Save',
- cancelButtonText: 'Cancel',
+ confirmButtonText: $t('prompt.pending_offline_delay.save'),
+ cancelButtonText: $t('prompt.pending_offline_delay.cancel'),
inputValue: this.pendingOfflineDelay / 1000,
inputPattern: /\d+$/,
- inputErrorMessage: 'Valid number is required',
+ inputErrorMessage: $t('prompt.pending_offline_delay.input_error'),
callback: (action, instance) => {
if (
action === 'confirm' &&
diff --git a/html/src/localization/strings/en.json b/html/src/localization/strings/en.json
index ab6bbd66..375f0f9a 100644
--- a/html/src/localization/strings/en.json
+++ b/html/src/localization/strings/en.json
@@ -1041,6 +1041,217 @@
"ok": "OK"
}
},
+ "prompt": {
+ "totp": {
+ "header": "Two-factor Authentication",
+ "description": "Enter a numeric code from your authenticator app",
+ "use_otp": "Use OTP",
+ "verify": "Verify",
+ "input_placeholder": "Code",
+ "input_error": "Invalid Code"
+ },
+ "otp": {
+ "header": "Two-factor Authentication",
+ "description": "Enter one of your saved recovery codes",
+ "use_otp": "Use TOTP",
+ "verify": "Verify",
+ "input_placeholder": "Code",
+ "input_error": "Invalid Code"
+ },
+ "email_otp": {
+ "header": "Two-factor Authentication",
+ "description": "Enter a numeric code that was sent to your email",
+ "cancel": "Cancel",
+ "verify": "Verify",
+ "input_placeholder": "Code",
+ "input_error": "Invalid Code"
+ },
+ "primary_password": {
+ "header": "Primary Password Required",
+ "description": "Please enter your Primary Password."
+ },
+ "change_favorite_group_name": {
+ "header": "Change Group Name",
+ "description": "Enter a new name",
+ "cancel": "Cancel",
+ "change": "Change",
+ "input_placeholder": "Name",
+ "input_error": "Name is required",
+ "message": {
+ "success": "Group renamed"
+ }
+ },
+ "direct_access_user_id": {
+ "header": "Direct Access",
+ "description": "Enter a User URL or ID (UUID)",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "User URL/ID is required",
+ "message": {
+ "error": "Invalid URL/ID"
+ }
+ },
+ "direct_access_username": {
+ "header": "Direct Access",
+ "description": "Enter a Username",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Username is required"
+ },
+ "direct_access_world_id": {
+ "header": "Direct Access",
+ "description": "Enter a World URL or ID (UUID)",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "World URL/ID is required",
+ "message": {
+ "error": "Invalid URL/ID"
+ }
+ },
+ "direct_access_avatar_id": {
+ "header": "Direct Access",
+ "description": "Enter a Avatar URL or ID (UUID)",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Avatar URL/ID is required",
+ "message": {
+ "error": "Invalid URL/ID"
+ }
+ },
+ "direct_access_omni": {
+ "header": "Direct Access",
+ "description": "Enter a User/World/Instance/Avatar/Group URL or ID (UUID)",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "URL/ID is required",
+ "message": {
+ "error": "Invalid URL/ID"
+ }
+ },
+ "notification_timeout": {
+ "header": "Notification Timeout",
+ "description": "Enter amount of seconds",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid number is required"
+ },
+ "overlay_message_timeout": {
+ "header": "Overlay Message Timeout",
+ "description": "Enter amount of seconds",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid number is required"
+ },
+ "rename_avatar": {
+ "header": "Rename Avatar",
+ "description": "Enter avatar name",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid name is required",
+ "message": {
+ "success": "Avatar renamed"
+ }
+ },
+ "change_avatar_description": {
+ "header": "Change Description",
+ "description": "Enter avatar description",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid description is required",
+ "message": {
+ "success": "Avatar description changed"
+ }
+ },
+ "rename_world": {
+ "header": "Rename World",
+ "description": "Enter world name",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid name is required",
+ "message": {
+ "success": "World renamed"
+ }
+ },
+ "change_world_description": {
+ "header": "Change Description",
+ "description": "Enter world description",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid description is required",
+ "message": {
+ "success": "World description changed"
+ }
+ },
+ "change_world_capacity": {
+ "header": "Change Capacity",
+ "description": "Enter world capacity, Max: 40",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid number is required",
+ "message": {
+ "success": "World capacity changed"
+ }
+ },
+ "change_world_preview": {
+ "header": "Change YouTube Preview",
+ "description": "Enter world YouTube preview",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid YouTube URL is required",
+ "message": {
+ "error": "Invalid YouTube URL",
+ "success": "World YouTube preview changed"
+ }
+ },
+ "change_table_size": {
+ "header": "Max Table Size",
+ "description": "Larger table sizes may impact RAM usage and performance (default: 1000)",
+ "cancel": "Cancel",
+ "save": "Save",
+ "input_error": "Valid number is required"
+ },
+ "photon_lobby_timeout": {
+ "header": "User Timeout Threshold",
+ "description": "Enter amount of seconds (default: 3)",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid number is required"
+ },
+ "auto_clear_cache": {
+ "header": "Clear VRCX Cache Timer",
+ "description": "Enter amount of hours, larger values may impact RAM usage and performance (default: 24, disabled: 0)",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Valid number is required"
+ },
+ "new_local_favorite_group": {
+ "header": "New Group",
+ "description": "Enter a world favorite group name",
+ "cancel": "Cancel",
+ "ok": "OK",
+ "input_error": "Name is required",
+ "message": {
+ "error": "Group already exists with the name {name}"
+ }
+ },
+ "local_favorite_group_rename": {
+ "header": "Rename Group",
+ "description": "Enter a world favorite group name",
+ "cancel": "Cancel",
+ "save": "Save",
+ "input_error": "Name is required",
+ "message": {
+ "error": "Group already exists with the name {name}"
+ }
+ },
+ "pending_offline_delay": {
+ "header": "Pending Offline",
+ "description": "Set pending offline delay in seconds (default: 110)",
+ "cancel": "Cancel",
+ "save": "Save",
+ "input_error": "Valid number is required"
+ }
+ },
"table": {
"feed": {
"date": "Date",
diff --git a/html/src/localization/strings/zh_TW.json b/html/src/localization/strings/zh_TW.json
index 4dd998f0..1de0ef37 100644
--- a/html/src/localization/strings/zh_TW.json
+++ b/html/src/localization/strings/zh_TW.json
@@ -21,7 +21,7 @@
"register": "註冊",
"forgotPassword": "忘記密碼?",
"field": {
- "username": "玩家名稱或電子郵件",
+ "username": "玩家名稱或電子信箱",
"password": "密碼",
"saveCredentials": "儲存登入資料",
"devEndpoint": "開發接口",
@@ -1041,6 +1041,217 @@
"ok": "OK"
}
},
+ "prompt": {
+ "totp": {
+ "header": "雙重認證",
+ "description": "輸入你的身份驗證器應用程式中的數字代碼",
+ "use_otp": "使用一次性密碼",
+ "verify": "驗證",
+ "input_placeholder": "驗證碼",
+ "input_error": "無效的代碼"
+ },
+ "otp": {
+ "header": "雙重認證",
+ "description": "輸入你儲存的其中一個備份驗證碼",
+ "use_otp": "使用驗證碼",
+ "verify": "驗證",
+ "input_placeholder": "備份驗證碼",
+ "input_error": "無效的代碼"
+ },
+ "email_otp": {
+ "header": "雙重認證",
+ "description": "輸入寄送到電子信箱的數字代碼",
+ "cancel": "取消",
+ "verify": "驗證",
+ "input_placeholder": "代碼",
+ "input_error": "無效的代碼"
+ },
+ "primary_password": {
+ "header": "需要主密碼",
+ "description": "請輸入你的主密碼"
+ },
+ "change_favorite_group_name": {
+ "header": "變更收藏群組名稱",
+ "description": "輸入新名稱",
+ "cancel": "取消",
+ "change": "變更",
+ "input_placeholder": "名稱",
+ "input_error": "需要名稱",
+ "message": {
+ "success": "已重新命名收藏群組"
+ }
+ },
+ "direct_access_user_id": {
+ "header": "直接存取",
+ "description": "輸入玩家連結或玩家 ID (UUID)",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "需要玩家連結 / 玩家 ID",
+ "message": {
+ "error": "無效的連結或 ID"
+ }
+ },
+ "direct_access_username": {
+ "header": "直接存取",
+ "description": "輸入玩家名稱",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "需要玩家名稱"
+ },
+ "direct_access_world_id": {
+ "header": "直接存取",
+ "description": "輸入世界連結或世界 ID (UUID)",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "需要世界連結 / 世界 ID",
+ "message": {
+ "error": "無效的連結或 ID"
+ }
+ },
+ "direct_access_avatar_id": {
+ "header": "直接存取",
+ "description": "輸入角色連結或角色 ID (UUID)",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "需要角色連結 / 角色 ID",
+ "message": {
+ "error": "無效的連結或 ID"
+ }
+ },
+ "direct_access_omni": {
+ "header": "直接存取",
+ "description": "輸入玩家 / 世界 / 房間 / 角色連結 或 ID (UUID)",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "需要連結或 ID",
+ "message": {
+ "error": "無效的連結或 ID"
+ }
+ },
+ "notification_timeout": {
+ "header": "通知顯示時間",
+ "description": "輸入秒數",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的秒數"
+ },
+ "overlay_message_timeout": {
+ "header": "訊息疊層顯示時間",
+ "description": "輸入秒數",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的秒數"
+ },
+ "rename_avatar": {
+ "header": "重新命名角色",
+ "description": "輸入角色名稱",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的名稱",
+ "message": {
+ "success": "已重新命名角色"
+ }
+ },
+ "change_avatar_description": {
+ "header": "變更角色敘述",
+ "description": "輸入角色敘述",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的敘述",
+ "message": {
+ "success": "已變更角色敘述"
+ }
+ },
+ "rename_world": {
+ "header": "重新命名世界",
+ "description": "輸入世界名稱",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的名稱",
+ "message": {
+ "success": "已重新命名世界"
+ }
+ },
+ "change_world_description": {
+ "header": "變更世界敘述",
+ "description": "輸入世界敘述",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的敘述",
+ "message": {
+ "success": "已變更世界敘述"
+ }
+ },
+ "change_world_capacity": {
+ "header": "變更世界最大人數",
+ "description": "輸入世界最大人數, 最大:40",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的人數",
+ "message": {
+ "success": "已變更世界最大人數"
+ }
+ },
+ "change_world_preview": {
+ "header": "變更 YouTube 預覽",
+ "description": "輸入世界 YouTube 預覽",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的 Youtube 連結",
+ "message": {
+ "error": "無效的 Youtube 連結",
+ "success": "世界 YouTube 預覽已變更"
+ }
+ },
+ "change_table_size": {
+ "header": "最大表格大小",
+ "description": "較大的資料表大小可能會影響內存用量和性能 (預設:1000)",
+ "cancel": "取消",
+ "save": "儲存",
+ "input_error": "請輸入有效的行數"
+ },
+ "photon_lobby_timeout": {
+ "header": "玩家愈時閥值",
+ "description": "輸入秒數(預設:3)",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的秒數"
+ },
+ "auto_clear_cache": {
+ "header": "VRCX 快取清除間隔",
+ "description": "輸入小時數,較大的數值可能會影響內存用量和性能 (預設:24,關閉:0)",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的小時數"
+ },
+ "new_local_favorite_group": {
+ "header": "新增收藏群組",
+ "description": "輸入世界收藏群組名稱",
+ "cancel": "取消",
+ "ok": "OK",
+ "input_error": "請輸入有效的名稱",
+ "message": {
+ "error": "名稱為 {name} 的群組已存在"
+ }
+ },
+ "local_favorite_group_rename": {
+ "header": "重新命名收藏群組",
+ "description": "輸入世界收藏群組名稱",
+ "cancel": "取消",
+ "save": "儲存",
+ "input_error": "請輸入有效的名稱",
+ "message": {
+ "error": "名稱為 {name} 的群組已存在"
+ }
+ },
+ "pending_offline_delay": {
+ "header": "待確認離線",
+ "description": "設定將玩家標記為離線之前的延遲秒數(預設:110)",
+ "cancel": "取消",
+ "save": "儲存",
+ "input_error": "請輸入有效的秒數"
+ }
+ },
"table": {
"feed": {
"date": "時間",