diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2018-11-09 03:44:35 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-11-09 03:44:35 +0900 |
| commit | 25a69ec1b69cb7f380949ef9cf1c3599eaa4face (patch) | |
| tree | 6f10016d32f94140d3953446c4b1fdb474e216e8 /src/client/app/mobile | |
| parent | Update CircleCI configuration (#3163) (diff) | |
| download | misskey-25a69ec1b69cb7f380949ef9cf1c3599eaa4face.tar.gz misskey-25a69ec1b69cb7f380949ef9cf1c3599eaa4face.tar.bz2 misskey-25a69ec1b69cb7f380949ef9cf1c3599eaa4face.zip | |
Refactoring of i18n (#3165)
Refactoring of i18n
Diffstat (limited to 'src/client/app/mobile')
46 files changed, 364 insertions, 276 deletions
diff --git a/src/client/app/mobile/views/components/drive-file-chooser.vue b/src/client/app/mobile/views/components/drive-file-chooser.vue index c1e53c83d2..92919c73c0 100644 --- a/src/client/app/mobile/views/components/drive-file-chooser.vue +++ b/src/client/app/mobile/views/components/drive-file-chooser.vue @@ -2,7 +2,7 @@ <div class="cdxzvcfawjxdyxsekbxbfgtplebnoneb"> <div class="body"> <header> - <h1>%i18n:@select-file%<span class="count" v-if="files.length > 0">({{ files.length }})</span></h1> + <h1>{{ $t('select-file') }}<span class="count" v-if="files.length > 0">({{ files.length }})</span></h1> <button class="close" @click="cancel"><fa icon="times"/></button> <button v-if="multiple" class="ok" @click="ok"><fa icon="check"/></button> </header> @@ -18,7 +18,10 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; + export default Vue.extend({ + i18n: i18n('mobile/views/components/drive-file-chooser.vue'), props: ['multiple'], data() { return { diff --git a/src/client/app/mobile/views/components/drive-folder-chooser.vue b/src/client/app/mobile/views/components/drive-folder-chooser.vue index da312841dd..4d08679624 100644 --- a/src/client/app/mobile/views/components/drive-folder-chooser.vue +++ b/src/client/app/mobile/views/components/drive-folder-chooser.vue @@ -2,7 +2,7 @@ <div class="mk-drive-folder-chooser"> <div class="body"> <header> - <h1>%i18n:@select-folder%</h1> + <h1>{{ $t('select-folder') }}</h1> <button class="close" @click="cancel"><fa icon="times"/></button> <button class="ok" @click="ok"><fa icon="check"/></button> </header> @@ -15,7 +15,9 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/components/drive-folder-chooser.vue'), methods: { cancel() { this.$emit('canceled'); diff --git a/src/client/app/mobile/views/components/drive.file-detail.vue b/src/client/app/mobile/views/components/drive.file-detail.vue index 11c0d33a5b..cda907fcd1 100644 --- a/src/client/app/mobile/views/components/drive.file-detail.vue +++ b/src/client/app/mobile/views/components/drive.file-detail.vue @@ -31,24 +31,24 @@ <span class="created-at" @click="showCreatedAt"><fa :icon="['far', 'clock']"/><mk-time :time="file.createdAt"/></span> <template v-if="file.isSensitive"> <span class="separator"></span> - <span class="nsfw"><fa icon="eye-slash"/> %i18n:@nsfw%</span> + <span class="nsfw"><fa icon="eye-slash"/> {{ $t('nsfw') }}</span> </template> </div> </div> <div class="menu"> <div> - <ui-button link :href="`${file.url}?download`" :download="file.name"><fa icon="download"/> %i18n:@download%</ui-button> - <ui-button @click="rename"><fa icon="pencil-alt"/> %i18n:@rename%</ui-button> - <ui-button @click="move"><fa :icon="['far', 'folder-open']"/> %i18n:@move%</ui-button> - <ui-button @click="toggleSensitive" v-if="file.isSensitive"><fa :icon="['far', 'eye']"/> %i18n:@unmark-as-sensitive%</ui-button> - <ui-button @click="toggleSensitive" v-else><fa :icon="['far', 'eye-slash']"/> %i18n:@mark-as-sensitive%</ui-button> - <ui-button @click="del"><fa :icon="['far', 'trash-alt']"/> %i18n:@delete%</ui-button> + <ui-button link :href="`${file.url}?download`" :download="file.name"><fa icon="download"/> {{ $t('download') }}</ui-button> + <ui-button @click="rename"><fa icon="pencil-alt"/> {{ $t('rename') }}</ui-button> + <ui-button @click="move"><fa :icon="['far', 'folder-open']"/> {{ $t('move') }}</ui-button> + <ui-button @click="toggleSensitive" v-if="file.isSensitive"><fa :icon="['far', 'eye']"/> {{ $t('unmark-as-sensitive') }}</ui-button> + <ui-button @click="toggleSensitive" v-else><fa :icon="['far', 'eye-slash']"/> {{ $t('mark-as-sensitive') }}</ui-button> + <ui-button @click="del"><fa :icon="['far', 'trash-alt']"/> {{ $t('delete') }}</ui-button> </div> </div> <div class="hash"> <div> <p> - <fa icon="hashtag"/>%i18n:@hash% + <fa icon="hashtag"/>{{ $t('hash') }} </p> <code>{{ file.md5 }}</code> </div> @@ -58,9 +58,11 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import { gcd } from '../../../../../prelude/math'; export default Vue.extend({ + i18n: i18n('mobile/views/components/drive.file-detail.vue'), props: ['file'], data() { @@ -88,7 +90,7 @@ export default Vue.extend({ methods: { rename() { - const name = window.prompt('%i18n:@rename%', this.file.name); + const name = window.prompt(this.$t('rename'), this.file.name); if (name == null || name == '' || name == this.file.name) return; (this as any).api('drive/files/update', { fileId: this.file.id, diff --git a/src/client/app/mobile/views/components/drive.file.vue b/src/client/app/mobile/views/components/drive.file.vue index 3ad208f12b..6be3dc342f 100644 --- a/src/client/app/mobile/views/components/drive.file.vue +++ b/src/client/app/mobile/views/components/drive.file.vue @@ -15,7 +15,7 @@ <span class="created-at"><fa :icon="['far', 'clock']"/><mk-time :time="file.createdAt"/></span> <template v-if="file.isSensitive"> <span class="separator"></span> - <span class="nsfw"><fa icon="eye-slash"/> %i18n:@nsfw%</span> + <span class="nsfw"><fa icon="eye-slash"/> {{ $t('nsfw') }}</span> </template> </footer> </div> @@ -25,7 +25,9 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/components/drive.file.vue'), props: ['file'], data() { return { diff --git a/src/client/app/mobile/views/components/drive.vue b/src/client/app/mobile/views/components/drive.vue index dd9870a930..b61af722cf 100644 --- a/src/client/app/mobile/views/components/drive.vue +++ b/src/client/app/mobile/views/components/drive.vue @@ -1,7 +1,7 @@ <template> <div class="kmmwchoexgckptowjmjgfsygeltxfeqs"> <nav ref="nav"> - <a @click.prevent="goRoot()" href="/i/drive"><fa icon="cloud"/>%i18n:common.drive%</a> + <a @click.prevent="goRoot()" href="/i/drive"><fa icon="cloud"/>{{ $t('@.drive') }}</a> <template v-for="folder in hierarchyFolders"> <span :key="folder.id + '>'"><fa icon="angle-right"/></span> <a :key="folder.id" @click.prevent="cd(folder)" :href="`/i/drive/folder/${folder.id}`">{{ folder.name }}</a> @@ -18,26 +18,26 @@ <mk-uploader ref="uploader"/> <div class="browser" :class="{ fetching }" v-if="file == null"> <div class="info" v-if="info"> - <p v-if="folder == null">{{ (info.usage / info.capacity * 100).toFixed(1) }}% %i18n:@used%</p> + <p v-if="folder == null">{{ (info.usage / info.capacity * 100).toFixed(1) }}% {{ $t('used') }}</p> <p v-if="folder != null && (folder.foldersCount > 0 || folder.filesCount > 0)"> - <template v-if="folder.foldersCount > 0">{{ folder.foldersCount }} %i18n:@folder-count%</template> - <template v-if="folder.foldersCount > 0 && folder.filesCount > 0">%i18n:@count-separator%</template> - <template v-if="folder.filesCount > 0">{{ folder.filesCount }} %i18n:@file-count%</template> + <template v-if="folder.foldersCount > 0">{{ folder.foldersCount }} {{ $t('folder-count') }}</template> + <template v-if="folder.foldersCount > 0 && folder.filesCount > 0">{{ $t('count-separator') }}</template> + <template v-if="folder.filesCount > 0">{{ folder.filesCount }} {{ $t('file-count') }}</template> </p> </div> <div class="folders" v-if="folders.length > 0"> <x-folder class="folder" v-for="folder in folders" :key="folder.id" :folder="folder"/> - <p v-if="moreFolders">%i18n:@load-more%</p> + <p v-if="moreFolders">{{ $t('@.load-more') }}</p> </div> <div class="files" v-if="files.length > 0"> <x-file class="file" v-for="file in files" :key="file.id" :file="file"/> <button class="more" v-if="moreFiles" @click="fetchMoreFiles"> - {{ fetchingMoreFiles ? '%i18n:common.loading%' : '%i18n:@load-more%' }} + {{ fetchingMoreFiles ? this.$t('@.loading') : this.$t('@.load-more') }} </button> </div> <div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching"> - <p v-if="folder == null">%i18n:@nothing-in-drive%</p> - <p v-if="folder != null">%i18n:@folder-is-empty%</p> + <p v-if="folder == null">{{ $t('nothing-in-drive') }}</p> + <p v-if="folder != null">{{ $t('folder-is-empty') }}</p> </div> </div> <div class="fetching" v-if="fetching && file == null && files.length == 0 && folders.length == 0"> @@ -53,11 +53,13 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import XFolder from './drive.folder.vue'; import XFile from './drive.file.vue'; import XFileDetail from './drive.file-detail.vue'; export default Vue.extend({ + i18n: i18n('mobile/views/components/drive.vue'), components: { XFolder, XFile, @@ -378,7 +380,7 @@ export default Vue.extend({ }, openContextMenu() { - const fn = window.prompt('%i18n:@prompt%'); + const fn = window.prompt(this.$t('prompt')); if (fn == null || fn == '') return; switch (fn) { case '1': @@ -397,7 +399,7 @@ export default Vue.extend({ this.moveFolder(); break; case '6': - alert('%i18n:@deletion-alert%'); + alert(this.$t('deletion-alert')); break; } }, @@ -407,7 +409,7 @@ export default Vue.extend({ }, createFolder() { - const name = window.prompt('%i18n:@folder-name%'); + const name = window.prompt(this.$t('folder-name')); if (name == null || name == '') return; (this as any).api('drive/folders/create', { name: name, @@ -419,10 +421,10 @@ export default Vue.extend({ renameFolder() { if (this.folder == null) { - alert('%i18n:@root-rename-alert%'); + alert(this.$t('root-rename-alert')); return; } - const name = window.prompt('%i18n:@folder-name%', this.folder.name); + const name = window.prompt(this.$t('folder-name'), this.folder.name); if (name == null || name == '') return; (this as any).api('drive/folders/update', { name: name, @@ -434,7 +436,7 @@ export default Vue.extend({ moveFolder() { if (this.folder == null) { - alert('%i18n:@root-move-alert%'); + alert(this.$t('root-move-alert')); return; } (this as any).apis.chooseDriveFolder().then(folder => { @@ -448,13 +450,13 @@ export default Vue.extend({ }, urlUpload() { - const url = window.prompt('%i18n:@url-prompt%'); + const url = window.prompt(this.$t('url-prompt')); if (url == null || url == '') return; (this as any).api('drive/files/upload_from_url', { url: url, folderId: this.folder ? this.folder.id : undefined }); - alert('%i18n:@uploading%'); + alert(this.$t('uploading')); }, onChangeLocalFile() { diff --git a/src/client/app/mobile/views/components/follow-button.vue b/src/client/app/mobile/views/components/follow-button.vue index d319ed5572..a13e2fab95 100644 --- a/src/client/app/mobile/views/components/follow-button.vue +++ b/src/client/app/mobile/views/components/follow-button.vue @@ -5,11 +5,11 @@ :disabled="wait" > <template v-if="!wait"> - <template v-if="u.hasPendingFollowRequestFromYou && u.isLocked"><fa icon="hourglass-half"/> %i18n:@request-pending%</template> - <template v-else-if="u.hasPendingFollowRequestFromYou && !u.isLocked"><fa icon="hourglass-start"/> %i18n:@follow-processing%</template> - <template v-else-if="u.isFollowing"><fa icon="minus"/> %i18n:@following%</template> - <template v-else-if="!u.isFollowing && u.isLocked"><fa icon="plus"/> %i18n:@follow-request%</template> - <template v-else-if="!u.isFollowing && !u.isLocked"><fa icon="plus"/> %i18n:@follow%</template> + <template v-if="u.hasPendingFollowRequestFromYou && u.isLocked"><fa icon="hourglass-half"/> {{ $t('request-pending') }}</template> + <template v-else-if="u.hasPendingFollowRequestFromYou && !u.isLocked"><fa icon="hourglass-start"/> {{ $t('follow-processing') }}</template> + <template v-else-if="u.isFollowing"><fa icon="minus"/> {{ $t('following') }}</template> + <template v-else-if="!u.isFollowing && u.isLocked"><fa icon="plus"/> {{ $t('follow-request') }}</template> + <template v-else-if="!u.isFollowing && !u.isLocked"><fa icon="plus"/> {{ $t('follow') }}</template> </template> <template v-else><fa icon="spinner .pulse" fixed-width/></template> </button> @@ -17,8 +17,10 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/components/follow-button.vue'), props: { user: { type: Object, diff --git a/src/client/app/mobile/views/components/friends-maker.vue b/src/client/app/mobile/views/components/friends-maker.vue index f27e7dd28f..d1b9690d68 100644 --- a/src/client/app/mobile/views/components/friends-maker.vue +++ b/src/client/app/mobile/views/components/friends-maker.vue @@ -1,19 +1,21 @@ <template> <div class="mk-friends-maker"> - <p class="title">%i18n:@title%:</p> + <p class="title">{{ $t('title') }}:</p> <div class="users" v-if="!fetching && users.length > 0"> <mk-user-card v-for="user in users" :key="user.id" :user="user"/> </div> - <p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p> - <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:@fetching%<mk-ellipsis/></p> - <a class="refresh" @click="refresh">%i18n:@refresh%</a> - <button class="close" @click="close" title="%i18n:@close%"><fa icon="times"/></button> + <p class="empty" v-if="!fetching && users.length == 0">{{ $t('empty') }}</p> + <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('fetching') }}<mk-ellipsis/></p> + <a class="refresh" @click="refresh">{{ $t('refresh') }}</a> + <button class="close" @click="close" :title="$t('title')"><fa icon="times"/></button> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/components/friends-maker.vue'), data() { return { users: [], diff --git a/src/client/app/mobile/views/components/media-image.vue b/src/client/app/mobile/views/components/media-image.vue index c555d6a611..ddbe4cb401 100644 --- a/src/client/app/mobile/views/components/media-image.vue +++ b/src/client/app/mobile/views/components/media-image.vue @@ -1,8 +1,8 @@ <template> <div class="qjewsnkgzzxlxtzncydssfbgjibiehcy" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false"> <div> - <b><fa icon="exclamation-triangle"/> %i18n:@sensitive%</b> - <span>%i18n:@click-to-show%</span> + <b><fa icon="exclamation-triangle"/> {{ $t('sensitive') }}</b> + <span>{{ $t('click-to-show') }}</span> </div> </div> <a class="gqnyydlzavusgskkfvwvjiattxdzsqlf" v-else :href="image.url" target="_blank" :style="style" :title="image.name" @click.prevent="onClick"></a> @@ -10,9 +10,11 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import ImageViewer from '../../../common/views/components/image-viewer.vue'; export default Vue.extend({ + i18n: i18n('mobile/views/components/media-image.vue'), props: { image: { type: Object, diff --git a/src/client/app/mobile/views/components/media-video.vue b/src/client/app/mobile/views/components/media-video.vue index 5e1c8a2500..8cd9971b77 100644 --- a/src/client/app/mobile/views/components/media-video.vue +++ b/src/client/app/mobile/views/components/media-video.vue @@ -1,8 +1,8 @@ <template> <div class="icozogqfvdetwohsdglrbswgrejoxbdj" v-if="video.isSensitive && hide" @click="hide = false"> <div> - <b><fa icon="exclamation-triangle"/> %i18n:@sensitive%</b> - <span>%i18n:@click-to-show%</span> + <b><fa icon="exclamation-triangle"/> {{ $t('sensitive') }}</b> + <span>{{ $t('click-to-show') }}</span> </div> </div> <a class="kkjnbbplepmiyuadieoenjgutgcmtsvu" v-else @@ -17,8 +17,10 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/components/media-video.vue'), props: { video: { type: Object, diff --git a/src/client/app/mobile/views/components/note-detail.vue b/src/client/app/mobile/views/components/note-detail.vue index 66fc91e784..2931f5c36c 100644 --- a/src/client/app/mobile/views/components/note-detail.vue +++ b/src/client/app/mobile/views/components/note-detail.vue @@ -20,9 +20,9 @@ <mk-avatar class="avatar" :user="note.user"/> <fa icon="retweet"/> <router-link class="name" :href="note.user | userPage">{{ note.user | userName }}</router-link> - <span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span> + <span>{{ this.$t('reposted-by').substr(0, this.$t('reposted-by').indexOf('{')) }}</span> <a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a> - <span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span> + <span>{{ this.$t('reposted-by').substr(this.$t('reposted-by').indexOf('}') + 1) }}</span> <mk-time :time="note.createdAt"/> </p> </div> @@ -41,8 +41,8 @@ </p> <div class="content" v-show="p.cw == null || showContent"> <div class="text"> - <span v-if="p.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> - <span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> + <span v-if="p.isHidden" style="opacity: 0.5">({{ $t('private') }})</span> + <span v-if="p.deletedAt" style="opacity: 0.5">({{ $t('deleted') }})</span> <misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i" :customEmojis="p.emojis"/> </div> <div class="files" v-if="p.files.length > 0"> @@ -50,7 +50,7 @@ </div> <mk-poll v-if="p.poll" :note="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/> - <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> %i18n:@location%</a> + <a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a> <div class="map" v-if="p.geo" ref="map"></div> <div class="renote" v-if="p.renote"> <mk-note-preview :note="p.renote"/> @@ -62,7 +62,7 @@ </router-link> <footer> <mk-reactions-viewer :note="p"/> - <button @click="reply" title="%i18n:@reply%"> + <button @click="reply" :title="$t('title')"> <template v-if="p.reply"><fa icon="reply-all"/></template> <template v-else><fa icon="reply"/></template> <p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p> @@ -70,7 +70,7 @@ <button @click="renote" title="Renote"> <fa icon="retweet"/><p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p> </button> - <button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@reaction%"> + <button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" :title="$t('title')"> <fa icon="plus"/><p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p> </button> <button @click="menu" ref="menuButton"> @@ -86,6 +86,7 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import parse from '../../../../../mfm/parse'; import MkNoteMenu from '../../../common/views/components/note-menu.vue'; @@ -95,6 +96,7 @@ import { sum } from '../../../../../prelude/array'; import noteSubscriber from '../../../common/scripts/note-subscriber'; export default Vue.extend({ + i18n: i18n('mobile/views/components/note-detail.vue'), components: { XSub }, diff --git a/src/client/app/mobile/views/components/note.vue b/src/client/app/mobile/views/components/note.vue index 44b717145b..08628da30b 100644 --- a/src/client/app/mobile/views/components/note.vue +++ b/src/client/app/mobile/views/components/note.vue @@ -12,9 +12,9 @@ <div class="renote" v-if="isRenote"> <mk-avatar class="avatar" :user="note.user"/> <fa icon="retweet"/> - <span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span> + <span>{{ this.$t('reposted-by').substr(0, this.$t('reposted-by').indexOf('{')) }}</span> <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> - <span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span> + <span>{{ this.$t('reposted-by').substr(this.$t('reposted-by').indexOf('}') + 1) }}</span> <mk-time :time="note.createdAt"/> </div> <article> @@ -28,7 +28,7 @@ </p> <div class="content" v-show="appearNote.cw == null || showContent"> <div class="text"> - <span v-if="appearNote.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> + <span v-if="appearNote.isHidden" style="opacity: 0.5">({{ $t('private') }})</span> <a class="reply" v-if="appearNote.reply"><fa icon="reply"/></a> <misskey-flavored-markdown v-if="appearNote.text" :text="appearNote.text" :i="$store.state.i" :class="$style.text" :customEmojis="appearNote.emojis"/> <a class="rp" v-if="appearNote.renote != null">RN:</a> @@ -38,7 +38,7 @@ </div> <mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> - <a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> %i18n:@location%</a> + <a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a> <div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div> </div> <span class="app" v-if="appearNote.app">via <b>{{ appearNote.app.name }}</b></span> @@ -67,12 +67,14 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import XSub from './note.sub.vue'; import noteMixin from '../../../common/scripts/note-mixin'; import noteSubscriber from '../../../common/scripts/note-subscriber'; export default Vue.extend({ + i18n: i18n('mobile/views/components/note.vue'), components: { XSub }, diff --git a/src/client/app/mobile/views/components/notes.vue b/src/client/app/mobile/views/components/notes.vue index fb09276891..e363d219a6 100644 --- a/src/client/app/mobile/views/components/notes.vue +++ b/src/client/app/mobile/views/components/notes.vue @@ -10,10 +10,7 @@ </template> </div> - <div v-if="!fetching && requestInitPromise != null"> - <p>%i18n:@failed%</p> - <button @click="resolveInitPromise">%i18n:@retry%</button> - </div> + <mk-error v-if="!fetching && requestInitPromise != null" @retry="resolveInitPromise"/> <!-- トランジションを有効にするとなぜかメモリリークする --> <component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="transition" tag="div"> @@ -28,7 +25,7 @@ <footer v-if="more"> <button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> - <template v-if="!moreFetching">%i18n:@load-more%</template> + <template v-if="!moreFetching">{{ $t('@.load-more') }}</template> <template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template> </button> </footer> @@ -37,10 +34,12 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; const displayLimit = 30; export default Vue.extend({ + i18n: i18n(), props: { more: { type: Function, @@ -64,7 +63,7 @@ export default Vue.extend({ const date = new Date(note.createdAt).getDate(); const month = new Date(note.createdAt).getMonth() + 1; note._date = date; - note._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString()); + note._datetext = this.$t('@.month-and-day').replace('{month}', month.toString()).replace('{day}', date.toString()); return note; }); } diff --git a/src/client/app/mobile/views/components/notifications.vue b/src/client/app/mobile/views/components/notifications.vue index 3669e84ea2..3a95e0d158 100644 --- a/src/client/app/mobile/views/components/notifications.vue +++ b/src/client/app/mobile/views/components/notifications.vue @@ -19,17 +19,19 @@ <button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template> - {{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }} + {{ fetchingMoreNotifications ? $t('@.loading') : $t('@.load-more') }} </button> - <p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p> + <p class="empty" v-if="notifications.length == 0 && !fetching">{{ $t('empty') }}</p> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/components/notifications.vue'), data() { return { fetching: true, @@ -46,7 +48,7 @@ export default Vue.extend({ const date = new Date(notification.createdAt).getDate(); const month = new Date(notification.createdAt).getMonth() + 1; notification._date = date; - notification._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString()); + notification._datetext = this.$t('@.month-and-day').replace('{month}', month.toString()).replace('{day}', date.toString()); return notification; }); } diff --git a/src/client/app/mobile/views/components/post-form.vue b/src/client/app/mobile/views/components/post-form.vue index 4a50ed982d..8715046acb 100644 --- a/src/client/app/mobile/views/components/post-form.vue +++ b/src/client/app/mobile/views/components/post-form.vue @@ -14,9 +14,9 @@ <mk-note-preview class="preview" v-if="renote" :note="renote"/> <div v-if="visibility == 'specified'" class="visibleUsers"> <span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span> - <a @click="addVisibleUser">+%i18n:@add-visible-user%</a> + <a @click="addVisibleUser">+{{ $t('add-visible-user') }}</a> </div> - <input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%"> + <input v-show="useCw" v-model="cw" :placeholder="$t('placeholder')"> <textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder" v-autocomplete="'text'"></textarea> <div class="attaches" v-show="files.length != 0"> <x-draggable class="files" :list="files" :options="{ animation: 150 }"> @@ -53,6 +53,7 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import insertTextAtCursor from 'insert-text-at-cursor'; import * as XDraggable from 'vuedraggable'; import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue'; @@ -65,6 +66,7 @@ import parseAcct from '../../../../../misc/acct/parse'; import { toASCII } from 'punycode'; export default Vue.extend({ + i18n: i18n('mobile/views/components/post-form.vue'), components: { XDraggable, MkVisibilityChooser @@ -124,28 +126,28 @@ export default Vue.extend({ placeholder(): string { const xs = [ - '%i18n:common.note-placeholders.a%', - '%i18n:common.note-placeholders.b%', - '%i18n:common.note-placeholders.c%', - '%i18n:common.note-placeholders.d%', - '%i18n:common.note-placeholders.e%', - '%i18n:common.note-placeholders.f%' + this.$t('@.note-placeholders.a'), + this.$t('@.note-placeholders.b'), + this.$t('@.note-placeholders.c'), + this.$t('@.note-placeholders.d'), + this.$t('@.note-placeholders.e'), + this.$t('@.note-placeholders.f') ]; const x = xs[Math.floor(Math.random() * xs.length)]; return this.renote - ? '%i18n:@quote-placeholder%' + ? this.$t('quote-placeholder') : this.reply - ? '%i18n:@reply-placeholder%' + ? this.$t('reply-placeholder') : x; }, submitText(): string { return this.renote - ? '%i18n:@renote%' + ? this.$t('renote') : this.reply - ? '%i18n:@reply%' - : '%i18n:@submit%'; + ? this.$t('reply') + : this.$t('submit'); }, canPost(): boolean { @@ -249,7 +251,7 @@ export default Vue.extend({ setGeo() { if (navigator.geolocation == null) { - alert('%i18n:@location-alert%'); + alert(this.$t('location-alert')); return; } @@ -278,7 +280,7 @@ export default Vue.extend({ addVisibleUser() { (this as any).apis.input({ - title: '%i18n:@username-prompt%' + title: this.$t('username-prompt') }).then(acct => { if (acct.startsWith('@')) acct = acct.substr(1); (this as any).api('users/show', parseAcct(acct)).then(user => { diff --git a/src/client/app/mobile/views/components/sub-note-content.vue b/src/client/app/mobile/views/components/sub-note-content.vue index 6a478130ce..f4c86f19d2 100644 --- a/src/client/app/mobile/views/components/sub-note-content.vue +++ b/src/client/app/mobile/views/components/sub-note-content.vue @@ -1,18 +1,18 @@ <template> <div class="mk-sub-note-content"> <div class="body"> - <span v-if="note.isHidden" style="opacity: 0.5">(%i18n:@private%)</span> - <span v-if="note.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span> + <span v-if="note.isHidden" style="opacity: 0.5">({{ $t('private') }})</span> + <span v-if="note.deletedAt" style="opacity: 0.5">({{ $t('deleted') }})</span> <a class="reply" v-if="note.replyId"><fa icon="reply"/></a> - <misskey-flavored-markdown v-if="note.text" :text="note.text" :i="$store.state.i" :customEmojis="note.emojis"/> + <misskey-flavored-markdown v-if="note.text" :text="note.text" :i="$store.state.i" :custom-emojis="note.emojis"/> <a class="rp" v-if="note.renoteId">RN: ...</a> </div> <details v-if="note.files.length > 0"> - <summary>({{ '%i18n:@media-count%'.replace('{}', note.files.length) }})</summary> + <summary>({{ $t('media-count').replace('{}', note.files.length) }})</summary> <mk-media-list :media-list="note.files"/> </details> <details v-if="note.poll"> - <summary>%i18n:@poll%</summary> + <summary>{{ $t('poll') }}</summary> <mk-poll :note="note"/> </details> </div> @@ -20,7 +20,9 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/components/sub-note-content.vue'), props: ['note'] }); </script> diff --git a/src/client/app/mobile/views/components/ui.header.vue b/src/client/app/mobile/views/components/ui.header.vue index e360e1c88a..9dbc1f9d02 100644 --- a/src/client/app/mobile/views/components/ui.header.vue +++ b/src/client/app/mobile/views/components/ui.header.vue @@ -1,7 +1,6 @@ <template> <div class="header" ref="root"> - <p class="warn" v-if="env != 'production'">%i18n:common.do-not-use-in-production%</p> - <mk-special-message/> + <p class="warn" v-if="env != 'production'">{{ $t('@.do-not-use-in-production') }}</p> <div class="main" ref="main"> <div class="backdrop"></div> <div class="content" ref="mainContainer"> @@ -19,10 +18,12 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import * as anime from 'animejs'; import { env } from '../../../config'; export default Vue.extend({ + i18n: i18n(), props: ['func'], data() { diff --git a/src/client/app/mobile/views/components/ui.nav.vue b/src/client/app/mobile/views/components/ui.nav.vue index d7f0d58ae2..5a582c7aca 100644 --- a/src/client/app/mobile/views/components/ui.nav.vue +++ b/src/client/app/mobile/views/components/ui.nav.vue @@ -15,23 +15,23 @@ </router-link> <div class="links"> <ul> - <li><router-link to="/" :data-active="$route.name == 'index'"><i><fa icon="home"/></i>%i18n:@timeline%<i><fa icon="angle-right"/></i></router-link></li> - <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'"><i><fa :icon="['far', 'bell']"/></i>%i18n:@notifications%<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li> - <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']"/></i>%i18n:@messaging%<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li> - <li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']"/></i>%i18n:@follow-requests%<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li> - <li><router-link to="/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad"/></i>%i18n:@game%<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li> + <li><router-link to="/" :data-active="$route.name == 'index'"><i><fa icon="home"/></i>{{ $t('timeline') }}<i><fa icon="angle-right"/></i></router-link></li> + <li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'"><i><fa :icon="['far', 'bell']"/></i>{{ $t('notifications') }}<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li> + <li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']"/></i>{{ $t('@.messaging') }}<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li> + <li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']"/></i>{{ $t('follow-requests') }}<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li> + <li><router-link to="/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad"/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li> </ul> <ul> - <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'"><i><fa :icon="['far', 'calendar-alt']"/></i>%i18n:@widgets%<i><fa icon="angle-right"/></i></router-link></li> - <li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'"><i><fa icon="star"/></i>%i18n:@favorites%<i><fa icon="angle-right"/></i></router-link></li> - <li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'"><i><fa icon="list"/></i>%i18n:@user-lists%<i><fa icon="angle-right"/></i></router-link></li> - <li><router-link to="/i/drive" :data-active="$route.name == 'drive'"><i><fa icon="cloud"/></i>%i18n:common.drive%<i><fa icon="angle-right"/></i></router-link></li> + <li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'"><i><fa :icon="['far', 'calendar-alt']"/></i>{{ $t('widgets') }}<i><fa icon="angle-right"/></i></router-link></li> + <li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'"><i><fa icon="star"/></i>{{ $t('favorites') }}<i><fa icon="angle-right"/></i></router-link></li> + <li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'"><i><fa icon="list"/></i>{{ $t('user-lists') }}<i><fa icon="angle-right"/></i></router-link></li> + <li><router-link to="/i/drive" :data-active="$route.name == 'drive'"><i><fa icon="cloud"/></i>{{ $t('@.drive') }}<i><fa icon="angle-right"/></i></router-link></li> </ul> <ul> - <li><a @click="search"><i><fa icon="search"/></i>%i18n:@search%<i><fa icon="angle-right"/></i></a></li> - <li><router-link to="/i/settings" :data-active="$route.name == 'settings'"><i><fa icon="cog"/></i>%i18n:@settings%<i><fa icon="angle-right"/></i></router-link></li> - <li v-if="$store.getters.isSignedIn && $store.state.i.isAdmin"><a href="/admin"><i><fa icon="terminal"/></i><span>%i18n:@admin%</span><i><fa icon="angle-right"/></i></a></li> - <li @click="dark"><p><template v-if="$store.state.device.darkmode"><i><fa icon="moon"/></i></template><template v-else><i><fa :icon="['far', 'moon']"/></i></template><span>%i18n:@darkmode%</span></p></li> + <li><a @click="search"><i><fa icon="search"/></i>{{ $t('search') }}<i><fa icon="angle-right"/></i></a></li> + <li><router-link to="/i/settings" :data-active="$route.name == 'settings'"><i><fa icon="cog"/></i>{{ $t('settings') }}<i><fa icon="angle-right"/></i></router-link></li> + <li v-if="$store.getters.isSignedIn && $store.state.i.isAdmin"><a href="/admin"><i><fa icon="terminal"/></i><span>{{ $t('admin') }}</span><i><fa icon="angle-right"/></i></a></li> + <li @click="dark"><p><template v-if="$store.state.device.darkmode"><i><fa icon="moon"/></i></template><template v-else><i><fa :icon="['far', 'moon']"/></i></template><span>{{ $t('darkmode') }}</span></p></li> </ul> </div> <div class="announcements" v-if="announcements && announcements.length > 0"> @@ -40,7 +40,7 @@ <div v-html="announcement.text"></div> </article> </div> - <a :href="aboutUrl"><p class="about">%i18n:@about%</p></a> + <a :href="aboutUrl"><p class="about">{{ $t('about') }}</p></a> </div> </transition> </div> @@ -48,9 +48,11 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import { lang } from '../../../config'; export default Vue.extend({ + i18n: i18n('mobile/views/components/ui.nav.vue'), props: ['isOpen'], data() { @@ -93,7 +95,7 @@ export default Vue.extend({ methods: { search() { - const query = window.prompt('%i18n:@search%'); + const query = window.prompt(this.$t('search')); if (query == null || query == '') return; this.$router.push(`/search?q=${encodeURIComponent(query)}`); }, diff --git a/src/client/app/mobile/views/components/user-timeline.vue b/src/client/app/mobile/views/components/user-timeline.vue index 55afda0eab..cfe1522666 100644 --- a/src/client/app/mobile/views/components/user-timeline.vue +++ b/src/client/app/mobile/views/components/user-timeline.vue @@ -3,7 +3,7 @@ <mk-notes ref="timeline" :more="existMore ? more : null"> <div slot="empty"> <fa :icon="['far', 'comments']"/> - {{ withMedia ? '%i18n:@no-notes-with-media%' : '%i18n:@no-notes%' }} + {{ withMedia ? this.$t('no-notes-with-media') : this.$t('no-notes') }} </div> </mk-notes> </div> @@ -11,10 +11,12 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; const fetchLimit = 10; export default Vue.extend({ + i18n: i18n('mobile/views/components/user-timeline.vue'), props: ['user', 'withMedia'], data() { diff --git a/src/client/app/mobile/views/components/users-list.vue b/src/client/app/mobile/views/components/users-list.vue index 29dd6abaab..a0f831c68b 100644 --- a/src/client/app/mobile/views/components/users-list.vue +++ b/src/client/app/mobile/views/components/users-list.vue @@ -1,26 +1,28 @@ <template> <div class="mk-users-list"> <nav> - <span :data-active="mode == 'all'" @click="mode = 'all'">%i18n:@all%<span>{{ count }}</span></span> - <span v-if="$store.getters.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">%i18n:@known%<span>{{ youKnowCount }}</span></span> + <span :data-active="mode == 'all'" @click="mode = 'all'">{{ $t('all') }}<span>{{ count }}</span></span> + <span v-if="$store.getters.isSignedIn && youKnowCount" :data-active="mode == 'iknow'" @click="mode = 'iknow'">{{ $t('known') }}<span>{{ youKnowCount }}</span></span> </nav> <div class="users" v-if="!fetching && users.length != 0"> <mk-user-preview v-for="u in users" :user="u" :key="u.id"/> </div> <button class="more" v-if="!fetching && next != null" @click="more" :disabled="moreFetching"> - <span v-if="!moreFetching">%i18n:@load-more%</span> - <span v-if="moreFetching">%i18n:common.loading%<mk-ellipsis/></span> + <span v-if="!moreFetching">{{ $t('@.load-more') }}</span> + <span v-if="moreFetching">{{ $t('@.loading') }}<mk-ellipsis/></span> </button> <p class="no" v-if="!fetching && users.length == 0"> <slot></slot> </p> - <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p> + <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/components/users-list.vue'), props: ['fetch', 'count', 'youKnowCount'], data() { return { diff --git a/src/client/app/mobile/views/pages/drive.vue b/src/client/app/mobile/views/pages/drive.vue index 4c1202f6b4..e9197bcfcf 100644 --- a/src/client/app/mobile/views/pages/drive.vue +++ b/src/client/app/mobile/views/pages/drive.vue @@ -3,7 +3,7 @@ <span slot="header"> <template v-if="folder"><span style="margin-right:4px;"><fa :icon="['far', 'folder-open']"/></span>{{ folder.name }}</template> <template v-if="file"><mk-file-type-icon data-icon :type="file.type" style="margin-right:4px;"/>{{ file.name }}</template> - <template v-if="!folder && !file"><span style="margin-right:4px;"><fa icon="cloud"/></span>%i18n:common.drive%</template> + <template v-if="!folder && !file"><span style="margin-right:4px;"><fa icon="cloud"/></span>{{ $t('@.drive') }}</template> </span> <template slot="func"><button @click="fn"><fa icon="ellipsis-h"/></button></template> <mk-drive @@ -24,9 +24,11 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; export default Vue.extend({ + i18n: i18n(), data() { return { Progress, diff --git a/src/client/app/mobile/views/pages/favorites.vue b/src/client/app/mobile/views/pages/favorites.vue index af159788b8..ff652ddf0b 100644 --- a/src/client/app/mobile/views/pages/favorites.vue +++ b/src/client/app/mobile/views/pages/favorites.vue @@ -1,21 +1,23 @@ <template> <mk-ui> - <span slot="header"><span style="margin-right:4px;"><fa icon="star"/></span>%i18n:@title%</span> + <span slot="header"><span style="margin-right:4px;"><fa icon="star"/></span>{{ $t('title') }}</span> <main> <template v-for="favorite in favorites"> <mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/> </template> - <a v-if="existMore" @click="more">%i18n:@more%</a> + <a v-if="existMore" @click="more">{{ $t('@.load-more') }}</a> </main> </mk-ui> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/favorites.vue'), data() { return { fetching: true, diff --git a/src/client/app/mobile/views/pages/followers.vue b/src/client/app/mobile/views/pages/followers.vue index 601f6670c1..b92c0088fb 100644 --- a/src/client/app/mobile/views/pages/followers.vue +++ b/src/client/app/mobile/views/pages/followers.vue @@ -1,8 +1,7 @@ <template> <mk-ui> <template slot="header" v-if="!fetching"> - <img :src="user.avatarUrl" alt=""> - {{ '%i18n:@followers-of%'.replace('{}', name) }} + <img :src="user.avatarUrl" alt="">{{ $t('followers-of', { name }) }} </template> <mk-users-list v-if="!fetching" @@ -18,11 +17,13 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; import parseAcct from '../../../../../misc/acct/parse'; import getUserName from '../../../../../misc/get-user-name'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/followers.vue'), data() { return { fetching: true, @@ -49,7 +50,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = `${'%i18n:@followers-of%'.replace('{}', this.name)} | ${(this as any).os.instanceName}`; + document.title = `${this.$t('followers-of').replace('{}', this.name)} | ${(this as any).os.instanceName}`; }); }, onLoaded() { diff --git a/src/client/app/mobile/views/pages/following.vue b/src/client/app/mobile/views/pages/following.vue index 0efac6110e..a4ec0ab6c7 100644 --- a/src/client/app/mobile/views/pages/following.vue +++ b/src/client/app/mobile/views/pages/following.vue @@ -1,8 +1,7 @@ <template> <mk-ui> <template slot="header" v-if="!fetching"> - <img :src="user.avatarUrl" alt=""> - {{ '%i18n:@following-of%'.replace('{}', name) }} + <img :src="user.avatarUrl" alt="">{{ $t('following-of', { name }) }} </template> <mk-users-list v-if="!fetching" @@ -18,10 +17,12 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; import parseAcct from '../../../../../misc/acct/parse'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/following.vue'), data() { return { fetching: true, @@ -48,7 +49,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = `${'%i18n:@followers-of%'.replace('{}', this.name)} | ${(this as any).os.instanceName}`; + document.title = `${this.$t('followers-of').replace('{}', this.name)} | ${(this as any).os.instanceName}`; }); }, onLoaded() { diff --git a/src/client/app/mobile/views/pages/games/reversi.vue b/src/client/app/mobile/views/pages/games/reversi.vue index d02bc191aa..8a5653fc6e 100644 --- a/src/client/app/mobile/views/pages/games/reversi.vue +++ b/src/client/app/mobile/views/pages/games/reversi.vue @@ -1,14 +1,16 @@ <template> <mk-ui> - <span slot="header"><span style="margin-right:4px;"><fa icon="gamepad"/></span>%i18n:@reversi%</span> + <span slot="header"><span style="margin-right:4px;"><fa icon="gamepad"/></span>{{ $t('reversi') }}</span> <x-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/> </mk-ui> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/games/reversi.vue'), components: { XReversi: () => import('../../../../common/views/components/games/reversi/reversi.vue') }, diff --git a/src/client/app/mobile/views/pages/home.vue b/src/client/app/mobile/views/pages/home.vue index 12c1c7f405..d197f1a44f 100644 --- a/src/client/app/mobile/views/pages/home.vue +++ b/src/client/app/mobile/views/pages/home.vue @@ -2,12 +2,12 @@ <mk-ui> <span slot="header" @click="showNav = true"> <span :class="$style.title"> - <span v-if="src == 'home'"><fa icon="home"/>%i18n:@home%</span> - <span v-if="src == 'local'"><fa :icon="['far', 'comments']"/>%i18n:@local%</span> - <span v-if="src == 'hybrid'"><fa icon="share-alt"/>%i18n:@hybrid%</span> - <span v-if="src == 'global'"><fa icon="globe"/>%i18n:@global%</span> - <span v-if="src == 'mentions'"><fa icon="at"/>%i18n:@mentions%</span> - <span v-if="src == 'messages'"><fa :icon="['far', 'envelope']"/>%i18n:@messages%</span> + <span v-if="src == 'home'"><fa icon="home"/>{{ $t('home') }}</span> + <span v-if="src == 'local'"><fa :icon="['far', 'comments']"/>{{ $t('local') }}</span> + <span v-if="src == 'hybrid'"><fa icon="share-alt"/>{{ $t('hybrid') }}</span> + <span v-if="src == 'global'"><fa icon="globe"/>{{ $t('global') }}</span> + <span v-if="src == 'mentions'"><fa icon="at"/>{{ $t('mentions') }}</span> + <span v-if="src == 'messages'"><fa :icon="['far', 'envelope']"/>{{ $t('messages') }}</span> <span v-if="src == 'list'"><fa icon="list"/>{{ list.title }}</span> <span v-if="src == 'tag'"><fa icon="hashtag"/>{{ tagTl.title }}</span> </span> @@ -28,13 +28,13 @@ <div class="pointer"></div> <div class="body"> <div> - <span :data-active="src == 'home'" @click="src = 'home'"><fa icon="home"/> %i18n:@home%</span> - <span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline"><fa :icon="['far', 'comments']"/> %i18n:@local%</span> - <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline"><fa icon="share-alt"/> %i18n:@hybrid%</span> - <span :data-active="src == 'global'" @click="src = 'global'"><fa icon="globe"/> %i18n:@global%</span> + <span :data-active="src == 'home'" @click="src = 'home'"><fa icon="home"/> {{ $t('home') }}</span> + <span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline"><fa :icon="['far', 'comments']"/> {{ $t('local') }}</span> + <span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline"><fa icon="share-alt"/> {{ $t('hybrid') }}</span> + <span :data-active="src == 'global'" @click="src = 'global'"><fa icon="globe"/> {{ $t('global') }}</span> <div class="hr"></div> - <span :data-active="src == 'mentions'" @click="src = 'mentions'"><fa icon="at"/> %i18n:@mentions%<i class="badge" v-if="$store.state.i.hasUnreadMentions"><fa icon="circle"/></i></span> - <span :data-active="src == 'messages'" @click="src = 'messages'"><fa :icon="['far', 'envelope']"/> %i18n:@messages%<i class="badge" v-if="$store.state.i.hasUnreadSpecifiedNotes"><fa icon="circle"/></i></span> + <span :data-active="src == 'mentions'" @click="src = 'mentions'"><fa icon="at"/> {{ $t('mentions') }}<i class="badge" v-if="$store.state.i.hasUnreadMentions"><fa icon="circle"/></i></span> + <span :data-active="src == 'messages'" @click="src = 'messages'"><fa :icon="['far', 'envelope']"/> {{ $t('messages') }}<i class="badge" v-if="$store.state.i.hasUnreadSpecifiedNotes"><fa icon="circle"/></i></span> <template v-if="lists"> <div class="hr" v-if="lists.length > 0"></div> <span v-for="l in lists" :data-active="src == 'list' && list == l" @click="src = 'list'; list = l" :key="l.id"><fa icon="list"/> {{ l.title }}</span> @@ -61,10 +61,13 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; import XTl from './home.timeline.vue'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/home.vue'), + components: { XTl }, diff --git a/src/client/app/mobile/views/pages/messaging-room.vue b/src/client/app/mobile/views/pages/messaging-room.vue index 9974b5689a..64feba43a2 100644 --- a/src/client/app/mobile/views/pages/messaging-room.vue +++ b/src/client/app/mobile/views/pages/messaging-room.vue @@ -10,9 +10,11 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import parseAcct from '../../../../../misc/acct/parse'; export default Vue.extend({ + i18n: i18n(), data() { return { fetching: true, @@ -47,7 +49,7 @@ export default Vue.extend({ this.user = user; this.fetching = false; - document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`; + document.title = `${this.$t('@.messaging')}: ${Vue.filter('userName')(this.user)} | ${(this as any).os.instanceName}`; }); } } diff --git a/src/client/app/mobile/views/pages/messaging.vue b/src/client/app/mobile/views/pages/messaging.vue index 4131d9ac94..790d2a6254 100644 --- a/src/client/app/mobile/views/pages/messaging.vue +++ b/src/client/app/mobile/views/pages/messaging.vue @@ -1,17 +1,19 @@ <template> <mk-ui> - <span slot="header"><span style="margin-right:4px;"><fa :icon="['far', 'comments']"/></span>%i18n:@messaging%</span> + <span slot="header"><span style="margin-right:4px;"><fa :icon="['far', 'comments']"/></span>{{ $t('@.messaging') }}</span> <mk-messaging @navigate="navigate" :header-top="48"/> </mk-ui> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import getAcct from '../../../../../misc/acct/render'; export default Vue.extend({ + i18n: i18n(), mounted() { - document.title = `${(this as any).os.instanceName} %i18n:@messaging%`; + document.title = `${(this as any).os.instanceName} ${this.$t('@.messaging')}`; }, methods: { navigate(user) { diff --git a/src/client/app/mobile/views/pages/note.vue b/src/client/app/mobile/views/pages/note.vue index 4e95bcf2be..efe9c0c0ff 100644 --- a/src/client/app/mobile/views/pages/note.vue +++ b/src/client/app/mobile/views/pages/note.vue @@ -1,13 +1,13 @@ <template> <mk-ui> - <span slot="header"><span style="margin-right:4px;"><fa :icon="['far', 'sticky-note']"/></span>%i18n:@title%</span> + <span slot="header"><span style="margin-right:4px;"><fa :icon="['far', 'sticky-note']"/></span>{{ $t('title') }}</span> <main v-if="!fetching"> <div> <mk-note-detail :note="note"/> </div> <footer> - <router-link v-if="note.prev" :to="note.prev"><fa icon="angle-left"/> %i18n:@prev%</router-link> - <router-link v-if="note.next" :to="note.next">%i18n:@next% <fa icon="angle-right"/></router-link> + <router-link v-if="note.prev" :to="note.prev"><fa icon="angle-left"/> {{ $t('prev') }}</router-link> + <router-link v-if="note.next" :to="note.next">{{ $t('next') }} <fa icon="angle-right"/></router-link> </footer> </main> </mk-ui> @@ -15,9 +15,11 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/note.vue'), data() { return { fetching: true, diff --git a/src/client/app/mobile/views/pages/notifications.vue b/src/client/app/mobile/views/pages/notifications.vue index 54aa48a155..8fc61ad3cb 100644 --- a/src/client/app/mobile/views/pages/notifications.vue +++ b/src/client/app/mobile/views/pages/notifications.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header"><span style="margin-right:4px;"><fa :icon="['far', 'bell']"/></span>%i18n:@notifications%</span> + <span slot="header"><span style="margin-right:4px;"><fa :icon="['far', 'bell']"/></span>{{ $t('notifications') }}</span> <template slot="func"><button @click="fn"><fa icon="check"/></button></template> <main> @@ -11,17 +11,19 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/notifications.vue'), mounted() { - document.title = '%i18n:@notifications%'; + document.title = this.$t('notifications'); Progress.start(); }, methods: { fn() { - const ok = window.confirm('%i18n:@read-all%'); + const ok = window.confirm(this.$t('read-all')); if (!ok) return; (this as any).api('notifications/mark_all_as_read'); diff --git a/src/client/app/mobile/views/pages/received-follow-requests.vue b/src/client/app/mobile/views/pages/received-follow-requests.vue index 40e9c1cae2..08fe787921 100644 --- a/src/client/app/mobile/views/pages/received-follow-requests.vue +++ b/src/client/app/mobile/views/pages/received-follow-requests.vue @@ -1,12 +1,12 @@ <template> <mk-ui> - <span slot="header"><fa :icon="['far', 'envelope']"/>%i18n:@title%</span> + <span slot="header"><fa :icon="['far', 'envelope']"/>{{ $t('title') }}</span> <main> <div v-for="req in requests"> <router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link> <span> - <a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a> + <a @click="accept(req.follower)">{{ $t('accept') }}</a>|<a @click="reject(req.follower)">{{ $t('reject') }}</a> </span> </div> </main> @@ -15,9 +15,11 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/received-follow-requests.vue'), data() { return { fetching: true, @@ -25,7 +27,7 @@ export default Vue.extend({ }; }, mounted() { - document.title = '%i18n:@title%'; + document.title = this.$t('title'); Progress.start(); diff --git a/src/client/app/mobile/views/pages/search.vue b/src/client/app/mobile/views/pages/search.vue index 0f680ac571..13b0469933 100644 --- a/src/client/app/mobile/views/pages/search.vue +++ b/src/client/app/mobile/views/pages/search.vue @@ -3,7 +3,7 @@ <span slot="header"><fa icon="search"/> {{ q }}</span> <main> - <p :class="$style.empty" v-if="!fetching && empty"><fa icon="search"/> {{ '%i18n:not-found%'.split('{}')[0] }}{{ q }}{{ '%i18n:not-found%'.split('{}')[1] }}</p> + <p :class="$style.empty" v-if="!fetching && empty"><fa icon="search"/> {{ $t('not-found', { q }) }}</p> <mk-notes ref="timeline" :more="existMore ? more : null"/> </main> </mk-ui> @@ -11,11 +11,13 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; const limit = 20; export default Vue.extend({ + i18n: i18n('mobile/views/pages/search.vue'), data() { return { fetching: true, diff --git a/src/client/app/mobile/views/pages/selectdrive.vue b/src/client/app/mobile/views/pages/selectdrive.vue index 4083624200..633c83e40d 100644 --- a/src/client/app/mobile/views/pages/selectdrive.vue +++ b/src/client/app/mobile/views/pages/selectdrive.vue @@ -1,7 +1,7 @@ <template> <div class="mk-selectdrive"> <header> - <h1>%i18n:@select-file%<span class="count" v-if="files.length > 0">({{ files.length }})</span></h1> + <h1>{{ $t('select-file') }}<span class="count" v-if="files.length > 0">({{ files.length }})</span></h1> <button class="upload" @click="upload"><fa icon="upload"/></button> <button v-if="multiple" class="ok" @click="ok"><fa icon="check"/></button> </header> @@ -11,8 +11,10 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/selectdrive.vue'), data() { return { files: [] @@ -25,7 +27,7 @@ export default Vue.extend({ } }, mounted() { - document.title = '%i18n:@title%'; + document.title = this.$t('title'); }, methods: { onSelected(file) { diff --git a/src/client/app/mobile/views/pages/settings.vue b/src/client/app/mobile/views/pages/settings.vue index fa80188904..702e5879e9 100644 --- a/src/client/app/mobile/views/pages/settings.vue +++ b/src/client/app/mobile/views/pages/settings.vue @@ -1,84 +1,84 @@ <template> <mk-ui> - <span slot="header"><span style="margin-right:4px;"><fa icon="cog"/></span>%i18n:@settings%</span> + <span slot="header"><span style="margin-right:4px;"><fa icon="cog"/></span>{{ $t('settings') }}</span> <main> - <div class="signin-as" v-html="'%i18n:@signed-in-as%'.replace('{}', `<b>${name}</b>`)"></div> + <div class="signin-as" v-html="this.$t('signed-in-as').replace('{}', `<b>${name}</b>`)"></div> <div> <mk-profile-editor/> <ui-card> - <div slot="title"><fa icon="palette"/> %i18n:@theme%</div> + <div slot="title"><fa icon="palette"/> {{ $t('theme') }}</div> <section> <mk-theme/> </section> </ui-card> <ui-card> - <div slot="title"><fa icon="poll-h"/> %i18n:@design%</div> + <div slot="title"><fa icon="poll-h"/> {{ $t('design') }}</div> <section> - <ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch> - <ui-switch v-model="circleIcons">%i18n:@circle-icons%</ui-switch> - <ui-switch v-model="reduceMotion">%i18n:common.reduce-motion% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> - <ui-switch v-model="contrastedAcct">%i18n:@contrasted-acct%</ui-switch> - <ui-switch v-model="showFullAcct">%i18n:common.show-full-acct%</ui-switch> - <ui-switch v-model="useOsDefaultEmojis">%i18n:common.use-os-default-emojis%</ui-switch> - <ui-switch v-model="iLikeSushi">%i18n:common.i-like-sushi%</ui-switch> - <ui-switch v-model="disableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch> - <ui-switch v-model="alwaysShowNsfw">%i18n:common.always-show-nsfw% (%i18n:common.this-setting-is-this-device-only%)</ui-switch> + <ui-switch v-model="darkmode">{{ $t('dark-mode') }}</ui-switch> + <ui-switch v-model="circleIcons">{{ $t('circle-icons') }}</ui-switch> + <ui-switch v-model="reduceMotion">{{ $t('@.reduce-motion') }} ({{ $t('@.this-setting-is-this-device-only') }})</ui-switch> + <ui-switch v-model="contrastedAcct">{{ $t('contrasted-acct') }}</ui-switch> + <ui-switch v-model="showFullAcct">{{ $t('@.show-full-acct') }}</ui-switch> + <ui-switch v-model="useOsDefaultEmojis">{{ $t('@.use-os-default-emojis') }}</ui-switch> + <ui-switch v-model="iLikeSushi">{{ $t('@.i-like-sushi') }}</ui-switch> + <ui-switch v-model="disableAnimatedMfm">{{ $t('@.disable-animated-mfm') }}</ui-switch> + <ui-switch v-model="alwaysShowNsfw">{{ $t('@.always-show-nsfw') }} ({{ $t('@.this-setting-is-this-device-only') }})</ui-switch> </section> <section> - <ui-switch v-model="games_reversi_showBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch> - <ui-switch v-model="games_reversi_useContrastStones">%i18n:common.use-contrast-reversi-stones%</ui-switch> + <ui-switch v-model="games_reversi_showBoardLabels">{{ $t('@.show-reversi-board-labels') }}</ui-switch> + <ui-switch v-model="games_reversi_useContrastStones">{{ $t('@.use-contrast-reversi-stones') }}</ui-switch> </section> <section> - <header>%i18n:@timeline%</header> + <header>{{ $t('timeline') }}</header> <div> - <ui-switch v-model="showReplyTarget">%i18n:@show-reply-target%</ui-switch> - <ui-switch v-model="showMyRenotes">%i18n:@show-my-renotes%</ui-switch> - <ui-switch v-model="showRenotedMyNotes">%i18n:@show-renoted-my-notes%</ui-switch> - <ui-switch v-model="showLocalRenotes">%i18n:@show-local-renotes%</ui-switch> + <ui-switch v-model="showReplyTarget">{{ $t('show-reply-target') }}</ui-switch> + <ui-switch v-model="showMyRenotes">{{ $t('show-my-renotes') }}</ui-switch> + <ui-switch v-model="showRenotedMyNotes">{{ $t('show-renoted-my-notes') }}</ui-switch> + <ui-switch v-model="showLocalRenotes">{{ $t('show-local-renotes') }}</ui-switch> </div> </section> <section> - <header>%i18n:@post-style%</header> - <ui-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</ui-radio> - <ui-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</ui-radio> + <header>{{ $t('post-style') }}</header> + <ui-radio v-model="postStyle" value="standard">{{ $t('post-style-standard') }}</ui-radio> + <ui-radio v-model="postStyle" value="smart">{{ $t('post-style-smart') }}</ui-radio> </section> <section> - <header>%i18n:@notification-position%</header> - <ui-radio v-model="mobileNotificationPosition" value="bottom">%i18n:@notification-position-bottom%</ui-radio> - <ui-radio v-model="mobileNotificationPosition" value="top">%i18n:@notification-position-top%</ui-radio> + <header>{{ $t('notification-position') }}</header> + <ui-radio v-model="mobileNotificationPosition" value="bottom">{{ $t('notification-position-bottom') }}</ui-radio> + <ui-radio v-model="mobileNotificationPosition" value="top">{{ $t('notification-position-top') }}</ui-radio> </section> </ui-card> <ui-card> - <div slot="title"><fa icon="sliders-h"/> %i18n:@behavior%</div> + <div slot="title"><fa icon="sliders-h"/> {{ $t('behavior') }}</div> <section> - <ui-switch v-model="fetchOnScroll">%i18n:@fetch-on-scroll%</ui-switch> - <ui-switch v-model="disableViaMobile">%i18n:@disable-via-mobile%</ui-switch> - <ui-switch v-model="loadRawImages">%i18n:@load-raw-images%</ui-switch> - <ui-switch v-model="loadRemoteMedia">%i18n:@load-remote-media%</ui-switch> - <ui-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</ui-switch> + <ui-switch v-model="fetchOnScroll">{{ $t('fetch-on-scroll') }}</ui-switch> + <ui-switch v-model="disableViaMobile">{{ $t('disable-via-mobile') }}</ui-switch> + <ui-switch v-model="loadRawImages">{{ $t('load-raw-images') }}</ui-switch> + <ui-switch v-model="loadRemoteMedia">{{ $t('load-remote-media') }}</ui-switch> + <ui-switch v-model="lightmode">{{ $t('i-am-under-limited-internet') }}</ui-switch> </section> <section> - <header>%i18n:@note-visibility%</header> - <ui-switch v-model="rememberNoteVisibility">%i18n:@remember-note-visibility%</ui-switch> + <header>{{ $t('note-visibility') }}</header> + <ui-switch v-model="rememberNoteVisibility">{{ $t('remember-note-visibility') }}</ui-switch> <section> - <header>%i18n:@default-note-visibility%</header> + <header>{{ $t('default-note-visibility') }}</header> <ui-select v-model="defaultNoteVisibility"> - <option value="public">%i18n:common.note-visibility.public%</option> - <option value="home">%i18n:common.note-visibility.home%</option> - <option value="followers">%i18n:common.note-visibility.followers%</option> - <option value="specified">%i18n:common.note-visibility.specified%</option> - <option value="private">%i18n:common.note-visibility.private%</option> + <option value="public">{{ $t('@.note-visibility.public') }}</option> + <option value="home">{{ $t('@.note-visibility.home') }}</option> + <option value="followers">{{ $t('@.note-visibility.followers') }}</option> + <option value="specified">{{ $t('@.note-visibility.specified') }}</option> + <option value="private">{{ $t('@.note-visibility.private') }}</option> </ui-select> </section> </section> @@ -89,52 +89,52 @@ <mk-mute-and-block/> <ui-card> - <div slot="title"><fa icon="volume-up"/> %i18n:@sound%</div> + <div slot="title"><fa icon="volume-up"/> {{ $t('sound') }}</div> <section> - <ui-switch v-model="enableSounds">%i18n:@enable-sounds%</ui-switch> + <ui-switch v-model="enableSounds">{{ $t('enable-sounds') }}</ui-switch> </section> </ui-card> <ui-card> - <div slot="title"><fa icon="language"/> %i18n:@lang%</div> + <div slot="title"><fa icon="language"/> {{ $t('lang') }}</div> <section class="fit-top"> - <ui-select v-model="lang" placeholder="%i18n:@auto%"> - <optgroup label="%i18n:@recommended%"> - <option value="">%i18n:@auto%</option> + <ui-select v-model="lang" :placeholder="$t('placeholder')"> + <optgroup :label="$t('label')"> + <option value="">{{ $t('auto') }}</option> </optgroup> - <optgroup label="%i18n:@specify-language%"> + <optgroup :label="$t('label')"> <option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</option> </optgroup> </ui-select> - <span><fa icon="info-circle"/> %i18n:@lang-tip%</span> + <span><fa icon="info-circle"/> {{ $t('lang-tip') }}</span> </section> </ui-card> <ui-card> - <div slot="title"><fa :icon="['fab', 'twitter']"/> %i18n:@twitter%</div> + <div slot="title"><fa :icon="['fab', 'twitter']"/> {{ $t('twitter') }}</div> <section> <p class="account" v-if="$store.state.i.twitter"><a :href="`https://twitter.com/${$store.state.i.twitter.screenName}`" target="_blank">@{{ $store.state.i.twitter.screenName }}</a></p> <p> - <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a> + <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ $store.state.i.twitter ? this.$t('twitter-reconnect') : this.$t('twitter-connect') }}</a> <span v-if="$store.state.i.twitter"> or </span> - <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">%i18n:@twitter-disconnect%</a> + <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="$store.state.i.twitter">{{ $t('twitter-disconnect') }}</a> </p> </section> </ui-card> <ui-card> - <div slot="title"><fa :icon="['fab', 'github']"/> %i18n:@github%</div> + <div slot="title"><fa :icon="['fab', 'github']"/> {{ $t('github') }}</div> <section> <p class="account" v-if="$store.state.i.github"><a :href="`https://github.com/${$store.state.i.github.login}`" target="_blank">@{{ $store.state.i.github.login }}</a></p> <p> - <a :href="`${apiUrl}/connect/github`" target="_blank">{{ $store.state.i.github ? '%i18n:@github-reconnect%' : '%i18n:@github-connect%' }}</a> + <a :href="`${apiUrl}/connect/github`" target="_blank">{{ $store.state.i.github ? this.$t('github-reconnect') : this.$t('github-connect') }}</a> <span v-if="$store.state.i.github"> or </span> - <a :href="`${apiUrl}/disconnect/github`" target="_blank" v-if="$store.state.i.github">%i18n:@github-disconnect%</a> + <a :href="`${apiUrl}/disconnect/github`" target="_blank" v-if="$store.state.i.github">{{ $t('github-disconnect') }}</a> </p> </section> </ui-card> @@ -142,29 +142,29 @@ <mk-api-settings /> <ui-card> - <div slot="title"><fa icon="unlock-alt"/> %i18n:@password%</div> + <div slot="title"><fa icon="unlock-alt"/> {{ $t('password') }}</div> <section> <mk-password-settings/> </section> </ui-card> <ui-card> - <div slot="title"><fa icon="sync-alt"/> %i18n:@update%</div> + <div slot="title"><fa icon="sync-alt"/> {{ $t('update') }}</div> <section> - <div>%i18n:@version% <i>{{ version }}</i></div> + <div>{{ $t('version') }} <i>{{ version }}</i></div> <template v-if="latestVersion !== undefined"> - <div>%i18n:@latest-version% <i>{{ latestVersion ? latestVersion : version }}</i></div> + <div>{{ $t('latest-version') }} <i>{{ latestVersion ? latestVersion : version }}</i></div> </template> <ui-button @click="checkForUpdate" :disabled="checkingForUpdate"> - <template v-if="checkingForUpdate">%i18n:@update-checking%<mk-ellipsis/></template> - <template v-else>%i18n:@check-for-updates%</template> + <template v-if="checkingForUpdate">{{ $t('update-checking') }}<mk-ellipsis/></template> + <template v-else>{{ $t('check-for-updates') }}</template> </ui-button> </section> </ui-card> </div> - <div class="signout" @click="signout">%i18n:@signout%</div> + <div class="signout" @click="signout">{{ $t('signout') }}</div> <footer> <small>ver {{ version }} ({{ codename }})</small> @@ -175,10 +175,12 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import { apiUrl, clientVersion as version, codename, langs } from '../../../config'; import checkForUpdate from '../../../common/scripts/check-for-update'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/settings.vue'), data() { return { apiUrl, @@ -327,7 +329,7 @@ export default Vue.extend({ }, mounted() { - document.title = '%i18n:@settings%'; + document.title = this.$t('settings'); }, methods: { @@ -342,13 +344,13 @@ export default Vue.extend({ this.latestVersion = newer; if (newer == null) { (this as any).apis.dialog({ - title: '%i18n:@no-updates%', - text: '%i18n:@no-updates-desc%' + title: this.$t('no-updates'), + text: this.$t('no-updates-desc') }); } else { (this as any).apis.dialog({ - title: '%i18n:@update-available%', - text: '%i18n:@update-available-desc%' + title: this.$t('update-available'), + text: this.$t('update-available-desc') }); } }); diff --git a/src/client/app/mobile/views/pages/share.vue b/src/client/app/mobile/views/pages/share.vue index 246a8afa4d..83535b39c1 100644 --- a/src/client/app/mobile/views/pages/share.vue +++ b/src/client/app/mobile/views/pages/share.vue @@ -1,19 +1,21 @@ <template> <div class="azibmfpleajagva420swmu4c3r7ni7iw"> - <h1>{{ '%i18n:@share-with%'.replace('{}', name) }}</h1> + <h1>{{ $t('share-with', { name }) }}</h1> <div> <mk-signin v-if="!$store.getters.isSignedIn"/> <mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/> <p v-if="posted" class="posted"><fa icon="check"/></p> </div> - <ui-button class="close" v-if="posted" @click="close">%i18n:common.close%</ui-button> + <ui-button class="close" v-if="posted" @click="close">{{ $t('@.close') }}</ui-button> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/share.vue'), data() { return { name: null, diff --git a/src/client/app/mobile/views/pages/signup.vue b/src/client/app/mobile/views/pages/signup.vue index aac2ee431d..65b02e967d 100644 --- a/src/client/app/mobile/views/pages/signup.vue +++ b/src/client/app/mobile/views/pages/signup.vue @@ -1,13 +1,15 @@ <template> <div class="signup"> - <h1>%i18n:@lets-start%</h1> + <h1>{{ $t('lets-start') }}</h1> <mk-signup/> </div> </template> <script lang="ts"> import Vue from 'vue'; -export default Vue.extend({}); +import i18n from '../../../i18n'; +export default Vue.extend({ + i18n: i18n('mobile/views/pages/signup.vue'),}); </script> <style lang="stylus" scoped> diff --git a/src/client/app/mobile/views/pages/tag.vue b/src/client/app/mobile/views/pages/tag.vue index 8f70a647ec..9a0c891920 100644 --- a/src/client/app/mobile/views/pages/tag.vue +++ b/src/client/app/mobile/views/pages/tag.vue @@ -3,7 +3,7 @@ <span slot="header"><span style="margin-right:4px;"><fa icon="hashtag"/></span>{{ $route.params.tag }}</span> <main> - <p v-if="!fetching && empty"><fa icon="search"/> {{ '%i18n:no-posts-found%'.split('{}')[0] }}{{ q }}{{ '%i18n:no-posts-found%'.split('{}')[1] }}</p> + <p v-if="!fetching && empty"><fa icon="search"/> {{ $t('no-posts-found', { q }) }}</p> <mk-notes ref="timeline" :more="existMore ? more : null"/> </main> </mk-ui> @@ -11,11 +11,13 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; const limit = 20; export default Vue.extend({ + i18n: i18n('mobile/views/pages/tag.vue'), data() { return { fetching: true, diff --git a/src/client/app/mobile/views/pages/user-lists.vue b/src/client/app/mobile/views/pages/user-lists.vue index 84f07e8a99..3844bbbf7e 100644 --- a/src/client/app/mobile/views/pages/user-lists.vue +++ b/src/client/app/mobile/views/pages/user-lists.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header"><fa icon="list"/>%i18n:@title%</span> + <span slot="header"><fa icon="list"/>{{ $t('title') }}</span> <template slot="func"><button @click="fn"><fa icon="plus"/></button></template> <main> @@ -13,9 +13,11 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import Progress from '../../../common/scripts/loading'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/user-lists.vue'), data() { return { fetching: true, @@ -23,7 +25,7 @@ export default Vue.extend({ }; }, mounted() { - document.title = '%i18n:@title%'; + document.title = this.$t('title'); Progress.start(); @@ -37,7 +39,7 @@ export default Vue.extend({ methods: { fn() { (this as any).apis.input({ - title: '%i18n:@enter-list-name%', + title: this.$t('enter-list-name'), }).then(async title => { const list = await (this as any).api('users/lists/create', { title diff --git a/src/client/app/mobile/views/pages/user.vue b/src/client/app/mobile/views/pages/user.vue index a3295d5ccf..9e79115896 100644 --- a/src/client/app/mobile/views/pages/user.vue +++ b/src/client/app/mobile/views/pages/user.vue @@ -2,8 +2,8 @@ <mk-ui> <template slot="header" v-if="!fetching"><img :src="user.avatarUrl" alt="">{{ user | userName }}</template> <main v-if="!fetching"> - <div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> %i18n:@is-suspended%</p></div> - <div class="is-remote" v-if="user.host != null"><p><fa icon="exclamation-triangle"/> %i18n:common.is-remote-user%<a :href="user.url || user.uri" target="_blank">%i18n:common.view-on-remote%</a></p></div> + <div class="is-suspended" v-if="user.isSuspended"><p><fa icon="exclamation-triangle"/> {{ $t('is-suspended') }}</p></div> + <div class="is-remote" v-if="user.host != null"><p><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" target="_blank">{{ $t('@.view-on-remote') }}</a></p></div> <header> <div class="banner" :style="style"></div> <div class="body"> @@ -17,7 +17,7 @@ <div class="title"> <h1>{{ user | userName }}</h1> <span class="username"><mk-acct :user="user" :detail="true" /></span> - <span class="followed" v-if="user.isFollowed">%i18n:@follows-you%</span> + <span class="followed" v-if="user.isFollowed">{{ $t('follows-you') }}</span> </div> <div class="description"> <misskey-flavored-markdown v-if="user.description" :text="user.description" :i="$store.state.i"/> @@ -33,24 +33,24 @@ <div class="status"> <a> <b>{{ user.notesCount | number }}</b> - <i>%i18n:@notes%</i> + <i>{{ $t('notes') }}</i> </a> <a :href="user | userPage('following')"> <b>{{ user.followingCount | number }}</b> - <i>%i18n:@following%</i> + <i>{{ $t('following') }}</i> </a> <a :href="user | userPage('followers')"> <b>{{ user.followersCount | number }}</b> - <i>%i18n:@followers%</i> + <i>{{ $t('followers') }}</i> </a> </div> </div> </header> <nav> <div class="nav-container"> - <a :data-active="page == 'home'" @click="page = 'home'"><fa icon="home"/> %i18n:@overview%</a> - <a :data-active="page == 'notes'" @click="page = 'notes'"><fa :icon="['far', 'comment-alt']"/> %i18n:@timeline%</a> - <a :data-active="page == 'media'" @click="page = 'media'"><fa icon="image"/> %i18n:@media%</a> + <a :data-active="page == 'home'" @click="page = 'home'"><fa icon="home"/> {{ $t('overview') }}</a> + <a :data-active="page == 'notes'" @click="page = 'notes'"><fa :icon="['far', 'comment-alt']"/> {{ $t('timeline') }}</a> + <a :data-active="page == 'media'" @click="page = 'media'"><fa icon="image"/> {{ $t('media') }}</a> </div> </nav> <div class="body"> @@ -64,6 +64,7 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import * as age from 's-age'; import parseAcct from '../../../../../misc/acct/parse'; import Progress from '../../../common/scripts/loading'; @@ -71,6 +72,7 @@ import Menu from '../../../common/views/components/menu.vue'; import XHome from './user/home.vue'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/user.vue'), components: { XHome }, @@ -115,7 +117,7 @@ export default Vue.extend({ menu() { let menu = [{ icon: this.user.isMuted ? '<fa icon="eye"/>' : '<fa icon="eye-slash"/>', - text: this.user.isMuted ? '%i18n:@unmute%' : '%i18n:@mute%', + text: this.user.isMuted ? this.$t('unmute') : this.$t('mute'), action: () => { if (this.user.isMuted) { (this as any).api('mute/delete', { @@ -137,7 +139,7 @@ export default Vue.extend({ } }, { icon: this.user.isBlocking ? '<fa icon="user"/>' : '<fa icon="user-slash"/>', - text: this.user.isBlocking ? '%i18n:@unblock%' : '%i18n:@block%', + text: this.user.isBlocking ? this.$t('unblock') : this.$t('block'), action: () => { if (this.user.isBlocking) { (this as any).api('blocking/delete', { diff --git a/src/client/app/mobile/views/pages/user/home.followers-you-know.vue b/src/client/app/mobile/views/pages/user/home.followers-you-know.vue index d25d3889ef..938a565aef 100644 --- a/src/client/app/mobile/views/pages/user/home.followers-you-know.vue +++ b/src/client/app/mobile/views/pages/user/home.followers-you-know.vue @@ -1,19 +1,21 @@ <template> <div class="root followers-you-know"> - <p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:@loading%<mk-ellipsis/></p> + <p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <div v-if="!fetching && users.length > 0"> <a v-for="user in users" :key="user.id" :href="user | userPage"> <img :src="user.avatarUrl" :alt="user | userName"/> </a> </div> - <p class="empty" v-if="!fetching && users.length == 0">%i18n:@no-users%</p> + <p class="empty" v-if="!fetching && users.length == 0">{{ $t('no-users') }}</p> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/user/home.followers-you-know.vue'), props: ['user'], data() { return { diff --git a/src/client/app/mobile/views/pages/user/home.friends.vue b/src/client/app/mobile/views/pages/user/home.friends.vue index 29f64116bc..d18a1e049e 100644 --- a/src/client/app/mobile/views/pages/user/home.friends.vue +++ b/src/client/app/mobile/views/pages/user/home.friends.vue @@ -1,16 +1,18 @@ <template> <div class="root friends"> - <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:@loading%<mk-ellipsis/></p> + <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <div v-if="!fetching && users.length > 0"> <mk-user-card v-for="user in users" :key="user.id" :user="user"/> </div> - <p class="empty" v-if="!fetching && users.length == 0">%i18n:@no-users%</p> + <p class="empty" v-if="!fetching && users.length == 0">{{ $t('no-users') }}</p> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/user/home.friends.vue'), props: ['user'], data() { return { diff --git a/src/client/app/mobile/views/pages/user/home.notes.vue b/src/client/app/mobile/views/pages/user/home.notes.vue index bb7132cc4a..d2ffa275a5 100644 --- a/src/client/app/mobile/views/pages/user/home.notes.vue +++ b/src/client/app/mobile/views/pages/user/home.notes.vue @@ -1,16 +1,18 @@ <template> <div class="root notes"> - <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:@loading%<mk-ellipsis/></p> + <p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <div v-if="!fetching && notes.length > 0"> <mk-note-card v-for="note in notes" :key="note.id" :note="note"/> </div> - <p class="empty" v-if="!fetching && notes.length == 0">%i18n:@no-notes%</p> + <p class="empty" v-if="!fetching && notes.length == 0">{{ $t('no-notes') }}</p> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/user/home.notes.vue'), props: ['user'], data() { return { diff --git a/src/client/app/mobile/views/pages/user/home.photos.vue b/src/client/app/mobile/views/pages/user/home.photos.vue index e30b16cc7f..6aa78a5414 100644 --- a/src/client/app/mobile/views/pages/user/home.photos.vue +++ b/src/client/app/mobile/views/pages/user/home.photos.vue @@ -1,6 +1,6 @@ <template> <div class="root photos"> - <p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:@loading%<mk-ellipsis/></p> + <p class="initializing" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>{{ $t('@.loading') }}<mk-ellipsis/></p> <div class="stream" v-if="!fetching && images.length > 0"> <a v-for="image in images" class="img" @@ -8,14 +8,16 @@ :href="image.note | notePage" ></a> </div> - <p class="empty" v-if="!fetching && images.length == 0">%i18n:@no-photos%</p> + <p class="empty" v-if="!fetching && images.length == 0">{{ $t('no-photos') }}</p> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../../i18n'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/user/home.photos.vue'), props: ['user'], data() { return { diff --git a/src/client/app/mobile/views/pages/user/home.vue b/src/client/app/mobile/views/pages/user/home.vue index 27d751260a..f89b04ae9d 100644 --- a/src/client/app/mobile/views/pages/user/home.vue +++ b/src/client/app/mobile/views/pages/user/home.vue @@ -2,47 +2,49 @@ <div class="root home"> <mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/> <section class="recent-notes"> - <h2><fa :icon="['far', 'comments']"/>%i18n:@recent-notes%</h2> + <h2><fa :icon="['far', 'comments']"/>{{ $t('recent-notes') }}</h2> <div> <x-notes :user="user"/> </div> </section> <section class="images"> - <h2><fa icon="image"/>%i18n:@images%</h2> + <h2><fa icon="image"/>{{ $t('images') }}</h2> <div> <x-photos :user="user"/> </div> </section> <section class="activity"> - <h2><fa icon="chart-bar"/>%i18n:@activity%</h2> + <h2><fa icon="chart-bar"/>{{ $t('activity') }}</h2> <div> <mk-activity :user="user"/> </div> </section> <section class="frequently-replied-users"> - <h2><fa icon="users"/>%i18n:@frequently-replied-users%</h2> + <h2><fa icon="users"/>{{ $t('frequently-replied-users') }}</h2> <div> <x-friends :user="user"/> </div> </section> <section class="followers-you-know" v-if="$store.getters.isSignedIn && $store.state.i.id !== user.id"> - <h2><fa icon="users"/>%i18n:@followers-you-know%</h2> + <h2><fa icon="users"/>{{ $t('followers-you-know') }}</h2> <div> <x-followers-you-know :user="user"/> </div> </section> - <p v-if="user.host === null">%i18n:@last-used-at%: <b><mk-time :time="user.lastUsedAt"/></b></p> + <p v-if="user.host === null">{{ $t('last-used-at') }}: <b><mk-time :time="user.lastUsedAt"/></b></p> </div> </template> <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../../i18n'; import XNotes from './home.notes.vue'; import XPhotos from './home.photos.vue'; import XFriends from './home.friends.vue'; import XFollowersYouKnow from './home.followers-you-know.vue'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/user/home.vue'), components: { XNotes, XPhotos, diff --git a/src/client/app/mobile/views/pages/welcome.vue b/src/client/app/mobile/views/pages/welcome.vue index c235cac690..c09ba1a78a 100644 --- a/src/client/app/mobile/views/pages/welcome.vue +++ b/src/client/app/mobile/views/pages/welcome.vue @@ -7,8 +7,8 @@ <p class="host">{{ host }}</p> <div class="about"> <h2>{{ name }}</h2> - <p v-html="description || '%i18n:common.about%'"></p> - <router-link class="signup" to="/signup">%i18n:@signup%</router-link> + <p v-html="description || this.$t('@.about')"></p> + <router-link class="signup" to="/signup">{{ $t('signup') }}</router-link> </div> <div class="login"> <mk-signin :with-avatar="false"/> @@ -33,32 +33,32 @@ </article> </div> <article class="about-misskey"> - <h1>%i18n:common.intro.title%</h1> - <p v-html="'%i18n:common.intro.about%'"></p> + <h1>{{ $t('@.intro.title') }}</h1> + <p v-html="this.$t('@.intro.about')"></p> <section> - <h2>%i18n:common.intro.features%</h2> + <h2>{{ $t('@.intro.features') }}</h2> <section> - <h3>%i18n:common.intro.rich-contents%</h3> + <h3>{{ $t('@.intro.rich-contents') }}</h3> <div class="image"><img src="/assets/about/post.png" alt=""></div> - <p v-html="'%i18n:common.intro.rich-contents-desc%'"></p> + <p v-html="this.$t('@.intro.rich-contents-desc')"></p> </section> <section> - <h3>%i18n:common.intro.reaction%</h3> + <h3>{{ $t('@.intro.reaction') }}</h3> <div class="image"><img src="/assets/about/reaction.png" alt=""></div> - <p v-html="'%i18n:common.intro.reaction-desc%'"></p> + <p v-html="this.$t('@.intro.reaction-desc')"></p> </section> <section> - <h3>%i18n:common.intro.ui%</h3> + <h3>{{ $t('@.intro.ui') }}</h3> <div class="image"><img src="/assets/about/ui.png" alt=""></div> - <p v-html="'%i18n:common.intro.ui-desc%'"></p> + <p v-html="this.$t('@.intro.ui-desc')"></p> </section> <section> - <h3>%i18n:common.intro.drive%</h3> + <h3>{{ $t('@.intro.drive') }}</h3> <div class="image"><img src="/assets/about/drive.png" alt=""></div> - <p v-html="'%i18n:common.intro.drive-desc%'"></p> + <p v-html="this.$t('@.intro.drive-desc')"></p> </section> </section> - <p v-html="'%i18n:common.intro.outro%'"></p> + <p v-html="this.$t('@.intro.outro')"></p> </article> <div class="info" v-if="meta"> <p>Version: <b>{{ meta.version }}</b></p> @@ -73,10 +73,12 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import { copyright, host } from '../../../config'; import { concat } from '../../../../../prelude/array'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/welcome.vue'), data() { return { meta: null, diff --git a/src/client/app/mobile/views/pages/widgets.vue b/src/client/app/mobile/views/pages/widgets.vue index cd4c75f15a..be6604b8a9 100644 --- a/src/client/app/mobile/views/pages/widgets.vue +++ b/src/client/app/mobile/views/pages/widgets.vue @@ -1,6 +1,6 @@ <template> <mk-ui> - <span slot="header"><span style="margin-right:4px;"><fa icon="home"/></span>%i18n:@dashboard%</span> + <span slot="header"><span style="margin-right:4px;"><fa icon="home"/></span>{{ $t('dashboard') }}</span> <template slot="func"> <button @click="customizing = !customizing"><fa icon="cog"/></button> </template> @@ -8,24 +8,24 @@ <template v-if="customizing"> <header> <select v-model="widgetAdderSelected"> - <option value="profile">%i18n:common.widgets.profile%</option> - <option value="analog-clock">%i18n:common.widgets.analog-clock%</option> - <option value="calendar">%i18n:common.widgets.calendar%</option> - <option value="activity">%i18n:common.widgets.activity%</option> - <option value="rss">%i18n:common.widgets.rss%</option> - <option value="photo-stream">%i18n:common.widgets.photo-stream%</option> - <option value="slideshow">%i18n:common.widgets.slideshow%</option> - <option value="hashtags">%i18n:common.widgets.hashtags%</option> - <option value="posts-monitor">%i18n:common.widgets.posts-monitor%</option> - <option value="version">%i18n:common.widgets.version%</option> - <option value="server">%i18n:common.widgets.server%</option> - <option value="memo">%i18n:common.widgets.memo%</option> - <option value="donation">%i18n:common.widgets.donation%</option> - <option value="nav">%i18n:common.widgets.nav%</option> - <option value="tips">%i18n:common.widgets.tips%</option> + <option value="profile">{{ $t('@.widgets.profile') }}</option> + <option value="analog-clock">{{ $t('@.widgets.analog-clock') }}</option> + <option value="calendar">{{ $t('@.widgets.calendar') }}</option> + <option value="activity">{{ $t('@.widgets.activity') }}</option> + <option value="rss">{{ $t('@.widgets.rss') }}</option> + <option value="photo-stream">{{ $t('@.widgets.photo-stream') }}</option> + <option value="slideshow">{{ $t('@.widgets.slideshow') }}</option> + <option value="hashtags">{{ $t('@.widgets.hashtags') }}</option> + <option value="posts-monitor">{{ $t('@.widgets.posts-monitor') }}</option> + <option value="version">{{ $t('@.widgets.version') }}</option> + <option value="server">{{ $t('@.widgets.server') }}</option> + <option value="memo">{{ $t('@.widgets.memo') }}</option> + <option value="donation">{{ $t('@.widgets.donation') }}</option> + <option value="nav">{{ $t('@.widgets.nav') }}</option> + <option value="tips">{{ $t('@.widgets.tips') }}</option> </select> - <button @click="addWidget">%i18n:add-widget%</button> - <p><a @click="hint">%i18n:customization-tips%</a></p> + <button @click="addWidget">{{ $t('add-widget') }}</button> + <p><a @click="hint">{{ $t('customization-tips') }}</a></p> </header> <x-draggable :list="widgets" @@ -51,10 +51,12 @@ <script lang="ts"> import Vue from 'vue'; +import i18n from '../../../i18n'; import * as XDraggable from 'vuedraggable'; import * as uuid from 'uuid'; export default Vue.extend({ + i18n: i18n('mobile/views/pages/widgets.vue'), components: { XDraggable }, @@ -107,7 +109,7 @@ export default Vue.extend({ methods: { hint() { - alert('%i18n:@widgets-hints%'); + alert(this.$t('widgets-hints')); }, widgetFunc(id) { diff --git a/src/client/app/mobile/views/widgets/activity.vue b/src/client/app/mobile/views/widgets/activity.vue index d35613b080..c67d846673 100644 --- a/src/client/app/mobile/views/widgets/activity.vue +++ b/src/client/app/mobile/views/widgets/activity.vue @@ -1,7 +1,7 @@ <template> <div class="mkw-activity"> <mk-widget-container :show-header="!props.compact"> - <template slot="header"><fa icon="chart-bar"/>%i18n:@activity%</template> + <template slot="header"><fa icon="chart-bar"/>{{ $t('activity') }}</template> <div :class="$style.body"> <mk-activity :user="$store.state.i"/> </div> @@ -11,6 +11,7 @@ <script lang="ts"> import define from '../../../common/define-widget'; +import i18n from '../../../i18n'; export default define({ name: 'activity', @@ -18,6 +19,7 @@ export default define({ compact: false }) }).extend({ + i18n: i18n(), methods: { func() { this.props.compact = !this.props.compact; |