This commit is contained in:
pa
2026-02-18 18:14:21 +09:00
parent a13b197d06
commit 7288995c73
22 changed files with 198 additions and 110 deletions
+5 -3
View File
@@ -103,6 +103,7 @@
import { acquireModalPortalLayer } from '@/lib/modalPortalLayers'; import { acquireModalPortalLayer } from '@/lib/modalPortalLayers';
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import { toast } from 'vue-sonner'; import { toast } from 'vue-sonner';
import { useI18n } from 'vue-i18n';
import Noty from 'noty'; import Noty from 'noty';
@@ -111,6 +112,7 @@
const galleryStore = useGalleryStore(); const galleryStore = useGalleryStore();
const { fullscreenImageDialog } = storeToRefs(galleryStore); const { fullscreenImageDialog } = storeToRefs(galleryStore);
const { t } = useI18n();
const viewerEl = ref(null); const viewerEl = ref(null);
const portalLayer = acquireModalPortalLayer(); const portalLayer = acquireModalPortalLayer();
@@ -286,7 +288,7 @@
async function copyImageToClipboard(url) { async function copyImageToClipboard(url) {
if (!url) return; if (!url) return;
const msg = toast.info('Downloading image...'); const msg = toast.info(t('message.image.downloading'));
try { try {
const response = await webApiService.execute({ url, method: 'GET' }); const response = await webApiService.execute({ url, method: 'GET' });
if (response.status !== 200 || !String(response.data).startsWith('data:image/png')) { if (response.status !== 200 || !String(response.data).startsWith('data:image/png')) {
@@ -294,7 +296,7 @@
} }
const blob = await (await fetch(response.data)).blob(); const blob = await (await fetch(response.data)).blob();
await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]); await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);
toast.success('Image copied to clipboard'); toast.success(t('message.image.copied_to_clipboard'));
} catch (error) { } catch (error) {
console.error('Error downloading image:', error); console.error('Error downloading image:', error);
new Noty({ type: 'error', text: escapeTag(`Failed to download image. ${url}`) }).show(); new Noty({ type: 'error', text: escapeTag(`Failed to download image. ${url}`) }).show();
@@ -305,7 +307,7 @@
async function downloadAndSaveImage(url, fileName) { async function downloadAndSaveImage(url, fileName) {
if (!url) return; if (!url) return;
const msg = toast.info('Downloading image...'); const msg = toast.info(t('message.image.downloading'));
try { try {
const response = await webApiService.execute({ url, method: 'GET' }); const response = await webApiService.execute({ url, method: 'GET' });
if (response.status !== 200 || !String(response.data).startsWith('data:image/png')) { if (response.status !== 200 || !String(response.data).startsWith('data:image/png')) {
+2 -2
View File
@@ -359,8 +359,8 @@
const closeInstance = (location) => { const closeInstance = (location) => {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? X Instance, nobody will be able to join', description: t('confirm.close_instance'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(async ({ ok }) => { .then(async ({ ok }) => {
if (!ok) return; if (!ok) return;
+6 -1
View File
@@ -2,6 +2,9 @@
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { computed } from 'vue'; import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const props = defineProps({ const props = defineProps({
modelValue: { type: String, default: '' }, modelValue: { type: String, default: '' },
@@ -93,7 +96,9 @@
@input="onInput" /> @input="onInput" />
<div v-if="clearable" class="mt-3 flex justify-end"> <div v-if="clearable" class="mt-3 flex justify-end">
<Button variant="ghost" size="sm" :disabled="disabled" @click="clear"> Clear </Button> <Button variant="ghost" size="sm" :disabled="disabled" @click="clear">
{{ t('view.favorite.clear') }}
</Button>
</div> </div>
</PopoverContent> </PopoverContent>
</Popover> </Popover>
@@ -109,7 +109,7 @@
v-if="avatarDialog.ref.styles?.primary || avatarDialog.ref.styles?.secondary" v-if="avatarDialog.ref.styles?.primary || avatarDialog.ref.styles?.secondary"
variant="outline" variant="outline"
style="margin-right: 5px; margin-top: 5px" style="margin-right: 5px; margin-top: 5px"
>Styles >{{ t('view.favorite.avatars.styles') }}
<span v-if="avatarDialog.ref.styles.primary" :class="['x-grey', 'x-tag-border-left']">{{ <span v-if="avatarDialog.ref.styles.primary" :class="['x-grey', 'x-tag-border-left']">{{
avatarDialog.ref.styles.primary avatarDialog.ref.styles.primary
}}</span> }}</span>
@@ -841,7 +841,7 @@
avatarId: D.id avatarId: D.id
}) })
.then((args) => { .then((args) => {
toast.success('Fallback avatar changed'); toast.success(t('message.avatar.fallback_changed'));
return args; return args;
}); });
break; break;
@@ -854,7 +854,7 @@
.then((args) => { .then((args) => {
// 'AVATAR-MODERATION'; // 'AVATAR-MODERATION';
applyAvatarModeration(args.json); applyAvatarModeration(args.json);
toast.success('Avatar blocked'); toast.success(t('message.avatar.blocked'));
return args; return args;
}); });
break; break;
@@ -883,7 +883,7 @@
}) })
.then((args) => { .then((args) => {
applyAvatar(args.json); applyAvatar(args.json);
toast.success('Avatar updated to public'); toast.success(t('message.avatar.updated_public'));
return args; return args;
}); });
break; break;
@@ -895,7 +895,7 @@
}) })
.then((args) => { .then((args) => {
applyAvatar(args.json); applyAvatar(args.json);
toast.success('Avatar updated to private'); toast.success(t('message.avatar.updated_private'));
return args; return args;
}); });
break; break;
@@ -918,7 +918,7 @@
sortUserDialogAvatars(array); sortUserDialogAvatars(array);
} }
toast.success('Avatar deleted'); toast.success(t('message.avatar.deleted'));
D.visible = false; D.visible = false;
return args; return args;
}); });
@@ -929,7 +929,7 @@
avatarId: D.id avatarId: D.id
}) })
.then((args) => { .then((args) => {
toast.success('Imposter deleted'); toast.success(t('message.avatar.impostor_deleted'));
showAvatarDialog(D.id); showAvatarDialog(D.id);
return args; return args;
}); });
@@ -940,7 +940,7 @@
avatarId: D.id avatarId: D.id
}) })
.then((args) => { .then((args) => {
toast.success('Imposter queued for creation'); toast.success(t('message.avatar.impostor_queued'));
return args; return args;
}); });
break; break;
@@ -959,7 +959,7 @@
avatarId: D.id avatarId: D.id
}) })
.then((args) => { .then((args) => {
toast.success('Imposter deleted and queued for creation'); toast.success(t('message.avatar.impostor_regenerated'));
return args; return args;
}); });
}); });
@@ -1467,8 +1467,8 @@
function confirmDeleteGroupPost(post) { function confirmDeleteGroupPost(post) {
modalStore modalStore
.confirm({ .confirm({
description: 'Are you sure you want to delete this post?', description: t('confirm.delete_post'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (!ok) return; if (!ok) return;
@@ -1570,8 +1570,8 @@
function blockGroup(groupId) { function blockGroup(groupId) {
modalStore modalStore
.confirm({ .confirm({
description: 'Are you sure you want to block this group?', description: t('confirm.block_group'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (!ok) return; if (!ok) return;
@@ -1591,8 +1591,8 @@
function unblockGroup(groupId) { function unblockGroup(groupId) {
modalStore modalStore
.confirm({ .confirm({
description: 'Are you sure you want to unblock this group?', description: t('confirm.unblock_group'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (!ok) return; if (!ok) return;
@@ -1628,9 +1628,9 @@
getGroupDialogGroup(id); getGroupDialogGroup(id);
} }
if (args.json.membershipStatus === 'member') { if (args.json.membershipStatus === 'member') {
toast.success('Group joined'); toast.success(t('message.group.joined'));
} else if (args.json.membershipStatus === 'requested') { } else if (args.json.membershipStatus === 'requested') {
toast.success('Group join request sent'); toast.success(t('message.group.join_request_sent'));
} }
return args; return args;
}); });
@@ -123,9 +123,11 @@
{{ t('dialog.user.tags.discord') }} {{ t('dialog.user.tags.discord') }}
</Badge> </Badge>
</TooltipWrapper> </TooltipWrapper>
<Badge v-if="userDialog.ref.$isTroll" variant="outline" class="x-tag-troll"> Nuisance </Badge> <Badge v-if="userDialog.ref.$isTroll" variant="outline" class="x-tag-troll">
{{ t('view.settings.appearance.user_colors.trust_levels.nuisance') }}
</Badge>
<Badge v-if="userDialog.ref.$isProbableTroll" variant="outline" class="x-tag-troll"> <Badge v-if="userDialog.ref.$isProbableTroll" variant="outline" class="x-tag-troll">
Almost Nuisance {{ t('view.favorite.avatars.almost_nuisance') }}
</Badge> </Badge>
<Badge v-if="userDialog.ref.$isModerator" variant="outline" class="x-tag-vip"> <Badge v-if="userDialog.ref.$isModerator" variant="outline" class="x-tag-vip">
{{ t('dialog.user.tags.vrchat_team') }} {{ t('dialog.user.tags.vrchat_team') }}
@@ -1062,7 +1062,7 @@
homeLocation: D.id homeLocation: D.id
}) })
.then((args) => { .then((args) => {
toast.success('Home world updated'); toast.success(t('message.world.home_updated'));
return args; return args;
}); });
break; break;
@@ -1072,7 +1072,7 @@
homeLocation: '' homeLocation: ''
}) })
.then((args) => { .then((args) => {
toast.success('Home world has been reset'); toast.success(t('message.world.home_reset'));
return args; return args;
}); });
break; break;
@@ -1082,7 +1082,7 @@
worldId: D.id worldId: D.id
}) })
.then((args) => { .then((args) => {
toast.success('World has been published'); toast.success(t('message.world.published'));
return args; return args;
}); });
break; break;
@@ -1092,7 +1092,7 @@
worldId: D.id worldId: D.id
}) })
.then((args) => { .then((args) => {
toast.success('World has been unpublished'); toast.success(t('message.world.unpublished'));
return args; return args;
}); });
break; break;
@@ -1105,7 +1105,7 @@
if (args.params.worldId === worldDialog.value.id && worldDialog.value.visible) { if (args.params.worldId === worldDialog.value.id && worldDialog.value.visible) {
worldDialog.value.hasPersistData = false; worldDialog.value.hasPersistData = false;
} }
toast.success('Persistent data has been deleted'); toast.success(t('message.world.persistent_data_deleted'));
return args; return args;
}); });
break; break;
@@ -1127,7 +1127,7 @@
const array = Array.from(map.values()); const array = Array.from(map.values());
userDialog.value.worlds = array; userDialog.value.worlds = array;
} }
toast.success('World has been deleted'); toast.success(t('message.world.deleted'));
D.visible = false; D.visible = false;
return args; return args;
}); });
@@ -1365,33 +1365,33 @@
navigator.clipboard navigator.clipboard
.writeText(worldDialog.value.id) .writeText(worldDialog.value.id)
.then(() => { .then(() => {
toast.success('World ID copied to clipboard'); toast.success(t('message.world.id_copied'));
}) })
.catch((err) => { .catch((err) => {
console.error('copy failed:', err); console.error('copy failed:', err);
toast.error('Copy failed'); toast.error(t('message.copy_failed'));
}); });
} }
function copyWorldUrl() { function copyWorldUrl() {
navigator.clipboard navigator.clipboard
.writeText(`https://vrchat.com/home/world/${worldDialog.value.id}`) .writeText(`https://vrchat.com/home/world/${worldDialog.value.id}`)
.then(() => { .then(() => {
toast.success('World URL copied to clipboard'); toast.success(t('message.world.url_copied'));
}) })
.catch((err) => { .catch((err) => {
console.error('copy failed:', err); console.error('copy failed:', err);
toast.error('Copy failed'); toast.error(t('message.copy_failed'));
}); });
} }
function copyWorldName() { function copyWorldName() {
navigator.clipboard navigator.clipboard
.writeText(worldDialog.value.ref.name) .writeText(worldDialog.value.ref.name)
.then(() => { .then(() => {
toast.success('World name copied to clipboard'); toast.success(t('message.world.name_copied'));
}) })
.catch((err) => { .catch((err) => {
console.error('copy failed:', err); console.error('copy failed:', err);
toast.error('Copy failed'); toast.error(t('message.copy_failed'));
}); });
} }
function showWorldAllowedDomainsDialog() { function showWorldAllowedDomainsDialog() {
+83 -8
View File
@@ -134,7 +134,8 @@
"Status": "Status", "Status": "Status",
"Avatar": "Avatar", "Avatar": "Avatar",
"Bio": "Bio" "Bio": "Bio"
} },
"photon_event_logging": "Photon Event Logging"
}, },
"friends_locations": { "friends_locations": {
"online": "Online", "online": "Online",
@@ -232,7 +233,11 @@
"confirm_delete_description": "Found {count} invalid avatars, delete them?", "confirm_delete_description": "Found {count} invalid avatars, delete them?",
"delete_summary": "Successfully deleted {removed} invalid avatars", "delete_summary": "Successfully deleted {removed} invalid avatars",
"no_invalid_found": "No invalid avatars found", "no_invalid_found": "No invalid avatars found",
"delete_cancelled": "Delete operation cancelled" "delete_cancelled": "Delete operation cancelled",
"local_history": "Local History",
"no_group_selected": "No Group Selected",
"styles": "Styles",
"almost_nuisance": "Almost Nuisance"
}, },
"edit_mode": "Edit Mode", "edit_mode": "Edit Mode",
"copy": "Copy", "copy": "Copy",
@@ -2002,6 +2007,19 @@
"decline_type": "Continue? Decline {type}", "decline_type": "Continue? Decline {type}",
"delete_type": "Continue? {type}", "delete_type": "Continue? {type}",
"command_question": "Continue? {command}", "command_question": "Continue? {command}",
"clear_group": "Continue? Clear Group",
"delete_group": "Continue? Delete Group {name}",
"delete_post": "Are you sure you want to delete this post?",
"block_group": "Are you sure you want to block this group?",
"unblock_group": "Are you sure you want to unblock this group?",
"leave_group": "Are you sure you want to leave this group?",
"disable_gamelog": "Continue? Disable GameLog",
"restore_backup": "Continue? Restore Backup",
"delete_vrc_registry": "Continue? Delete VRC Registry Settings",
"clear_cache": "Continue? Clear all VRChat cache",
"close_instance": "Continue? Close Instance, nobody will be able to join",
"bulk_unfavorite": "Are you sure you want to unfavorite {count} favorites?\nThis action cannot be undone.",
"bulk_unfavorite_title": "Delete {count} favorites?",
"restart_required_title": "Restart Required", "restart_required_title": "Restart Required",
"restart_now": "Restart Now", "restart_now": "Restart Now",
"restart_later": "Later" "restart_later": "Later"
@@ -2176,6 +2194,11 @@
"error": "Group already exists with the name {name}" "error": "Group already exists with the name {name}"
} }
}, },
"backup_name": {
"header": "Backup Name",
"description": "Enter a name for the backup",
"input_error": "Name is required"
},
"auto_login_delay": { "auto_login_delay": {
"header": "Auto-login delay", "header": "Auto-login delay",
"description": "Enter delay in seconds (0 to disable, max 10).", "description": "Enter delay in seconds (0 to disable, max 10).",
@@ -2215,7 +2238,15 @@
"create_failed": "Failed to create instance" "create_failed": "Failed to create instance"
}, },
"avatar": { "avatar": {
"change_moderation_failed": "Failed to change avatar moderation" "change_moderation_failed": "Failed to change avatar moderation",
"fallback_changed": "Fallback avatar changed",
"blocked": "Avatar blocked",
"updated_public": "Avatar updated to public",
"updated_private": "Avatar updated to private",
"deleted": "Avatar deleted",
"impostor_deleted": "Imposter deleted",
"impostor_queued": "Imposter queued for creation",
"impostor_regenerated": "Imposter deleted and queued for creation"
}, },
"avatar_lookup": { "avatar_lookup": {
"not_found": "Avatar not found in search providers", "not_found": "Avatar not found in search providers",
@@ -2224,7 +2255,9 @@
"loading": "Searching for avatar using search providers" "loading": "Searching for avatar using search providers"
}, },
"database": { "database": {
"upgrade_complete": "Database upgrade complete" "upgrade_complete": "Database upgrade complete",
"disk_space": "Please free up some disk space.",
"disk_error": "Please check your disk for errors."
}, },
"file": { "file": {
"not_image": "File isn't an image", "not_image": "File isn't an image",
@@ -2232,12 +2265,19 @@
"folder_missing": "Folder doesn't exist" "folder_missing": "Folder doesn't exist"
}, },
"group": { "group": {
"load_failed": "Failed to load group" "load_failed": "Failed to load group",
"joined": "Group joined",
"join_request_sent": "Group join request sent",
"visibility_updated": "Group visibility updated",
"subscription_updated": "Group subscription updated"
}, },
"invite": { "invite": {
"self_sent": "Self invite sent", "self_sent": "Self invite sent",
"sent": "Invite sent", "sent": "Invite sent",
"message_update_failed": "VRChat API didn't update message, try again" "message_update_failed": "VRChat API didn't update message, try again",
"message_updated": "Invite message updated",
"response_sent": "Invite response message sent",
"response_photo_sent": "Invite response photo message sent"
}, },
"launch": { "launch": {
"invalid_path": "Invalid path, you must enter VRChat folder or launch.exe" "invalid_path": "Invalid path, you must enter VRChat folder or launch.exe"
@@ -2252,7 +2292,16 @@
"error": "Upload failed" "error": "Upload failed"
}, },
"world": { "world": {
"load_failed": "Failed to load world" "load_failed": "Failed to load world",
"home_updated": "Home world updated",
"home_reset": "Home world has been reset",
"published": "World has been published",
"unpublished": "World has been unpublished",
"persistent_data_deleted": "Persistent data has been deleted",
"deleted": "World has been deleted",
"id_copied": "World ID copied to clipboard",
"url_copied": "World URL copied to clipboard",
"name_copied": "World name copied to clipboard"
}, },
"user": { "user": {
"moderated": "User moderated", "moderated": "User moderated",
@@ -2270,7 +2319,27 @@
}, },
"crash": { "crash": {
"vrcx_reload": "VRCX was reloaded for stability" "vrcx_reload": "VRCX was reloaded for stability"
} },
"image": {
"downloading": "Downloading image...",
"copied_to_clipboard": "Image copied to clipboard"
},
"registry": {
"restored": "VRC registry settings restored",
"deleted": "VRC registry settings deleted",
"restore_failed": "Failed to restore VRC registry settings, check console for full error: {error}",
"invalid_json": "Invalid JSON"
},
"cache": {
"deleted": "All VRChat cache deleted",
"delete_error": "Error deleting VRChat cache: {error}",
"invalid_config": "Invalid JSON in config.json"
},
"gamelog": {
"vrchat_must_be_closed": "VRChat needs to be closed before this option can be changed"
},
"copy_failed": "Copy failed",
"error": "Error"
}, },
"status": { "status": {
"title": "VRChat Status" "title": "VRChat Status"
@@ -2481,5 +2550,11 @@
"unavailable": "Service may be unavailable due to VRChat internal issues" "unavailable": "Service may be unavailable due to VRChat internal issues"
} }
} }
},
"accessibility": {
"toggle_sidebar": "Toggle Sidebar",
"back_to_top": "Back to top",
"toggle_password": "Toggle password visibility",
"clear_input": "Clear input"
} }
} }
+3 -2
View File
@@ -1,3 +1,4 @@
import { i18n } from '../plugin/i18n';
import { openExternalLink } from '../shared/utils'; import { openExternalLink } from '../shared/utils';
import { useModalStore } from '../stores'; import { useModalStore } from '../stores';
@@ -23,7 +24,7 @@ class SQLiteService {
} }
if (e.message.includes('database or disk is full')) { if (e.message.includes('database or disk is full')) {
modalStore.alert({ modalStore.alert({
description: 'Please free up some disk space.', description: i18n.global.t('message.database.disk_space'),
title: 'Disk containing database is full' title: 'Disk containing database is full'
}); });
} }
@@ -39,7 +40,7 @@ class SQLiteService {
} }
if (e.message.includes('disk I/O error')) { if (e.message.includes('disk I/O error')) {
modalStore.alert({ modalStore.alert({
description: 'Please check your disk for errors.', description: i18n.global.t('message.database.disk_error'),
title: 'Disk I/O error' title: 'Disk I/O error'
}); });
} }
+2 -1
View File
@@ -13,6 +13,7 @@ import {
import { escapeTag, replaceBioSymbols } from './base/string'; import { escapeTag, replaceBioSymbols } from './base/string';
import { AppDebug } from '../../service/appConfig.js'; import { AppDebug } from '../../service/appConfig.js';
import { compareUnityVersion } from './avatar'; import { compareUnityVersion } from './avatar';
import { i18n } from '../../plugin/i18n';
import { miscRequest } from '../../api'; import { miscRequest } from '../../api';
/** /**
@@ -170,7 +171,7 @@ function copyToClipboard(text, message = 'Copied successfully!') {
}) })
.catch((err) => { .catch((err) => {
console.error('Copy failed:', err); console.error('Copy failed:', err);
toast.error('Copy failed!'); toast.error(i18n.global.t('message.copy_failed'));
}); });
} }
+1 -1
View File
@@ -1641,7 +1641,7 @@ export const useFriendStore = defineStore('Friend', () => {
modalStore modalStore
.confirm({ .confirm({
description: t('confirm.unfriend'), description: t('confirm.unfriend'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(async ({ ok }) => { .then(async ({ ok }) => {
if (!ok) return; if (!ok) return;
+5 -5
View File
@@ -1,6 +1,7 @@
import { reactive, ref, shallowRef, watch } from 'vue'; import { reactive, ref, shallowRef, watch } from 'vue';
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { toast } from 'vue-sonner'; import { toast } from 'vue-sonner';
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
@@ -56,6 +57,7 @@ export const useGameLogStore = defineStore('GameLog', () => {
const modalStore = useModalStore(); const modalStore = useModalStore();
const router = useRouter(); const router = useRouter();
const { t } = useI18n();
const state = reactive({ const state = reactive({
lastLocationAvatarList: new Map() lastLocationAvatarList: new Map()
@@ -1420,16 +1422,14 @@ export const useGameLogStore = defineStore('GameLog', () => {
async function disableGameLogDialog() { async function disableGameLogDialog() {
if (gameStore.isGameRunning) { if (gameStore.isGameRunning) {
toast.error( toast.error(t('message.gamelog.vrchat_must_be_closed'));
'VRChat needs to be closed before this option can be changed'
);
return; return;
} }
if (!advancedSettingsStore.gameLogDisabled) { if (!advancedSettingsStore.gameLogDisabled) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Disable GameLog', description: t('confirm.disable_gamelog'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (!ok) return; if (!ok) return;
+4 -4
View File
@@ -583,8 +583,8 @@ export const useGroupStore = defineStore('Group', () => {
function leaveGroupPrompt(groupId) { function leaveGroupPrompt(groupId) {
modalStore modalStore
.confirm({ .confirm({
description: 'Are you sure you want to leave this group?', description: t('confirm.leave_group'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (!ok) return; if (!ok) return;
@@ -617,7 +617,7 @@ export const useGroupStore = defineStore('Group', () => {
}) })
.then((args) => { .then((args) => {
handleGroupMemberProps(args); handleGroupMemberProps(args);
toast.success('Group visibility updated'); toast.success(t('message.group.visibility_updated'));
return args; return args;
}); });
} }
@@ -629,7 +629,7 @@ export const useGroupStore = defineStore('Group', () => {
}) })
.then((args) => { .then((args) => {
handleGroupMemberProps(args); handleGroupMemberProps(args);
toast.success('Group subscription updated'); toast.success(t('message.group.subscription_updated'));
return args; return args;
}); });
} }
+1 -1
View File
@@ -2531,7 +2531,7 @@ export const useNotificationStore = defineStore('Notification', () => {
handleNotificationHide({ params }); handleNotificationHide({ params });
notificationRequest.hideNotificationV2(params.notificationId); notificationRequest.hideNotificationV2(params.notificationId);
console.error('Notification response failed', err); console.error('Notification response failed', err);
toast.error('Error'); toast.error(t('message.error'));
}); });
} }
+12 -10
View File
@@ -40,7 +40,7 @@
<DropdownMenuContent class="favorites-dropdown"> <DropdownMenuContent class="favorites-dropdown">
<li class="favorites-dropdown__control" @click.stop> <li class="favorites-dropdown__control" @click.stop>
<div class="favorites-dropdown__control-header"> <div class="favorites-dropdown__control-header">
<span>Scale</span> <span>{{ t('view.friends_locations.scale') }}</span>
<span class="favorites-dropdown__control-value">{{ avatarCardScalePercent }}%</span> <span class="favorites-dropdown__control-value">{{ avatarCardScalePercent }}%</span>
</div> </div>
<Slider <Slider
@@ -52,7 +52,7 @@
</li> </li>
<li class="favorites-dropdown__control" @click.stop> <li class="favorites-dropdown__control" @click.stop>
<div class="favorites-dropdown__control-header"> <div class="favorites-dropdown__control-header">
<span>Spacing</span> <span>{{ t('view.friends_locations.spacing') }}</span>
<span class="favorites-dropdown__control-value"> <span class="favorites-dropdown__control-value">
{{ avatarCardSpacingPercent }}% {{ avatarCardSpacingPercent }}%
</span> </span>
@@ -294,7 +294,7 @@
</div> </div>
<div class="group-section"> <div class="group-section">
<div class="group-section__header"> <div class="group-section__header">
<span>Local History</span> <span>{{ t('view.favorite.avatars.local_history') }}</span>
<DropdownMenu <DropdownMenu
:open="activeGroupMenu === historyGroupMenuKey" :open="activeGroupMenu === historyGroupMenuKey"
@update:open="handleGroupMenuVisible(historyGroupMenuKey, $event)"> @update:open="handleGroupMenuVisible(historyGroupMenuKey, $event)">
@@ -318,7 +318,9 @@
]" ]"
@click="handleGroupClick('history', historyGroupKey)"> @click="handleGroupClick('history', historyGroupKey)">
<div class="group-item__top"> <div class="group-item__top">
<span class="group-item__name">Local History</span> <span class="group-item__name">{{
t('view.favorite.avatars.local_history')
}}</span>
<span class="group-item__count">{{ avatarHistory.length }}/100</span> <span class="group-item__count">{{ avatarHistory.length }}/100</span>
</div> </div>
</div> </div>
@@ -350,7 +352,7 @@
<small>{{ avatarHistory.length }}/100</small> <small>{{ avatarHistory.length }}/100</small>
</span> </span>
</template> </template>
<span v-else>No Group Selected</span> <span v-else>{{ t('view.favorite.avatars.no_group_selected') }}</span>
</div> </div>
<div class="favorites-content__edit"> <div class="favorites-content__edit">
<span>{{ t('view.favorite.edit_mode') }}</span> <span>{{ t('view.favorite.edit_mode') }}</span>
@@ -500,7 +502,7 @@
</div> </div>
</template> </template>
<template v-else> <template v-else>
<div class="favorites-empty">No Group Selected</div> <div class="favorites-empty">{{ t('view.favorite.avatars.no_group_selected') }}</div>
</template> </template>
</div> </div>
</div> </div>
@@ -1237,8 +1239,8 @@
function clearFavoriteGroup(ctx) { function clearFavoriteGroup(ctx) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Clear Group', description: t('confirm.clear_group'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (ok) { if (ok) {
@@ -1279,8 +1281,8 @@
function promptLocalAvatarFavoriteGroupDelete(group) { function promptLocalAvatarFavoriteGroupDelete(group) {
modalStore modalStore
.confirm({ .confirm({
description: `Delete Group? ${group}`, description: t('confirm.delete_group', { name: group }),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (ok) { if (ok) {
+5 -5
View File
@@ -955,8 +955,8 @@
function clearFavoriteGroup(ctx) { function clearFavoriteGroup(ctx) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Clear Group', description: t('confirm.clear_group'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (ok) { if (ok) {
@@ -1035,7 +1035,7 @@
favoriteGroupId: args.json.id favoriteGroupId: args.json.id
} }
}); });
toast.success('Group visibility changed'); toast.success(t('message.group.visibility_updated'));
if (menuKey) { if (menuKey) {
handleGroupMenuVisible(menuKey, false); handleGroupMenuVisible(menuKey, false);
} }
@@ -1107,8 +1107,8 @@
handleGroupMenuVisible(localGroupMenuKey(group), false); handleGroupMenuVisible(localGroupMenuKey(group), false);
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Delete Group', description: t('confirm.delete_group', { name: group }),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (!ok) return; if (!ok) return;
+5 -5
View File
@@ -1137,7 +1137,7 @@
favoriteGroupId: args.json.id favoriteGroupId: args.json.id
} }
}); });
toast.success('Group visibility changed'); toast.success(t('message.group.visibility_updated'));
if (menuKey) { if (menuKey) {
handleGroupMenuVisible(menuKey, false); handleGroupMenuVisible(menuKey, false);
} }
@@ -1174,8 +1174,8 @@
function promptLocalWorldFavoriteGroupDelete(group) { function promptLocalWorldFavoriteGroupDelete(group) {
modalStore modalStore
.confirm({ .confirm({
description: `Delete Group? ${group}`, description: t('confirm.delete_group', { name: group }),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (ok) { if (ok) {
@@ -1188,8 +1188,8 @@
function clearFavoriteGroup(ctx) { function clearFavoriteGroup(ctx) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Clear Group', description: t('confirm.clear_group'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (ok) { if (ok) {
@@ -76,7 +76,7 @@
.editInviteMessage(params, messageType, slot) .editInviteMessage(params, messageType, slot)
.catch((err) => { .catch((err) => {
console.error('Invite response message update failed', err); console.error('Invite response message update failed', err);
toast.error('Error'); toast.error(t('message.error'));
}) })
.then((args) => { .then((args) => {
if (args.json[slot].message === I.messageSlot.message) { if (args.json[slot].message === I.messageSlot.message) {
@@ -84,7 +84,7 @@
toast.error(errorMessage); toast.error(errorMessage);
throw new Error(errorMessage); throw new Error(errorMessage);
} else { } else {
toast('Invite message updated'); toast(t('message.invite.message_updated'));
} }
return args; return args;
}); });
@@ -98,13 +98,13 @@
.sendInviteResponsePhoto(params, I.invite.id) .sendInviteResponsePhoto(params, I.invite.id)
.catch((err) => { .catch((err) => {
console.error('Invite response photo failed', err); console.error('Invite response photo failed', err);
toast.error('Error'); toast.error(t('message.error'));
}) })
.then((args) => { .then((args) => {
notificationRequest.hideNotification({ notificationRequest.hideNotification({
notificationId: I.invite.id notificationId: I.invite.id
}); });
toast.success('Invite response message sent'); toast.success(t('message.invite.response_sent'));
return args; return args;
}) })
.finally(() => { .finally(() => {
@@ -115,13 +115,13 @@
.sendInviteResponse(params, I.invite.id) .sendInviteResponse(params, I.invite.id)
.catch((err) => { .catch((err) => {
console.error('Invite response failed', err); console.error('Invite response failed', err);
toast.error('Error'); toast.error(t('message.error'));
}) })
.then((args) => { .then((args) => {
notificationRequest.hideNotification({ notificationRequest.hideNotification({
notificationId: I.invite.id notificationId: I.invite.id
}); });
toast.success('Invite response message sent'); toast.success(t('message.invite.response_sent'));
return args; return args;
}) })
.finally(() => { .finally(() => {
@@ -68,7 +68,7 @@
notificationRequest.hideNotification({ notificationRequest.hideNotification({
notificationId: D.invite.id notificationId: D.invite.id
}); });
toast.success('Invite response photo message sent'); toast.success(t('message.invite.response_photo_sent'));
return args; return args;
}) })
.finally(() => { .finally(() => {
@@ -79,13 +79,13 @@
.sendInviteResponse(params, D.invite.id) .sendInviteResponse(params, D.invite.id)
.catch((err) => { .catch((err) => {
console.error('Invite response failed', err); console.error('Invite response failed', err);
toast.error('Error'); toast.error(t('message.error'));
}) })
.then((args) => { .then((args) => {
notificationRequest.hideNotification({ notificationRequest.hideNotification({
notificationId: D.invite.id notificationId: D.invite.id
}); });
toast.success('Invite response message sent'); toast.success(t('message.invite.response_sent'));
return args; return args;
}) })
.finally(() => { .finally(() => {
@@ -39,7 +39,9 @@
<template v-if="photonLoggingEnabled"> <template v-if="photonLoggingEnabled">
<br /> <br />
<div class="mb-[5px] flex items-center"> <div class="mb-[5px] flex items-center">
<span class="inline-block min-w-[190px] pr-2.5 text-right">Photon Event Logging</span> <span class="inline-block min-w-[190px] pr-2.5 text-right">{{
t('view.feed.photon_event_logging')
}}</span>
</div> </div>
<div <div
v-for="setting in photonFeedFiltersOptions" v-for="setting in photonFeedFiltersOptions"
@@ -73,9 +75,7 @@
<Button variant="secondary" @click="currentResetFunction">{{ <Button variant="secondary" @click="currentResetFunction">{{
t('dialog.shared_feed_filters.reset') t('dialog.shared_feed_filters.reset')
}}</Button> }}</Button>
<Button @click="handleDialogClose">{{ <Button @click="handleDialogClose">{{ t('dialog.shared_feed_filters.close') }}</Button>
t('dialog.shared_feed_filters.close')
}}</Button>
</DialogFooter> </DialogFooter>
</DialogContent> </DialogContent>
</Dialog> </Dialog>
@@ -330,8 +330,8 @@
function showDeleteAllVRChatCacheConfirm() { function showDeleteAllVRChatCacheConfirm() {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? all VRChat cache', description: t('confirm.clear_cache'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (ok) { if (ok) {
@@ -344,9 +344,9 @@
async function deleteAllVRChatCache() { async function deleteAllVRChatCache() {
try { try {
await AssetBundleManager.DeleteAllCache(); await AssetBundleManager.DeleteAllCache();
toast.success('All VRChat cache deleted'); toast.success(t('message.cache.deleted'));
} catch (error) { } catch (error) {
toast.error(`Error deleting VRChat cache: ${error.message}`); toast.error(t('message.cache.delete_error', { error: error.message }));
} }
getVRChatCacheSize(); getVRChatCacheSize();
} }
@@ -441,7 +441,7 @@
const parsedConfig = JSON.parse(config); const parsedConfig = JSON.parse(config);
VRChatConfigFile.value = { ...VRChatConfigFile.value, ...parsedConfig }; VRChatConfigFile.value = { ...VRChatConfigFile.value, ...parsedConfig };
} catch { } catch {
toast.error('Invalid JSON in config.json'); toast.error(t('message.cache.invalid_config'));
throw new Error('Invalid JSON in config.json'); throw new Error('Invalid JSON in config.json');
} }
} }
@@ -119,8 +119,8 @@
function restoreVrcRegistryBackup(row) { function restoreVrcRegistryBackup(row) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Restore Backup', description: t('confirm.restore_backup'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (!ok) { if (!ok) {
@@ -129,11 +129,11 @@
const data = JSON.stringify(row.data); const data = JSON.stringify(row.data);
AppApi.SetVRChatRegistry(data) AppApi.SetVRChatRegistry(data)
.then(() => { .then(() => {
toast.success('VRC registry settings restored'); toast.success(t('message.registry.restored'));
}) })
.catch((e) => { .catch((e) => {
console.error(e); console.error(e);
toast.error(`Failed to restore VRC registry settings, check console for full error: ${e}`); toast.error(t('message.registry.restore_failed', { error: e }));
}); });
}) })
.catch(() => {}); .catch(() => {});
@@ -153,15 +153,15 @@
function deleteVrcRegistry() { function deleteVrcRegistry() {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Delete VRC Registry Settings', description: t('confirm.delete_vrc_registry'),
title: 'Confirm' title: t('confirm.title')
}) })
.then(({ ok }) => { .then(({ ok }) => {
if (!ok) { if (!ok) {
return; return;
} }
AppApi.DeleteVRChatRegistryFolder().then(() => { AppApi.DeleteVRChatRegistryFolder().then(() => {
toast.success('VRC registry settings deleted'); toast.success(t('message.registry.deleted'));
}); });
}) })
.catch(() => {}); .catch(() => {});
@@ -175,11 +175,11 @@
function promptVrcRegistryBackupName() { function promptVrcRegistryBackupName() {
modalStore modalStore
.prompt({ .prompt({
title: 'Backup Name', title: t('prompt.backup_name.header'),
description: 'Enter a name for the backup', description: t('prompt.backup_name.description'),
inputValue: 'Backup', inputValue: 'Backup',
pattern: /\S+/, pattern: /\S+/,
errorMessage: 'Name is required' errorMessage: t('prompt.backup_name.input_error')
}) })
.then(({ ok, value }) => { .then(({ ok, value }) => {
if (!ok) return; if (!ok) return;
@@ -245,14 +245,14 @@
} }
AppApi.SetVRChatRegistry(json) AppApi.SetVRChatRegistry(json)
.then(() => { .then(() => {
toast.success('VRC registry settings restored'); toast.success(t('message.registry.restored'));
}) })
.catch((e) => { .catch((e) => {
console.error(e); console.error(e);
toast.error(`Failed to restore VRC registry settings, check console for full error: ${e}`); toast.error(t('message.registry.restore_failed', { error: e }));
}); });
} catch { } catch {
toast.error('Invalid JSON'); toast.error(t('message.registry.invalid_json'));
} }
} }