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 +}