diff --git a/html/src/index.pug b/html/src/index.pug
index 8335db17..73043fe1 100644
--- a/html/src/index.pug
+++ b/html/src/index.pug
@@ -90,15 +90,15 @@ html
div
span.x-link(v-text="currentInstanceWorld.ref.authorName" @click="showUserDialog(currentInstanceWorld.ref.authorId)" style="color:#909399;font-family:monospace")
div(style="margin-top:5px")
- el-tag(v-if="currentInstanceWorld.ref.$isLabs" type="primary" effect="plain" size="mini" style="margin-right:5px") Labs
- el-tag(v-else-if="currentInstanceWorld.ref.releaseStatus === 'public'" type="success" effect="plain" size="mini" style="margin-right:5px") Public
- el-tag(v-else-if="currentInstanceWorld.ref.releaseStatus === 'private'" type="danger" effect="plain" size="mini" style="margin-right:5px") Private
+ el-tag(v-if="currentInstanceWorld.ref.$isLabs" type="primary" effect="plain" size="mini" style="margin-right:5px") {{ $t('dialog.world.tags.labs') }}
+ el-tag(v-else-if="currentInstanceWorld.ref.releaseStatus === 'public'" type="success" effect="plain" size="mini" style="margin-right:5px") {{ $t('dialog.world.tags.public') }}
+ el-tag(v-else-if="currentInstanceWorld.ref.releaseStatus === 'private'" type="danger" effect="plain" size="mini" style="margin-right:5px") {{ $t('dialog.world.tags.private') }}
el-tag.x-tag-platform-pc(v-if="currentInstanceWorld.isPC" type="info" effect="plain" size="mini" style="margin-right:5px") PC
el-tag.x-tag-platform-quest(v-if="currentInstanceWorld.isQuest" type="info" effect="plain" size="mini" style="margin-right:5px") Quest
el-tag(type="info" effect="plain" size="mini" v-text="currentInstanceWorld.fileSize" style="margin-right:5px")
el-tag(v-if="currentInstanceWorld.inCache" type="info" effect="plain" size="mini" style="margin-right:5px")
span(v-text="currentInstanceWorld.cacheSize")
- | Cache
+ | {{ $t('dialog.world.tags.cache') }}
br
location-world(:locationobject="currentInstanceLocation" :currentuserid="API.currentUser.id")
span(v-if="lastLocation.playerList.size > 0" style="margin-left:5px")
@@ -110,29 +110,29 @@ html
div(style="display:flex;flex-direction:column;margin-left:20px")
.x-friend-item(style="cursor:default")
.detail
- span.name Capacity
+ span.name {{ $t('dialog.world.info.capacity') }}
span.extra {{ currentInstanceWorld.ref.capacity | commaNumber }} ({{ currentInstanceWorld.ref.capacity * 2 | commaNumber }})
.x-friend-item(style="cursor:default")
.detail
- span.name Last Updated
+ span.name {{ $t('dialog.world.info.last_updated') }}
span.extra {{ currentInstanceWorld.fileCreatedAt | formatDate('long') }}
.x-friend-item(style="cursor:default")
.detail
- span.name Created
+ span.name {{ $t('dialog.world.info.created_at') }}
span.extra {{ currentInstanceWorld.ref.created_at | formatDate('long') }}
div.photon-event-table(v-if="photonLoggingEnabled")
div(style="position:absolute;width:600px;margin-left:195px;z-index:1")
- el-select(v-model="photonEventTableTypeFilter" @change="photonEventTableFilterChange" multiple clearable collapse-tags style="flex:1;width:220px" placeholder="Filter")
+ el-select(v-model="photonEventTableTypeFilter" @change="photonEventTableFilterChange" multiple clearable collapse-tags style="flex:1;width:220px" :placeholder="$t('view.player_list.photon.filter_placeholder')")
el-option(v-once v-for="type in photonEventTableTypeFilterList" :key="type" :label="type" :value="type")
- el-input(v-model="photonEventTableFilter" @input="photonEventTableFilterChange" placeholder="Search" clearable style="width:150px;margin-left:10px")
- el-button(@click="showChatboxBlacklistDialog" style="margin-left:10px") Chatbox Blacklist
- el-tooltip(placement="bottom" content="VRCX Companion Status" :disabled="hideTooltips")
+ el-input(v-model="photonEventTableFilter" @input="photonEventTableFilterChange" :placeholder="$t('view.player_list.photon.search_placeholder')" clearable style="width:150px;margin-left:10px")
+ el-button(@click="showChatboxBlacklistDialog" style="margin-left:10px") {{ $t('view.player_list.photon.chatbox_blacklist') }}
+ el-tooltip(placement="bottom" :content="$t('view.player_list.photon.status_tooltip')" :disabled="hideTooltips")
div(style="display:inline-block;margin-left:15px;font-size:14px;vertical-align:text-top;margin-top:1px")
span(v-if="ipcEnabled && !photonEventIcon") 🟢
span(v-else-if="ipcEnabled") ⚪
span(v-else) 🔴
el-tabs(type="card")
- el-tab-pane(label="Current")
+ el-tab-pane(:label="$t('view.player_list.photon.current')")
data-tables(v-bind="photonEventTable" style="margin-bottom:10px")
el-table-column(:label="$t('table.playerList.date')" prop="created_at" width="120")
template(v-once #default="scope")
@@ -150,19 +150,19 @@ html
span.x-link(v-text="scope.row.avatar.name" @click="showAvatarDialog(scope.row.avatar.id)")
|
span(v-if="!scope.row.inCache" style="color:#aaa") #[i.el-icon-download]
- span.avatar-info-public(v-if="scope.row.avatar.releaseStatus === 'public'") (Public)
- span.avatar-info-own(v-else-if="scope.row.avatar.releaseStatus === 'private'") (Private)
+ span.avatar-info-public(v-if="scope.row.avatar.releaseStatus === 'public'") {{ $t('dialog.avatar.labels.public') }}
+ span.avatar-info-own(v-else-if="scope.row.avatar.releaseStatus === 'private'") {{ $t('dialog.avatar.labels.private') }}
template(v-if="scope.row.avatar.description && scope.row.avatar.name !== scope.row.avatar.description")
| - {{ scope.row.avatar.description }}
template(v-else-if="scope.row.type === 'ChangeStatus'")
template(v-if="scope.row.status !== scope.row.previousStatus")
el-tooltip(placement="top")
template(#content)
- span(v-if="scope.row.previousStatus === 'active'") Active
- span(v-else-if="scope.row.previousStatus === 'join me'") Join Me
- span(v-else-if="scope.row.previousStatus === 'ask me'") Ask Me
- span(v-else-if="scope.row.previousStatus === 'busy'") Do Not Disturb
- span(v-else) Offline
+ span(v-if="scope.row.previousStatus === 'active'") {{ $t('dialog.user.status.active') }}
+ span(v-else-if="scope.row.previousStatus === 'join me'") {{ $t('dialog.user.status.join_me') }}
+ span(v-else-if="scope.row.previousStatus === 'ask me'") {{ $t('dialog.user.status.ask_me') }}
+ span(v-else-if="scope.row.previousStatus === 'busy'") {{ $t('dialog.user.status.busy') }}
+ span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.previousStatus)")
span
i.el-icon-right
@@ -182,11 +182,11 @@ html
span.x-link(v-text="scope.row.avatar.name" @click="showAvatarDialog(scope.row.avatar.id)")
|
span(v-if="!scope.row.inCache" style="color:#aaa") #[i.el-icon-download]
- span.avatar-info-public(v-if="scope.row.avatar.releaseStatus === 'public'") (Public)
- span.avatar-info-own(v-else-if="scope.row.avatar.releaseStatus === 'private'") (Private)
+ span.avatar-info-public(v-if="scope.row.avatar.releaseStatus === 'public'") {{ $t('dialog.avatar.labels.public') }}
+ span.avatar-info-own(v-else-if="scope.row.avatar.releaseStatus === 'private'") {{ $t('dialog.avatar.labels.private') }}
span(v-else-if="scope.row.color === 'yellow'" v-text="scope.row.text" style="color:yellow")
span(v-else v-text="scope.row.text")
- el-tab-pane(label="Previous")
+ el-tab-pane(:label="$t('view.player_list.photon.previous')")
data-tables(v-bind="photonEventTablePrevious" style="margin-bottom:10px")
el-table-column(:label="$t('table.playerList.date')" prop="created_at" width="120")
template(v-once #default="scope")
@@ -194,11 +194,11 @@ html
template(#content)
span {{ scope.row.created_at | formatDate('long') }}
span {{ scope.row.created_at | formatDate('short') }}
- el-table-column(label="User" prop="photonId" width="160")
+ el-table-column(:label="$t('table.playerList.user')" prop="photonId" width="160")
template(v-once #default="scope")
span.x-link(v-text="scope.row.displayName" @click="lookupUser(scope.row)" style="padding-right:10px")
- el-table-column(label="Type" prop="type" width="140")
- el-table-column(label="Details" prop="text")
+ el-table-column(:label="$t('table.playerList.type')" prop="type" width="140")
+ el-table-column(:label="$t('table.playerList.detail')" prop="text")
template(v-once #default="scope")
template(v-if="scope.row.type === 'ChangeAvatar'")
span.x-link(v-text="scope.row.avatar.name" @click="showAvatarDialog(scope.row.avatar.id)")
@@ -212,21 +212,21 @@ html
template(v-if="scope.row.status !== scope.row.previousStatus")
el-tooltip(placement="top")
template(#content)
- span(v-if="scope.row.previousStatus === 'active'") Active
- span(v-else-if="scope.row.previousStatus === 'join me'") Join Me
- span(v-else-if="scope.row.previousStatus === 'ask me'") Ask Me
- span(v-else-if="scope.row.previousStatus === 'busy'") Do Not Disturb
- span(v-else) Offline
+ span(v-if="scope.row.previousStatus === 'active'") {{ $t('dialog.user.status.active') }}
+ span(v-else-if="scope.row.previousStatus === 'join me'") {{ $t('dialog.user.status.join_me') }}
+ span(v-else-if="scope.row.previousStatus === 'ask me'") {{ $t('dialog.user.status.ask_me') }}
+ span(v-else-if="scope.row.previousStatus === 'busy'") {{ $t('dialog.user.status.busy') }}
+ span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.previousStatus)")
span
i.el-icon-right
el-tooltip(placement="top")
template(#content)
- span(v-if="scope.row.status === 'active'") Active
- span(v-else-if="scope.row.status === 'join me'") Join Me
- span(v-else-if="scope.row.status === 'ask me'") Ask Me
- span(v-else-if="scope.row.status === 'busy'") Do Not Disturb
- span(v-else) Offline
+ span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }}
+ span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }}
+ span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }}
+ span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }}
+ span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)")
span(v-if="scope.row.statusDescription !== scope.row.previousStatusDescription" v-text="scope.row.statusDescription" style="margin-left:5px")
span.x-link(v-else-if="scope.row.type === 'PortalSpawn'" @click="showWorldDialog(scope.row.location, scope.row.shortName)")
@@ -347,11 +347,11 @@ html
template(v-else-if="scope.row.type === 'Status'")
el-tooltip(placement="top")
template(#content)
- span(v-if="scope.row.previousStatus === 'active'") Active
- span(v-else-if="scope.row.previousStatus === 'join me'") Join Me
- span(v-else-if="scope.row.previousStatus === 'ask me'") Ask Me
- span(v-else-if="scope.row.previousStatus === 'busy'") Do Not Disturb
- span(v-else) Offline
+ span(v-if="scope.row.previousStatus === 'active'") {{ $t('dialog.user.status.active') }}
+ span(v-else-if="scope.row.previousStatus === 'join me'") {{ $t('dialog.user.status.join_me') }}
+ span(v-else-if="scope.row.previousStatus === 'ask me'") {{ $t('dialog.user.status.ask_me') }}
+ span(v-else-if="scope.row.previousStatus === 'busy'") {{ $t('dialog.user.status.busy') }}
+ span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.previousStatus)")
span(v-text="scope.row.previousStatusDescription")
br
@@ -359,11 +359,11 @@ html
i.el-icon-right
el-tooltip(placement="top")
template(#content)
- span(v-if="scope.row.status === 'active'") Active
- span(v-else-if="scope.row.status === 'join me'") Join Me
- span(v-else-if="scope.row.status === 'ask me'") Ask Me
- span(v-else-if="scope.row.status === 'busy'") Do Not Disturb
- span(v-else) Offline
+ span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }}
+ span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }}
+ span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }}
+ span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }}
+ span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)")
span(v-text="scope.row.statusDescription")
template(v-else-if="scope.row.type === 'Bio'")
@@ -391,30 +391,30 @@ html
template(v-if="scope.row.statusDescription === scope.row.previousStatusDescription")
el-tooltip(placement="top")
template(#content)
- span(v-if="scope.row.previousStatus === 'active'") Active
- span(v-else-if="scope.row.previousStatus === 'join me'") Join Me
- span(v-else-if="scope.row.previousStatus === 'ask me'") Ask Me
- span(v-else-if="scope.row.previousStatus === 'busy'") Do Not Disturb
- span(v-else) Offline
+ span(v-if="scope.row.previousStatus === 'active'") {{ $t('dialog.user.status.active') }}
+ span(v-else-if="scope.row.previousStatus === 'join me'") {{ $t('dialog.user.status.join_me') }}
+ span(v-else-if="scope.row.previousStatus === 'ask me'") {{ $t('dialog.user.status.ask_me') }}
+ span(v-else-if="scope.row.previousStatus === 'busy'") {{ $t('dialog.user.status.busy') }}
+ span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.previousStatus)")
span
i.el-icon-right
el-tooltip(placement="top")
template(#content)
- span(v-if="scope.row.status === 'active'") Active
- span(v-else-if="scope.row.status === 'join me'") Join Me
- span(v-else-if="scope.row.status === 'ask me'") Ask Me
- span(v-else-if="scope.row.status === 'busy'") Do Not Disturb
- span(v-else) Offline
+ span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }}
+ span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }}
+ span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }}
+ span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }}
+ span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)")
template(v-else)
el-tooltip(placement="top")
template(#content)
- span(v-if="scope.row.status === 'active'") Online
- span(v-else-if="scope.row.status === 'join me'") Join Me
- span(v-else-if="scope.row.status === 'ask me'") Ask Me
- span(v-else-if="scope.row.status === 'busy'") Do Not Disturb
- span(v-else) Offline
+ span(v-if="scope.row.status === 'active'") {{ $t('dialog.user.status.active') }}
+ span(v-else-if="scope.row.status === 'join me'") {{ $t('dialog.user.status.join_me') }}
+ span(v-else-if="scope.row.status === 'ask me'") {{ $t('dialog.user.status.ask_me') }}
+ span(v-else-if="scope.row.status === 'busy'") {{ $t('dialog.user.status.busy') }}
+ span(v-else) {{ $t('dialog.user.status.offline') }}
i.x-user-status(:class="statusClass(scope.row.status)")
span
span(v-text="scope.row.statusDescription")
@@ -3421,7 +3421,7 @@ html
span(v-text="scope.row.count")
//- dialog: export world list
- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="worldExportDialogRef" :visible.sync="worldExportDialogVisible" title="World Favorites Export" width="650px")
+ el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="worldExportDialogRef" :visible.sync="worldExportDialogVisible" :title="$t('dialog.world_export.header')" width="650px")
el-dropdown(@click.native.stop trigger="click" size="small")
el-button(size="mini")
span(v-if="worldExportFavoriteGroup") {{ worldExportFavoriteGroup.displayName }} ({{ worldExportFavoriteGroup.count }}/{{ worldExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
@@ -3442,60 +3442,60 @@ html
el-input(type="textarea" v-if="worldExportDialogVisible" v-model="worldExportContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="$event.target.tagName === 'TEXTAREA' && $event.target.select()")
//- dialog: World import dialog
- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="worldImportDialog" :visible.sync="worldImportDialog.visible" title="World Favorites Import" width="650px")
+ el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="worldImportDialog" :visible.sync="worldImportDialog.visible" :title="$t('dialog.world_import.header')" width="650px")
div(style="font-size:12px")
- | Enter a list of world IDs
+ | {{ $t('dialog.world_import.description') }}
el-input(type="textarea" v-model="worldImportDialog.input" size="mini" rows="10" resize="none" style="margin-top:15px")
- el-button(size="small" @click="processWorldImportList" :disabled="!worldImportDialog.input") Process List
- span(v-if="worldImportDialog.progress" style="margin-top:10px") #[i.el-icon-loading(style="margin-right:5px")] Progress: {{ worldImportDialog.progress }}/{{ worldImportDialog.progressTotal }}
+ el-button(size="small" @click="processWorldImportList" :disabled="!worldImportDialog.input") {{ $t('dialog.world_import.process_list') }}
+ span(v-if="worldImportDialog.progress" style="margin-top:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.world_import.process_progress') }} {{ worldImportDialog.progress }}/{{ worldImportDialog.progressTotal }}
br
el-dropdown(@click.native.stop trigger="click" size="small" style="margin-right:5px")
el-button(size="mini")
span(v-if="worldImportDialog.worldImportFavoriteGroup") {{ worldImportDialog.worldImportFavoriteGroup.displayName }} ({{ worldImportDialog.worldImportFavoriteGroup.count }}/{{ worldImportDialog.worldImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
- span(v-else) Select Group #[i.el-icon-arrow-down.el-icon--right]
+ span(v-else) {{ $t('dialog.world_import.select_vrchat_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
template(v-for="groupAPI in API.favoriteWorldGroups" :key="groupAPI.name")
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectWorldImportGroup(groupAPI)" :disabled="groupAPI.count >= groupAPI.capacity") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
el-dropdown(@click.native.stop trigger="click" size="small" style="margin:5px")
el-button(size="mini")
span(v-if="worldImportDialog.worldImportLocalFavoriteGroup") {{ worldImportDialog.worldImportLocalFavoriteGroup }} ({{ getLocalWorldFavoriteGroupLength(worldImportDialog.worldImportLocalFavoriteGroup) }}) #[i.el-icon-arrow-down.el-icon--right]
- span(v-else) Select Group #[i.el-icon-arrow-down.el-icon--right]
+ span(v-else) {{ $t('dialog.world_import.select_local_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
template(v-for="group in localWorldFavoriteGroups" :key="group")
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectWorldImportLocalGroup(group)" ) {{ group }} ({{ getLocalWorldFavoriteGroupLength(group) }})
- el-button(size="small" @click="importWorldImportTable" style="margin:5px" :disabled="worldImportTable.data.length === 0 || (!worldImportDialog.worldImportFavoriteGroup && !worldImportDialog.worldImportLocalFavoriteGroup)") Import Worlds
- el-button(v-if="worldImportDialog.loading" size="small" @click="cancelWorldImport" style="margin-top:10px") Cancel
+ el-button(size="small" @click="importWorldImportTable" style="margin:5px" :disabled="worldImportTable.data.length === 0 || (!worldImportDialog.worldImportFavoriteGroup && !worldImportDialog.worldImportLocalFavoriteGroup)") {{ $t('dialog.world_import.import') }}
+ el-button(v-if="worldImportDialog.loading" size="small" @click="cancelWorldImport" style="margin-top:10px") {{ $t('dialog.world_import.cancel') }}
span(v-if="worldImportDialog.worldImportFavoriteGroup") {{ worldImportTable.data.length }} / {{ worldImportDialog.worldImportFavoriteGroup.capacity - worldImportDialog.worldImportFavoriteGroup.count }}
- span(v-if="worldImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] Import Progress: {{ worldImportDialog.importProgress }}/{{ worldImportDialog.importProgressTotal }}
+ span(v-if="worldImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.world_import.import_progress') }} {{ worldImportDialog.importProgress }}/{{ worldImportDialog.importProgressTotal }}
br
- el-button(size="small" @click="clearWorldImportTable") Clear Table
+ el-button(size="small" @click="clearWorldImportTable") {{ $t('dialog.world_import.clear_table') }}
template(v-if="worldImportDialog.errors")
- el-button(size="small" @click="worldImportDialog.errors = ''" style="margin-left:5px") Clear Errors
- h2(style="font-weight:bold;margin:0") Errors:
+ el-button(size="small" @click="worldImportDialog.errors = ''" style="margin-left:5px") {{ $t('dialog.world_import.clear_errors') }}
+ h2(style="font-weight:bold;margin:0") {{ $t('dialog.world_import.errors') }}
pre(v-text="worldImportDialog.errors" style="white-space:pre-wrap;font-size:12px")
data-tables(v-if="worldImportDialog.visible" v-bind="worldImportTable" v-loading="worldImportDialog.loading" style="margin-top:10px")
- el-table-column(label="Image" width="70" prop="thumbnailImageUrl")
+ el-table-column(:label="$t('table.import.image')" width="70" prop="thumbnailImageUrl")
template(v-once #default="scope")
el-popover(placement="right" height="500px" trigger="hover")
img.friends-list-avatar(slot="reference" v-lazy="scope.row.thumbnailImageUrl")
img.friends-list-avatar(v-lazy="scope.row.imageUrl" style="height:500px;cursor:pointer" @click="downloadAndSaveImage(scope.row.imageUrl)")
- el-table-column(label="Name" prop="name")
+ el-table-column(:label="$t('table.import.name')" prop="name")
template(v-once #default="scope")
span.x-link(v-text="scope.row.name" @click="showWorldDialog(scope.row.id)")
- el-table-column(label="Author" width="120" prop="authorName")
+ el-table-column(:label="$t('table.import.author')" width="120" prop="authorName")
template(v-once #default="scope")
span.x-link(v-text="scope.row.authorName" @click="showUserDialog(scope.row.authorId)")
- el-table-column(label="Status" width="70" prop="releaseStatus")
+ el-table-column(:label="$t('table.import.status')" width="70" prop="releaseStatus")
template(v-once #default="scope")
span(v-text="scope.row.releaseStatus" v-if="scope.row.releaseStatus === 'public'" style="color:#67c23a")
span(v-text="scope.row.releaseStatus" v-else-if="scope.row.releaseStatus === 'private'" style="color:#f56c6c")
span(v-text="scope.row.releaseStatus" v-else)
- el-table-column(label="Action" width="90" align="right")
+ el-table-column(:label="$t('table.import.action')" width="90" align="right")
template(v-once #default="scope")
el-button(type="text" icon="el-icon-close" size="mini" @click="deleteItemWorldImport(scope.row)")
//- dialog: export avatar list
- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="avatarExportDialogRef" :visible.sync="avatarExportDialogVisible" title="Avatar Favorites Export" width="650px")
+ el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="avatarExportDialogRef" :visible.sync="avatarExportDialogVisible" :title="$t('dialog.avatar_export.header')" width="650px")
el-dropdown(@click.native.stop trigger="click" size="small")
el-button(size="mini")
span(v-if="avatarExportFavoriteGroup") {{ avatarExportFavoriteGroup.displayName }} ({{ avatarExportFavoriteGroup.count }}/{{ avatarExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
@@ -3508,53 +3508,53 @@ html
el-input(type="textarea" v-if="avatarExportDialogVisible" v-model="avatarExportContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="$event.target.tagName === 'TEXTAREA' && $event.target.select()")
//- dialog: Avatar import dialog
- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="avatarImportDialog" :visible.sync="avatarImportDialog.visible" title="Avatar Favorites Import" width="650px")
+ el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="avatarImportDialog" :visible.sync="avatarImportDialog.visible" :title="$t('dialog.avatar_import.header')" width="650px")
div(style="font-size:12px")
- | Enter a list of avatar IDs
+ | {{ $t('dialog.avatar_import.description') }}
el-input(type="textarea" v-model="avatarImportDialog.input" size="mini" rows="10" resize="none" style="margin-top:15px")
- el-button(size="small" @click="processAvatarImportList" :disabled="!avatarImportDialog.input") Process List
- span(v-if="avatarImportDialog.progress" style="margin-top:10px") #[i.el-icon-loading(style="margin-right:5px")] Progress: {{ avatarImportDialog.progress }}/{{ avatarImportDialog.progressTotal }}
+ el-button(size="small" @click="processAvatarImportList" :disabled="!avatarImportDialog.input") {{ $t('dialog.avatar_import.process_list') }}
+ span(v-if="avatarImportDialog.progress" style="margin-top:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.avatar_import.process_progress') }} {{ avatarImportDialog.progress }}/{{ avatarImportDialog.progressTotal }}
br
el-dropdown(@click.native.stop trigger="click" size="small")
el-button(size="mini")
span(v-if="avatarImportDialog.avatarImportFavoriteGroup") {{ avatarImportDialog.avatarImportFavoriteGroup.displayName }} ({{ avatarImportDialog.avatarImportFavoriteGroup.count }}/{{ avatarImportDialog.avatarImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
- span(v-else) Select Group #[i.el-icon-arrow-down.el-icon--right]
+ span(v-else) {{ $t('dialog.avatar_import.select_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
template(v-for="groupAPI in API.favoriteAvatarGroups" :key="groupAPI.name")
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectAvatarImportGroup(groupAPI)" :disabled="groupAPI.count >= groupAPI.capacity") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
- el-button(size="small" @click="importAvatarImportTable" style="margin:5px" :disabled="avatarImportTable.data.length === 0 || !avatarImportDialog.avatarImportFavoriteGroup") Import Avatars
- el-button(v-if="avatarImportDialog.loading" size="small" @click="cancelAvatarImport" style="margin-top:10px") Cancel
+ el-button(size="small" @click="importAvatarImportTable" style="margin:5px" :disabled="avatarImportTable.data.length === 0 || !avatarImportDialog.avatarImportFavoriteGroup") {{ $t('dialog.avatar_import.import') }}
+ el-button(v-if="avatarImportDialog.loading" size="small" @click="cancelAvatarImport" style="margin-top:10px") {{ $t('dialog.avatar_import.cancel') }}
span(v-if="avatarImportDialog.avatarImportFavoriteGroup") {{ avatarImportTable.data.length }} / {{ avatarImportDialog.avatarImportFavoriteGroup.capacity - avatarImportDialog.avatarImportFavoriteGroup.count }}
- span(v-if="avatarImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] Import Progress: {{ avatarImportDialog.importProgress }}/{{ avatarImportDialog.importProgressTotal }}
+ span(v-if="avatarImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.avatar_import.import_progress') }} {{ avatarImportDialog.importProgress }}/{{ avatarImportDialog.importProgressTotal }}
br
- el-button(size="small" @click="clearAvatarImportTable") Clear Table
+ el-button(size="small" @click="clearAvatarImportTable") {{ $t('dialog.avatar_import.clear_table') }}
template(v-if="avatarImportDialog.errors")
- el-button(size="small" @click="avatarImportDialog.errors = ''" style="margin-left:5px") Clear Errors
- h2(style="font-weight:bold;margin:0") Errors:
+ el-button(size="small" @click="avatarImportDialog.errors = ''" style="margin-left:5px") {{ $t('dialog.avatar_import.clear_errors') }}
+ h2(style="font-weight:bold;margin:0") {{ $t('dialog.avatar_import.errors') }}
pre(v-text="avatarImportDialog.errors" style="white-space:pre-wrap;font-size:12px")
data-tables(v-if="avatarImportDialog.visible" v-bind="avatarImportTable" v-loading="avatarImportDialog.loading" style="margin-top:10px")
- el-table-column(label="Image" width="70" prop="thumbnailImageUrl")
+ el-table-column(:label="$t('table.import.image')" width="70" prop="thumbnailImageUrl")
template(v-once #default="scope")
el-popover(placement="right" height="500px" trigger="hover")
img.friends-list-avatar(slot="reference" v-lazy="scope.row.thumbnailImageUrl")
img.friends-list-avatar(v-lazy="scope.row.imageUrl" style="height:500px;cursor:pointer" @click="downloadAndSaveImage(scope.row.imageUrl)")
- el-table-column(label="Name" prop="name")
+ el-table-column(:label="$t('table.import.name')" prop="name")
template(v-once #default="scope")
span.x-link(v-text="scope.row.name" @click="showAvatarDialog(scope.row.id)")
- el-table-column(label="Author" width="120" prop="authorName")
+ el-table-column(:label="$t('table.import.author')" width="120" prop="authorName")
template(v-once #default="scope")
span.x-link(v-text="scope.row.authorName" @click="showUserDialog(scope.row.authorId)")
- el-table-column(label="Status" width="70" prop="releaseStatus")
+ el-table-column(:label="$t('table.import.status')" width="70" prop="releaseStatus")
template(v-once #default="scope")
span(v-text="scope.row.releaseStatus" v-if="scope.row.releaseStatus === 'public'" style="color:#67c23a")
span(v-text="scope.row.releaseStatus" v-else-if="scope.row.releaseStatus === 'private'" style="color:#f56c6c")
span(v-text="scope.row.releaseStatus" v-else)
- el-table-column(label="Action" width="90" align="right")
+ el-table-column(:label="$t('table.import.action')" width="90" align="right")
template(v-once #default="scope")
el-button(type="text" icon="el-icon-close" size="mini" @click="deleteItemAvatarImport(scope.row)")
//- dialog: export friend list
- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="friendExportDialogRef" :visible.sync="friendExportDialogVisible" title="Friend Favorites Export" width="650px")
+ el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="friendExportDialogRef" :visible.sync="friendExportDialogVisible" :title="$t('dialog.friend_export.header')" width="650px")
el-dropdown(@click.native.stop trigger="click" size="small")
el-button(size="mini")
span(v-if="friendExportFavoriteGroup") {{ friendExportFavoriteGroup.displayName }} ({{ friendExportFavoriteGroup.count }}/{{ friendExportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
@@ -3567,75 +3567,75 @@ html
el-input(type="textarea" v-if="friendExportDialogVisible" v-model="friendExportContent" size="mini" rows="15" resize="none" readonly style="margin-top:15px" @click.native="$event.target.tagName === 'TEXTAREA' && $event.target.select()")
//- dialog: Friend import dialog
- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="friendImportDialog" :visible.sync="friendImportDialog.visible" title="Friend Favorites Import" width="650px")
+ el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="friendImportDialog" :visible.sync="friendImportDialog.visible" :title="$t('dialog.friend_import.header')" width="650px")
div(style="font-size:12px")
- | Enter a list of user IDs
+ | {{ $t('dialog.friend_import.description') }}
el-input(type="textarea" v-model="friendImportDialog.input" size="mini" rows="10" resize="none" style="margin-top:15px")
- el-button(size="small" @click="processFriendImportList" :disabled="!friendImportDialog.input") Process List
- span(v-if="friendImportDialog.progress" style="margin-top:10px") #[i.el-icon-loading(style="margin-right:5px")] Progress: {{ friendImportDialog.progress }}/{{ friendImportDialog.progressTotal }}
+ el-button(size="small" @click="processFriendImportList" :disabled="!friendImportDialog.input") {{ $t('dialog.friend_import.process_list') }}
+ span(v-if="friendImportDialog.progress" style="margin-top:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.friend_import.process_progress') }} {{ friendImportDialog.progress }}/{{ friendImportDialog.progressTotal }}
br
el-dropdown(@click.native.stop trigger="click" size="small")
el-button(size="mini")
span(v-if="friendImportDialog.friendImportFavoriteGroup") {{ friendImportDialog.friendImportFavoriteGroup.displayName }} ({{ friendImportDialog.friendImportFavoriteGroup.count }}/{{ friendImportDialog.friendImportFavoriteGroup.capacity }}) #[i.el-icon-arrow-down.el-icon--right]
- span(v-else) Select Group #[i.el-icon-arrow-down.el-icon--right]
+ span(v-else) {{ $t('dialog.friend_import.select_group_placeholder') }} #[i.el-icon-arrow-down.el-icon--right]
el-dropdown-menu(#default="dropdown")
template(v-for="groupAPI in API.favoriteFriendGroups" :key="groupAPI.name")
el-dropdown-item(style="display:block;margin:10px 0" @click.native="selectFriendImportGroup(groupAPI)" :disabled="groupAPI.count >= groupAPI.capacity") {{ groupAPI.displayName }} ({{ groupAPI.count }}/{{ groupAPI.capacity }})
- el-button(size="small" @click="importFriendImportTable" style="margin:5px" :disabled="friendImportTable.data.length === 0 || !friendImportDialog.friendImportFavoriteGroup") Import Friends
- el-button(v-if="friendImportDialog.loading" size="small" @click="cancelFriendImport" style="margin-top:10px") Cancel
+ el-button(size="small" @click="importFriendImportTable" style="margin:5px" :disabled="friendImportTable.data.length === 0 || !friendImportDialog.friendImportFavoriteGroup") {{ $t('dialog.friend_import.import') }}
+ el-button(v-if="friendImportDialog.loading" size="small" @click="cancelFriendImport" style="margin-top:10px") {{ $t('dialog.friend_import.cancel') }}
span(v-if="friendImportDialog.friendImportFavoriteGroup") {{ friendImportTable.data.length }} / {{ friendImportDialog.friendImportFavoriteGroup.capacity - friendImportDialog.friendImportFavoriteGroup.count }}
- span(v-if="friendImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] Import Progress: {{ friendImportDialog.importProgress }}/{{ friendImportDialog.importProgressTotal }}
+ span(v-if="friendImportDialog.importProgress" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.friend_import.import_progress') }} {{ friendImportDialog.importProgress }}/{{ friendImportDialog.importProgressTotal }}
br
- el-button(size="small" @click="clearFriendImportTable") Clear Table
+ el-button(size="small" @click="clearFriendImportTable") {{ $t('dialog.friend_import.clear_table') }}
template(v-if="friendImportDialog.errors")
- el-button(size="small" @click="friendImportDialog.errors = ''" style="margin-left:5px") Clear Errors
- h2(style="font-weight:bold;margin:0") Errors:
+ el-button(size="small" @click="friendImportDialog.errors = ''" style="margin-left:5px") {{ $t('dialog.friend_import.clear_errors') }}
+ h2(style="font-weight:bold;margin:0") {{ $t('dialog.friend_import.errors') }}
pre(v-text="friendImportDialog.errors" style="white-space:pre-wrap;font-size:12px")
data-tables(v-if="friendImportDialog.visible" v-bind="friendImportTable" v-loading="friendImportDialog.loading" style="margin-top:10px")
- el-table-column(label="Image" width="70" prop="currentAvatarThumbnailImageUrl")
+ el-table-column(:label="$t('table.import.image')" width="70" prop="currentAvatarThumbnailImageUrl")
template(v-once #default="scope")
el-popover(placement="right" height="500px" trigger="hover")
img.friends-list-avatar(slot="reference" v-lazy="userImage(scope.row)")
img.friends-list-avatar(v-lazy="userImageFull(scope.row)" style="height:500px;cursor:pointer" @click="downloadAndSaveImage(userImageFull(scope.row))")
- el-table-column(label="Name" prop="displayName")
+ el-table-column(:label="$t('table.import.name')" prop="displayName")
template(v-once #default="scope")
span.x-link(v-text="scope.row.displayName" @click="showUserDialog(scope.row.id)")
- el-table-column(label="Action" width="90" align="right")
+ el-table-column(:label="$t('table.import.action')" width="90" align="right")
template(v-once #default="scope")
el-button(type="text" icon="el-icon-close" size="mini" @click="deleteItemFriendImport(scope.row)")
//- dialog: Note export dialog
- el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="noteExportDialog" :visible.sync="noteExportDialog.visible" title="Note Export" width="1000px")
+ el-dialog.x-dialog(:before-close="beforeDialogClose" @mousedown.native="dialogMouseDown" @mouseup.native="dialogMouseUp" ref="noteExportDialog" :visible.sync="noteExportDialog.visible" :title="$t('dialog.note_export.header')" width="1000px")
div(style="font-size:12px")
- | This process will export all of your VRCX memos and import them into VRChat notes. #[br]
- | Be warned of the following limitations: #[br]
- | - API endpoint has a rate limit that requires a large delay between requests. #[br]
- | - Character limit of 256 per note. #[br]
- | - Swear words filter (no fun allowed). #[br]
- | - No new lines (they will replaced with a space). #[br]
- | - This will overwrite any existing VRChat notes for these users. #[br]
- | - Any edits made here wont affect VRCX memos but will affect VRChat notes once exported. #[br]
- el-button(size="small" @click="updateNoteExportDialog" :disabled="noteExportDialog.loading" style="margin-top:10px") Refresh
- el-button(size="small" @click="exportNoteExport" :disabled="noteExportDialog.loading" style="margin-top:10px") Export
- el-button(v-if="noteExportDialog.loading" size="small" @click="cancelNoteExport" style="margin-top:10px") Cancel
- span(v-if="noteExportDialog.loading" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] Progress: {{ noteExportDialog.progress }}/{{ noteExportDialog.progressTotal }}
+ | {{ $t('dialog.note_export.description1') }} #[br]
+ | {{ $t('dialog.note_export.description2') }} #[br]
+ | {{ $t('dialog.note_export.description3') }} #[br]
+ | {{ $t('dialog.note_export.description4') }} #[br]
+ | {{ $t('dialog.note_export.description5') }} #[br]
+ | {{ $t('dialog.note_export.description6') }} #[br]
+ | {{ $t('dialog.note_export.description7') }} #[br]
+ | {{ $t('dialog.note_export.description8') }} #[br]
+ el-button(size="small" @click="updateNoteExportDialog" :disabled="noteExportDialog.loading" style="margin-top:10px") {{ $t('dialog.note_export.refresh') }}
+ el-button(size="small" @click="exportNoteExport" :disabled="noteExportDialog.loading" style="margin-top:10px") {{ $t('dialog.note_export.export') }}
+ el-button(v-if="noteExportDialog.loading" size="small" @click="cancelNoteExport" style="margin-top:10px") {{ $t('dialog.note_export.cancel') }}
+ span(v-if="noteExportDialog.loading" style="margin:10px") #[i.el-icon-loading(style="margin-right:5px")] {{ $t('dialog.note_export.progress') }} {{ noteExportDialog.progress }}/{{ noteExportDialog.progressTotal }}
template(v-if="noteExportDialog.errors")
- el-button(size="small" @click="noteExportDialog.errors = ''") Clear Errors
- h2(style="font-weight:bold;margin:0") Errors:
+ el-button(size="small" @click="noteExportDialog.errors = ''") {{ $t('dialog.note_export.clear_errors') }}
+ h2(style="font-weight:bold;margin:0") {{ $t('dialog.note_export.errors') }}
pre(v-text="noteExportDialog.errors" style="white-space:pre-wrap;font-size:12px")
data-tables(v-if="noteExportDialog.visible" v-bind="noteExportTable" v-loading="noteExportDialog.loading" style="margin-top:10px")
- el-table-column(label="Image" width="70" prop="currentAvatarThumbnailImageUrl")
+ el-table-column(:label="$t('table.import.image')" width="70" prop="currentAvatarThumbnailImageUrl")
template(v-once #default="scope")
el-popover(placement="right" height="500px" trigger="hover")
img.friends-list-avatar(slot="reference" v-lazy="userImage(scope.row.ref)")
img.friends-list-avatar(v-lazy="userImageFull(scope.row.ref)" style="height:500px;cursor:pointer" @click="downloadAndSaveImage(userImageFull(scope.row.ref))")
- el-table-column(label="Name" width="170" prop="name")
+ el-table-column(:label="$t('table.import.name')" width="170" prop="name")
template(v-once #default="scope")
span.x-link(v-text="scope.row.name" @click="showUserDialog(scope.row.id)")
- el-table-column(label="Note" prop="memo")
+ el-table-column(:label="$t('table.import.note')" prop="memo")
template(v-once #default="scope")
el-input(v-model="scope.row.memo" type="textarea" maxlength="256" show-word-limit :rows="2" :autosize="{ minRows: 1, maxRows: 10 }" size="mini" resize="none")
- el-table-column(label="Skip Export" width="90" align="right")
+ el-table-column(:label="$t('table.import.skip_export')" width="90" align="right")
template(v-once #default="scope")
el-button(type="text" icon="el-icon-close" size="mini" @click="removeFromNoteExportTable(scope.row)")
diff --git a/html/src/localization/strings/en.json b/html/src/localization/strings/en.json
index 36b7f713..733207b6 100644
--- a/html/src/localization/strings/en.json
+++ b/html/src/localization/strings/en.json
@@ -38,6 +38,19 @@
"filter_placeholder": "Filter",
"search_placeholder": "Search"
},
+ "player_list": {
+ "capacity": "Capacoty",
+ "last_updated": "Last Updated",
+ "created_at": "Created At",
+ "photon": {
+ "current": "Current",
+ "previous": "Previous",
+ "search_placeholder": "Search",
+ "filter_placeholder": "Filter",
+ "chatbox_blacklist": "Chatbox Blacklist",
+ "status_tooltip": "VRCX Companion Status"
+ }
+ },
"search": {
"search_placeholder": "Search",
"clear_results_tooltip": "Clear Search Results",
@@ -114,7 +127,8 @@
"search_placeholder": "Search",
"filter_placeholder": "Filter",
"refresh_tooltip": "Refresh",
- "clear_tooltip": "Clear Results"
+ "clear_tooltip": "Clear Results",
+ "cancel_tooltip": "Cancel"
},
"profile": {
"profile": {
@@ -616,6 +630,11 @@
"fallback": "Fallback",
"cache": "Cache"
},
+ "labels": {
+ "public": "(Public)",
+ "private": "(Private)",
+ "own": "(Own)"
+ },
"actions": {
"delete_cache_tooltip": "Delete avatar from cache",
"favorite_tooltip": "Add to favorites",
@@ -805,6 +824,72 @@
"discord_names": {
"header": "Discord Names",
"description": "Click load missing entries in the Friends List tab to search entire friends list"
+ },
+ "world_export": {
+ "header": "World Favorites Export"
+ },
+ "world_import": {
+ "header": "World Favorites Import",
+ "description": "Enter a list of world IDs",
+ "process_list": "Process List",
+ "process_progress": "Progress:",
+ "select_vrchat_group_placeholder": "Select Group",
+ "select_local_group_placeholder": "Select Group",
+ "import": "Import Worlds",
+ "cancel": "Cancel",
+ "import_progress": "Import Progress:",
+ "clear_table": "Clear Table",
+ "errors": "Errors:",
+ "clear_errors": "Clear Errors"
+ },
+ "avatar_export": {
+ "header": "Avatar Favorites Export"
+ },
+ "avatar_import": {
+ "header": "Avatar Favorites Import",
+ "description": "Enter a list of avatar IDs",
+ "process_list": "Process List",
+ "process_progress": "Progress:",
+ "select_group_placeholder": "Select Group",
+ "import": "Import Avatars",
+ "cancel": "Cancel",
+ "import_progress": "Import Progress:",
+ "clear_table": "Clear Table",
+ "errors": "Errors:",
+ "clear_errors": "Clear Errors"
+ },
+ "friend_export": {
+ "header": "Friend Favorites Export"
+ },
+ "friend_import": {
+ "header": "Friend Favorites Import",
+ "description": "Enter a list of user IDs",
+ "process_list": "Process List",
+ "process_progress": "Progress:",
+ "select_group_placeholder": "Select Group",
+ "import": "Import Friends",
+ "cancel": "Cancel",
+ "import_progress": "Import Progress:",
+ "clear_table": "Clear Table",
+ "errors": "Errors:",
+ "clear_errors": "Clear Errors"
+ },
+ "note_export": {
+ "header": "Note Export",
+ "description1": "This process will export all of your VRCX memos and import them into VRChat notes.",
+ "description2": "Be warned of the following limitations:",
+ "description3": "- API endpoint has a rate limit that requires a large delay between requests.",
+ "description4": "- Character limit of 256 per note.",
+ "description5": "- Swear words filter (no fun allowed).",
+ "description6": "- No new lines (they will replaced with a space).",
+ "description7": "- This will overwrite any existing VRChat notes for these users.",
+ "description8": "- Any edits made here wont affect VRCX memos but will affect VRChat notes once exported.",
+ "refresh": "Refresh",
+ "export": "Export",
+ "cancel": "Cancel",
+ "progress": "Progress:",
+ "errors": "Errors:",
+ "clear_errors": "Clear Errors"
}
},
"table": {
@@ -830,7 +915,11 @@
"status": "Status",
"rank": "Rank",
"language": "Language",
- "bioLink": "Bio Links"
+ "bioLink": "Bio Links",
+ "date": "Date",
+ "user": "User",
+ "type": "Type",
+ "detail": "Detail"
},
"friendLog": {
"date": "Date",
@@ -872,6 +961,15 @@
"social_status": {
"no": "No.",
"status": "Status"
+ },
+ "import": {
+ "image": "Image",
+ "name": "Name",
+ "author": "Author",
+ "status": "Status",
+ "note": "Note",
+ "skip_export": "Skip Export",
+ "action": "Action"
}
}
-}
\ No newline at end of file
+}
diff --git a/html/src/localization/strings/zh_TW.json b/html/src/localization/strings/zh_TW.json
index c4a03213..a8e25007 100644
--- a/html/src/localization/strings/zh_TW.json
+++ b/html/src/localization/strings/zh_TW.json
@@ -38,6 +38,16 @@
"filter_placeholder": "篩選遊戲紀錄",
"search_placeholder": "搜尋遊戲紀錄"
},
+ "player_list": {
+ "photon": {
+ "current": "目前",
+ "previous": "上一個",
+ "search_placeholder": "搜尋",
+ "filter_placeholder": "篩選",
+ "chatbox_blacklist": "聊天框黑名單",
+ "status_tooltip": "VRCX Companion 狀態"
+ }
+ },
"search": {
"search_placeholder": "搜尋",
"clear_results_tooltip": "清除搜尋結果",
@@ -411,7 +421,7 @@
"filter_everyone": "所有人",
"message_timeout": "訊息時長"
},
- "event_hud": {
+ "timeout_hud": {
"header": "玩家愈時 HUD",
"enable": "啟用",
"enable_tooltip": "需要啟用 SteamVR 疊層選項",
@@ -467,7 +477,7 @@
"invite_to_group": "邀情到群組",
"manage_gallery_icon": "管理相簿 / 圖示",
"accept_friend_request": "接受好友邀請",
- "deny_friend_request": "回絕好友邀請",
+ "decline_friend_request": "回絕好友邀請",
"cancel_friend_request": "取消好友邀請",
"send_friend_request": "傳送好友邀請",
"show_avatar_author": "顯示角色作者",
@@ -611,13 +621,17 @@
}
},
"avatar": {
- "header": "角色",
"tags": {
"public": "公開",
"private": "私人",
"fallback": "備用",
"cache": "快取"
},
+ "labels": {
+ "public": "(公開)",
+ "private": "(私人)",
+ "own": "(自有)"
+ },
"actions": {
"delete_cache_tooltip": "從快取中刪除角色",
"favorite_tooltip": "添加到我的收藏",
@@ -807,6 +821,72 @@
"discord_names": {
"header": "Discord 名稱",
"description": "點擊好友列表中的「讀取缺失的項目」來搜尋整個好友列表"
+ },
+ "world_export": {
+ "header": "世界收藏匯出"
+ },
+ "world_import": {
+ "header": "世界收藏匯入",
+ "description": "輸入世界 ID 列表",
+ "process_list": "讀取列表",
+ "process_progress": "進度:",
+ "select_vrchat_group_placeholder": "選擇 VRChat 群組",
+ "select_local_group_placeholder": "選擇本地群組",
+ "import": "匯入世界",
+ "cancel": "取消",
+ "import_progress": "匯入進度:",
+ "clear_table": "清除表格",
+ "errors": "錯誤:",
+ "clear_errors": "清除錯誤"
+ },
+ "avatar_export": {
+ "header": "角色收藏匯出"
+ },
+ "avatar_import": {
+ "header": "角色收藏匯入",
+ "description": "輸入角色 ID 列表",
+ "process_list": "讀取列表",
+ "process_progress": "進度:",
+ "select_group_placeholder": "選擇群組",
+ "import": "匯入角色",
+ "cancel": "取消",
+ "import_progress": "匯入進度:",
+ "clear_table": "清除表格",
+ "errors": "錯誤:",
+ "clear_errors": "清除錯誤"
+ },
+ "friend_export": {
+ "header": "好友收藏匯出"
+ },
+ "friend_import": {
+ "header": "好友收藏匯入",
+ "description": "輸入玩家 ID 列表",
+ "process_list": "讀取列表",
+ "process_progress": "進度:",
+ "select_group_placeholder": "選擇群組",
+ "import": "匯入好友",
+ "cancel": "取消",
+ "import_progress": "匯入進度:",
+ "clear_table": "清除表格",
+ "errors": "錯誤:",
+ "clear_errors": "清除錯誤"
+ },
+ "note_export": {
+ "header": "備註匯出",
+ "description1": "這個過程將匯出你所有的 VRCX 備忘錄並將它們匯入到 VRChat 備註中。",
+ "description2": "請注意以下限制:",
+ "description3": "- API 接口有速率限制,每個請求之間會有很大的延遲。",
+ "description4": "- 每個備註的字數限制為 256 個字元。",
+ "description5": "- 髒話過濾器(沒有樂趣)。",
+ "description6": "- 不能換行(將會被替換成空格)。",
+ "description7": "- 這將會覆蓋這些玩家現有的任何 VRChat 備註。",
+ "description8": "- 在這裡所做的任何編輯都不會影響 VRCX 備忘錄,但會在匯出後會影響 VRChat 備註。",
+ "refresh": "重新整理",
+ "export": "匯出",
+ "cancel": "取消",
+ "progress": "進度:",
+ "errors": "錯誤:",
+ "clear_errors": "清除錯誤"
}
},
"table": {
@@ -832,7 +912,11 @@
"status": "狀態",
"rank": "階級",
"language": "語言",
- "bioLink": "社交連結"
+ "bioLink": "社交連結",
+ "user": "玩家",
+ "type": "種類",
+ "detail": "詳細",
+ "date": "時間"
},
"friendLog": {
"date": "時間",
@@ -874,6 +958,15 @@
"social_status": {
"no": "No.",
"status": "狀蓋"
+ },
+ "import": {
+ "image": "圖片",
+ "name": "名稱",
+ "author": "作者",
+ "status": "狀態",
+ "note": "備註",
+ "skip_export": "跳過匯出",
+ "action": "動作"
}
}
-}
\ No newline at end of file
+}