Merge pull request 'main' (#3) from RemixDev/deemix-webui:main into main

Reviewed-on: https://codeberg.org/m3troux/deemix-webui/pulls/3
This commit is contained in:
m3troux 2020-08-04 15:42:33 +02:00
commit f4eb5b7d33
19 changed files with 1216 additions and 278 deletions

View File

@ -6,7 +6,9 @@ This is just the WebUI for deemix, it should be used with deemix-pyweb or someth
- Use Vue as much as possible - Use Vue as much as possible
- First step: rewrite the app in Single File Components way ✅ - First step: rewrite the app in Single File Components way ✅
- Second step: Implement custom contextmenu - Second step: Implement custom contextmenu ⚒
- Implemented a first version
- Need heavy testing and more features
- Third step: Implement routing for the whole app using Vue Router - Third step: Implement routing for the whole app using Vue Router
- Fourth step: Remove jQuery - Fourth step: Remove jQuery
- Make i18n async (https://kazupon.github.io/vue-i18n/guide/lazy-loading.html) - Make i18n async (https://kazupon.github.io/vue-i18n/guide/lazy-loading.html)

File diff suppressed because one or more lines are too long

View File

@ -7,6 +7,8 @@
<TheTrackPreview /> <TheTrackPreview />
<TheQualityModal /> <TheQualityModal />
<TheContextMenu />
</div> </div>
</template> </template>
@ -16,6 +18,7 @@ import TheMainContent from '@components/TheMainContent.vue'
import TheTrackPreview from '@components/TheTrackPreview.vue' import TheTrackPreview from '@components/TheTrackPreview.vue'
import TheQualityModal from '@components/TheQualityModal.vue' import TheQualityModal from '@components/TheQualityModal.vue'
import BaseLoadingPlaceholder from '@components/BaseLoadingPlaceholder.vue' import BaseLoadingPlaceholder from '@components/BaseLoadingPlaceholder.vue'
import TheContextMenu from '@components/TheContextMenu.vue'
export default { export default {
components: { components: {
@ -23,10 +26,8 @@ export default {
TheMainContent, TheMainContent,
TheTrackPreview, TheTrackPreview,
TheQualityModal, TheQualityModal,
BaseLoadingPlaceholder BaseLoadingPlaceholder,
TheContextMenu
} }
} }
</script> </script>
<style>
</style>

View File

@ -69,6 +69,7 @@
</i> </i>
</td> </td>
<td>{{ release.release_date }}</td> <td>{{ release.release_date }}</td>
<td>{{ release.nb_song }}</td>
<td <td
@click.stop="addToQueue" @click.stop="addToQueue"
@contextmenu.prevent="openQualityModal" @contextmenu.prevent="openQualityModal"
@ -169,6 +170,7 @@ export default {
this.head = [ this.head = [
{ title: this.$tc('globals.listTabs.title',1), sortKey: 'title' }, { title: this.$tc('globals.listTabs.title',1), sortKey: 'title' },
{ title: this.$t('globals.listTabs.releaseDate'), sortKey: 'release_date' }, { title: this.$t('globals.listTabs.releaseDate'), sortKey: 'release_date' },
{ title: this.$tc('globals.listTabs.track', 2), sortKey: 'nb_song' },
{ title: '', width: '32px' } { title: '', width: '32px' }
] ]
if (isEmpty(releases)) { if (isEmpty(releases)) {
@ -180,7 +182,12 @@ export default {
}, },
computed: { computed: {
showTable() { showTable() {
if (this.body) return orderBy(this.body[this.currentTab], this.sortKey, this.sortOrder) if (this.body){
if (this.sortKey=='nb_song')
return orderBy(this.body[this.currentTab], function (o) { return new Number(o.nb_song); }, this.sortOrder)
else
return orderBy(this.body[this.currentTab], this.sortKey, this.sortOrder)
}
else return [] else return []
} }
}, },

View File

@ -0,0 +1,228 @@
<template>
<div class="context-menu" v-show="menuOpen" ref="contextMenu" :style="{ top: yPos, left: xPos }">
<button
class="menu-option"
v-for="option of options"
:key="option.label"
v-show="option.show"
@click.prevent="option.action"
>
<span class="menu-option__text">{{ option.label }}</span>
</button>
</div>
</template>
<script>
export default {
data: () => ({
menuOpen: false,
xPos: 0,
yPos: 0,
currentHref: '',
options: [
{
label: 'Cut',
show: true,
// Use arrow functions to keep the Vue instance in 'this'
// Use normal functions to keep the object instance in 'this'
action: () => {
document.execCommand('Cut')
}
},
{
label: 'Copy',
show: true,
action: () => {
document.execCommand('Copy')
}
},
{
label: 'Copy Link',
show: false,
action: null
},
{
label: 'Copy Deezer Link',
show: false,
action: null
},
{
label: 'Paste',
show: true,
action: () => {
navigator.clipboard.readText().then(text => {
document.execCommand('insertText', undefined, text)
})
}
}
]
}),
mounted() {
document.body.addEventListener('contextmenu', this.showMenu)
document.body.addEventListener('click', () => {
// Finish all operations before closing (may be not necessary)
this.$nextTick().then(() => {
this.menuOpen = false
this.options[2].show = false
this.options[3].show = false
})
})
},
methods: {
showMenu(contextMenuEvent) {
contextMenuEvent.preventDefault()
const {
pageX,
pageY,
path,
path: [elementClicked]
} = contextMenuEvent
this.positionMenu(pageX, pageY)
// Show 'Copy Link' option
if (elementClicked.matches('a')) {
this.showCopyLink(elementClicked.href)
}
let link = null
for (let i = 0; i < path.length; i++) {
if (path[i] == document) break
if (path[i].matches('[data-link]')) {
link = path[i].dataset.link
break
}
}
// Show 'Copy Deezer Link' option
if (link) {
this.showCopyDeezerLink(link)
}
this.menuOpen = true
},
positionMenu(newX, newY) {
this.xPos = `${newX}px`
this.yPos = `${newY}px`
},
showCopyLink(href) {
this.options[2].show = true
this.options[2].action = () => {
navigator.clipboard.writeText(href).catch(err => {
console.error('Link copying failed', err)
})
}
},
showCopyDeezerLink(link) {
this.options[3].show = true
this.options[3].action = () => {
navigator.clipboard.writeText(link).catch(err => {
console.error('Download link copying failed', err)
})
}
}
}
}
</script>
<style lang="scss" scoped>
.context-menu {
position: absolute;
top: 0;
left: 0;
min-width: 100px;
background: var(--foreground-inverted);
border-radius: 7px;
box-shadow: 4px 10px 18px 0px hsla(0, 0%, 0%, 0.15);
z-index: 10000;
}
.menu-option {
display: flex;
align-items: center;
width: 100%;
height: 40px;
padding-left: 10px;
padding-right: 10px;
color: var(--foreground);
cursor: pointer;
&:first-child {
border-radius: 7px 7px 0 0;
}
&:last-child {
border-radius: 0 0 7px 7px;
}
&:hover {
background: var(--table-highlight);
filter: brightness(150%);
}
}
// Resetting buttons only for this component (because the style is scoped)
button {
color: var(--accent-text);
color: unset;
background-color: var(--accent-color);
background-color: unset;
min-width: unset;
position: unset;
border: unset;
border-radius: unset;
font-family: unset;
font-weight: unset;
font-size: unset;
padding: unset;
margin-right: unset;
height: unset;
text-transform: unset;
cursor: unset;
transition: unset;
&:focus {
outline: none;
}
&[disabled] {
background-color: unset;
color: unset;
opacity: unset;
}
&.selective {
background-color: unset;
color: unset;
&.active {
background-color: unset;
color: unset;
}
}
&.with_icon {
display: unset;
align-items: unset;
i {
margin-left: unset;
}
}
&:active {
background-color: unset;
transform: unset;
}
&:hover {
background: unset;
border: unset;
}
}
</style>

View File

@ -15,9 +15,6 @@ export default {
components: { components: {
TheMiddleSection, TheMiddleSection,
TheDownloadTab TheDownloadTab
},
mounted() {
console.log(this.$route)
} }
} }
</script> </script>

View File

@ -186,6 +186,7 @@
<select v-model="settings.overwriteFile"> <select v-model="settings.overwriteFile">
<option value="y">{{ $t('settings.downloads.overwriteFile.y') }}</option> <option value="y">{{ $t('settings.downloads.overwriteFile.y') }}</option>
<option value="n">{{ $t('settings.downloads.overwriteFile.n') }}</option> <option value="n">{{ $t('settings.downloads.overwriteFile.n') }}</option>
<option value="b">{{ $t('settings.downloads.overwriteFile.b') }}</option>
<option value="t">{{ $t('settings.downloads.overwriteFile.t') }}</option> <option value="t">{{ $t('settings.downloads.overwriteFile.t') }}</option>
</select> </select>
</div> </div>

View File

@ -293,7 +293,6 @@ export default {
} }
}, },
mounted() { mounted() {
console.log('tracklist mounted')
EventBus.$on('tracklistTab:reset', this.reset) EventBus.$on('tracklistTab:reset', this.reset)
EventBus.$on('tracklistTab:selectRow', this.selectRow) EventBus.$on('tracklistTab:selectRow', this.selectRow)

View File

@ -25,6 +25,8 @@ const en = {
playlist: 'playlist | playlists', playlist: 'playlist | playlists',
compile: 'compilation | compilations', compile: 'compilation | compilations',
ep: 'ep | eps', ep: 'ep | eps',
more: 'More albums',
featured: 'Featured in',
spotifyPlaylist: 'spotify playlist | spotify playlists', spotifyPlaylist: 'spotify playlist | spotify playlists',
releaseDate: 'release date', releaseDate: 'release date',
error: 'error' error: 'error'
@ -51,9 +53,9 @@ const en = {
officialWebuiRepo: 'Official WebUI Repository', officialWebuiRepo: 'Official WebUI Repository',
officialSubreddit: 'Official Subreddit', officialSubreddit: 'Official Subreddit',
newsChannel: 'News Channel', newsChannel: 'News Channel',
questions: `If you have questions or problems with the app, search for a solution in the <a href="https://www.reddit.com/r/deemix" target="_blank">subreddit</a> first. Then, if you don't find anything you can make a post with your issue on the subreddit.`, questions: `If you have questions or problems with the app, search for a solution on the <a href="https://www.reddit.com/r/deemix" target="_blank">subreddit</a> first. Then, if you don't find anything you can make a post with your issue on the subreddit.`,
beforeReporting: `Before reporting a bug make sure you're running the latest version of the app and that what you want to report is actually a bug and not something that's wrong only on your end.`, beforeReporting: `Before reporting a bug make sure you're running the latest version of the app and that what you want to report is actually a bug and not something that's wrong only on your end.`,
beSure: `Make sure the bug is reproducible on another machines and also <strong>DO NOT</strong> report a bug if it's been already reported.`, beSure: `Make sure the bug is reproducible on other machines and also <strong>DO NOT</strong> report a bug if it's already been reported.`,
duplicateReports: 'Duplicate bug reports will be closed, so keep an eye out on that.', duplicateReports: 'Duplicate bug reports will be closed, so keep an eye out on that.',
dontOpenIssues: `<strong>DO NOT</strong> open issues for asking questions, there is a subreddit for that.`, dontOpenIssues: `<strong>DO NOT</strong> open issues for asking questions, there is a subreddit for that.`,
newUI: `If you're fluent in python you could try to make a new UI for the app using the base library, or fix bugs in the library with a pull request on the <a href="https://codeberg.org/RemixDev/deemix" target="_blank">repo</a>.`, newUI: `If you're fluent in python you could try to make a new UI for the app using the base library, or fix bugs in the library with a pull request on the <a href="https://codeberg.org/RemixDev/deemix" target="_blank">repo</a>.`,
@ -63,7 +65,7 @@ const en = {
contributeWebUI: `If you know Vue.js (JavaScript), HTML or CSS you could contribute to the <a href="https://codeberg.org/RemixDev/deemix-webui" target="_blank">WebUI</a>.`, contributeWebUI: `If you know Vue.js (JavaScript), HTML or CSS you could contribute to the <a href="https://codeberg.org/RemixDev/deemix-webui" target="_blank">WebUI</a>.`,
itsFree: `You should remember that <strong>this is a free project</strong> and <strong>you should support the artists you love</strong> before supporting the developers.`, itsFree: `You should remember that <strong>this is a free project</strong> and <strong>you should support the artists you love</strong> before supporting the developers.`,
notObligated: `Don't feel obligated to donate, I appreciate you anyway!`, notObligated: `Don't feel obligated to donate, I appreciate you anyway!`,
lincensedUnder: `This work is licensed under a lincensedUnder: `This work is licensed under the
<a rel="license" href="https://www.gnu.org/licenses/gpl-3.0.en.html" target="_blank" <a rel="license" href="https://www.gnu.org/licenses/gpl-3.0.en.html" target="_blank"
>GNU General Public License 3.0</a >GNU General Public License 3.0</a
>.` >.`
@ -78,19 +80,19 @@ const en = {
ids: { ids: {
invalidURL: 'URL not recognized', invalidURL: 'URL not recognized',
unsupportedURL: 'URL not supported yet', unsupportedURL: 'URL not supported yet',
ISRCnotOnDeezer: 'Track ISRC is not available on deezer', ISRCnotOnDeezer: 'Track ISRC is not available on Deezer',
notYourPrivatePlaylist: "You can't download others private playlists.", notYourPrivatePlaylist: "You can't download others private playlists.",
spotifyDisabled: 'Spotify Features is not setted up correctly.', spotifyDisabled: 'Spotify Features is not setted up correctly.',
trackNotOnDeezer: 'Track not found on deezer!', trackNotOnDeezer: 'Track not found on Deezer!',
albumNotOnDeezer: 'Album not found on deezer!', albumNotOnDeezer: 'Album not found on Deezer!',
notOnDeezer: 'Track not available on Deezer!', notOnDeezer: 'Track not available on Deezer!',
notEncoded: 'Track not yet encoded!', notEncoded: 'Track not yet encoded!',
notEncodedNoAlternative: 'Track not yet encoded and no alternative found!', notEncodedNoAlternative: 'Track not yet encoded and no alternative found!',
wrongBitrate: 'Track not found at desired bitrate.', wrongBitrate: 'Track not found at desired bitrate.',
wrongBitrateNoAlternative: 'Track not found at desired bitrate and no alternative found!', wrongBitrateNoAlternative: 'Track not found at desired bitrate and no alternative found!',
no360RA: 'Track is not available in Reality Audio 360.', no360RA: 'Track is not available in Reality Audio 360.',
notAvailable: "Track not available on deezer's servers!", notAvailable: "Track not available on Deezer's servers!",
notAvailableNoAlternative: "Track not available on deezer's servers and no alternative found!" notAvailableNoAlternative: "Track not available on Deezer's servers and no alternative found!"
} }
}, },
favorites: { favorites: {
@ -109,7 +111,7 @@ const en = {
} }
}, },
linkAnalyzer: { linkAnalyzer: {
info: 'You can use this section to find out more information about the link you are trying to download.', info: 'You can use this section to find more information about the link you are trying to download.',
useful: useful:
"This is useful if you're trying to download some tracks that are not available in your country and want to know where they are available, for instance.", "This is useful if you're trying to download some tracks that are not available in your country and want to know where they are available, for instance.",
linkNotSupported: 'This link is not yet supported', linkNotSupported: 'This link is not yet supported',
@ -148,7 +150,7 @@ const en = {
finishDownload: '{0} finished downloading.', finishDownload: '{0} finished downloading.',
allDownloaded: 'All downloads completed!', allDownloaded: 'All downloads completed!',
refreshFavs: 'Refresh completed!', refreshFavs: 'Refresh completed!',
loggingIn: 'Logging in', loggingIn: 'Logging in...',
loggedIn: 'Logged in', loggedIn: 'Logged in',
alreadyLogged: 'Already logged in', alreadyLogged: 'Already logged in',
loginFailed: "Couldn't log in", loginFailed: "Couldn't log in",
@ -157,7 +159,7 @@ const en = {
currentItemCancelled: 'Current item cancelled.', currentItemCancelled: 'Current item cancelled.',
startAddingArtist: 'Adding {0} albums to queue', startAddingArtist: 'Adding {0} albums to queue',
finishAddingArtist: 'Added {0} albums to queue', finishAddingArtist: 'Added {0} albums to queue',
startConvertingSpotifyPlaylist: 'Converting spotify tracks to deezer tracks', startConvertingSpotifyPlaylist: 'Converting spotify tracks to Deezer tracks',
finishConvertingSpotifyPlaylist: 'Spotify playlist converted', finishConvertingSpotifyPlaylist: 'Spotify playlist converted',
loginNeededToDownload: 'You need to log in to download tracks!' loginNeededToDownload: 'You need to log in to download tracks!'
}, },
@ -217,7 +219,8 @@ const en = {
title: 'Should I overwrite the files?', title: 'Should I overwrite the files?',
y: 'Yes, overwrite the file', y: 'Yes, overwrite the file',
n: "No, don't overwrite the file", n: "No, don't overwrite the file",
t: 'Overwrite only the tags' t: 'Overwrite only the tags',
b: 'No, keep both files and add a number to the duplicate'
}, },
fallbackBitrate: 'Bitrate fallback', fallbackBitrate: 'Bitrate fallback',
fallbackSearch: 'Search fallback', fallbackSearch: 'Search fallback',
@ -316,9 +319,9 @@ const en = {
}, },
spotify: { spotify: {
title: 'Spotify Features', title: 'Spotify Features',
clientID: 'Spotify clientID', clientID: 'Spotify ClientID',
clientSecret: 'Spotify Client Secret', clientSecret: 'Spotify Client Secret',
username: 'Spotify username' username: 'Spotify Username'
}, },
reset: 'Reset to Default', reset: 'Reset to Default',
save: 'Save', save: 'Save',

View File

@ -9,8 +9,8 @@ const fr = {
download_hint: 'Télécharger', download_hint: 'Télécharger',
play_hint: 'Lire', play_hint: 'Lire',
toggle_download_tab_hint: 'Développer/Réduire', toggle_download_tab_hint: 'Développer/Réduire',
clean_queue_hint: 'Retirer les tâches terminées', clean_queue_hint: 'Retirer Les Tâches Terminées',
cancel_queue_hint: 'Tout annuler', cancel_queue_hint: 'Tout Annuler',
listTabs: { listTabs: {
empty: '', empty: '',
all: 'tout', all: 'tout',
@ -33,7 +33,7 @@ const fr = {
about: { about: {
titles: { titles: {
usefulLinks: 'Liens Utiles', usefulLinks: 'Liens Utiles',
bugReports: 'Rapports de Bug', bugReports: 'Rapports De Bug',
contributing: 'Contribution', contributing: 'Contribution',
donations: 'Dons', donations: 'Dons',
license: 'Licence' license: 'Licence'
@ -45,14 +45,14 @@ const fr = {
}, },
usesLibrary: usesLibrary:
'Cette application utilise la bibliothèque <strong>deemix</strong>, que vous pouvez exploiter afin de créer votre propre interface utilisateur pour deemix.', 'Cette application utilise la bibliothèque <strong>deemix</strong>, que vous pouvez exploiter afin de créer votre propre interface utilisateur pour deemix.',
thanks: "Merci à <strong>rtonno</strong>, <strong>uhwot</strong> et <strong>lollilol</strong> de m'avoir aidé dans ce projet ainsi qu\'à <strong>BasCurtiz</strong> et <strong>scarvimane</strong> pour avoir réalisé l'icône.", thanks: "Merci à <strong>rtonno</strong>, <strong>uhwot</strong> et <strong>lollilol</strong> de m'avoir aidé dans ce projet ainsi qu'à <strong>BasCurtiz</strong> et <strong>scarvimane</strong> pour avoir réalisé l'icône.",
upToDate: 'Restez informé des mises à jour en suivant le <a href="https://t.me/RemixDevNews" target="_blank">canal de nouveautés</a> sur Telegram.', upToDate: 'Restez informé des mises à jour en suivant le <a href="https://t.me/RemixDevNews" target="_blank">canal de nouveautés</a> sur Telegram.',
officialWebsite: 'Site Officiel', officialWebsite: 'Site Officiel',
officialRepo: 'Répertoire de dépôt officiel de la bibiliothèque', officialRepo: 'Répertoire De Dépôt Officiel De La Bibiliothèque',
officialWebuiRepo: 'Répertoire de dépôt officiel de la WebUI', officialWebuiRepo: 'Répertoire De Dépôt Officiel De La WebUI',
officialSubreddit: 'Subreddit officiel', officialSubreddit: 'Subreddit Officiel',
newsChannel: 'Canal de nouveautés', newsChannel: 'Canal De Nouveautés',
questions: `Si vous avez des questions ou des problèmes avec l'application, cherchez d'abord une solution dans le <a href="https://www.reddit.com/r/deemix" target="_blank">subreddit</a>. Ensuite, si vous ne trouvez rien, vous pouvez publier un message avec votre problème sur le subreddit.`, questions: `Si vous avez des questions ou des problèmes avec l'application, cherchez d'abord une solution dans le <a href="https://www.reddit.com/r/deemix" target="_blank">subreddit</a>. Ensuite, si vous ne trouvez rien, vous pouvez publier un message avec votre problème dans le subreddit.`,
beforeReporting: "Avant de signaler un bug, assurez-vous que vous exécutez la dernière version de l'application et que ce que vous voulez signaler est bien un bug et non quelque chose qui ne va pas de votre côté.", beforeReporting: "Avant de signaler un bug, assurez-vous que vous exécutez la dernière version de l'application et que ce que vous voulez signaler est bien un bug et non quelque chose qui ne va pas de votre côté.",
beSure: "Assurez-vous que le bug est reproductible sur d'autres machines et aussi de <strong>NE PAS</strong> signaler un bug si celui-ci a déjà été mentionné.", beSure: "Assurez-vous que le bug est reproductible sur d'autres machines et aussi de <strong>NE PAS</strong> signaler un bug si celui-ci a déjà été mentionné.",
duplicateReports: 'Les doublons de rapports de bug seront supprimés, alors gardez un œil sur cela.', duplicateReports: 'Les doublons de rapports de bug seront supprimés, alors gardez un œil sur cela.',
@ -60,7 +60,7 @@ const fr = {
newUI: `Si vous maîtrisez python, vous pouvez essayer de créer une nouvelle interface utilisateur pour l'application à l'aide de la bibliothèque de base, ou corriger des bugs dans la bibliothèque avec une requête sur le <a href="https://codeberg.org/RemixDev/deemix" target="_blank">répertoire de dépôt</a>.`, newUI: `Si vous maîtrisez python, vous pouvez essayer de créer une nouvelle interface utilisateur pour l'application à l'aide de la bibliothèque de base, ou corriger des bugs dans la bibliothèque avec une requête sur le <a href="https://codeberg.org/RemixDev/deemix" target="_blank">répertoire de dépôt</a>.`,
acceptFeatures: "J'accepte également les fonctionnalités, mais pas de choses complexes, car elles peuvent être implémentées directement dans l'application et non dans la bibliothèque.", acceptFeatures: "J'accepte également les fonctionnalités, mais pas de choses complexes, car elles peuvent être implémentées directement dans l'application et non dans la bibliothèque.",
otherLanguages: "Si vous maîtrisez un autre langage de programmation, vous pouvez essayer de transposer deemix dans d'autres langages de programmation !", otherLanguages: "Si vous maîtrisez un autre langage de programmation, vous pouvez essayer de transposer deemix dans d'autres langages de programmation !",
understandingCode: "Vous avez besoin d'aide pour comprendre le code ? Contactez simplement RemixDev sur Telegram ou Reddit.", understandingCode: "Vous avez besoin d'aide pour comprendre le code ? Il suffit de contacter RemixDev sur Telegram ou Reddit.",
contributeWebUI: `Si vous vous y connaissez en Vue.js (JavaScript), HTML ou CSS vous pouvez contribuer à la <a href="https://codeberg.org/RemixDev/deemix-webui" target="_blank">WebUI</a>.`, contributeWebUI: `Si vous vous y connaissez en Vue.js (JavaScript), HTML ou CSS vous pouvez contribuer à la <a href="https://codeberg.org/RemixDev/deemix-webui" target="_blank">WebUI</a>.`,
itsFree: "N'oubliez pas que <strong>ceci est un projet gratuit</strong> et que <strong>vous devez soutenir les artistes que vous appréciez</strong> avant de supporter les développeurs.", itsFree: "N'oubliez pas que <strong>ceci est un projet gratuit</strong> et que <strong>vous devez soutenir les artistes que vous appréciez</strong> avant de supporter les développeurs.",
notObligated: "Ne vous sentez pas obligé de faire un don, je vous apprécie quand même !", notObligated: "Ne vous sentez pas obligé de faire un don, je vous apprécie quand même !",
@ -70,15 +70,15 @@ const fr = {
}, },
charts: { charts: {
title: 'Hit-Parade', title: 'Hit-Parade',
changeCountry: 'Changer de Pays', changeCountry: 'Changer De Pays',
download: 'Télécharger le Hit-Parade' download: 'Télécharger Le Hit-Parade'
}, },
errors: { errors: {
title: 'Erreurs pour {0}', title: 'Erreurs pour {0}',
ids: { ids: {
invalidURL: "Cette URL n'est pas reconnue", invalidURL: "Cette URL n'est pas reconnue",
unsupportedURL: "Cette URL n'est pas supportée actuellement", unsupportedURL: "Cette URL n'est pas supportée actuellement",
ISRCnotOnDeezer: "L'ISRC de la piste n'est pas disponible sur Deezer", ISRCnotOnDeezer: "L'ISRC de la piste est indisponible sur Deezer",
notYourPrivatePlaylist: "Vous ne pouvez pas télécharger les playlists privées de quelqu'un d'autre.", notYourPrivatePlaylist: "Vous ne pouvez pas télécharger les playlists privées de quelqu'un d'autre.",
spotifyDisabled: 'Les Fonctionnalités Spotify ne sont pas configurées correctement.', spotifyDisabled: 'Les Fonctionnalités Spotify ne sont pas configurées correctement.',
trackNotOnDeezer: 'La piste est introuvable sur Deezer !', trackNotOnDeezer: 'La piste est introuvable sur Deezer !',
@ -88,21 +88,21 @@ const fr = {
notEncodedNoAlternative: "La piste n'a pas encore été encodée et aucune alternative n'a été trouvée !", notEncodedNoAlternative: "La piste n'a pas encore été encodée et aucune alternative n'a été trouvée !",
wrongBitrate: 'La piste est introuvable au débit souhaité.', wrongBitrate: 'La piste est introuvable au débit souhaité.',
wrongBitrateNoAlternative: "La piste est introuvable au débit souhaité et aucune alternative n'a été trouvée !", wrongBitrateNoAlternative: "La piste est introuvable au débit souhaité et aucune alternative n'a été trouvée !",
no360RA: "La piste n'est pas disponible au format Reality Audio 360.", no360RA: 'La piste est indisponible au format Reality Audio 360.',
notAvailable: 'La piste est indisponible sur les serveurs de Deezer !', notAvailable: 'La piste est indisponible sur les serveurs de Deezer !',
notAvailableNoAlternative: "La piste est indisponible sur les serveurs de Deezer et aucune alternative n'a été trouvée !" notAvailableNoAlternative: "La piste est indisponible sur les serveurs de Deezer et aucune alternative n'a été trouvée !"
} }
}, },
favorites: { favorites: {
title: 'Favoris', title: 'Favoris',
noPlaylists: "Aucune playlist n'a été trouvée", noPlaylists: "Aucune Playlist n'a été trouvée",
noAlbums: "Aucun album favori n'a été trouvé", noAlbums: "Aucun Album Favori n'a été trouvé",
noArtists: "Aucun artiste favori n'a été trouvé", noArtists: "Aucun Artiste Favori n'a été trouvé",
noTracks: "Aucune piste favorite n'a été trouvée" noTracks: "Aucune Piste Favorite n'a été trouvée"
}, },
home: { home: {
needTologin: 'Vous devez vous connecter à votre compte Deezer avant de pouvoir commencer le téléchargement.', needTologin: 'Vous devez vous connecter à votre compte Deezer avant de pouvoir commencer les téléchargements.',
openSettings: 'Ouvrir les paramètres', openSettings: 'Ouvrir Les Paramètres',
sections: { sections: {
popularPlaylists: 'Playlists populaires', popularPlaylists: 'Playlists populaires',
popularAlbums: 'Albums les plus diffusés' popularAlbums: 'Albums les plus diffusés'
@ -120,20 +120,20 @@ const fr = {
isrc: 'ISRC', isrc: 'ISRC',
upc: 'UPC', upc: 'UPC',
duration: 'Durée', duration: 'Durée',
diskNumber: 'Numéro de disque', diskNumber: 'Numéro De Disque',
trackNumber: 'Numéro de disque', trackNumber: 'Numéro De Disque',
releaseDate: 'Date de parution', releaseDate: 'Date De Parution',
bpm: 'BPM', bpm: 'BPM',
label: 'Label', label: 'Label',
recordType: "Type d'enregistrement", recordType: "Type d'Enregistrement",
genres: 'Genres', genres: 'Genres',
tracklist: 'Liste des pistes' tracklist: 'Liste Des Pistes'
} }
}, },
search: { search: {
startSearching: 'Commencer une recherche !', startSearching: 'Commencer une recherche !',
description: description:
'Vous pouvez rechercher une piste, un album entier, un artiste, une playlist.... tout ! Vous pouvez également copier-coller un lien Deezer', 'Vous pouvez rechercher une piste, un album entier, un artiste, une playlist... tout ! Vous pouvez également copier-coller un lien Deezer',
fans: '{0} fans', fans: '{0} fans',
noResults: 'Aucun résultat', noResults: 'Aucun résultat',
noResultsTrack: "Aucune piste n'a été trouvée", noResultsTrack: "Aucune piste n'a été trouvée",
@ -141,7 +141,7 @@ const fr = {
noResultsArtist: "Aucun artiste n'a été trouvé", noResultsArtist: "Aucun artiste n'a été trouvé",
noResultsPlaylist: "Aucune playlist n'a été trouvée" noResultsPlaylist: "Aucune playlist n'a été trouvée"
}, },
searchbar: 'Recherchez tout ce que vous voulez (ou copier-collez simplement un lien)', searchbar: 'Recherchez tout ce que vous voulez (ou copiez-collez simplement un lien)',
downloads: 'téléchargements', downloads: 'téléchargements',
toasts: { toasts: {
addedToQueue: "{0} ajouté à la file d'attente", addedToQueue: "{0} ajouté à la file d'attente",
@ -149,7 +149,7 @@ const fr = {
finishDownload: '{0} a été téléchargé.', finishDownload: '{0} a été téléchargé.',
allDownloaded: 'Tous les téléchargements sont terminés !', allDownloaded: 'Tous les téléchargements sont terminés !',
refreshFavs: 'Actualisation terminée !', refreshFavs: 'Actualisation terminée !',
loggingIn: 'Connexion', loggingIn: 'Connexion...',
loggedIn: 'Connecté', loggedIn: 'Connecté',
alreadyLogged: 'Déjà connecté', alreadyLogged: 'Déjà connecté',
loginFailed: 'Connexion impossible', loginFailed: 'Connexion impossible',
@ -178,7 +178,7 @@ const fr = {
slimDownloadTab: 'Onglet de téléchargement plus petit' slimDownloadTab: 'Onglet de téléchargement plus petit'
}, },
downloadPath: { downloadPath: {
title: 'Emplacement de téléchargement' title: 'Emplacement De Téléchargement'
}, },
templates: { templates: {
title: 'Gabarits', title: 'Gabarits',
@ -200,15 +200,15 @@ const fr = {
}, },
trackTitles: { trackTitles: {
title: 'Titres de pistes', title: 'Titres de pistes',
padTracks: 'Pad tracks', padTracks: "Longueur uniforme des numéros de piste (ajoute automatiquement des zéros devant le numéro initial de la piste)",
paddingSize: 'Écraser la taille du remplissage', paddingSize: 'Nombre de zéros à ajouter en permanance devant le numéro initial de la piste',
illegalCharacterReplacer: 'Remplacement de caractère inapproprié' illegalCharacterReplacer: 'Remplacement de caractère inapproprié'
}, },
downloads: { downloads: {
title: 'Téléchargements', title: 'Téléchargements',
queueConcurrency: 'Téléchargements Simultanés', queueConcurrency: 'Téléchargements Simultanés',
maxBitrate: { maxBitrate: {
title: 'Débit préféré', title: 'Débit Préféré',
9: 'FLAC 1411kbps', 9: 'FLAC 1411kbps',
3: 'MP3 320kbps', 3: 'MP3 320kbps',
1: 'MP3 128kbps' 1: 'MP3 128kbps'
@ -216,21 +216,22 @@ const fr = {
overwriteFile: { overwriteFile: {
title: 'Dois-je écraser les fichiers ?', title: 'Dois-je écraser les fichiers ?',
y: 'Oui, écraser le fichier', y: 'Oui, écraser le fichier',
n: "Non, ne pas écraser le fichier", n: 'Non, ne pas écraser le fichier',
t: 'Écraser uniquement les métadonnées' t: 'Écraser uniquement les métadonnées',
b: 'Non, conserver les deux fichiers et ajouter un numéro au doublon'
}, },
fallbackBitrate: 'Débits plus faibles', fallbackBitrate: 'Recours aux débits plus faibles',
fallbackSearch: 'Rechercher un débit plus faible', fallbackSearch: 'Rechercher un débit plus faible',
logErrors: "Créer un fichier journal d'erreurs", logErrors: "Créer un fichier journal d'erreurs",
logSearched: 'Créer un fichier journal des pistes recherchées', logSearched: 'Créer un fichier journal des pistes recherchées',
createM3U8File: 'Créer un fichier de playlist', createM3U8File: 'Créer un fichier de playlist',
syncedLyrics: 'Créer des fichiers .lyr (Paroles Synchronisées)', syncedLyrics: 'Créer des fichiers .lyr (Paroles Synchronisées)',
playlistFilenameTemplate: 'Gabarit du nom de fichier de la playlist', playlistFilenameTemplate: 'Gabarit du nom de fichier de la playlist',
saveDownloadQueue: "Enregistrer la file d'attente de téléchargement lors de la fermeture de l'application" saveDownloadQueue: "Enregistrer la file d'attente de téléchargement à la fermeture de l'application"
}, },
covers: { covers: {
title: "Pochettes d'albums", title: "Pochettes d'albums",
saveArtwork: 'Enregistrer les pochettes', saveArtwork: 'Enregistrer Les Pochettes',
coverImageTemplate: 'Gabarit pour le nom de la pochette', coverImageTemplate: 'Gabarit pour le nom de la pochette',
saveArtworkArtist: "Enregistrer l'image de l'artiste", saveArtworkArtist: "Enregistrer l'image de l'artiste",
artistImageTemplate: "Gabarit pour le nom de l'image de l'artiste", artistImageTemplate: "Gabarit pour le nom de l'image de l'artiste",
@ -249,32 +250,32 @@ const fr = {
title: 'Titre', title: 'Titre',
artist: 'Artiste', artist: 'Artiste',
album: 'Album', album: 'Album',
cover: 'Reprise', cover: 'Pochette',
trackNumber: 'Numéro de piste', trackNumber: 'Numéro De Piste',
trackTotal: 'Nombre de pistes', trackTotal: 'Nombre De Pistes',
discNumber: 'Numéro du disque', discNumber: 'Numéro Du Disque',
discTotal: 'Nombre de disques', discTotal: 'Nombre De Disques',
albumArtist: "Artiste de l'album", albumArtist: "Artiste De l'Album",
genre: 'Genre', genre: 'Genre',
year: 'Année', year: 'Année',
date: 'Date', date: 'Date',
explicit: 'Paroles Explicites', explicit: 'Paroles Explicites',
isrc: 'ISRC', isrc: 'ISRC',
length: 'Longueur de la piste', length: 'Longueur De La Piste',
barcode: "Code-barres de l'album (UPC)", barcode: "Code-Barres De l'Album (UPC)",
bpm: 'BPM', bpm: 'BPM',
replayGain: 'Gain en Relecture (Replay Gain)', replayGain: 'Gain En Relecture (Replay Gain)',
label: "Label de l'album", label: "Label De l'Album",
lyrics: 'Paroles non-synchronisées', lyrics: 'Paroles Non-Synchronisées',
copyright: "Droits d'auteur (copyright)", copyright: "Droits d'Auteur (Copyright)",
composer: 'Compositeur', composer: 'Compositeur',
involvedPeople: 'Personnes impliquées' involvedPeople: 'Personnes Impliquées'
}, },
other: { other: {
title: 'Autre', title: 'Autre',
savePlaylistAsCompilation: 'Enregistrer les playlists en tant que compilation', savePlaylistAsCompilation: 'Enregistrer les playlists en tant que compilation',
useNullSeparator: 'Utiliser un séparateur nul', useNullSeparator: 'Utiliser un séparateur nul',
saveID3v1: "Enregistrez l'ID3v1 également", saveID3v1: 'Enregistrer également les métadonnées ID3v1',
multiArtistSeparator: { multiArtistSeparator: {
title: 'Comment aimeriez-vous séparer les artistes ?', title: 'Comment aimeriez-vous séparer les artistes ?',
nothing: "Enregistrer uniquement l'artiste principal", nothing: "Enregistrer uniquement l'artiste principal",
@ -283,7 +284,7 @@ const fr = {
using: 'En utilisant "{0}"' using: 'En utilisant "{0}"'
}, },
singleAlbumArtist: "Enregistrer uniquement l'artiste principal de l'album", singleAlbumArtist: "Enregistrer uniquement l'artiste principal de l'album",
albumVariousArtists: `Conserver "Various Artists" dans les artistes de l'album`, albumVariousArtists: `Conserver "Various Artists" dans les Artistes de l'Album`,
removeAlbumVersion: `Supprimer "Album Version" du titre de la piste`, removeAlbumVersion: `Supprimer "Album Version" du titre de la piste`,
removeDuplicateArtists: "Supprimer les combinaisons d'artistes", removeDuplicateArtists: "Supprimer les combinaisons d'artistes",
dateFormat: { dateFormat: {

346
src/lang/hr.js Normal file
View File

@ -0,0 +1,346 @@
const hr = {
globals: {
welcome: 'Dobrodošli u deemix',
back: 'nazad',
loading: 'učitavanje',
download: 'Preuzmi {0}',
by: 'by {0}',
in: 'u {0}',
download_hint: 'Preuzmi',
play_hint: 'Play',
toggle_download_tab_hint: 'Proširi/Smanji',
clean_queue_hint: 'Čišćenje završeno',
cancel_queue_hint: 'Zaustavi sve',
listTabs: {
empty: '',
all: 'sve',
top_result: 'Najbolji rezultat',
album: 'album | albumi',
artist: 'izvođač | izvođači',
single: 'singl | singlovi',
title: 'naslov | naslovi',
track: 'pjesma | pjesme',
trackN: '0 pjesmi | {n} pjesma | {n} pjesme',
releaseN: '0 izdanja | {n} izdanje | {n} izdanja',
playlist: 'playlista | playliste',
compile: 'kompilacija | kompilacije',
ep: 'ep | eps',
spotifyPlaylist: 'spotify playlista | spotify playliste',
releaseDate: 'datum izdavanja',
error: 'greška'
}
},
about: {
titles: {
usefulLinks: 'Korisne poveznice',
bugReports: 'Prijave grešaka',
contributing: 'Doprinosi',
donations: 'Donacije',
license: 'Licenca'
},
subtitles: {
bugReports: "Postoji nešto što ne radi u deemixu? Reci nam!",
contributing: 'Želiš doprinijeti ovom projektu? Možeš i to čak u više načina!',
donations: 'Želiš doprijeniti odmah? Možeš donirati!'
},
usesLibrary: 'Ova aplikacija koristi <strong>deemix</strong> biblioteku, koju možeš koristiti i ti kako bi napravio svoj UI za demix.',
thanks: `Hvala <strong>rtonno</strong>, <strong>uhwot</strong> i <strong>lollilol</strong> što su mi pomogli s ovim projektom te <strong>BasCurtiz</strong> i <strong>scarvimane</strong> što su napravili ikonu.`,
upToDate: `Ostani u tijeku s nadogradnjama prateći <a href="https://t.me/RemixDevNews" target="_blank">kanal s novostima</a> na Telegramu.`,
officialWebsite: 'Službena web stranica',
officialRepo: 'Službeni repozitorij biblioteke',
officialWebuiRepo: 'Službeni WebUI repozitorij',
officialSubreddit: 'Službeni subreddit',
newsChannel: 'Kanal s novostima',
questions: `Ukoliko imate pitanja o aplikaciji, prvo potražite riješenje na <a href="https://www.reddit.com/r/deemix" target="_blank">subreddit</a>. Tada, ako ne pronađete ništa, možete objaviti svoj problem na subredditu.`,
beforeReporting: `Prije prijavljivanja greške provjerite imate li instaliranu zadnju verziju aplikacije i da to što želite prijaviti je ustvari pogreška, a ne nešto što samo vama ne radi.`,
beSure: `Provjerite može li se pogreška reproducirati i na drugim uređajima i također <strong>NEMOJTE</strong> prijavljivati grešku ako je već prijavljena.`,
duplicateReports: 'Duplicirane prijave o greški bit će zatvorene, tako da pripazite na to.',
dontOpenIssues: `<strong>NEMOJTE</strong> otvarati issue za postavljanje pitanja, za to postoji subreddit.`,
newUI: `Ako ste vješti u pythonu možete probati napraviti novi UI za aplikaciju koristeći osnovnu biblioteku ili ispraviti pogrešku u biblioteci sa pull zahtjevom na <a href="https://codeberg.org/RemixDev/deemix" target="_blank">repozitoriju</a>.`,
acceptFeatures: `Prihavaćam i značajke, ali bez kompleksnih stvari, jer one mogu biti implementirane direktno u aplikaciji, a ne u biblioteci.`,
otherLanguages: `Ako ste vješti u drugom programskom jezikumožete probati portati deemix u drugi programski jezik!`,
understandingCode: `Trebate pomoć s razumijevanjem koda? Samo potraži RemixDev na Telegramu ili Redditu.`,
contributeWebUI: `Ako znaš Vue.js (JavaScript), HTML ili CSS možete doprinijeti za <a href="https://codeberg.org/RemixDev/deemix-webui" target="_blank">WebUI</a>.`,
itsFree: `Trebate zapamtiti da je ovo <strong>besplatni projekt</strong> i <strong>trebali biste podržati autore koje volite</strong> prije podržavanja developera.`,
notObligated: `Nemojte se osjećati obveznim darivati, svejedno vas cijenim!`,
lincensedUnder: `Ovaj rad licenciran je unutar
<a rel="license" href="https://www.gnu.org/licenses/gpl-3.0.en.html" target="_blank"
>GNU General Public License 3.0</a
>.`
},
charts: {
title: 'Ljestvice',
changeCountry: 'Promijeni državu',
download: 'Preuzmi ljestvicu'
},
errors: {
title: 'Greške za {0}',
ids: {
invalidURL: 'URL nije prepoznat',
unsupportedURL: 'URL još nije podržan',
ISRCnotOnDeezer: 'Zapis ISRC još nije podržan na Deezeru',
notYourPrivatePlaylist: "Ne možete preuzeti tuđe privatne playliste.",
spotifyDisabled: 'Spotify značajke nisu podešene ispravno.',
trackNotOnDeezer: 'Pjesma nije pronađena na Deezeru!',
albumNotOnDeezer: 'Album nije pronađen na Deezeru!',
notOnDeezer: 'Pjesma nije dostupna na Deezeru!',
notEncoded: 'Pjesma još nije enkodirana!',
notEncodedNoAlternative: 'Pjesma još nije enkodirana i nije pronađena alternativa!',
wrongBitrate: 'Pjesma nije pronađena u željenom bitrateu.',
wrongBitrateNoAlternative: 'Pjesma nije pronađena u željenom bitrateu i nije pronađena alternativa!',
no360RA: 'Pjesma nije dostupna u Reality Audio 360.',
notAvailable: "Pjesma nije dostupna na Deezerovim serverima!",
notAvailableNoAlternative: "Pjesma nije dostupna na Deezerovim serverima i alternativa nije pronađena!"
}
},
favorites: {
title: 'Favoriti',
noPlaylists: 'Nisu pronađene playliste',
noAlbums: 'Omiljeni albumi nisu pronađeni',
noArtists: 'Omiljeni glazbenici nisu pronađeni',
noTracks: 'Omiljene pjesme nisu pronađene'
},
home: {
needTologin: 'Trebate se prijaviti sa svojim Deezer računom kako biste mogli početi preuzimati pjesme.',
openSettings: 'Otvori postavke',
sections: {
popularPlaylists: 'Popularne playliste',
popularAlbums: 'Najpreslušaniji album'
}
},
linkAnalyzer: {
info: 'Ovu sekciju možete koristiti kako biste saznali više informacija o linku koji pokušavate preuzeti.',
useful:
"Ovo je korisno ako pokušavate preuzeti pjesme koje još nisu dostupne u vašoj zemlji i želite, na primjer, znati gdje su dostupne.",
linkNotSupported: 'Ovaj link još nije podržan',
linkNotSupportedYet: 'Čini se da ovaj link još nije podržan, pokušaj analizirati neki drugi.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Trajanje',
diskNumber: 'Broj diska',
trackNumber: 'Broj pjesme',
releaseDate: 'Datum izadavanja',
bpm: 'BPM',
label: 'Izdavačka kuća',
recordType: 'Vrsta zapisa',
genres: 'Žanrovi',
tracklist: 'Popis pjesama'
}
},
search: {
startSearching: 'Počni pretraživati!',
description:
'Možete pretražiti pjesmu, cijeli album, izvođača, playlistu... sve! Također, možete i zalijepiti Deezer link',
fans: '{0} obožavatelja',
noResults: 'Nema rezultata',
noResultsTrack: 'Pjesme nisu pronađene',
noResultsAlbum: 'Albumi nisu pronađeni',
noResultsArtist: 'Izvođači nisu pronađeni',
noResultsPlaylist: 'Playliste nisu pronađene'
},
searchbar: 'Pretraži bilo što (ili samo zalijepi link)',
downloads: 'preuzimanja',
toasts: {
addedToQueue: '{0} dodan u red',
alreadyInQueue: '{0} je već u redu!',
finishDownload: '{0} završeno preuzimanje.',
allDownloaded: 'Sva preuzimanja završena!',
refreshFavs: 'Osvježavanje završeno!',
loggingIn: 'Prijavljivanje...',
loggedIn: 'Prijavljeni',
alreadyLogged: 'Već prijavljeni',
loginFailed: "Prijava nije bila moguća",
loggedOut: 'Odjavljeni',
cancellingCurrentItem: 'Otkazujem trenutnu stavku.',
currentItemCancelled: 'Trenutna stavka otkazana.',
startAddingArtist: 'Dodajem {0} album u red',
finishAddingArtist: 'Dodan {0} album u red',
startConvertingSpotifyPlaylist: 'Pretvaram Spotify pjesme u Deezer pjesme',
finishConvertingSpotifyPlaylist: 'Spotify playlista pretvorena',
loginNeededToDownload: 'Trebate se prijaviti kako bi preuzeli pjesme!'
},
settings: {
title: 'Postavke',
languages: 'Jezici',
login: {
title: 'Prijava',
loggedIn: 'Prijavljeni ste kao {username}',
arl: {
question: 'Kako da dobijem svoj ARL?',
update: 'Ažuriraj ARL'
},
logout: 'Odjavi se'
},
appearance: {
title: 'Izgled',
slimDownloadTab: 'Tanka kartica za preuzimanje'
},
downloadPath: {
title: 'Putanja za preuzimanja'
},
templates: {
title: 'Predlošci',
tracknameTemplate: 'Naziv pjesme predložak',
albumTracknameTemplate: 'Pjesma albuma predložak',
playlistTracknameTemplate: 'Pjesma playliste predložak'
},
folders: {
title: 'Mape',
createPlaylistFolder: 'Izradi mapu za playliste',
playlistNameTemplate: 'Mapa za playliste predložak',
createArtistFolder: 'Izradi mapu za izvođača',
artistNameTemplate: 'Izvođač mapa predložak',
createAlbumFolder: 'Izradi mapu za album',
albumNameTemplate: 'Album mapa predložak',
createCDFolder: 'Izradi mapu za CD',
createStructurePlaylist: 'Strkturiraj mape za playliste',
createSingleFolder: 'Strukturiraj mape za singlove'
},
trackTitles: {
title: 'Naslovi pjesama',
padTracks: 'Pad tracks',
paddingSize: 'Prepiši veličinu paddinga',
illegalCharacterReplacer: 'Zamjena za nedozvoljeni znak'
},
downloads: {
title: 'Preuzimanja',
queueConcurrency: 'Istovremena preuzimanja',
maxBitrate: {
title: 'Željeni bitrate',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Trebam li prepisati datoteke?',
y: 'Da, prepiši datoteke',
n: "Ne, nemoj prepisati datoteke",
t: 'Prepiši samo oznake',
b: 'Ne, zadrži obje datoteke i dodaj broj duplikatu'
},
fallbackBitrate: 'Bitrate fallback',
fallbackSearch: 'Pretraživanje fallback',
logErrors: 'Izradi zapisnik datoteku za greške',
logSearched: 'Izradi zapisnik datoteku za pretražene pjesme',
createM3U8File: 'Izradi playlist datoteku',
syncedLyrics: 'Izradi .lyr datoteke (sinkronizirani lyrics)',
playlistFilenameTemplate: 'Naziv playliste predložak',
saveDownloadQueue: 'Spremi red za preuzimanje prilikom zatvaranja aplikacije'
},
covers: {
title: 'Omoti albuma',
saveArtwork: 'Spremi omote',
coverImageTemplate: 'Naziv omota predložak',
saveArtworkArtist: 'Spremi sliku izvođača',
artistImageTemplate: 'Slika izvođača predložak',
localArtworkSize: 'Veličina lokalnog omota',
embeddedArtworkSize: 'Veličina ugrađenog omota',
localArtworkFormat: {
title: 'U kojem formatu želite lokalni omot?',
jpg: 'Jpeg slika',
png: 'Png slika',
both: 'I jpeg i png'
},
jpegImageQuality: 'JPEG kvaliteta slike'
},
tags: {
head: 'Koja oznake spremam',
title: 'Naslovi',
artist: 'Izvođač',
album: 'Album',
cover: 'Omot',
trackNumber: 'Broj pjesme',
trackTotal: 'Ukupno pjesama',
discNumber: 'Broj diska',
discTotal: 'Ukupno diskova',
albumArtist: 'Izvođač albuma',
genre: 'Žanr',
year: 'Godina',
date: 'Datum',
explicit: 'Eksplicitni lyrics',
isrc: 'ISRC',
length: 'Dužina pjesme',
barcode: 'Album barkod (UPC)',
bpm: 'BPM',
replayGain: 'Replay Gain',
label: 'Izdavačka kuća albuma',
lyrics: 'Nesinkronizirani lyrics',
copyright: 'Autorska prava',
composer: 'Skladatelj',
involvedPeople: 'Uključeni ljudi'
},
other: {
title: 'Ostalo',
savePlaylistAsCompilation: 'Spremi playliste kao kompilacije',
useNullSeparator: 'Koristi null razdvojnik',
saveID3v1: 'Spremi i ID3v1 također',
multiArtistSeparator: {
title: 'Kako biste željeli razdvojiti izvođače?',
nothing: 'Spremi samo glavnog izvođača',
default: 'Koristeći standardnu specifikaciju',
andFeat: 'Koristeći & i feat.',
using: 'Koristeći "{0}"'
},
singleAlbumArtist: 'Spremi samo izvođača glavnog albuma',
albumVariousArtists: 'Zadrži "Various Artists" u Izvođačima albuma',
removeAlbumVersion: 'Izbriši "Album Version" iz naziva pjesme',
removeDuplicateArtists: 'Izbriši kombinacije izvođača',
dateFormat: {
title: 'Format datuma za FLAC datoteke',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'Što trebam napraviti s istaknutim izvođačima? (feat. i ft.)',
0: 'Ništa',
1: 'Izbriši ih iz naziva',
3: 'Izbriši ih iz naziva i iz naziva albuma',
2: 'Premjesti ih u naziv'
},
titleCasing: 'Veličina slova naslova',
artistCasing: 'Veličina slova izvođača',
casing: {
nothing: 'Zadrži nepromijenjeno',
lower: 'sve malo',
upper: 'sve VELIKO',
start: 'Početak Svake Riječi',
sentence: 'Kao rečenica'
},
previewVolume: 'Volumen pregleda',
executeCommand: {
title: 'Naredba za izvršenje nakon preuzimanja',
description: 'Ostavi prazno za bez akcije'
}
},
spotify: {
title: 'Spotify značajke',
clientID: 'Spotify ClientID',
clientSecret: 'Spotify Client Secret',
username: 'Spotify korisničko ime'
},
reset: 'Resetiraj na zadano',
save: 'Spremi',
toasts: {
init: 'Postavke učitane!',
update: 'Postavke ažurirane!',
ARLcopied: 'ARL kopiran u međuspremnik'
}
},
sidebar: {
home: 'početna',
search: 'pretraživanje',
charts: 'ljestvice',
favorites: 'favoriti',
linkAnalyzer: 'analizator linka',
settings: 'postavke',
about: 'o programu'
},
tracklist: {
downloadSelection: 'Preuzmi selekciju'
}
}
export default hr

View File

@ -24,6 +24,8 @@ const it = {
playlist: 'playlist', playlist: 'playlist',
compile: 'compilation', compile: 'compilation',
ep: 'ep', ep: 'ep',
more: 'Altri album',
featured: 'Compare in',
spotifyPlaylist: 'playlist spotify', spotifyPlaylist: 'playlist spotify',
releaseDate: 'data di uscita', releaseDate: 'data di uscita',
error: 'errore', error: 'errore',
@ -150,7 +152,7 @@ const it = {
finishDownload: '{0} ha finito di scaricarsi.', finishDownload: '{0} ha finito di scaricarsi.',
allDownloaded: 'Tutti i download completati!', allDownloaded: 'Tutti i download completati!',
refreshFavs: 'Preferiti ricaricati!', refreshFavs: 'Preferiti ricaricati!',
loggingIn: 'Effettuando il login', loggingIn: 'Effettuando il login...',
loggedIn: 'Login effettuato', loggedIn: 'Login effettuato',
alreadyLogged: 'Sei già loggato', alreadyLogged: 'Sei già loggato',
loginFailed: 'Impossibile loggarsi', loginFailed: 'Impossibile loggarsi',
@ -219,7 +221,8 @@ const it = {
title: 'Dovrei sovrascrivere i file già scaricati?', title: 'Dovrei sovrascrivere i file già scaricati?',
y: 'Si, sovrascrivi i file', y: 'Si, sovrascrivi i file',
n: 'No, non sovrascrivere i file', n: 'No, non sovrascrivere i file',
t: 'Sovrascrivi solo i tag' t: 'Sovrascrivi solo i tag',
b: 'No, mantieni entrambi i file e aggiungi un numero al duplicato'
}, },
fallbackBitrate: 'Utilizza bitrate più bassi se il bitrate preferito non è disponibile', fallbackBitrate: 'Utilizza bitrate più bassi se il bitrate preferito non è disponibile',
fallbackSearch: 'Cerca il brano se il link originale non è disponibile', fallbackSearch: 'Cerca il brano se il link originale non è disponibile',

View File

@ -1,6 +1,6 @@
const ptBr = { const pt_br = {
globals: { globals: {
welcome: 'Bem vindo ao deemix', welcome: 'bem vindo ao deemix',
back: 'voltar', back: 'voltar',
loading: 'carregando', loading: 'carregando',
download: 'Baixar {0}', download: 'Baixar {0}',
@ -8,20 +8,20 @@
in: 'em {0}', in: 'em {0}',
download_hint: 'Baixar', download_hint: 'Baixar',
play_hint: 'Reproduzir', play_hint: 'Reproduzir',
toggle_download_tab_hint: 'Expandir/Recolher', toggle_download_tab_hint: 'Expandir/Diminuir',
clean_queue_hint: 'Limpar os terminados', clean_queue_hint: 'Limpar',
cancel_queue_hint: 'Cancelar todos', cancel_queue_hint: 'Cancelar Todos',
listTabs: { listTabs: {
empty: '', empty: '',
all: 'todos', all: 'todos',
top_result: 'Resultado principal', top_result: 'resultado principal',
album: 'álbum | álbuns', album: 'álbum | álbuns',
artist: 'artista | artistas', artist: 'artista | artistas',
single: 'single | singles', single: 'single | singles',
title: 'título | títulos', title: 'título | títulos',
track: 'faixa | faixas', track: 'faixa | faixas',
trackN: '0 faixas | {n} faixa | {n} faixas', trackN: '0 faixas | {n} faixa | {n} faixas',
releaseN: '0 lançamentos | {n} lançamento | {n} lançamentos', releaseN: '0 lançamento | {n} lançamento | {n} lançamentos',
playlist: 'playlist | playlists', playlist: 'playlist | playlists',
compile: 'compilação | compilações', compile: 'compilação | compilações',
ep: 'ep | eps', ep: 'ep | eps',
@ -39,253 +39,252 @@
license: 'Licença' license: 'Licença'
}, },
subtitles: { subtitles: {
bugReports: 'Tem algo não funcionando no deemix? Informe-nos!', bugReports: "Há algo não funcionando no deemix? Nos diga!",
contributing: 'Quer contribuir com este projeto? Há várias formas!', contributing: 'Você quer contribuir para este projeto? Você pode fazer isso de diferentes maneiras!',
donations: 'Quer contribuir monetariamente? Você pode fazer uma doação!' donations: 'Você quer contribuir monetariamente? Você pode fazer uma doação!'
}, },
usesLibrary: usesLibrary: 'Esse app usa a biblioteca do <strong>deemix</strong>, no qual você pode usar para criar sua própria UI para o deemix',
'Este programa usa a biblioteca <strong>deemix</strong>, no qual você pode usar para construir uma UI para o seu deemix.', thanks: `Agradecimentos para <strong>rtonno</strong>, <strong>uhwot</strong> e <strong>lollilol</strong> por ajudar neste projeto, e para <strong>BasCurtiz</strong> e <strong>scarvimane</strong> por fazerem o ícone`,
thanks: `Obrigado <strong>rtonno</strong>, <strong>uhwot</strong> e <strong>lollilol</strong> por me ajudarem com este projeto e <strong>BasCurtiz</strong> e <strong>scarvimane</strong> por fazerem o ícone.`, upToDate: `Para mais novidades siga o <a href="https://t.me/RemixDevNews" target="_blank">news channel</a> no Telegram.`,
upToDate: `Seja avisado quando houver novas atualizações, siga o <a href="https://t.me/RemixDevNews" target="_blank">nosso canal de notícias</a> no Telegram.`, officialWebsite: 'Site Oficial',
officialWebsite: 'Website Oficial',
officialRepo: 'Repositório da Biblioteca Oficial', officialRepo: 'Repositório da Biblioteca Oficial',
officialWebuiRepo: 'Repositório da WebUI Oficial', officialWebuiRepo: 'Repositório da WebUI Oficial',
officialSubreddit: 'Subreddit Oficial', officialSubreddit: 'Subreddit Oficial',
newsChannel: 'Canal de Notícia', newsChannel: 'Canal de Notícias',
questions: `Caso houver dúvidas ou problemas com o programa, procure uma solução no <a href="https://www.reddit.com/r/deemix" target="_blank">subreddit</a>. Caso não encontre nada, você pode fazer um post com a sua dúvida no subreddit.`, questions: `Se você tiver dúvidas ou problemas com o app, procure uma solução em <a href="https://www.reddit.com/r/deemix" target="_blank">subreddit</a> primeiro. Caso você não encontre, você pode fazer um post explicando seu problema no subreddit. `,
beforeReporting: `Antes de reportar um bug tenha certeza de que o seu deemix esteja atualizado e que o seu relato seja realmente um bug e não um problema no seu lado de usuário.`, beforeReporting: `Antes de reportar um bug, tenha certeza que você está rodando a versão mais recente do app, e o que você quer reportar seja realmente um bug e não algo que esteja acontecendo especialmente com você.`,
beSure: `Certifique-se de que o bug ocorra em outras máquinas e <strong>NÃO</strong> relate-o caso ele já tenha sido relatado.`, beSure: `Certifique-se que o bug é reproduzivel em outras máquinas e também <strong>NÃO</strong> reporte um bug se ele já foi reportado.`,
duplicateReports: 'Relatos duplicados de bug serão fechados, então fique de olho.', duplicateReports: 'Reportes de bugs duplicados serão fechados, então fique atento a isso.',
dontOpenIssues: `<strong>NÃO</strong> abra uma issue para fazer questões, o subreddit é para isso.`, dontOpenIssues: `<strong>NÃO</strong> abra tópicos para fazer perguntas, há o subreddit para isso.`,
newUI: `Caso seja fluente em python, você pode tentar fazer uma nova UI para o app usando a biblioteca base, ou consertar os bugs da biblioteca com uma pull request na <a href="https://codeberg.org/RemixDev/deemix" target="_blank">repo do projeto</a>.`, newUI: `Se você é fluente em Phython, você pode tentar fazer uma nova UI para o app usando a biblioteca base, ou consertar bugs da biblioteca com um pull request em <a href="https://codeberg.org/RemixDev/deemix" target="_blank">repo</a>.`,
acceptFeatures: `Eu aceito recursos também, mas nada muito complexo e que possa ser implementado diretamente no aplicativo e não na biblioteca.`, acceptFeatures: `Eu aceito funcionalidades extras também, mas nada de coisas complexas, desde que ela possa ser implementada no app, e não na biblioteca.`,
otherLanguages: `Caso seja fluente em outra linguagem de programação você pode tentar portar o deemix para ela!`, otherLanguages: `Se você for fluente em outra linguagem de programação, você pode tentar portar o deemix para outra linguagem!`,
understandingCode: `Precisa de ajuda para entender o código? Contate o RemixDev no Telegram ou Reddit.`, understandingCode: `Você precisa de ajuda para entender o código? Mande mensagem no RemixDex pelo Telegram ou pelo Reddit.`,
contributeWebUI: `Caso saiba Vue.js (JavaScript), HTML ou CSS você pode contribuir para a <a href="https://codeberg.org/RemixDev/deemix-webui" target="_blank">WebUI</a>.`, contributeWebUI: `Se você souber Vue.js (JavaScript), HTML ou CSS você pode contribuir para o <a href="https://codeberg.org/RemixDev/deemix-webui" target="_blank">WebUI</a>.`,
itsFree: `Mantenha em mente que <strong>este é um projeto gratuito</strong> e que <strong>você deve apoiar os artistas que ama</strong> antes de apoiar os desenvolvedores.`, itsFree: `Lembre-se que <strong>este projeto é livre</strong> e <strong>você deve dar suporte aos artistas que você ama</strong> antes de dar suporte aos desenvolvedores.`,
notObligated: `Não se sinta obrigado a doar, agradecemos da mesma forma!`, notObligated: `Não se sinta na obrigação de doar, eu agradeço de qualquer maneira!`,
lincensedUnder: `Este trabalho é licenciado sob a lincensedUnder: `Esse é um projeto licenciado através da
<a rel="license" href="https://www.gnu.org/licenses/gpl-3.0.en.html" target="_blank" <a rel="license" href="https://www.gnu.org/licenses/gpl-3.0.en.html" target="_blank"
>GNU General Public License 3.0</a >GNU General Public License 3.0</a
>.` >.`
}, },
charts: { charts: {
title: 'Charts', title: 'Charts',
changeCountry: 'Trocar o país', changeCountry: 'Mudar País',
download: 'Baixe a chart' download: 'Download Chart'
}, },
errors: { errors: {
title: 'Erros para {0}', title: 'Erros para {0}',
ids: { ids: {
invalidURL: 'URL não reconhecida', invalidURL: 'URL inválida',
unsupportedURL: 'URL não suportada', unsupportedURL: 'URL não suportada ainda',
ISRCnotOnDeezer: 'ISRC da faixa não está no deezer', ISRCnotOnDeezer: 'Faixa ISRC não está disponível ainda no deezer',
notYourPrivatePlaylist: 'Você não pode baixar playlists privadas de outros usuários.', notYourPrivatePlaylist: "Você não pode baixar playlists privadas.",
spotifyDisabled: 'Recursos do Spotify não estão configurados corretamente.', spotifyDisabled: 'Os Recursos do Spotify não foram configurados corretamente.',
trackNotOnDeezer: 'Faixa não encontrada no deezer!', trackNotOnDeezer: 'Faixa não encontrada no deezer!',
albumNotOnDeezer: 'Álbum não encontrada no deezer!', albumNotOnDeezer: 'Album not found on deezer! Álbum não encontrado no deezer!',
notOnDeezer: 'Faixa não disponível no Deezer!', notOnDeezer: 'Faixa indisponível no deezer!',
notEncoded: 'Faixa ainda não encodada!', notEncoded: 'Faixa ainda não codificada!',
notEncodedNoAlternative: 'Faixa ainda não encodada e sem alternativas encontradas!', notEncodedNoAlternative: 'Faixa ainda não codificada e sem alternativas encontradas!',
wrongBitrate: 'Faixa não encontrada no bitrate desejado.', wrongBitrate: 'Faixa não encontrada no bitrate desejado.',
wrongBitrateNoAlternative: 'Faixa não encontrada no bitrate desejado e sem alternativas encontradas!', wrongBitrateNoAlternative: 'Faixa não encontrada no bitrate desejado e nenhuma outra alternativa encontrada!',
no360RA: 'Faixa não disponível no Reality Audio 360.', no360RA: 'Faixa não disponível na qualidade Reality Audio 360.',
notAvailable: 'Faixa não disponível nos servidores do deezer!', notAvailable: "Faixa não disponível nos servidores do deezer!",
notAvailableNoAlternative: 'Faixa não disponível nos servidores do deezer e sem alternativas encontradas!' notAvailableNoAlternative: "Faixa não disponível nos servidores do deezer e nenhuma outra alternativa encontrada!"
} }
}, },
favorites: { favorites: {
title: 'Favorites', title: 'Favoritos',
noPlaylists: 'Nenhuma playlists favorita encontrada', noPlaylists: 'Nenhuma Playlist encontrada',
noAlbums: 'Nenhum álbum favorito encontrado', noAlbums: 'Nenhum Álbum Favorito encontrado',
noArtists: 'Nenhum artista favorito encontrado', noArtists: 'Nenhum Artista Favorito encontrado',
noTracks: 'Nenhuma faixa favorita encontrada' noTracks: 'Nenhuma Faixa Favorita encontrada'
}, },
home: { home: {
needTologin: 'Você precisa logar na sua conta do Deezer antes de poder começar a baixar.', needTologin: 'Você precisa logar na sua conta do deezer antes de começar a baixar músicas.',
openSettings: 'Abrir configurações', openSettings: 'Abrir Configurações',
sections: { sections: {
popularPlaylists: 'Playlists populares', popularPlaylists: 'Playlists Populares',
popularAlbums: 'Álbuns mais ouvidos' popularAlbums: 'Álbuns mais ouvidos'
} }
}, },
linkAnalyzer: { linkAnalyzer: {
info: 'Você pode usar esta seção para descobrir mais informações sobre o link que está tentando baixar.', info: 'Você pode usar essa seção para encontrar mais informações sobre o link que você quer baixar.',
useful: useful:
'Esta função é útil caso esteja tentando baixar algumas faixas que não estão disponíveis no seu país e você quer descobrir aonde estão disponíveis, por exemplo.', "Isso é útil se você está tentando baixar algumas faixas que não estão disponíveis no seu país, e quer saber onde elas estão disponíveis, por exemplo.",
linkNotSupported: 'Este link não é suportado ainda', linkNotSupported: 'Esse link não é suportado ainda',
linkNotSupportedYet: 'Aparentemente este link ainda não é suportado, tente analizar algum outro.', linkNotSupportedYet: 'Parece que esse link não é suportado ainda, tente analizar outro.',
table: { table: {
id: 'ID', id: 'ID',
isrc: 'ISRC', isrc: 'ISRC',
upc: 'UPC', upc: 'UPC',
duration: 'Duração', duration: 'Duração',
diskNumber: 'Número do disco', diskNumber: 'Número do Disco',
trackNumber: 'Número da faixa', trackNumber: 'Número da Faixa',
releaseDate: 'Data de lançamento', releaseDate: 'Data de Lançamento',
bpm: 'BPM', bpm: 'BPM',
label: 'Gravadora', label: 'Gravadora',
recordType: 'Tipo de gravação', recordType: 'Tipo de Gravação',
genres: 'Gêneros', genres: 'Gêneros',
tracklist: 'Lista de faixas' tracklist: 'Tracklist'
} }
}, },
search: { search: {
startSearching: 'Comece a procurar!', startSearching: 'Comece pesquisando!',
description: description:
'Você pode procurar uma faixa, um álbum inteiro, um artista, uma playlist... tudo! Você também pode colar um link do Deezer', 'Você pode pesquisar uma música, um álbum, um artista, uma playlist.... tudo! Você também pode colar um link do Deezer',
fans: '{0} fãs', fans: '{0} fãs',
noResults: 'Sem resultados', noResults: 'Sem resultados',
noResultsTrack: 'Nenhuma faixa encontrada', noResultsTrack: 'Nenhuma Faixa encontrada',
noResultsAlbum: 'Nenhum álbum encontrado', noResultsAlbum: 'Nenhum Álbum encontrado',
noResultsArtist: 'Nenhum artista encontrado', noResultsArtist: 'Nenhum Artista encontrado',
noResultsPlaylist: 'Nenhuma playlist encontrada' noResultsPlaylist: 'Nenhuma Playlist encontrada'
}, },
searchbar: 'Pesquise tudo o que quiser (ou simplesmente cole um link)', searchbar: 'Pesquise algo (ou apenas cole um link)',
downloads: 'downloads', downloads: 'downloads',
toasts: { toasts: {
addedToQueue: '{0} adicionado à lista de espera', addedToQueue: '{0} adicionado à fila',
alreadyInQueue: '{0} já está na lista de espera!', alreadyInQueue: '{0} já está na fila!',
finishDownload: '{0} terminou de baixar.', finishDownload: '{0} download terminado.',
allDownloaded: 'Todos os downloads terminaram!', allDownloaded: 'Todos os downloads foram feitos!',
refreshFavs: 'Atualização completa!', refreshFavs: 'Atualização completa!',
loggingIn: 'Entrando na conta', loggingIn: 'Logando',
loggedIn: 'Conta logada', loggedIn: 'Logado',
alreadyLogged: 'Já está na conta', alreadyLogged: 'Você já está logado',
loginFailed: 'Não pode entrar na conta', loginFailed: "Não foi possivel entrar",
loggedOut: 'Saindo da conta', loggedOut: 'Desconectando',
cancellingCurrentItem: 'Cancelando item atual.', cancellingCurrentItem: 'Cancelando item atual.',
currentItemCancelled: 'Cancelado item atual.', currentItemCancelled: 'Item atual cancelado.',
startAddingArtist: 'Adicionando {0} álbuns à lista de espera', startAddingArtist: 'Adicionando {0} álbuns à fila',
finishAddingArtist: '{0} álbuns adicionados à lista de espera', finishAddingArtist: '{0} álbuns adicionados a fila',
startConvertingSpotifyPlaylist: 'Convertendo faixas do Spotify para faixas do Deezer', startConvertingSpotifyPlaylist: 'Convertendo faixas do spotify para faixas do deezer',
finishConvertingSpotifyPlaylist: 'Playlist do Spotify convertida' finishConvertingSpotifyPlaylist: 'Playlists do Spotify convertidas'
}, },
settings: { settings: {
title: 'Configurações', title: 'Configurações',
languages: 'Linguagens', languages: 'Idiomas',
login: { login: {
title: 'Login', title: 'Login',
loggedIn: 'Você está logado como {username}', loggedIn: 'Você está logado como {username}',
arl: { arl: {
question: 'Como eu pego a minha ARL?', question: 'Como eu consigo o meu ARL?',
update: 'Atualizar a ARL' update: 'Atualizar ARL'
}, },
logout: 'Sair' logout: 'Sair'
}, },
appearance: { appearance: {
title: 'Aparência', title: 'Aparência',
slimDownloadTab: 'Guia de download slim' slimDownloadTab: 'Aba de download slim'
}, },
downloadPath: { downloadPath: {
title: 'Diretório de download' title: 'Diretório de Downloads'
}, },
templates: { templates: {
title: 'Templates', title: 'Templates',
tracknameTemplate: 'Template do nome da faixa avulsa', tracknameTemplate: 'Template do nome da faixa',
albumTracknameTemplate: 'Template do nome da faixa no álbum', albumTracknameTemplate: 'Template da faixa do álbum',
playlistTracknameTemplate: 'Template do nome da faixa na playlist' playlistTracknameTemplate: 'Template da faixa da playlist'
}, },
folders: { folders: {
title: 'Pastas', title: 'Pastas',
createPlaylistFolder: 'Criar pasta para playlists', createPlaylistFolder: 'Criar pasta para playlists',
playlistNameTemplate: 'Template do nome da pasta da playlist', playlistNameTemplate: 'Template da pasta de playlist',
createArtistFolder: 'Criar pasta para artistas', createArtistFolder: 'Criar pasta para os artistas',
artistNameTemplate: 'Template do nome da pasta do artista', artistNameTemplate: 'Template da pasta de artistas',
createAlbumFolder: 'Criar pasta para álbuns', createAlbumFolder: 'Criar pasta para álbuns',
albumNameTemplate: 'Template do nome da pasta do álbum', albumNameTemplate: 'Template da pasta de álbuns',
createCDFolder: 'Criar pasta para discos', createCDFolder: 'Criar pasta para CDs',
createStructurePlaylist: 'Criar estrutura de pasta para playlists', createStructurePlaylist: 'Criar estrutura de pastas para playlists',
createSingleFolder: 'Criar estrutura de pasta para singles' createSingleFolder: 'Criar estrutura de pastas para singles'
}, },
trackTitles: { trackTitles: {
title: 'Títulos das faixas', title: 'Título das faixas',
padTracks: 'Pad das faixas', padTracks: 'Faixas com pad',
paddingSize: 'Substituir tamanho do padding', paddingSize: 'Sobrescrever tamanho do padding',
illegalCharacterReplacer: 'Substituto de caracter ilegal' illegalCharacterReplacer: 'Substituir caracteres inválidos'
}, },
downloads: { downloads: {
title: 'Downloads', title: 'Downloads',
queueConcurrency: 'Downloads simultâneos', queueConcurrency: 'Downloads Simultâneos',
maxBitrate: { maxBitrate: {
title: 'Bitrate preferido', title: 'Escolher Taxa de Bits',
9: 'FLAC 1411kbps', 9: 'FLAC 1411kbps',
3: 'MP3 320kbps', 3: 'MP3 320kbps',
1: 'MP3 128kbps' 1: 'MP3 128kbps'
}, },
overwriteFile: { overwriteFile: {
title: 'Posso substituir os arquivos?', title: 'Sobrescrever arquivos?',
y: 'Sim, substitua os arquivos', y: 'Sim, sobrescrever arquivos',
n: 'Não, não substitua os arquivos', n: "Não, não sobrescrever arquivos",
t: 'Substitua apenas as tags' t: 'Sobrescrever apenas as tags'
}, },
fallbackBitrate: 'Bitrate reserva', fallbackBitrate: 'Taxa de bits reserva',
fallbackSearch: 'Pesquisa reserva', fallbackSearch: 'Procurar reserva',
logErrors: 'Criar log para erros', logErrors: 'Criar arquivos de log para erros',
logSearched: 'Criar log para faixas pesquisadas', logSearched: 'Criar arquivos de log para faixas pesquisadas',
createM3U8File: 'Criar arquivo de playlist', createM3U8File: 'Criar arquivo de playlist',
syncedLyrics: 'Criar arquivos .lyr (Letras sincronizadas)', syncedLyrics: 'Criar arquivos .lyr (Letras)',
playlistFilenameTemplate: 'Template do nome da playlist', playlistFilenameTemplate: 'Template do nome do arquivo da playlist',
saveDownloadQueue: 'Salvar lista de espera do download ao fechar o programa' saveDownloadQueue: 'Salvar a fila de downloads quando fechar o app'
}, },
covers: { covers: {
title: 'Capa dos álbuns', title: 'Capa dos álbuns',
saveArtwork: 'Salvar as capas', saveArtwork: 'Salvar capas',
coverImageTemplate: 'Template do nome da capa', coverImageTemplate: 'Template do nome da capa',
saveArtworkArtist: 'Salvar imagem do artista', saveArtworkArtist: 'Salvar imagem do artista',
artistImageTemplate: 'Template da imagem do artista', artistImageTemplate: 'Template da imagem do artista',
localArtworkSize: 'Tamanho da artwork local', localArtworkSize: 'Tamanho da capa local',
embeddedArtworkSize: 'Tamanho da artwork embutida', embeddedArtworkSize: 'Tamanho da capa embutida',
localArtworkFormat: { localArtworkFormat: {
title: 'Qual formato você quer que a artwork local seja?', title: 'Qual o formato da imagem que você quer para a capa local?',
jpg: 'Uma imagem jpeg', jpg: '.jpeg',
png: 'Uma imagem png', png: '.png',
both: 'Ambos um jpeg e um png' both: 'Ambas, .jpeg e .png'
}, },
jpegImageQuality: 'Qualidade do JPEG' jpegImageQuality: 'Qualidade da imagem JPEG'
}, },
tags: { tags: {
head: 'Quais tags salvar', head: 'Quais tags salvar',
title: 'Título', title: 'Título',
artist: 'Artista', artist: 'Artista',
album: 'Álbuns', album: 'Álbum',
cover: 'Capa', cover: 'Capa',
trackNumber: 'Número da faixa', trackNumber: 'Número da Faixa',
trackTotal: 'Total de faixas', trackTotal: 'Total de Faixas',
discNumber: 'Número de discos', discNumber: 'Número de Discos',
discTotal: 'Total de discos', discTotal: 'Total de Discos',
albumArtist: 'Artista do álbum', albumArtist: 'Artista do Álbum',
genre: 'Gênero', genre: 'Gênero',
year: 'Ano', year: 'Ano',
date: 'Data', date: 'Data',
explicit: 'Letras explícitas', explicit: 'Letras Explícitas',
isrc: 'ISRC', isrc: 'ISRC',
length: 'Tamanho da faixa', length: 'Tamanho da Faixa',
barcode: 'Barcode do álbum (UPC)', barcode: 'Código de Barras do álbum (UPC)',
bpm: 'BPM', bpm: 'BPM',
replayGain: 'Replay Gain', replayGain: 'Replay Gain',
label: 'Gravadora do álbum', label: 'Gravadora',
lyrics: 'Letras desincronizadas', lyrics: 'Letras Dessincronizadas',
copyright: 'Copyright', copyright: 'Copyright',
composer: 'Compositor', composer: 'Compositor',
involvedPeople: 'Pessoas involvidas' involvedPeople: 'Pessoas Envolvidas'
}, },
other: { other: {
title: 'Outros', title: 'Outros',
savePlaylistAsCompilation: 'Savar playlists como uma compilação', savePlaylistAsCompilation: 'Salvar playlists como uma compilação',
useNullSeparator: 'Usar separador nulo', useNullSeparator: 'Usar separador nulo',
saveID3v1: 'Salvar ID3v1', saveID3v1: 'Salvar ID3v1',
multiArtistSeparator: { multiArtistSeparator: {
title: 'Como gostaria de separar seus artistas?', title: 'Como você gostaria de separar os artistas?',
nothing: 'Salvar apenas o artista principal', nothing: 'Salvar apenas o artista principal',
default: 'Usando especificação padrão', default: 'Usar a especificação padrão',
andFeat: 'Usando & e feat.', andFeat: 'Usar & e feat.',
using: 'Usando "{0}"' using: 'Usar "{0}"'
}, },
singleAlbumArtist: 'Salvar apenas o artista principal do álbum', singleAlbumArtist: 'Salvar apenas o artista principal',
albumVariousArtists: 'Manter "Various Artists" em Artistas do Álbum', albumVariousArtists: 'Manter "Various Artists" nos Artistas do Álbum',
removeAlbumVersion: 'Remover "Album Version" do título de faixas', removeAlbumVersion: 'Remover "Album Version" do título da faixa',
removeDuplicateArtists: 'Remover combinações de artistas', removeDuplicateArtists: 'Remover combinação de artistas',
dateFormat: { dateFormat: {
title: 'Formato da data para arquivos FLAC', title: 'Formato da data para arquivos FLAC',
year: 'AAAA', year: 'AAAA',
@ -293,43 +292,43 @@
day: 'DD' day: 'DD'
}, },
featuredToTitle: { featuredToTitle: {
title: 'O que eu deveria fazer com os artistas feat.?', title: 'O que devo fazer com artistas participantes?',
0: 'Nada', 0: 'Nada',
1: 'Remova-os do título da faixa', 1: 'Remova do título da faixa',
3: 'Remova-os do título da faixa e do álbum', 3: 'Remova do título da faixa e do álbum',
2: 'Mova-os para o título da faixa' 2: 'Mover para o título da faixa'
}, },
titleCasing: 'Formatação do título', titleCasing: 'Formatação do título',
artistCasing: 'Formatação do artista', artistCasing: 'Formatação do artista',
casing: { casing: {
nothing: 'Manter intocado', nothing: 'Manter inalterado',
lower: 'minúsculo', lower: 'minúsculo',
upper: 'MAIÚSCULO', upper: 'MAIÚSCULO',
start: 'No Começo De Cada Palavra', start: 'Começo De Cada Palavra',
sentence: 'Como uma frase' sentence: 'Como uma frase'
}, },
previewVolume: 'Volume da prévia', previewVolume: 'Prévia do Volume',
executeCommand: { executeCommand: {
title: 'Comando para executar depois do download', title: 'Comando para executar depois de baixar',
description: 'Deixe em branco para não executar nada' description: 'Deixe em branco para nenhuma ação'
} }
}, },
spotify: { spotify: {
title: 'Destaques do Spotify', title: 'Recursos do Spotify',
clientID: 'Spotify clientID', clientID: 'Spotify clientID',
clientSecret: 'Spotify Client Secret', clientSecret: 'Spotify Client Secret',
username: 'Nome de usuário do Spotify' username: 'usuário do Spotify'
}, },
reset: 'Resetar para Padrão', reset: 'Restaurar para o padrão',
save: 'Save', save: 'Salvar',
toasts: { toasts: {
init: 'Configurações carregadas!', init: 'Configurações carregadas!',
update: 'Configurações atualizadas!', update: 'Configurações atualizadas!',
ARLcopied: 'ARL copiado para o clipboard' ARLcopied: 'ARL copiada para a área de transferência'
} }
}, },
sidebar: { sidebar: {
home: 'home', home: 'início',
search: 'pesquisa', search: 'pesquisa',
charts: 'charts', charts: 'charts',
favorites: 'favoritos', favorites: 'favoritos',
@ -342,4 +341,4 @@
} }
} }
export default ptBr export default pt_br

View File

@ -6,7 +6,7 @@ const pt = {
download: 'Transferir {0}', download: 'Transferir {0}',
by: 'por {0}', by: 'por {0}',
in: 'em {0}', in: 'em {0}',
download_hint: 'Descarregar', download_hint: 'Transferir',
play_hint: 'Tocar', play_hint: 'Tocar',
toggle_download_tab_hint: 'Expandir/Recolher', toggle_download_tab_hint: 'Expandir/Recolher',
clean_queue_hint: 'Limpar Finalizados', clean_queue_hint: 'Limpar Finalizados',
@ -71,7 +71,7 @@ const pt = {
charts: { charts: {
title: 'Tabelas', title: 'Tabelas',
changeCountry: 'Alterar país', changeCountry: 'Alterar país',
download: 'Descarregar tabela' download: 'Transferir tabela'
}, },
errors: { errors: {
title: 'Erros para {0}', title: 'Erros para {0}',
@ -79,7 +79,7 @@ const pt = {
invalidURL: 'URL não reconhecido', invalidURL: 'URL não reconhecido',
unsupportedURL: 'URL ainda não suportado', unsupportedURL: 'URL ainda não suportado',
ISRCnotOnDeezer: 'Faixa ISRC não disponível no deezer', ISRCnotOnDeezer: 'Faixa ISRC não disponível no deezer',
notYourPrivatePlaylist: "Nao podes baixar listas de reprodução privado dos outros.", notYourPrivatePlaylist: "Nao podes baixar listas de reprodução privadas de outros.",
spotifyDisabled: 'Funcionalidades do Spotify não estão definidas corretamente.', spotifyDisabled: 'Funcionalidades do Spotify não estão definidas corretamente.',
trackNotOnDeezer: 'Faixa não encontrada no deezer!', trackNotOnDeezer: 'Faixa não encontrada no deezer!',
albumNotOnDeezer: 'Álbum não encontrado no deezer!', albumNotOnDeezer: 'Álbum não encontrado no deezer!',
@ -123,7 +123,7 @@ const pt = {
releaseDate: 'Data de lançamento', releaseDate: 'Data de lançamento',
bpm: 'BPM', bpm: 'BPM',
label: 'Editora', label: 'Editora',
recordType: 'Tipo de Recorde', recordType: 'Tipo de Disco',
genres: 'Géneros', genres: 'Géneros',
tracklist: 'Lista de faixas' tracklist: 'Lista de faixas'
} }
@ -166,7 +166,7 @@ const pt = {
loggedIn: 'Estás autenticado como {username}', loggedIn: 'Estás autenticado como {username}',
arl: { arl: {
question: 'Como obter o meu ARL?', question: 'Como obter o meu ARL?',
update: 'Atualizar ARL' update: 'Actualizar ARL'
}, },
logout: 'Sair' logout: 'Sair'
}, },
@ -175,7 +175,7 @@ const pt = {
slimDownloadTab: 'Aba de transferências estreita' slimDownloadTab: 'Aba de transferências estreita'
}, },
downloadPath: { downloadPath: {
title: 'Caminho de transferências' title: 'Caminho das transferências'
}, },
templates: { templates: {
title: 'Formatos', title: 'Formatos',
@ -199,7 +199,7 @@ const pt = {
title: 'Título', title: 'Título',
padTracks: 'Bloco de Faixas', padTracks: 'Bloco de Faixas',
paddingSize: 'Substituir tamanho do preenchimento', paddingSize: 'Substituir tamanho do preenchimento',
illegalCharacterReplacer: 'Substituir caractere inválidos' illegalCharacterReplacer: 'Substituir caractere inválido'
}, },
downloads: { downloads: {
title: 'Transferências', title: 'Transferências',
@ -216,12 +216,12 @@ const pt = {
n: 'Não substituir o ficheiro', n: 'Não substituir o ficheiro',
t: 'Subescrever apenas as etiquetas' t: 'Subescrever apenas as etiquetas'
}, },
fallbackBitrate: 'Reserva de taxa de bits', fallbackBitrate: 'Bitrate fallback',
fallbackSearch: 'reserva de pesquisa', fallbackSearch: 'Fallback de pesquisa',
logErrors: 'Criar histórico para erros', logErrors: 'Criar histórico para erros',
logSearched: 'Criar histórico para faixas pesquisadas', logSearched: 'Criar histórico para faixas pesquisadas',
createM3U8File: 'Criar ficheiro de lista de reprodução', createM3U8File: 'Criar ficheiro de lista de reprodução',
syncedLyrics: 'Criar ficheiro .lyr (Letras Sincronizadas)', syncedLyrics: 'Criar ficheiro .lyr (Letra Sincronizada)',
playlistFilenameTemplate: 'Formato do nome de ficheiro da lista de reprodução', playlistFilenameTemplate: 'Formato do nome de ficheiro da lista de reprodução',
saveDownloadQueue: 'Guardar fila de transferências ao fechar a aplicação' saveDownloadQueue: 'Guardar fila de transferências ao fechar a aplicação'
}, },
@ -234,10 +234,10 @@ const pt = {
localArtworkSize: 'Tamanho do trabalho artístico local', localArtworkSize: 'Tamanho do trabalho artístico local',
embeddedArtworkSize: 'Tamanho do trabalho artístico incorporado', embeddedArtworkSize: 'Tamanho do trabalho artístico incorporado',
localArtworkFormat: { localArtworkFormat: {
title: 'Que formato você deseja que o trabalho artístico local seja?', title: 'Em que formato desejas o trabalho artístico local?',
jpg: 'Uma imagem jpeg', jpg: 'Em imagem jpeg',
png: 'Uma imagem png', png: 'Em imagem png',
both: 'Os dois um jpeg e um png' both: 'Em jpeg e em png'
}, },
jpegImageQuality: 'Qualidade de imagem JPEG' jpegImageQuality: 'Qualidade de imagem JPEG'
}, },
@ -260,16 +260,16 @@ const pt = {
length: 'Duração da faixa', length: 'Duração da faixa',
barcode: 'Código de barras do álbum (UPC)', barcode: 'Código de barras do álbum (UPC)',
bpm: 'BPM', bpm: 'BPM',
replayGain: 'Ganho de Repeticao', replayGain: 'ReplayGain',
label: 'Editora do álbum', label: 'Editora do álbum',
lyrics: 'Letra da música não sincronizado', lyrics: 'Letra da música não sincronizada',
copyright: 'Direito Autoral', copyright: 'Direitos de Autor',
composer: 'Compositor', composer: 'Compositor',
involvedPeople: 'Pessoas envolvidas' involvedPeople: 'Pessoas envolvidas'
}, },
other: { other: {
title: 'Outros', title: 'Outros',
savePlaylistAsCompilation: 'Guardar a lista de reproducao como uma compilacao', savePlaylistAsCompilation: 'Guardar listas de reprodução como compilação',
useNullSeparator: 'Usar separador nulo', useNullSeparator: 'Usar separador nulo',
saveID3v1: 'Também guardar ID3v1', saveID3v1: 'Também guardar ID3v1',
multiArtistSeparator: { multiArtistSeparator: {
@ -284,16 +284,16 @@ const pt = {
removeAlbumVersion: 'Remover "Album Version" do título da faixa', removeAlbumVersion: 'Remover "Album Version" do título da faixa',
removeDuplicateArtists: 'Remover combinação de artistas', removeDuplicateArtists: 'Remover combinação de artistas',
dateFormat: { dateFormat: {
title: 'Formtado de data nos ficheiros FLAC', title: 'Formato de data nos ficheiros FLAC',
year: 'AAAA', year: 'AAAA',
month: 'MM', month: 'MM',
day: 'DD' day: 'DD'
}, },
featuredToTitle: { featuredToTitle: {
title: 'O que devo fazer com os artistas em destaque?', title: 'O que devo fazer com artistas convidados/participações?',
0: 'Nada', 0: 'Nada',
1: 'Remover do título', 1: 'Remover do título',
3: 'Remover do título de do título do album', 3: 'Remover do título e do título do album',
2: 'Movê-lo para o título' 2: 'Movê-lo para o título'
}, },
titleCasing: 'Caixa do Título', titleCasing: 'Caixa do Título',
@ -301,11 +301,11 @@ const pt = {
casing: { casing: {
nothing: 'Manter inalterado', nothing: 'Manter inalterado',
lower: 'minusculas', lower: 'minusculas',
upper: 'MAIÙSCULAS', upper: 'MAIÚSCULAS',
start: 'Ínicio De Cada Palavra', start: 'Início De Cada Palavra',
sentence: 'Como uma frase' sentence: 'Como uma frase'
}, },
previewVolume: 'Pre visualizacao do volume', previewVolume: 'Volume de Pré-visualização',
executeCommand: { executeCommand: {
title: 'Comando a executar após transferir', title: 'Comando a executar após transferir',
description: 'Deixar em branco para nenhuma acção' description: 'Deixar em branco para nenhuma acção'
@ -317,7 +317,7 @@ const pt = {
clientSecret: 'Spotify Client Secret', clientSecret: 'Spotify Client Secret',
username: 'nome de utilizador Spotify' username: 'nome de utilizador Spotify'
}, },
reset: 'Restaurar para o padrao', reset: 'Repor configurações padrão',
save: 'Guardar', save: 'Guardar',
toasts: { toasts: {
init: 'Configurações carregadas!', init: 'Configurações carregadas!',
@ -330,12 +330,12 @@ const pt = {
search: 'pesquisa', search: 'pesquisa',
charts: 'tabelas', charts: 'tabelas',
favorites: 'favoritos', favorites: 'favoritos',
linkAnalyzer: 'Analizador de Links', linkAnalyzer: 'analizador de links',
settings: 'definições', settings: 'definições',
about: 'sobre' about: 'sobre'
}, },
tracklist: { tracklist: {
downloadSelection: 'Descarregar seleccionados' downloadSelection: 'Transferir seleccionados'
} }
} }

345
src/lang/vn.js Normal file
View File

@ -0,0 +1,345 @@
const vn = {
globals: {
welcome: 'Chào mừng đến với deemix',
back: 'trở lại',
loading: 'đang tải',
download: 'Tải xuống {0}',
by: 'bởi {0}',
in: 'trong {0}',
download_hint: 'Tải xuống',
play_hint: 'Phát',
toggle_download_tab_hint: 'Mở rộng/Giấu',
clean_queue_hint: 'Xóa những file đã tải xong',
cancel_queue_hint: 'Hủy tất cả',
listTabs: {
empty: '',
all: 'tất cả',
top_result: 'kết quả hàng đầu',
album: 'album | album',
artist: 'Nghệ sĩ | Nghệ sĩ',
single: 'đơn | đơn',
title: 'tiêu đề | tiêu đề',
track: 'Bài hát | Bài hát',
trackN: '0 Bài hát | {n} Bài hát | {n} Bài hát',
releaseN: '0 sản phẩm | {n} sản phẩm | {n} sản phẩm',
playlist: 'playlist | playlist',
compile: 'tổng hợp | tổng hợp',
ep: 'ep | ep',
spotifyPlaylist: 'playlist của spotify | playlist của spotify',
releaseDate: 'ngày phát hành',
error: 'lỗi'
}
},
about: {
titles: {
usefulLinks: 'Link hữu dụng',
bugReports: 'Báo lỗi',
contributing: 'Đóng góp',
donations: 'Quyên góp',
license: 'Bằng phép'
},
subtitles: {
bugReports: "Bạn thấy có gì đó không hoạt động trong deemix? Xin hãy báo với chúng tôi!",
contributing: 'Bạn muốn đóng góp cho dự án này? Bạn có thể làm điều đó với nhiều cách khác nhau!',
donations: 'Bạn muốn ủng hộ kinh phí? Bạn có thể quyên góp tại đây!'
},
usesLibrary: 'Ứng dụng này sử dụng thư viện <strong>deemix</strong>, bạn có thể dùng nó để tạo một UI riêng cho deemix.',
thanks: `Cảm ơn <strong>rtonno</strong>, <strong>uhwot</strong> và <strong>lollilol</strong> đã giúp tôi với dự án này và <strong>BasCurtiz</strong> và <strong>scarvimane</strong> với việc thiết kế biểu tượng.`,
upToDate: `Cập nhật app bằng cách theo dõi <a href="https://t.me/RemixDevNews" target="_blank">kênh tin tức</a> trên Telegram.`,
officialWebsite: 'Website chính thức',
officialRepo: 'Repo thư viện chính thức',
officialWebuiRepo: 'Repo WebUI chính thức',
officialSubreddit: 'Subreddit chính thức',
newsChannel: 'Kênh tin tức',
questions: `Nếu bạn có câu hỏi hoặc vấn đề về ứng dụng này, xin hãy tìm giải pháp trên <a href="https://www.reddit.com/r/deemix" target="_blank">subreddit</a> trước. Sau đó, nếu bạn không tìm được gì thì bạn có thể tạo một bài đăng về vấn đề của bạn trên subreddit dó.`,
beforeReporting: `Trước khi báo lỗi hãy đảm bảo bạn đang sử dụng phiên bản mới nhất của ứng dụng và lỗi bạn đang gặp không phải là do bạn.`,
beSure: `Hãy đảm bảo là lỗi này vẫn có thể xảy ra trên các thiết bị khác và <strong>XIN ĐỪNG</strong> báo lỗi đã được báo rồi.`,
duplicateReports: 'Những bản báo lỗi trùng nhau sẽ bị đóng, xin bạn hãy để ý điều này.',
dontOpenIssues: `<strong>XIN ĐỪNG</strong> mở vấn đề để hỏi, bạn có thể dùng subreddit trên cho việc đó.`,
newUI: `Nếu bạn thành thạo với python bạn có thể tạo một UI mới bằng cách sử dụng thư viện gốc, hoặc sửa lỗi trong thư viện đó với một pull request trên <a href="https://codeberg.org/RemixDev/deemix" target="_blank">repo này</a>.`,
acceptFeatures: `Tôi có chấp nhận yêu cầu về tính năng mới nhưng không quá phức tạp bởi vì chúng có thể được triển khai trực tiếp vào ứng dụng thay vì vào thư viện.`,
otherLanguages: `Nếu bạn thành thạo với một ngôn ngữ khác, bạn có thể port deemix sang ngôn ngữ đó!`,
understandingCode: `Bạn muốn hiểu code của deemix? Xin hãy liên lạc RemixDev trên Telegram hoặc Reddit.`,
contributeWebUI: `Nếu bạn biết Vue.js (JavaScript), HTML hoặc CSS, bạn có thể góp phần phát triển <a href="https://codeberg.org/RemixDev/deemix-webui" target="_blank">WebUI</a>.`,
itsFree: `Bạn nên nhớ rằng <strong>đây là một dự án phi lợi nhuận</strong> và <strong>bạn nên ủng hộ những Nghệ sĩ yêu thích của bạn</strong> trước khi ủng hộ nhà phát triển.`,
notObligated: `Đừng nghĩ rằng bạn phải đóng góp tiền, tôi vẫn sẽ rất biết ơn bạn!`,
lincensedUnder: `Dự án này được cấp phép bởi
<a rel="license" href="https://www.gnu.org/licenses/gpl-3.0.en.html" target="_blank"
>GNU General Public License 3.0</a
>.`
},
charts: {
title: 'Bảng xếp hạng',
changeCountry: 'Thay đổi quốc gia',
download: 'Tải xuống bảng xếp hạng này'
},
errors: {
title: 'Lỗi {0}',
ids: {
invalidURL: 'Không nhận diện được URL',
unsupportedURL: 'URL này chưa được hỗ trợ',
ISRCnotOnDeezer: 'ISRC của bài hát này hiện không có trên Deezer',
notYourPrivatePlaylist: "Bạn không thể tải xuống playlist riêng của người khác.",
spotifyDisabled: 'Chức năng Spotify chưa được thiết lập đúng cách.',
trackNotOnDeezer: 'Bài hát không có trên Deezer!',
albumNotOnDeezer: 'Album không có trên Deezer!',
notOnDeezer: 'Bài hát chưa có trên Deezer!',
notEncoded: 'Bài hát chưa được encode!',
notEncodedNoAlternative: 'Bài hát chưa được encode và không có bản thay thế nào khác!',
wrongBitrate: 'Bài hát này không có ở bitrate bạn muốn.',
wrongBitrateNoAlternative: 'Bài hát này không có ở bitrate bạn muốn và không có bản thay thế nào khác!',
no360RA: 'Bài hát này không có ở dạng Reality Audio 360.',
notAvailable: "Bài hát này không có trên server của Deezer!",
notAvailableNoAlternative: "Bài hát này không có trên server của Deezer và không có bản thay thế nào khác!"
}
},
favorites: {
title: 'Yêu thích',
noPlaylists: 'Không tìm được Playlist',
noAlbums: 'Không tìm được Album Yêu thích',
noArtists: 'Không tìm được Nghệ sĩ Yêu thích',
noTracks: 'Không tìm được Bài hát Yêu thích'
},
home: {
needTologin: 'Bạn cần phải đăng nhập vào tài khoản Deezer trước khi bắt đầu tải xuống.',
openSettings: 'Mở Cài đặt',
sections: {
popularPlaylists: 'Playlist Nổi tiếng',
popularAlbums: 'Album được stream nhiều nhất'
}
},
linkAnalyzer: {
info: 'Bạn có thể sử dụng chức năng này để kiếm thêm thông tin về đường link mà bạn muốn tải xuống.',
useful:
"Chức năng này rất hữu dụng nếu bạn muốn tải các bài hát hiện không có sẵn ở quốc gia của bạn và muốn biết các quốc gia được hỗ trợ.",
linkNotSupported: 'Đường link này chưa được hỗ trợ',
linkNotSupportedYet: 'Đường link này chưa được hỗ trợ, xin hãy thử lại với một đường link khác.',
table: {
id: 'ID',
isrc: 'ISRC',
upc: 'UPC',
duration: 'Thời lượng',
diskNumber: 'Số đĩa',
trackNumber: 'Số bài hát',
releaseDate: 'Ngày phát hành',
bpm: 'BPM',
label: 'Hãng',
recordType: 'Loại Thu âm',
genres: 'Thể loại',
tracklist: 'Danh sách các bài hát'
}
},
search: {
startSearching: 'Bắt đầu tìm kiếm!',
description:
'Bạn có thể tìm một bài hát, album, nghệ sĩ, playlist, v.v...! Bạn cũng có thể dùng link của Deezer',
fans: '{0} người hâm mộ',
noResults: 'Không có kết quả',
noResultsTrack: 'Không tìm được bài hát nào',
noResultsAlbum: 'Không tìm được album nào',
noResultsArtist: 'Không tìm được nghệ sĩ nào',
noResultsPlaylist: 'Không tìm được playlist nào'
},
searchbar: 'Tìm những gì bạn muốn (bạn cũng có thể sữ dụng một đường link)',
downloads: 'Tải xuống',
toasts: {
addedToQueue: '{0} đã được đưa vào hàng chờ',
alreadyInQueue: '{0} đã đang trong hàng chờ!',
finishDownload: '{0} đã tải xong.',
allDownloaded: 'Tất cả các bài hát đã được tải xuống!',
refreshFavs: 'Tải lại hoàn tất!',
loggingIn: 'Đang đăng nhập',
loggedIn: 'Đăng nhập thành công',
alreadyLogged: 'Đã đăng nhập',
loginFailed: "Không thể đăng nhập",
loggedOut: 'Đăng xuất',
cancellingCurrentItem: 'Đang hủy file hiện tại.',
currentItemCancelled: 'File hiện tại đã bị hủy.',
startAddingArtist: 'Đang đưa {0} album vào hàng chờ',
finishAddingArtist: 'Đã đưa {0} album vào hàng chờ',
startConvertingSpotifyPlaylist: 'Đang chuyển đổi các bài hát từ Spotify sang Deezer',
finishConvertingSpotifyPlaylist: 'Playlist của Spotify đã được chuyển đổi',
loginNeededToDownload: 'Bạn cần phải đang nhập để tải nhạc!'
},
settings: {
title: 'Cài đặt',
languages: 'Ngôn ngữ',
login: {
title: 'Đăng nhập',
loggedIn: 'Bạn đã đăng nhập với tên {username}',
arl: {
question: 'Làm cách nào để có ARL của tôi?',
update: 'Cập nhật ARL'
},
logout: 'Đăng xuất'
},
appearance: {
title: 'Giao diện',
slimDownloadTab: 'Thanh tải xuống nhỏ'
},
downloadPath: {
title: 'Nơi tải xuống'
},
templates: {
title: 'Bản mẫu',
tracknameTemplate: 'Bài hát mẫu',
albumTracknameTemplate: 'Bài hát trong album mẫu',
playlistTracknameTemplate: 'Bài hát trong playlist mẫu'
},
folders: {
title: 'Thư mục',
createPlaylistFolder: 'Tạo thư mục cho playlist',
playlistNameTemplate: 'Thư mục playlist mẫu',
createArtistFolder: 'Tạo thư mục cho nghệ sĩ',
artistNameTemplate: 'Thư mục Nghệ sĩ mẫu',
createAlbumFolder: 'Tạo thư mục cho album',
albumNameTemplate: 'Thư mục cho album mẫu',
createCDFolder: 'Tạo thư mục cho đĩa CD',
createStructurePlaylist: 'Tạo thư mục có kết cấu cho playlist',
createSingleFolder: 'Tạo thư mục có kết cấu cho đĩa đơn'
},
trackTitles: {
title: 'Tên bài hát',
padTracks: 'Đệm tên bài hát',
paddingSize: 'Ghì đè kích cỡ phần đệm',
illegalCharacterReplacer: 'Thay các kí tự không hợp lệ với'
},
downloads: {
title: 'Tải xuống',
queueConcurrency: 'Số lượng tải xuống cùng lúc',
maxBitrate: {
title: 'Bitrate ưa thích',
9: 'FLAC 1411kbps',
3: 'MP3 320kbps',
1: 'MP3 128kbps'
},
overwriteFile: {
title: 'Tôi có nên ghi đè file này không?',
y: 'Có, hãy ghi đè file này',
n: "Không, đừng ghi đè file này",
t: 'Chỉ ghi đè các tag'
},
fallbackBitrate: 'Bitrate dự phòng',
fallbackSearch: 'Search dự phòng',
logErrors: 'Tạo file log khi có lỗi',
logSearched: 'Tạo file log khi bạn tìm Bài hát',
createM3U8File: 'Tạo file playlist',
syncedLyrics: 'Tạo file .lyr (Lời Bài hát)',
playlistFilenameTemplate: 'Tên playlist mẫu',
saveDownloadQueue: 'Lưu hàng chờ download khi đóng ứng dụng'
},
covers: {
title: 'Bìa album',
saveArtwork: 'Lưu bìa',
coverImageTemplate: 'Tên bìa mẫu',
saveArtworkArtist: 'Lưu hình Nghệ sĩ',
artistImageTemplate: 'Hình nghệ sĩ mẫu',
localArtworkSize: 'Kích cỡ file bìa',
embeddedArtworkSize: 'Kích cỡ bìa trong file bài hát',
localArtworkFormat: {
title: 'Bạn muốn file bìa ở định dạng nào?',
jpg: 'jpg',
png: 'png',
both: 'Cả jpg và png'
},
jpegImageQuality: 'Chất lượng file JPEG'
},
tags: {
head: 'Những tag sẽ được lưu',
title: 'Tiêu đề',
artist: 'Nghệ sĩ',
album: 'Album',
cover: 'Bìa',
trackNumber: 'Số bài hát',
trackTotal: 'Tổng số bài hát',
discNumber: 'Số đĩa',
discTotal: 'Tổng số đĩa',
albumArtist: 'Nghệ sĩ của album',
genre: 'Thể loại',
year: 'Năm',
date: 'Ngày',
explicit: 'Lời explicit',
isrc: 'ISRC',
length: 'Thời lượng',
barcode: 'Mã vạch của album (UPC)',
bpm: 'BPM',
replayGain: 'ReplayGain',
label: 'Nhãn hiệu album',
lyrics: 'Lời',
copyright: 'Bản quyền',
composer: 'Nhà soạn nhạc',
involvedPeople: 'Những người liên quan'
},
other: {
title: 'Khác',
savePlaylistAsCompilation: 'Lưu playlist dưới dạng tuyển tập',
useNullSeparator: 'Dùng dải phân cách null',
saveID3v1: 'Lưu ID3v1',
multiArtistSeparator: {
title: 'Bạn muốn phân cách các nghệ sĩ như thế nào?',
nothing: 'Chỉ lưu nghệ sĩ chính',
default: 'Dùng quy cách tiêu chuẩn',
andFeat: 'Dùng & và feat.',
using: 'Dùng "{0}"'
},
singleAlbumArtist: 'Chỉ lưu Nghệ sĩ Album chính',
albumVariousArtists: 'Giữ nguyên "Nhiều Nghệ sĩ" trong Nghệ sĩ Album',
removeAlbumVersion: 'Bỏ "Phiên bản Album" khỏi tên bài hát',
removeDuplicateArtists: 'Bỏ các tên nghệ sĩ phối hợp',
dateFormat: {
title: 'Định dạng ngày cho file FLAC ',
year: 'YYYY',
month: 'MM',
day: 'DD'
},
featuredToTitle: {
title: 'Tôi nên làm gì với các nghệ sĩ đóng góp?',
0: 'Không làm gì cả',
1: 'Bỏ chúng khỏi tên bài hát',
3: 'Bỏ chúng khỏi tên bài hát và tên album',
2: 'Đưa chúng vào tên bài hát'
},
titleCasing: 'Định dạng tên bài hát',
artistCasing: 'Định dạng tên nghệ sĩ',
casing: {
nothing: 'Không đổi',
lower: 'chữ thường',
upper: 'CHỮ HOA',
start: 'Viết Hoa Ở Chữ Cái Đầu Tiên Của Mỗi Từ',
sentence: 'Như một câu'
},
previewVolume: 'Âm lượng nghe thử',
executeCommand: {
title: 'Thực hiện những lệnh này khi đã tải xuống xong',
description: 'Để trống nếu bạn không muốn thực hiện lệnh nào'
}
},
spotify: {
title: 'Chức năng Spotify',
clientID: 'ClientID của Spotify',
clientSecret: 'Client Secret của Spotify',
username: 'Tên tài khoản của Spotify'
},
reset: 'Quay trở lại cài đặt mặc định',
save: 'Lưu',
toasts: {
init: 'Cài đặt đã được thiết lập!',
update: 'Cài đặt cập nhật thành công!',
ARLcopied: 'ARL đã được sao chép vào clipboard'
}
},
sidebar: {
home: 'trang chủ',
search: 'tìm kiếm',
charts: 'bảng xếp hạng',
favorites: 'yêu thích',
linkAnalyzer: 'phân tích link',
settings: 'cài đặt',
about: 'thông tin'
},
tracklist: {
downloadSelection: 'Tải xuống những mục đã chọn'
}
}
export default vn

View File

@ -9,9 +9,11 @@ import de from '@/lang/de'
import fr from '@/lang/fr' import fr from '@/lang/fr'
import id from '@/lang/id' import id from '@/lang/id'
import pt from '@/lang/pt-pt' import pt from '@/lang/pt-pt'
import ptBr from '@/lang/pt-br' import pt_br from '@/lang/pt-br'
import ru from '@/lang/ru' import ru from '@/lang/ru'
import tr from '@/lang/tr' import tr from '@/lang/tr'
import vn from '@/lang/vn'
import hr from '@/lang/hr'
Vue.use(VueI18n) Vue.use(VueI18n)
@ -27,9 +29,11 @@ const locales = {
fr, fr,
id, id,
pt, pt,
ptBr, pt_br,
ru, ru,
tr tr,
vn,
hr
} }
const i18n = new VueI18n({ const i18n = new VueI18n({

View File

@ -3,8 +3,6 @@ import VueRouter from 'vue-router'
import TracklistTab from '@components/TracklistTab.vue' import TracklistTab from '@components/TracklistTab.vue'
console.log(TracklistTab)
Vue.use(VueRouter) Vue.use(VueRouter)
const routes = [ const routes = [
@ -29,7 +27,6 @@ const router = new VueRouter({
}) })
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
console.log({ from, to })
next() next()
}) })

View File

@ -8,6 +8,8 @@ import pt from 'svg-country-flags/svg/pt.svg'
import br from 'svg-country-flags/svg/br.svg' import br from 'svg-country-flags/svg/br.svg'
import ru from 'svg-country-flags/svg/ru.svg' import ru from 'svg-country-flags/svg/ru.svg'
import tr from 'svg-country-flags/svg/tr.svg' import tr from 'svg-country-flags/svg/tr.svg'
import vn from 'svg-country-flags/svg/vn.svg'
import hr from 'svg-country-flags/svg/hr.svg'
export default { export default {
it, it,
@ -17,7 +19,9 @@ export default {
fr, fr,
id, id,
pt, pt,
ptBr: br, pt_br: br,
ru, ru,
tr tr,
vn,
hr
} }

View File

@ -44,6 +44,7 @@ export const toast = function(msg, icon = null, dismiss = true, id = null) {
} }
if (toastObj && dismissable) { if (toastObj && dismissable) {
toastObj.hideToast() toastObj.hideToast()
if (id) delete toastsWithId[id]
} }
} }
}).showToast() }).showToast()