- Tracks
+ {{ $t('views.admin.moderation.AccountsDetail.tracksLabel') }}
|
{{ stats.tracks }}
diff --git a/front/src/views/admin/moderation/Base.vue b/front/src/views/admin/moderation/Base.vue
index a1b561f6e..2739cc84a 100644
--- a/front/src/views/admin/moderation/Base.vue
+++ b/front/src/views/admin/moderation/Base.vue
@@ -9,8 +9,8 @@ const { t } = useI18n()
const allowListEnabled = ref(false)
const labels = computed(() => ({
- moderation: t('Moderation'),
- secondaryMenu: t('Secondary menu')
+ moderation: t('views.admin.moderation.Base.moderation'),
+ secondaryMenu: t('views.admin.moderation.Base.secondaryMenu')
}))
const fetchNodeInfo = async () => {
@@ -35,7 +35,7 @@ fetchNodeInfo()
class="ui item"
:to="{name: 'manage.moderation.reports.list', query: {q: 'resolved:no'}}"
>
- Reports
+ {{ $t('views.admin.moderation.Base.reportsLink') }}
- User Requests
+ {{ $t('views.admin.moderation.Base.userRequestsLink') }}
- Domains
+ {{ $t('views.admin.moderation.Base.domainsLink') }}
- Accounts
+ {{ $t('views.admin.moderation.Base.accountsLink') }}
()
const { t } = useI18n()
const labels = computed(() => ({
- statsWarning: t('Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object')
+ statsWarning: t('views.admin.moderation.DomainsDetail.statsWarning')
}))
const isLoadingPolicy = ref(false)
@@ -133,7 +133,7 @@ const setAllowList = async (value: boolean) => {
rel="noopener noreferrer"
class="logo-wrapper"
>
- Open website
+ {{ $t('views.admin.moderation.DomainsDetail.websiteLink') }}
@@ -149,7 +149,7 @@ const setAllowList = async (value: boolean) => {
rel="noopener noreferrer"
>
- View in Django's admin
+ {{ $t('views.admin.moderation.DomainsDetail.djangoLink') }}
{
@click.prevent="setAllowList(false)"
>
- Remove from allow-list
+ {{ $t('views.admin.moderation.DomainsDetail.removeFromAllowList') }}
@@ -191,17 +191,17 @@ const setAllowList = async (value: boolean) => {
- Moderation policies help you control how your instance interact with a given domain or account.
+ {{ $t('views.admin.moderation.DomainsDetail.policyDescription') }}
{
>
@@ -235,78 +235,78 @@ const setAllowList = async (value: boolean) => {
- Is present on allow-list
+ {{ $t('views.admin.moderation.DomainsDetail.inAllowListLabel') }}
|
-
- Yes
-
-
+
- No
-
+ {{ $t('views.admin.moderation.DomainsDetail.inAllowListFalse') }}
+
|
- Last checked
+ {{ $t('views.admin.moderation.DomainsDetail.lastCheckedLabel') }}
|
-
- N/A
-
+ {{ $t('views.admin.moderation.DomainsDetail.notApplicable') }}
+
|
- Software
+ {{ $t('views.admin.moderation.DomainsDetail.softwareLabel') }}
|
- {{ get(object, 'nodeinfo.payload.software.name', t('N/A')) }} ({{ get(object, 'nodeinfo.payload.software.version', t('N/A')) }})
+ {{ $t('views.admin.moderation.DomainsDetail.softwareValue', {name: get(object, 'nodeinfo.payload.software.name', t('views.admin.moderation.DomainsDetail.notApplicable')), version: get(object, 'nodeinfo.payload.software.version', t('views.admin.moderation.DomainsDetail.notApplicable'))}) }}
|
- Name
+ {{ $t('views.admin.moderation.DomainsDetail.domainNameLabel') }}
|
- {{ get(object, 'nodeinfo.payload.metadata.nodeName', t('N/A')) }}
+ {{ get(object, 'nodeinfo.payload.metadata.nodeName', t('views.admin.moderation.DomainsDetail.notApplicable')) }}
|
- Total users
+ {{ $t('views.admin.moderation.DomainsDetail.totalUsersLabel') }}
|
- {{ get(object, 'nodeinfo.payload.usage.users.total', t('N/A')) }}
+ {{ get(object, 'nodeinfo.payload.usage.users.total', t('views.admin.moderation.DomainsDetail.notApplicable')) }}
|
- Status
+ {{ $t('views.admin.moderation.DomainsDetail.nodeInfoStatusLabel') }}
|
- Error while fetching node info
+ {{ $t('views.admin.moderation.DomainsDetail.nodeInfoFailureMessage') }}
|
@@ -319,7 +319,7 @@ const setAllowList = async (value: boolean) => {
:url="'manage/federation/domains/' + object.name + '/nodeinfo/'"
@action-done="refreshNodeInfo"
>
- Refresh node info
+ {{ $t('views.admin.moderation.DomainsDetail.refreshNodeInfoButton') }}
@@ -328,7 +328,7 @@ const setAllowList = async (value: boolean) => {
@@ -348,7 +348,7 @@ const setAllowList = async (value: boolean) => {
- First seen
+ {{ $t('views.admin.moderation.DomainsDetail.firstSeenLabel') }}
|
@@ -359,7 +359,7 @@ const setAllowList = async (value: boolean) => {
- Known accounts
+ {{ $t('views.admin.moderation.DomainsDetail.knownAccountsLink') }}
|
@@ -368,7 +368,7 @@ const setAllowList = async (value: boolean) => {
|
- Emitted messages
+ {{ $t('views.admin.moderation.DomainsDetail.emittedMessagesLabel') }}
|
{{ stats.outbox_activities }}
@@ -376,7 +376,7 @@ const setAllowList = async (value: boolean) => {
|
- Received library follows
+ {{ $t('views.admin.moderation.DomainsDetail.receivedFollowsLabel') }}
|
{{ stats.received_library_follows }}
@@ -384,7 +384,7 @@ const setAllowList = async (value: boolean) => {
|
- Emitted library follows
+ {{ $t('views.admin.moderation.DomainsDetail.emittedFollowsLabel') }}
|
{{ stats.emitted_library_follows }}
@@ -399,7 +399,7 @@ const setAllowList = async (value: boolean) => {
@@ -419,7 +419,7 @@ const setAllowList = async (value: boolean) => {
|
- Cached size
+ {{ $t('views.admin.moderation.DomainsDetail.cachedSizeLabel') }}
|
{{ humanSize(stats.media_downloaded_size) }}
@@ -427,7 +427,7 @@ const setAllowList = async (value: boolean) => {
|
- Total size
+ {{ $t('views.admin.moderation.DomainsDetail.totalSizeLabel') }}
|
{{ humanSize(stats.media_total_size) }}
@@ -436,7 +436,7 @@ const setAllowList = async (value: boolean) => {
|
- Channels
+ {{ $t('views.admin.moderation.DomainsDetail.channelsLabel') }}
|
@@ -446,7 +446,7 @@ const setAllowList = async (value: boolean) => {
|
- Libraries
+ {{ $t('views.admin.moderation.DomainsDetail.librariesLabel') }}
|
@@ -456,7 +456,7 @@ const setAllowList = async (value: boolean) => {
|
- Uploads
+ {{ $t('views.admin.moderation.DomainsDetail.uploadsLabel') }}
|
@@ -466,7 +466,7 @@ const setAllowList = async (value: boolean) => {
|
- Artists
+ {{ $t('views.admin.moderation.DomainsDetail.artistsLabel') }}
|
@@ -476,7 +476,7 @@ const setAllowList = async (value: boolean) => {
|
- Albums
+ {{ $t('views.admin.moderation.DomainsDetail.albumsLabel') }}
|
@@ -486,7 +486,7 @@ const setAllowList = async (value: boolean) => {
|
- Tracks
+ {{ $t('views.admin.moderation.DomainsDetail.tracksLabel') }}
|
diff --git a/front/src/views/admin/moderation/DomainsList.vue b/front/src/views/admin/moderation/DomainsList.vue
index 0472ddb2e..775fa49d8 100644
--- a/front/src/views/admin/moderation/DomainsList.vue
+++ b/front/src/views/admin/moderation/DomainsList.vue
@@ -20,7 +20,7 @@ const { t } = useI18n()
const router = useRouter()
const labels = computed(() => ({
- domains: t('Domains')
+ domains: t('views.admin.moderation.DomainsList.title')
}))
const domainName = ref('')
@@ -50,7 +50,7 @@ const createDomain = async () => {
@@ -108,13 +108,13 @@ const submit = async () => {
class="ui positive message"
>
- Your password has been updated successfully.
+ {{ $t('views.auth.PasswordResetConfirm.changeSuccessMessage') }}
- Proceed to login
+ {{ $t('views.auth.PasswordResetConfirm.goToLoginLink') }}
diff --git a/front/src/views/auth/Plugins.vue b/front/src/views/auth/Plugins.vue
index 79f071e2f..ca4977b0f 100644
--- a/front/src/views/auth/Plugins.vue
+++ b/front/src/views/auth/Plugins.vue
@@ -11,7 +11,7 @@ import useErrorHandler from '~/composables/useErrorHandler'
const { t } = useI18n()
const labels = computed(() => ({
- title: t('Manage plugins')
+ title: t('views.auth.Plugins.title')
}))
const isLoading = ref(false)
diff --git a/front/src/views/auth/ProfileActivity.vue b/front/src/views/auth/ProfileActivity.vue
index f1f471ac7..b51d45dc9 100644
--- a/front/src/views/auth/ProfileActivity.vue
+++ b/front/src/views/auth/ProfileActivity.vue
@@ -27,7 +27,7 @@ const recentActivity = ref(0)
:client-only="true"
/>
props.domain
const { t } = useI18n()
const labels = computed(() => ({
- usernameProfile: t("%{ username }'s profile", { username: props.username })
+ usernameProfile: t('views.auth.ProfileBase.title', { username: props.username })
}))
onBeforeRouteUpdate((to) => {
@@ -100,9 +100,7 @@ watch(props, fetchData, { immediate: true })
class="basic item"
>
- View on %{ domain }
+ {{ $t('views.auth.ProfileBase.domainViewLink', {domain: object.domain}) }}
- Open in moderation interface
+ {{ $t('views.auth.ProfileBase.moderationLink') }}
@@ -150,7 +148,7 @@ watch(props, fetchData, { immediate: true })
- This is you!
+ {{ $t('views.auth.ProfileBase.ownUserLabel') }}
@@ -173,13 +171,13 @@ watch(props, fetchData, { immediate: true })
class="item"
:to="{name: 'profile.overview', params: routerParams}"
>
- Overview
+ {{ $t('views.auth.ProfileBase.overviewLink') }}
- Activity
+ {{ $t('views.auth.ProfileBase.activityLink') }}
diff --git a/front/src/views/auth/ProfileOverview.vue b/front/src/views/auth/ProfileOverview.vue
index 4fbc64091..368d1643a 100644
--- a/front/src/views/auth/ProfileOverview.vue
+++ b/front/src/views/auth/ProfileOverview.vue
@@ -42,7 +42,7 @@ const createForm = ref()
- This user shared the following libraries
+ {{ $t('views.auth.ProfileOverview.sharedLibraries') }}
- Cancel
+ {{ $t('views.auth.ProfileOverview.cancelButton') }}
diff --git a/front/src/views/auth/Signup.vue b/front/src/views/auth/Signup.vue
index 735b1619a..bcd21c37b 100644
--- a/front/src/views/auth/Signup.vue
+++ b/front/src/views/auth/Signup.vue
@@ -19,7 +19,7 @@ withDefaults(defineProps(), {
const { t } = useI18n()
const labels = computed(() => ({
- title: t('Sign Up')
+ title: t('views.auth.Signup.title')
}))
@@ -31,7 +31,7 @@ const labels = computed(() => ({
- Create a Funkwhale account
+ {{ $t('views.auth.Signup.createAccountHeader') }}
{
const { t } = useI18n()
const labels = computed(() => ({
- title: t('Channel')
+ title: t('views.channels.DetailBase.title')
}))
onBeforeRouteUpdate((to) => {
@@ -167,42 +167,22 @@ const updateSubscriptionCount = (delta: number) => {
/>
-
- %{ count } episode
-
-
+
- %{ count } track
-
+ {{ $t('views.channels.DetailBase.trackCount', {count: totalTracks}) }}
+
-
- %{ count } subscriber
-
-
- %{ count } listening
-
+
+ {{ $t('views.channels.DetailBase.subscriberCount', {count: object?.subscriptions_count}) }}
+
+ {{ $t('views.channels.DetailBase.listeningsCount', {count: object?.downloads_count}) }}
{
class="tiny"
>
- Subscribe on Funkwhale
+ {{ $t('views.channels.DetailBase.subscribeOnFunkwhale') }}
{
- Subscribe via RSS
+ {{ $t('views.channels.DetailBase.subscribeRss') }}
- Copy-paste the following URL in your favorite podcatcher:
+ {{ $t('views.channels.DetailBase.copyUrl') }}
- Subscribe on the Fediverse
+ {{ $t('views.channels.DetailBase.subscribeOnFediverse') }}
- If you're using Mastodon or other fediverse applications, you can subscribe to this account:
+ {{ $t('views.channels.DetailBase.subscribeOnFediverseDescription') }}
{
@@ -276,7 +256,7 @@ const updateSubscriptionCount = (delta: number) => {
@click.prevent="showEmbedModal = !showEmbedModal"
>
- Embed
+ {{ $t('views.channels.DetailBase.embedButton') }}
{
class="basic item"
>
- View on %{ domain }
+ {{ $t('views.channels.DetailBase.domainViewLink', {domain: object.actor.domain}) }}
{
@click.stop.prevent="showEditModal = true"
>
- Edit…
+ {{ $t('views.channels.DetailBase.editButton') }}
{
@confirm="remove()"
>
- Delete…
+ {{ $t('views.channels.DetailBase.deleteButton') }}
- Delete this Channel?
+ {{ $t('views.channels.DetailBase.deleteModalHeader') }}
- The channel will be deleted, as well as any related files and data. This action is irreversible.
+ {{ $t('views.channels.DetailBase.deleteModalMessage') }}
- Delete
+ {{ $t('views.channels.DetailBase.deleteModalConfirm') }}
@@ -343,7 +321,7 @@ const updateSubscriptionCount = (delta: number) => {
:to="{name: 'manage.channels.detail', params: {id: object.uuid}}"
>
- Open in moderation interface
+ {{ $t('views.channels.DetailBase.moderationLink') }}
@@ -374,9 +352,7 @@ const updateSubscriptionCount = (delta: number) => {
target="_blank"
>
- Mirrored from %{ domain }
+ {{ $t('views.channels.DetailBase.mirroredLink', {domain: externalDomain}) }}
@@ -391,7 +367,7 @@ const updateSubscriptionCount = (delta: number) => {
@click.prevent.stop="$store.commit('channels/showUploadModal', {show: true, config: {channel: object}})"
>
- Upload
+ {{ $t('views.channels.DetailBase.uploadButton') }}
@@ -400,7 +376,7 @@ const updateSubscriptionCount = (delta: number) => {
class="vibrant"
:artist="object.artist"
>
- Play
+ {{ $t('views.channels.DetailBase.playButton') }}
@@ -156,16 +156,16 @@ const albumModal = ref()
:filters="{channel: object.uuid, ordering: '-creation_date', page_size: '25'}"
>
@@ -175,23 +175,23 @@ const albumModal = ref()
:is-podcast="isPodcast"
>
diff --git a/front/src/views/channels/SubscriptionsList.vue b/front/src/views/channels/SubscriptionsList.vue
index cd6c3edcf..2dc091a2b 100644
--- a/front/src/views/channels/SubscriptionsList.vue
+++ b/front/src/views/channels/SubscriptionsList.vue
@@ -25,8 +25,8 @@ const widgetKey = ref(new Date().toLocaleString())
const { t } = useI18n()
const labels = computed(() => ({
- title: t('Subscribed Channels'),
- searchPlaceholder: t('Filter by name…')
+ title: t('views.channels.SubscriptionsList.title'),
+ searchPlaceholder: t('views.channels.SubscriptionsList.searchPlaceholder')
}))
const previousPage = ref()
@@ -66,7 +66,7 @@ const showSubscribeModal = ref(false)
@@ -76,7 +76,7 @@ const showSubscribeModal = ref(false)
:fullscreen="false"
>
diff --git a/front/src/views/content/Base.vue b/front/src/views/content/Base.vue
index ea08b583c..6956f603e 100644
--- a/front/src/views/content/Base.vue
+++ b/front/src/views/content/Base.vue
@@ -5,8 +5,8 @@ import { computed } from 'vue'
const { t } = useI18n()
const labels = computed(() => ({
- secondaryMenu: t('Secondary menu'),
- title: t('Add content')
+ secondaryMenu: t('views.content.Base.secondaryMenu'),
+ title: t('views.content.Base.title')
}))
@@ -24,13 +24,13 @@ const labels = computed(() => ({
class="ui item"
:to="{name: 'content.libraries.index'}"
>
- Libraries
+ {{ $t('views.content.Base.librariesLink') }}
- Tracks
+ {{ $t('views.content.Base.tracksLink') }}
diff --git a/front/src/views/content/Home.vue b/front/src/views/content/Home.vue
index 6fba4e794..68bf8a6e2 100644
--- a/front/src/views/content/Home.vue
+++ b/front/src/views/content/Home.vue
@@ -7,7 +7,7 @@ import { useStore } from '~/store'
const { t } = useI18n()
const labels = computed(() => ({
- title: t('Add and manage content')
+ title: t('views.content.Home.title')
}))
const store = useStore()
@@ -23,51 +23,51 @@ const defaultQuota = computed(() => humanSize(quota.value * 1e6))
{{ labels.title }}
- {{ $t('This instance offers up to %{quota} of storage space for every user.', { quota: defaultQuota }) }}
+ {{ $t('views.content.Home.uploadQuota', { quota: defaultQuota }) }}
- Publish your work in a channel
+ {{ $t('views.content.Home.channelHeader') }}
- If you are a musician or a podcaster, channels are designed for you! If you are a musician or a podcaster, channels are designed for you! work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application.
+ {{ $t('views.content.Home.channelDescription') }} {{ $t('views.content.Home.channelDescriptionContinued') }}
- Get started
+ {{ $t('views.content.Home.getStartedButton') }}
- Upload third-party content in a library
+ {{ $t('views.content.Home.libraryUploadHeader') }}
- Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family.
+ {{ $t('views.content.Home.libraryUploadDescription') }}
- Get started
+ {{ $t('views.content.Home.getStartedButton') }}
- Follow remote libraries
+ {{ $t('views.content.Home.followLibrariesHeader') }}
- Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner.
+ {{ $t('views.content.Home.followLibrariesDescription') }}
- Get started
+ {{ $t('views.content.Home.getStartedButton') }}
diff --git a/front/src/views/content/libraries/Card.vue b/front/src/views/content/libraries/Card.vue
index 202d0915f..78c7733ff 100644
--- a/front/src/views/content/libraries/Card.vue
+++ b/front/src/views/content/libraries/Card.vue
@@ -17,7 +17,7 @@ const { t } = useI18n()
const sharedLabels = useSharedLabels()
-const sizeLabel = computed(() => t('Total size of the files in this library'))
+const sizeLabel = computed(() => t('views.content.libraries.Card.sizeLabel'))
const privacyTooltips = (level: PrivacyLevel) => `Visibility: ${sharedLabels.fields.privacy_level.choices[level].toLowerCase()}`
@@ -69,14 +69,7 @@ const privacyTooltips = (level: PrivacyLevel) => `Visibility: ${sharedLabels.fie
{{ humanSize(library.size) }}
-
- %{ count } track
-
+ {{ $t('views.content.libraries.Card.trackCount') }}
@@ -84,13 +77,13 @@ const privacyTooltips = (level: PrivacyLevel) => `Visibility: ${sharedLabels.fie
:to="{name: 'library.detail.upload', params: {id: library.uuid}}"
class="ui button"
>
- Upload
+ {{ $t('views.content.libraries.Card.uploadButton') }}
- Library Details
+ {{ $t('views.content.libraries.Card.detailsLink') }}
diff --git a/front/src/views/content/libraries/FilesTable.vue b/front/src/views/content/libraries/FilesTable.vue
index eba2f7f72..6c4e680d8 100644
--- a/front/src/views/content/libraries/FilesTable.vue
+++ b/front/src/views/content/libraries/FilesTable.vue
@@ -70,14 +70,14 @@ const actionFilters = computed(() => ({ q: query.value, ...props.filters }))
const actions = computed(() => [
{
name: 'delete',
- label: t('Delete'),
+ label: t('views.content.libraries.FilesTable.deleteLabel'),
isDangerous: true,
allowAll: true,
confirmColor: 'danger'
},
{
name: 'relaunch_import',
- label: t('Restart import'),
+ label: t('views.content.libraries.FilesTable.restartImportLabel'),
isDangerous: true,
allowAll: true,
filterCheckable: (filter: { import_status: ImportStatus }) => {
@@ -120,8 +120,8 @@ fetchData()
const sharedLabels = useSharedLabels()
const labels = computed(() => ({
- searchPlaceholder: t('Search by title, artist, album…'),
- showStatus: t('Show information about the upload status for this track')
+ searchPlaceholder: t('views.content.libraries.FilesTable.searchPlaceholder'),
+ showStatus: t('views.content.libraries.FilesTable.showStatus')
}))
const detailedUpload = ref()
@@ -138,7 +138,7 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
@@ -236,7 +236,7 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
>
{
>
- Title
+ {{ $t('views.content.libraries.FilesTable.titleTableHeader') }}
|
- Artist
+ {{ $t('views.content.libraries.FilesTable.artistTableHeader') }}
|
- Album
+ {{ $t('views.content.libraries.FilesTable.albumTableHeader') }}
|
- Upload date
+ {{ $t('views.content.libraries.FilesTable.uploadDateTableHeader') }}
|
- Import status
+ {{ $t('views.content.libraries.FilesTable.importStatusTableHeader') }}
|
- Duration
+ {{ $t('views.content.libraries.FilesTable.durationTableHeader') }}
|
- Size
+ {{ $t('views.content.libraries.FilesTable.sizeTableHeader') }}
|
{
{{ time.parse(scope.obj.duration) }}
|
- N/A
+ {{ $t('views.content.libraries.FilesTable.notApplicable') }}
|
{{ humanSize(scope.obj.size) }}
|
- N/A
+ {{ $t('views.content.libraries.FilesTable.notApplicable') }}
|
@@ -351,10 +351,7 @@ const getImportStatusChoice = (importStatus: ImportStatus) => {
/>
- Showing results %{ start }-%{ end } on %{ total }
+ {{ $t('views.content.libraries.FilesTable.resultsDisplay', {start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}) }}
diff --git a/front/src/views/content/libraries/Form.vue b/front/src/views/content/libraries/Form.vue
index c9d02162c..7a73d2f72 100644
--- a/front/src/views/content/libraries/Form.vue
+++ b/front/src/views/content/libraries/Form.vue
@@ -30,8 +30,8 @@ const sharedLabels = useSharedLabels()
const store = useStore()
const labels = computed(() => ({
- descriptionPlaceholder: t('This library contains my personal music, I hope you like it.'),
- namePlaceholder: t('My awesome library')
+ descriptionPlaceholder: t('views.content.libraries.Form.descriptionPlaceholder'),
+ namePlaceholder: t('views.content.libraries.Form.namePlaceholder')
}))
const currentVisibilityLevel = ref(props.library?.privacy_level ?? 'me')
@@ -59,8 +59,8 @@ const submit = async () => {
store.commit('ui/addMessage', {
content: props.library
- ? t('Library updated')
- : t('Library created'),
+ ? t('views.content.libraries.Form.libraryUpdateMessage')
+ : t('views.content.libraries.Form.libraryCreateMessage'),
date: new Date()
})
} catch (error) {
@@ -77,7 +77,7 @@ const remove = async () => {
await axios.delete(`libraries/${props.library?.uuid}/`)
emit('deleted')
store.commit('ui/addMessage', {
- content: t('Library deleted'),
+ content: t('views.content.libraries.Form.libraryDeleteMessage'),
date: new Date()
})
} catch (error) {
@@ -94,7 +94,7 @@ const remove = async () => {
@submit.prevent="submit"
>
- Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family.
+ {{ $t('views.content.libraries.Form.libraryHelp') }}
{
class="ui negative message"
>
-
+
{
>
-
+
-
+
- You are able to share your library with other people, regardless of its visibility.
+ {{ $t('views.content.libraries.Form.visibilityDescription') }}
{
class="ui text container"
>
- Looks like you don't have a library, it's time to create one.
+ {{ $t('views.content.libraries.Home.emptyState') }}
{
v-else
class="minus icon"
/>
- Create a new library
+ {{ $t('views.content.libraries.Home.createLibraryLink') }}
purge('errored')
- Loading usage data…
+ {{ $t('views.content.libraries.Quota.loadingMessage') }}
purge('errored')
:style="{width: `${progress}%`}"
>
- {{ progress }}%
+ {{ $t('views.content.libraries.Quota.percentUsed', {progress: progress}) }}
-
- %{ current } used on %{ max } allowed
-
+ {{ $t('views.content.libraries.Quota.currentUsage', {max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}) }}
@@ -101,7 +96,7 @@ const purgeErroredFiles = () => purge('errored')
{{ humanSize(quotaStatus.pending * 1000 * 1000) }}
- Pending files
+ {{ $t('views.content.libraries.Quota.pendingLabel') }}
@@ -109,27 +104,27 @@ const purgeErroredFiles = () => purge('errored')
class="ui basic primary tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'pending'}])}}"
>
- View files
+ {{ $t('views.content.libraries.Quota.viewFilesLink') }}
- Purge
+ {{ $t('views.content.libraries.Quota.purgeButton') }}
- Purge pending files?
+ {{ $t('views.content.libraries.Quota.purgePendingModalHeader') }}
- Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota.
+ {{ $t('views.content.libraries.Quota.purgePendingModalMessage') }}
- Purge
+ {{ $t('views.content.libraries.Quota.purgeButton') }}
@@ -144,7 +139,7 @@ const purgeErroredFiles = () => purge('errored')
{{ humanSize(quotaStatus.skipped * 1000 * 1000) }}
- Skipped files
+ {{ $t('views.content.libraries.Quota.skippedLabel') }}
@@ -152,26 +147,26 @@ const purgeErroredFiles = () => purge('errored')
class="ui basic primary tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'skipped'}])}}"
>
- View files
+ {{ $t('views.content.libraries.Quota.viewFilesLink') }}
- Purge
+ {{ $t('views.content.libraries.Quota.purgeButton') }}
- Purge skipped files?
+ {{ $t('views.content.libraries.Quota.purgeSkippedModalHeader') }}
- Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota.
+ {{ $t('views.content.libraries.Quota.purgeSkippedModalMessage') }}
- Purge
+ {{ $t('views.content.libraries.Quota.purgeButton') }}
@@ -186,7 +181,7 @@ const purgeErroredFiles = () => purge('errored')
{{ humanSize(quotaStatus.errored * 1000 * 1000) }}
- Errored files
+ {{ $t('views.content.libraries.Quota.erroredLabel') }}
@@ -194,26 +189,26 @@ const purgeErroredFiles = () => purge('errored')
class="ui basic primary tiny button"
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'errored'}])}}"
>
- View files
+ {{ $t('views.content.libraries.Quota.viewFilesLink') }}
- Purge
+ {{ $t('views.content.libraries.Quota.purgeButton') }}
- Purge errored files?
+ {{ $t('views.content.libraries.Quota.purgeErroredModalHeader') }}
- Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota.
+ {{ $t('views.content.libraries.Quota.purgeErroredModalMessage') }}
- Purge
+ {{ $t('views.content.libraries.Quota.purgeButton') }}
diff --git a/front/src/views/content/remote/Card.vue b/front/src/views/content/remote/Card.vue
index ddb74f08d..1a99ee6d8 100644
--- a/front/src/views/content/remote/Card.vue
+++ b/front/src/views/content/remote/Card.vue
@@ -50,8 +50,8 @@ const radioPlayable = computed(() => (
const { t } = useI18n()
const labels = computed(() => ({
tooltips: {
- me: t('This library is private and your approval from its owner is needed to access its content'),
- everyone: t('This library is public and you can access its content freely')
+ me: t('views.content.remote.Card.privateTooltip'),
+ everyone: t('views.content.remote.Card.publicTooltip')
}
}))
@@ -65,8 +65,8 @@ const launchScan = async () => {
store.commit('ui/addMessage', {
date: new Date(),
content: response.data.status === 'skipped'
- ? t('Scan skipped (previous scan is too recent)')
- : t('Scan launched')
+ ? t('views.content.remote.Card.scanSkipped')
+ : t('views.content.remote.Card.scanLaunched')
})
} catch (error) {
useErrorHandler(error as Error)
@@ -82,8 +82,7 @@ const follow = async () => {
} catch (error) {
console.error(error)
store.commit('ui/addMessage', {
- // TODO (wvffle): Translate
- content: 'Cannot follow remote library: ' + error,
+ content: t('views.content.remote.Card.followError', { error }),
date: new Date()
})
}
@@ -100,8 +99,7 @@ const unfollow = async () => {
}
} catch (error) {
store.commit('ui/addMessage', {
- // TODO (wvffle): Translate
- content: 'Cannot unfollow remote library: ' + error,
+ content: t('views.content.remote.Card.unfollowError', { error }),
date: new Date()
})
}
@@ -193,14 +191,7 @@ watch(showScan, (shouldShow) => {
-
- %{ count } track
-
+ {{ $t('views.content.remote.Card.trackCount', {count: library.uploads_count}) }}
{
>
- Scan pending
+ {{ $t('views.content.remote.Card.scanPending') }}
-
- Scanning… (%{ progress }%)
-
+ {{ $t('views.content.remote.Card.scanProgress', {progress: scanProgress}) }}
- Problem during scanning
+ {{ $t('views.content.remote.Card.scanFailure') }}
- Scanned
+ {{ $t('views.content.remote.Card.scanSuccess') }}
- Scanned with errors
+ {{ $t('views.content.remote.Card.scanPartialSuccess') }}
- Details
+ {{ $t('views.content.remote.Card.scanDetails') }}
{
- Last update:
+ {{ $t('views.content.remote.Card.lastUpdate') }}
- Failed tracks: {{ latestScan.errored_files }}
+ {{ $t('views.content.remote.Card.failedTracks', {tracks: latestScan.errored_files}) }}
{
class="right floated link"
@click.prevent="launchScan"
>
- Scan now
+ {{ $t('views.content.remote.Card.scanNowButton') }}
@@ -278,7 +264,7 @@ watch(showScan, (shouldShow) => {
>
@@ -123,10 +118,10 @@ const deletePlaylist = async () => {
>
- Stop Editing
+ {{ $t('views.playlists.Detail.stopEditButton') }}
- Edit
+ {{ $t('views.playlists.Detail.editButton') }}
@@ -137,31 +132,28 @@ const deletePlaylist = async () => {
@click="showEmbedModal = !showEmbedModal"
>
- Embed
+ {{ $t('views.playlists.Detail.embedButton') }}
- Delete
+
+ {{ $t('views.playlists.Detail.deleteButton') }}
-
- Do you want to delete the playlist "%{ playlist }"?
+
+ {{ $t('views.playlists.Detail.deleteModalHeader', {playlist: playlist.name}) }}
- This will completely delete this playlist and cannot be undone.
+ {{ $t('views.playlists.Detail.deleteModalMessage') }}
- Delete playlist
+ {{ $t('views.playlists.Detail.deleteModalConfirm') }}
@@ -172,7 +164,7 @@ const deletePlaylist = async () => {
v-model:show="showEmbedModal"
>
@@ -184,7 +176,7 @@ const deletePlaylist = async () => {
@@ -199,7 +191,7 @@ const deletePlaylist = async () => {
- Tracks
+ {{ $t('views.playlists.Detail.tracksHeader') }}
{
>
diff --git a/front/src/views/playlists/List.vue b/front/src/views/playlists/List.vue
index 07bbd8e23..009c8e03e 100644
--- a/front/src/views/playlists/List.vue
+++ b/front/src/views/playlists/List.vue
@@ -97,8 +97,8 @@ onMounted(() => $('.ui.dropdown').dropdown())
const { t } = useI18n()
const labels = computed(() => ({
- playlists: t('Playlists'),
- searchPlaceholder: t('Enter playlist name…')
+ playlists: t('views.playlists.List.playlistsHeader'),
+ searchPlaceholder: t('views.playlists.List.searchPlaceholder')
}))
const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value].sort((a, b) => a - b)))
@@ -108,14 +108,14 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
@@ -125,7 +125,7 @@ const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value]
>
-
+
sortedUniq([12, 25, 50, paginateBy.value]
-
+
-
+
-
+
diff --git a/front/src/views/radios/Detail.vue b/front/src/views/radios/Detail.vue
index 0e7545c22..5ba6ea763 100644
--- a/front/src/views/radios/Detail.vue
+++ b/front/src/views/radios/Detail.vue
@@ -26,7 +26,7 @@ const page = ref(1)
const { t } = useI18n()
const labels = computed(() => ({
- title: t('Radio')
+ title: t('views.radios.Detail.title')
}))
const isLoading = ref(false)
@@ -82,8 +82,7 @@ const deleteRadio = async () => {
{{ radio.name }}
@@ -98,30 +97,26 @@ const deleteRadio = async () => {
:to="{name: 'library.radios.edit', params: {id: radio.id}}"
>
- Edit…
+ {{ $t('views.radios.Detail.editButton') }}
- Delete
+ {{ $t('views.radios.Detail.deleteButton') }}
-
- Do you want to delete the radio "%{ radio }"?
+
+ {{ $t('views.radios.Detail.deleteModalHeader', {radio: radio.name}) }}
- This will completely delete this radio and cannot be undone.
+ {{ $t('views.radios.Detail.deleteModalMessage') }}
- Delete radio
+ {{ $t('views.radios.Detail.deleteModalConfirm') }}
@@ -133,7 +128,7 @@ const deleteRadio = async () => {
class="ui vertical stripe segment"
>
- Tracks
+ {{ $t('views.radios.Detail.tracksHeader') }}
@@ -151,7 +146,7 @@ const deleteRadio = async () => {
>
{
:to="{name: 'library.radios.edit', params: { id: radio?.id }}"
>
- Edit…
+ {{ $t('views.radios.Detail.editButton') }}
|