improve i18n

This commit is contained in:
pa
2026-01-19 11:49:41 +09:00
parent 7303cd0b33
commit 1e25255ac5
34 changed files with 179 additions and 65 deletions
+1 -1
View File
@@ -311,7 +311,7 @@
shortName: props.shortname shortName: props.shortname
}) })
.then((args) => { .then((args) => {
toast.success('Self invite sent'); toast.success(t('message.invite.self_sent'));
return args; return args;
}); });
}; };
@@ -91,8 +91,9 @@
}) })
.then((args) => { .then((args) => {
if (args.json[slot].message === I.messageSlot.message) { if (args.json[slot].message === I.messageSlot.message) {
toast.error("VRChat API didn't update message, try again"); const errorMessage = t('message.invite.message_update_failed');
throw new Error("VRChat API didn't update message, try again"); toast.error(errorMessage);
throw new Error(errorMessage);
} else { } else {
toast('Invite message updated'); toast('Invite message updated');
} }
@@ -141,7 +142,7 @@
} else { } else {
J.loading = false; J.loading = false;
J.visible = false; J.visible = false;
toast.success('Invite sent'); toast.success(t('message.invite.sent'));
} }
}; };
inviteLoop(); inviteLoop();
@@ -244,7 +244,7 @@
function sendInvite() { function sendInvite() {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Invite', description: t('confirm.invite'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
@@ -281,7 +281,7 @@
} else { } else {
D.loading = false; D.loading = false;
D.visible = false; D.visible = false;
toast.success('Invite sent'); toast.success(t('message.invite.sent'));
} }
}; };
inviteLoop(); inviteLoop();
+1 -1
View File
@@ -273,7 +273,7 @@
function sendGroupInvite() { function sendGroupInvite() {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Invite User(s) To Group', description: t('confirm.invite_group'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
+1 -1
View File
@@ -309,7 +309,7 @@
shortName shortName
}) })
.then((args) => { .then((args) => {
toast.success('Self invite sent'); toast.success(t('message.invite.self_sent'));
return args; return args;
}); });
} }
+1 -1
View File
@@ -916,7 +916,7 @@
worldId: L.worldId worldId: L.worldId
}) })
.then((args) => { .then((args) => {
toast.success('Self invite sent'); toast.success(t('message.invite.self_sent'));
return args; return args;
}); });
} }
@@ -1854,7 +1854,7 @@
D.id D.id
) )
.then((_args) => { .then((_args) => {
toast('Invite sent'); toast(t('message.invite.sent'));
return _args; return _args;
}); });
}); });
@@ -975,7 +975,9 @@
case 'Trash2': case 'Trash2':
modalStore modalStore
.confirm({ .confirm({
description: `Continue? ${command}`, description: t('confirm.command_question', {
command
}),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
@@ -3,6 +3,7 @@
import { PaginationEllipsis } from 'reka-ui'; import { PaginationEllipsis } from 'reka-ui';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { reactiveOmit } from '@vueuse/core'; import { reactiveOmit } from '@vueuse/core';
import { useI18n } from 'vue-i18n';
const props = defineProps({ const props = defineProps({
asChild: { type: Boolean, required: false }, asChild: { type: Boolean, required: false },
@@ -10,6 +11,8 @@
class: { type: null, required: false } class: { type: null, required: false }
}); });
const { t } = useI18n();
const delegatedProps = reactiveOmit(props, 'class'); const delegatedProps = reactiveOmit(props, 'class');
</script> </script>
@@ -20,7 +23,9 @@
:class="cn('flex size-9 items-center justify-center text-[13px]', props.class)"> :class="cn('flex size-9 items-center justify-center text-[13px]', props.class)">
<slot> <slot>
<MoreHorizontal class="size-4" /> <MoreHorizontal class="size-4" />
<span class="sr-only">More pages</span> <span class="sr-only">
{{ t('table.pagination.more_pages') }}
</span>
</slot> </slot>
</PaginationEllipsis> </PaginationEllipsis>
</template> </template>
@@ -4,6 +4,7 @@
import { buttonVariants } from '@/components/ui/button'; import { buttonVariants } from '@/components/ui/button';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { reactiveOmit } from '@vueuse/core'; import { reactiveOmit } from '@vueuse/core';
import { useI18n } from 'vue-i18n';
const props = defineProps({ const props = defineProps({
asChild: { type: Boolean, required: false }, asChild: { type: Boolean, required: false },
@@ -12,6 +13,8 @@
class: { type: null, required: false } class: { type: null, required: false }
}); });
const { t } = useI18n();
const delegatedProps = reactiveOmit(props, 'class', 'size'); const delegatedProps = reactiveOmit(props, 'class', 'size');
const forwarded = useForwardProps(delegatedProps); const forwarded = useForwardProps(delegatedProps);
</script> </script>
@@ -23,7 +26,9 @@
v-bind="forwarded"> v-bind="forwarded">
<slot> <slot>
<ChevronLeftIcon /> <ChevronLeftIcon />
<span class="hidden sm:block">First</span> <span class="hidden sm:block">
{{ t('table.pagination.first') }}
</span>
</slot> </slot>
</PaginationFirst> </PaginationFirst>
</template> </template>
@@ -4,6 +4,7 @@
import { buttonVariants } from '@/components/ui/button'; import { buttonVariants } from '@/components/ui/button';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { reactiveOmit } from '@vueuse/core'; import { reactiveOmit } from '@vueuse/core';
import { useI18n } from 'vue-i18n';
const props = defineProps({ const props = defineProps({
asChild: { type: Boolean, required: false }, asChild: { type: Boolean, required: false },
@@ -12,6 +13,8 @@
class: { type: null, required: false } class: { type: null, required: false }
}); });
const { t } = useI18n();
const delegatedProps = reactiveOmit(props, 'class', 'size'); const delegatedProps = reactiveOmit(props, 'class', 'size');
const forwarded = useForwardProps(delegatedProps); const forwarded = useForwardProps(delegatedProps);
</script> </script>
@@ -22,7 +25,9 @@
:class="cn(buttonVariants({ variant: 'ghost', size }), 'text-[13px] gap-1 px-2.5 sm:pr-2.5', props.class)" :class="cn(buttonVariants({ variant: 'ghost', size }), 'text-[13px] gap-1 px-2.5 sm:pr-2.5', props.class)"
v-bind="forwarded"> v-bind="forwarded">
<slot> <slot>
<span class="hidden sm:block">Last</span> <span class="hidden sm:block">
{{ t('table.pagination.last') }}
</span>
<ChevronRightIcon /> <ChevronRightIcon />
</slot> </slot>
</PaginationLast> </PaginationLast>
@@ -4,6 +4,7 @@
import { buttonVariants } from '@/components/ui/button'; import { buttonVariants } from '@/components/ui/button';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { reactiveOmit } from '@vueuse/core'; import { reactiveOmit } from '@vueuse/core';
import { useI18n } from 'vue-i18n';
const props = defineProps({ const props = defineProps({
asChild: { type: Boolean, required: false }, asChild: { type: Boolean, required: false },
@@ -12,6 +13,8 @@
class: { type: null, required: false } class: { type: null, required: false }
}); });
const { t } = useI18n();
const delegatedProps = reactiveOmit(props, 'class', 'size'); const delegatedProps = reactiveOmit(props, 'class', 'size');
const forwarded = useForwardProps(delegatedProps); const forwarded = useForwardProps(delegatedProps);
</script> </script>
@@ -22,7 +25,9 @@
:class="cn(buttonVariants({ variant: 'ghost', size }), 'text-[13px] gap-1 px-2.5 sm:pr-2.5', props.class)" :class="cn(buttonVariants({ variant: 'ghost', size }), 'text-[13px] gap-1 px-2.5 sm:pr-2.5', props.class)"
v-bind="forwarded"> v-bind="forwarded">
<slot> <slot>
<span class="hidden sm:block">Next</span> <span class="hidden sm:block">
{{ t('table.pagination.next') }}
</span>
<ChevronRightIcon /> <ChevronRightIcon />
</slot> </slot>
</PaginationNext> </PaginationNext>
@@ -4,6 +4,7 @@
import { buttonVariants } from '@/components/ui/button'; import { buttonVariants } from '@/components/ui/button';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { reactiveOmit } from '@vueuse/core'; import { reactiveOmit } from '@vueuse/core';
import { useI18n } from 'vue-i18n';
const props = defineProps({ const props = defineProps({
asChild: { type: Boolean, required: false }, asChild: { type: Boolean, required: false },
@@ -12,6 +13,8 @@
class: { type: null, required: false } class: { type: null, required: false }
}); });
const { t } = useI18n();
const delegatedProps = reactiveOmit(props, 'class', 'size'); const delegatedProps = reactiveOmit(props, 'class', 'size');
const forwarded = useForwardProps(delegatedProps); const forwarded = useForwardProps(delegatedProps);
</script> </script>
@@ -23,7 +26,9 @@
v-bind="forwarded"> v-bind="forwarded">
<slot> <slot>
<ChevronLeftIcon /> <ChevronLeftIcon />
<span class="hidden sm:block">Previous</span> <span class="hidden sm:block">
{{ t('table.pagination.previous') }}
</span>
</slot> </slot>
</PaginationPrev> </PaginationPrev>
</template> </template>
+54 -6
View File
@@ -250,6 +250,13 @@
"filter_placeholder": "Filter", "filter_placeholder": "Filter",
"search_placeholder": "Search", "search_placeholder": "Search",
"refresh_tooltip": "Refresh", "refresh_tooltip": "Refresh",
"actions": {
"accept": "Accept",
"invite": "Invite",
"decline": "Decline",
"delete_log": "Delete log",
"decline_with_message": "Decline with message"
},
"filters": { "filters": {
"requestInvite": "Request Invite", "requestInvite": "Request Invite",
"invite": "Invite", "invite": "Invite",
@@ -1954,7 +1961,22 @@
"title": "Confirm", "title": "Confirm",
"confirm_button": "Confirm", "confirm_button": "Confirm",
"cancel_button": "Cancel", "cancel_button": "Cancel",
"message": "Continue {command}?" "message": "Continue {command}?",
"logout": "Continue? Logout",
"unfriend": "Continue? Unfriend",
"clear_avatar_history": "Continue? Clear Avatar History",
"select_avatar": "Continue? Select Avatar",
"invite": "Continue? Invite",
"invite_group": "Continue? Invite User(s) To Group",
"delete_log": "Continue? Delete Log",
"accept_friend_request": "Continue? Accept Friend Request",
"send_invite": "Continue? Send Invite",
"decline_type": "Continue? Decline {type}",
"delete_type": "Continue? Trash2 {type}",
"command_question": "Continue? {command}",
"restart_required_title": "Restart Required",
"restart_now": "Restart Now",
"restart_later": "Later"
}, },
"status": { "status": {
"title": "VRChat Status" "title": "VRChat Status"
@@ -1974,19 +1996,35 @@
"instance": { "instance": {
"closed": "Instance closed", "closed": "Instance closed",
"removed_form_queue": "Removed instance {worldName} from queue", "removed_form_queue": "Removed instance {worldName} from queue",
"not_allowed": "You're not allowed to access this instance" "not_allowed": "You're not allowed to access this 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",
"image_changed": "Avatar image changed", "image_changed": "Avatar image changed",
"image_invalid": "Current avatar image invalid" "image_invalid": "Current avatar image invalid"
}, },
"database": {
"upgrade_complete": "Database upgrade complete"
},
"emoji": { "emoji": {
"uploaded": "Emoji uploaded" "uploaded": "Emoji uploaded"
}, },
"file": { "file": {
"not_image": "File isn't an image", "not_image": "File isn't an image",
"too_large": "File size too large" "too_large": "File size too large",
"folder_missing": "Folder dosn't exist"
},
"group": {
"load_failed": "Failed to load group"
},
"invite": {
"self_sent": "Self invite sent",
"sent": "Invite sent",
"message_update_failed": "VRChat API didn't update message, try again"
},
"launch": {
"invalid_path": "Invalid path, you must enter VRChat folder or launch.exe"
}, },
"print": { "print": {
"uploaded": "Print uploaded" "uploaded": "Print uploaded"
@@ -2014,17 +2052,22 @@
}, },
"world": { "world": {
"image_changed": "World image changed", "image_changed": "World image changed",
"image_invalid": "Current world image invalid" "image_invalid": "Current world image invalid",
"load_failed": "Failed to load world"
}, },
"icon": { "icon": {
"uploaded": "Icon uploaded" "uploaded": "Icon uploaded"
}, },
"user": { "user": {
"moderated": "User moderated" "moderated": "User moderated",
"load_failed": "Failed to load user"
}, },
"friend": { "friend": {
"load_failed": "Failed to load friends list, logging out" "load_failed": "Failed to load friends list, logging out"
}, },
"vrcplus": {
"required": "VRCPlus required"
},
"screenshot_metadata": { "screenshot_metadata": {
"deleted": "Screenshot metadata deleted", "deleted": "Screenshot metadata deleted",
"delete_failed": "Failed to delete screenshot metadata" "delete_failed": "Failed to delete screenshot metadata"
@@ -2272,7 +2315,12 @@
}, },
"table": { "table": {
"pagination": { "pagination": {
"rows_per_page": "Rows per page" "rows_per_page": "Rows per page",
"first": "First",
"previous": "Previous",
"next": "Next",
"last": "Last",
"more_pages": "More pages"
}, },
"feed": { "feed": {
"date": "Date", "date": "Date",
+1 -1
View File
@@ -418,7 +418,7 @@ export const useAuthStore = defineStore('Auth', () => {
function logout() { function logout() {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Logout', description: t('confirm.logout'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
+4 -2
View File
@@ -1,6 +1,7 @@
import { nextTick, ref, watch } from 'vue'; import { nextTick, ref, 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 { import {
checkVRChatCache, checkVRChatCache,
@@ -31,6 +32,7 @@ export const useAvatarStore = defineStore('Avatar', () => {
const advancedSettingsStore = useAdvancedSettingsStore(); const advancedSettingsStore = useAdvancedSettingsStore();
const userStore = useUserStore(); const userStore = useUserStore();
const modalStore = useModalStore(); const modalStore = useModalStore();
const { t } = useI18n();
let cachedAvatarModerations = new Map(); let cachedAvatarModerations = new Map();
let cachedAvatars = new Map(); let cachedAvatars = new Map();
@@ -392,7 +394,7 @@ export const useAvatarStore = defineStore('Avatar', () => {
function promptClearAvatarHistory() { function promptClearAvatarHistory() {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Clear Avatar History', description: t('confirm.clear_avatar_history'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
@@ -556,7 +558,7 @@ export const useAvatarStore = defineStore('Avatar', () => {
function selectAvatarWithConfirmation(id) { function selectAvatarWithConfirmation(id) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Select Avatar', description: t('confirm.select_avatar'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
+1 -1
View File
@@ -1581,7 +1581,7 @@ export const useFriendStore = defineStore('Friend', () => {
function confirmDeleteFriend(id) { function confirmDeleteFriend(id) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Unfriend', description: t('confirm.unfriend'),
title: 'Confirm' title: 'Confirm'
}) })
.then(async ({ ok }) => { .then(async ({ ok }) => {
+3 -1
View File
@@ -1,6 +1,7 @@
import { nextTick, reactive, ref, watch } from 'vue'; import { nextTick, reactive, ref, 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 { import {
groupRequest, groupRequest,
@@ -32,6 +33,7 @@ export const useGroupStore = defineStore('Group', () => {
const userStore = useUserStore(); const userStore = useUserStore();
const notificationStore = useNotificationStore(); const notificationStore = useNotificationStore();
const modalStore = useModalStore(); const modalStore = useModalStore();
const { t } = useI18n();
let cachedGroups = new Map(); let cachedGroups = new Map();
@@ -152,7 +154,7 @@ export const useGroupStore = defineStore('Group', () => {
.catch((err) => { .catch((err) => {
D.loading = false; D.loading = false;
D.visible = false; D.visible = false;
toast.error('Failed to load group'); toast.error(t('message.group.load_failed'));
throw err; throw err;
}) })
.then((args) => { .then((args) => {
+4 -2
View File
@@ -1,6 +1,7 @@
import { computed, ref, watch } from 'vue'; import { computed, ref, 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 { instanceRequest, inviteMessagesRequest } from '../api'; import { instanceRequest, inviteMessagesRequest } from '../api';
import { parseLocation } from '../shared/utils'; import { parseLocation } from '../shared/utils';
@@ -15,6 +16,7 @@ export const useInviteStore = defineStore('Invite', () => {
const gameStore = useGameStore(); const gameStore = useGameStore();
const launchStore = useLaunchStore(); const launchStore = useLaunchStore();
const advancedSettingsStore = useAdvancedSettingsStore(); const advancedSettingsStore = useAdvancedSettingsStore();
const { t } = useI18n();
const inviteMessageTable = ref({ const inviteMessageTable = ref({
data: [], data: [],
@@ -95,7 +97,7 @@ export const useInviteStore = defineStore('Invite', () => {
instanceStore.createNewInstance(worldId).then((args) => { instanceStore.createNewInstance(worldId).then((args) => {
const location = args?.json?.location; const location = args?.json?.location;
if (!location) { if (!location) {
toast.error('Failed to create instance'); toast.error(t('message.instance.create_failed'));
return; return;
} }
// self invite // self invite
@@ -115,7 +117,7 @@ export const useInviteStore = defineStore('Invite', () => {
worldId: L.worldId worldId: L.worldId
}) })
.then((args) => { .then((args) => {
toast.success('Self invite sent'); toast.success(t('message.invite.self_sent'));
return args; return args;
}); });
}); });
+3 -1
View File
@@ -1,6 +1,7 @@
import { nextTick, ref, watch } from 'vue'; import { nextTick, ref, 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 { instanceRequest } from '../api'; import { instanceRequest } from '../api';
import { parseLocation } from '../shared/utils'; import { parseLocation } from '../shared/utils';
@@ -11,6 +12,7 @@ import configRepository from '../service/config';
export const useLaunchStore = defineStore('Launch', () => { export const useLaunchStore = defineStore('Launch', () => {
const isLaunchOptionsDialogVisible = ref(false); const isLaunchOptionsDialogVisible = ref(false);
const isOpeningInstance = ref(false); const isOpeningInstance = ref(false);
const { t } = useI18n();
const launchDialogData = ref({ const launchDialogData = ref({
visible: false, visible: false,
loading: false, loading: false,
@@ -114,7 +116,7 @@ export const useLaunchStore = defineStore('Launch', () => {
worldId: L.worldId, worldId: L.worldId,
shortName shortName
}); });
toast.success('Self invite sent'); toast.success(t('message.invite.self_sent'));
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
+6 -6
View File
@@ -485,9 +485,9 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => {
.confirm({ .confirm({
description: description:
'Error reporting setting has been enabled. Would you like to restart VRCX now for the change to take effect?', 'Error reporting setting has been enabled. Would you like to restart VRCX now for the change to take effect?',
title: 'Restart Required', title: t('confirm.restart_required_title'),
confirmText: 'Restart Now', confirmText: t('confirm.restart_now'),
cancelText: 'Later' cancelText: t('confirm.restart_later')
}) })
.then(async ({ ok }) => { .then(async ({ ok }) => {
if (!ok) return; if (!ok) return;
@@ -507,9 +507,9 @@ export const useAdvancedSettingsStore = defineStore('AdvancedSettings', () => {
.confirm({ .confirm({
description: description:
'Error reporting setting has been disabled. Would you like to restart VRCX now for the change to take effect?', 'Error reporting setting has been disabled. Would you like to restart VRCX now for the change to take effect?',
title: 'Restart Required', title: t('confirm.restart_required_title'),
confirmText: 'Restart Now', confirmText: t('confirm.restart_now'),
cancelText: 'Later' cancelText: t('confirm.restart_later')
}) })
.then(async ({ ok }) => { .then(async ({ ok }) => {
if (!ok) return; if (!ok) return;
+3 -1
View File
@@ -1,6 +1,7 @@
import { computed, reactive, ref, shallowReactive, watch } from 'vue'; import { computed, reactive, ref, shallowReactive, 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 Noty from 'noty'; import Noty from 'noty';
@@ -70,6 +71,7 @@ export const useUserStore = defineStore('User', () => {
const moderationStore = useModerationStore(); const moderationStore = useModerationStore();
const photonStore = usePhotonStore(); const photonStore = usePhotonStore();
const sharedFeedStore = useSharedFeedStore(); const sharedFeedStore = useSharedFeedStore();
const { t } = useI18n();
const currentUser = ref({ const currentUser = ref({
acceptedPrivacyVersion: 0, acceptedPrivacyVersion: 0,
@@ -837,7 +839,7 @@ export const useUserStore = defineStore('User', () => {
.catch((err) => { .catch((err) => {
D.loading = false; D.loading = false;
D.visible = false; D.visible = false;
toast.error('Failed to load user'); toast.error(t('message.user.load_failed'));
throw err; throw err;
}) })
.then((args) => { .then((args) => {
+1 -1
View File
@@ -195,7 +195,7 @@ export const useVrcxStore = defineStore('Vrcx', () => {
toast.dismiss(msgBox); toast.dismiss(msgBox);
if (state.databaseVersion) { if (state.databaseVersion) {
// only display when database exists // only display when database exists
toast.success('Database upgrade complete'); toast.success(t('message.database.upgrade_complete'));
} }
state.databaseVersion = databaseVersion; state.databaseVersion = databaseVersion;
} catch (err) { } catch (err) {
+3 -1
View File
@@ -1,6 +1,7 @@
import { reactive, shallowReactive, watch } from 'vue'; import { reactive, shallowReactive, 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 { import {
checkVRChatCache, checkVRChatCache,
@@ -24,6 +25,7 @@ export const useWorldStore = defineStore('World', () => {
const favoriteStore = useFavoriteStore(); const favoriteStore = useFavoriteStore();
const instanceStore = useInstanceStore(); const instanceStore = useInstanceStore();
const userStore = useUserStore(); const userStore = useUserStore();
const { t } = useI18n();
const worldDialog = reactive({ const worldDialog = reactive({
visible: false, visible: false,
@@ -132,7 +134,7 @@ export const useWorldStore = defineStore('World', () => {
.catch((err) => { .catch((err) => {
D.loading = false; D.loading = false;
D.visible = false; D.visible = false;
toast.error('Failed to load world'); toast.error(t('message.world.load_failed'));
throw err; throw err;
}) })
.then((args) => { .then((args) => {
+1 -1
View File
@@ -151,7 +151,7 @@
function deleteFriendLogPrompt(row) { function deleteFriendLogPrompt(row) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Delete Log', description: t('confirm.delete_log'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => ok && deleteFriendLog(row)) .then(({ ok }) => ok && deleteFriendLog(row))
+1 -1
View File
@@ -138,7 +138,7 @@
function deleteGameLogEntryPrompt(row) { function deleteGameLogEntryPrompt(row) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Delete Log', description: t('confirm.delete_log'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => ok && deleteGameLogEntry(row)) .then(({ ok }) => ok && deleteGameLogEntry(row))
+5 -5
View File
@@ -324,7 +324,7 @@
// FIXME: 메시지 수정 // FIXME: 메시지 수정
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Accept Friend Request', description: t('confirm.accept_friend_request'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
@@ -349,7 +349,7 @@
function acceptRequestInvite(row) { function acceptRequestInvite(row) {
modalStore modalStore
.confirm({ .confirm({
description: 'Continue? Send Invite', description: t('confirm.send_invite'),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
@@ -381,7 +381,7 @@
row.senderUserId row.senderUserId
) )
.then((_args) => { .then((_args) => {
toast('Invite sent'); toast(t('message.invite.sent'));
notificationRequest.hideNotification({ notificationRequest.hideNotification({
notificationId: row.id notificationId: row.id
}); });
@@ -459,7 +459,7 @@
function hideNotificationPrompt(row) { function hideNotificationPrompt(row) {
modalStore modalStore
.confirm({ .confirm({
description: `Continue? Decline ${row.type}`, description: t('confirm.decline_type', { type: row.type }),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
@@ -483,7 +483,7 @@
function deleteNotificationLogPrompt(row) { function deleteNotificationLogPrompt(row) {
modalStore modalStore
.confirm({ .confirm({
description: `Continue? Trash2 ${row.type}`, description: t('confirm.delete_type', { type: row.type }),
title: 'Confirm' title: 'Confirm'
}) })
.then(({ ok }) => { .then(({ ok }) => {
+31 -7
View File
@@ -543,7 +543,11 @@ export const createColumns = ({
</button> </button>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">
<span>Accept</span> <span>
{t(
'view.notification.actions.accept'
)}
</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>
@@ -567,7 +571,9 @@ export const createColumns = ({
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">
<span> <span>
Decline with message {t(
'view.notification.actions.decline_with_message'
)}
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
@@ -593,7 +599,11 @@ export const createColumns = ({
</button> </button>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">
<span>Invite</span> <span>
{t(
'view.notification.actions.invite'
)}
</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>
@@ -615,7 +625,9 @@ export const createColumns = ({
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">
<span> <span>
Decline with message {t(
'view.notification.actions.decline_with_message'
)}
</span> </span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
@@ -705,7 +717,11 @@ export const createColumns = ({
</button> </button>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">
<span>Decline</span> <span>
{t(
'view.notification.actions.decline'
)}
</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>
@@ -736,7 +752,11 @@ export const createColumns = ({
</button> </button>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">
<span>Delete log</span> <span>
{t(
'view.notification.actions.delete_log'
)}
</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>
@@ -767,7 +787,11 @@ export const createColumns = ({
</button> </button>
</TooltipTrigger> </TooltipTrigger>
<TooltipContent side="top"> <TooltipContent side="top">
<span>Delete log</span> <span>
{t(
'view.notification.actions.delete_log'
)}
</span>
</TooltipContent> </TooltipContent>
</Tooltip> </Tooltip>
</TooltipProvider> </TooltipProvider>
@@ -79,8 +79,9 @@
}) })
.then((args) => { .then((args) => {
if (args.json[slot].message === I.messageSlot.message) { if (args.json[slot].message === I.messageSlot.message) {
toast.error("VRChat API didn't update message, try again"); const errorMessage = t('message.invite.message_update_failed');
throw new Error("VRChat API didn't update message, try again"); toast.error(errorMessage);
throw new Error(errorMessage);
} else { } else {
toast('Invite message updated'); toast('Invite message updated');
} }
@@ -507,7 +507,7 @@
if (result) { if (result) {
toast.success('Folder opened'); toast.success('Folder opened');
} else { } else {
toast.error("Folder dosn't exist"); toast.error(t('message.file.folder_missing'));
} }
}); });
} }
@@ -517,7 +517,7 @@
if (result) { if (result) {
toast.success('Folder opened'); toast.success('Folder opened');
} else { } else {
toast.error("Folder dosn't exist"); toast.error(t('message.file.folder_missing'));
} }
}); });
} }
@@ -527,7 +527,7 @@
if (result) { if (result) {
toast.success('Folder opened'); toast.success('Folder opened');
} else { } else {
toast.error("Folder dosn't exist"); toast.error(t('message.file.folder_missing'));
} }
}); });
} }
@@ -111,7 +111,7 @@
D.vrcLaunchPathOverride.endsWith('.exe') && D.vrcLaunchPathOverride.endsWith('.exe') &&
!D.vrcLaunchPathOverride.endsWith('launch.exe') !D.vrcLaunchPathOverride.endsWith('launch.exe')
) { ) {
toast.error('Invalid path, you must enter VRChat folder or launch.exe'); toast.error(t('message.launch.invalid_path'));
return; return;
} }
configRepository.setString('vrcLaunchPathOverride', D.vrcLaunchPathOverride); configRepository.setString('vrcLaunchPathOverride', D.vrcLaunchPathOverride);
+2 -2
View File
@@ -737,7 +737,7 @@
function setProfilePicOverride(fileId) { function setProfilePicOverride(fileId) {
if (!isLocalUserVrcPlusSupporter.value) { if (!isLocalUserVrcPlusSupporter.value) {
toast.error('VRCPlus required'); toast.error(t('message.vrcplus.required'));
return; return;
} }
let profilePicOverride = ''; let profilePicOverride = '';
@@ -834,7 +834,7 @@
function setVRCPlusIcon(fileId) { function setVRCPlusIcon(fileId) {
if (!isLocalUserVrcPlusSupporter.value) { if (!isLocalUserVrcPlusSupporter.value) {
toast.error('VRCPlus required'); toast.error(t('message.vrcplus.required'));
return; return;
} }
let userIcon = ''; let userIcon = '';
+2 -2
View File
@@ -286,7 +286,7 @@
if (result) { if (result) {
toast.success('Folder opened'); toast.success('Folder opened');
} else { } else {
toast.error("Folder dosn't exist"); toast.error(t('message.file.folder_missing'));
} }
}); });
} }
@@ -296,7 +296,7 @@
if (result) { if (result) {
toast.success('Folder opened'); toast.success('Folder opened');
} else { } else {
toast.error("Folder dosn't exist"); toast.error(t('message.file.folder_missing'));
} }
}); });
} }
@@ -70,8 +70,9 @@
}) })
.then((args) => { .then((args) => {
if (args.json[slot].message === props.inviteMessage.message) { if (args.json[slot].message === props.inviteMessage.message) {
toast.error("VRChat API didn't update message, try again"); const errorMessage = t('message.invite.message_update_failed');
throw new Error("VRChat API didn't update message, try again"); toast.error(errorMessage);
throw new Error(errorMessage);
} else { } else {
toast.success('Invite message updated'); toast.success('Invite message updated');
emit('updateInviteMessages', messageType); emit('updateInviteMessages', messageType);