From 9fe17e7869dcccf56fbfb51ac7fa3dc4a4a9cc10 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sat, 5 Feb 2022 22:02:02 -0800 Subject: [PATCH 01/54] just in case --- src/renderer/views/pages/settings.ejs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 8d3573c6..89b2ac15 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -808,6 +808,7 @@ ciderPPECompatibility: function () { if (app.cfg.audio.spatial) { notyf.error("CAP is not compatible with Spatialization. Please disable Spatialization to continue.") + app.cfg.audio.advanced.ciderPPE = false; } }, toggleSpatial: function () { From 393b0a7e0dcd11b1a7c7b2a8d8959c0c0b0985fe Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sat, 5 Feb 2022 22:32:10 -0800 Subject: [PATCH 02/54] trademark LMAO --- src/i18n/en_OWO.jsonc | 2 +- src/i18n/en_PISS.jsonc | 2 +- src/i18n/en_US.jsonc | 4 ++-- src/i18n/ja_JP.jsonc | 2 +- src/i18n/zh_CN.jsonc | 2 +- src/i18n/zh_TW.jsonc | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/i18n/en_OWO.jsonc b/src/i18n/en_OWO.jsonc index 286af8bc..8db529b0 100644 --- a/src/i18n/en_OWO.jsonc +++ b/src/i18n/en_OWO.jsonc @@ -229,7 +229,7 @@ "settings.option.audio.seamlessTransition": "Seamwess Audiowo Twansition", // Toggle "settings.option.audio.enableAdvancedFunctionality": "Enabwe Advanced Functionawity", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "Enabwing AudiowoContext functionawity wiww awwow fow extended audiowo featuwes wike Audiowo Nowmawization, Equalizews and Visuawizews, howevew on some systems dis may cause stuttewing in audiowo twacks.", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cidew Adwenawine Pwocessow", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cidew Adwenawine Pwocessow™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacouwstic enhancements that makes evewything souwnd both wichew and mowe wivewy. | Designed by Maikiwi", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP stwength", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the stwength of the pwocessing done to the auwdio. (Aggwessive may yiewd uwndesiwabwe wesuwwts)", diff --git a/src/i18n/en_PISS.jsonc b/src/i18n/en_PISS.jsonc index 4e53489f..07dd925c 100644 --- a/src/i18n/en_PISS.jsonc +++ b/src/i18n/en_PISS.jsonc @@ -243,7 +243,7 @@ "settings.option.audio.seamlessTransition": "seamless piss-to-piss transition", // Toggle "settings.option.audio.enableAdvancedFunctionality": "cool piss tricks", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "enabling the AudioContext thingy allows you to do cool stuffs, however on some systems your song may stutter", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "clear piss", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "clear piss™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "makes your bladder go overboard and makes your piss crisp and clear.", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "piss normaliztion", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "protect your eardrums from overly loud/slient pisses", diff --git a/src/i18n/en_US.jsonc b/src/i18n/en_US.jsonc index f5066780..91bc9d14 100644 --- a/src/i18n/en_US.jsonc +++ b/src/i18n/en_US.jsonc @@ -232,8 +232,8 @@ "settings.option.audio.seamlessTransition": "Seamless Audio Transition", // Toggle "settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization , Equalizers and Visualizers, however on some systems this may cause stuttering in audio tracks.", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor", // Toggle - "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes everything sound both richer and more lively. | Designed by Maikiwi", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes everything sound both richer and more lively | Designed by Maikiwi.", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard", diff --git a/src/i18n/ja_JP.jsonc b/src/i18n/ja_JP.jsonc index 9cec0629..d1867969 100644 --- a/src/i18n/ja_JP.jsonc +++ b/src/i18n/ja_JP.jsonc @@ -208,7 +208,7 @@ "settings.option.audio.seamlessTransition": "曲間なしで再生", // Toggle "settings.option.audio.enableAdvancedFunctionality": "先進的な機能", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "AudioContext 機能を有効にすると、オーディオノーマライズ、空間オーディオ、イコライザーなどの機能を使用できますが、音が途切れるかもしれません。", // Toggle - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider AEP", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider AEP™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "圧縮音源を高解像度に処理することによって、ロスレス相当の音質に向上させます。", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "AEPの強さ", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)", diff --git a/src/i18n/zh_CN.jsonc b/src/i18n/zh_CN.jsonc index cb323812..0ebcb5ab 100644 --- a/src/i18n/zh_CN.jsonc +++ b/src/i18n/zh_CN.jsonc @@ -208,7 +208,7 @@ "settings.option.audio.seamlessTransition": "无缝播放", // Toggle "settings.option.audio.enableAdvancedFunctionality": "进阶功能", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "启用 AudioContext 将解锁例如音量标准化和音频空间化的功能,但可能会在小部分设备上出现音频上的卡顿。", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 数字增强引擎", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 数字增强引擎™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "将欺骗您的大脑来感知到近似无损音频的效果。", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音量标准化", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "使所感知到的音频响度统一", diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index 67dd8aff..0e40cf5b 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -209,7 +209,7 @@ "settings.option.audio.seamlessTransition": "無間斷播放", // Toggle "settings.option.audio.enableAdvancedFunctionality": "進階機能", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "啟用 AudioContext 將解鎖類似音訊標準化和等化器的進階機能。但是會在部分電腦造成音樂卡頓。", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數位增强音訊處理", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數位增强音訊處理™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "將欺騙您的大腦使其感受近似保真壓縮的音質。| 由 Maikiwi 設計", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "數位增强音訊處理設置", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "將更改音訊處理的激進程度(增强選項有可能會引起雜訊)", From 34e447f9902e7426d1a70dcff02e6d1bbfc79015 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sat, 5 Feb 2022 22:50:30 -0800 Subject: [PATCH 03/54] missspelll --- src/renderer/views/pages/settings.ejs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 89b2ac15..99da6a3d 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -808,12 +808,12 @@ ciderPPECompatibility: function () { if (app.cfg.audio.spatial) { notyf.error("CAP is not compatible with Spatialization. Please disable Spatialization to continue.") - app.cfg.audio.advanced.ciderPPE = false; + app.cfg.advanced.ciderPPE = false; } }, toggleSpatial: function () { if (app.cfg.audio.spatial) { - if (!app.cfg.audio.advanced.ciderPPE) { + if (!app.cfg.advanced.ciderPPE) { CiderAudio.spatialOn()} else { notyf.error("Spatialization is not compatible with CAP. Please disable CAP to continue.") From 8f5a1234125258efbc6358576cd441e61c3bc3ed Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sun, 6 Feb 2022 07:15:06 +0000 Subject: [PATCH 04/54] removed unused depends and qr code depend as not necessary --- package.json | 7 ------- src/main/base/browserwindow.ts | 6 +----- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/package.json b/package.json index 7d189bf0..93141b16 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,11 @@ "dependencies": { "@sentry/electron": "^2.5.4", "@sentry/integrations": "^6.17.4", - "castv2-client": "^1.2.0", "discord-rpc": "^4.0.1", "ejs": "^3.1.6", "electron-fetch": "^1.7.4", "electron-log": "^4.4.5", "electron-notarize": "^1.1.1", - "electron-packager": "^15.4.0", "electron-store": "^8.0.1", "electron-updater": "^4.6.1", "electron-window-state": "^5.0.3", @@ -48,18 +46,13 @@ "mpris-service": "^2.1.2", "music-metadata": "^7.11.4", "node-gyp": "^8.4.1", - "node-ssdp": "^4.0.1", "qrcode": "^1.5.0", - "qrcode-terminal": "^0.12.0", "react": "^17.0.2", "react-dom": "^17.0.2", "run-script-os": "^1.1.6", "source-map-support": "^0.5.21", - "tsc": "^2.0.4", "typescript": "^4.5.5", - "upnp-mediarenderer-client": "^1.4.0", "v8-compile-cache": "^2.3.0", - "wavefile": "^11.0.0", "ws": "^8.4.2", "xml2js": "^0.4.23", "youtube-search-without-api-key": "^1.0.7" diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index e9722e9d..655bd67e 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -6,8 +6,7 @@ import * as getPort from "get-port"; import {search} from "youtube-search-without-api-key"; import {existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync} from "fs"; import {Stream} from "stream"; -import {generate as generateQR} from "qrcode-terminal"; -import {hostname, networkInterfaces} from "os"; +import {networkInterfaces} from "os"; import * as mm from 'music-metadata'; import fetch from 'electron-fetch' import {wsapi} from "./wsapi"; @@ -287,9 +286,6 @@ export class BrowserWindow { this.broadcastRemote() remote.listen(this.remotePort, () => { console.log(`Cider remote port: ${this.remotePort}`); - if (firstRequest) { - generateQR(`http://${hostname}:${this.remotePort}`); - } firstRequest = false; }) remote.get("/", (_req, res) => { From 4651b791060ba678709ce63a7360758ecdc15b69 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sun, 6 Feb 2022 07:15:56 +0000 Subject: [PATCH 05/54] this should be false --- src/main/base/store.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 564f267a..c8ac6280 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -6,7 +6,7 @@ export class Store { private defaults: any = { "general": { - "close_button_hide": true, + "close_button_hide": false, "open_on_startup": false, "discord_rpc": 1, // 0 = disabled, 1 = enabled as Cider, 2 = enabled as Apple Music "discord_rpc_clear_on_pause": true, From e7537e4a2bf0459e7cf965b75736b09a0e4c6b61 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sun, 6 Feb 2022 08:12:22 +0000 Subject: [PATCH 06/54] Menubar Moved to Plugin --- src/main/base/browserwindow.ts | 133 ++-------------------- src/main/base/utils.ts | 2 + src/main/plugins/menubar.ts | 197 +++++++++++++++++++++++++++++++++ src/main/plugins/thumbar.ts | 2 +- 4 files changed, 207 insertions(+), 127 deletions(-) create mode 100644 src/main/plugins/menubar.ts diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index 655bd67e..9c701a04 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -1,5 +1,5 @@ import {join} from "path"; -import {app, BrowserWindow as bw, ipcMain, shell, ShareMenu, Menu, nativeImage} from "electron"; +import {app, BrowserWindow as bw, ipcMain, ShareMenu, shell} from "electron"; import * as windowStateKeeper from "electron-window-state"; import * as express from "express"; import * as getPort from "get-port"; @@ -13,8 +13,6 @@ import {wsapi} from "./wsapi"; import {jsonc} from "jsonc"; import {AppImageUpdater, NsisUpdater} from "electron-updater"; import {utils} from './utils'; -import * as path from "path"; - export class BrowserWindow { @@ -198,9 +196,9 @@ export class BrowserWindow { res.render("main", this.EnvironmentVariables); }); - app.get("/api/playback/:action", (req, res)=>{ + app.get("/api/playback/:action", (req, res) => { const action = req.params.action; - switch(action) { + switch (action) { case "playpause": BrowserWindow.win.webContents.executeJavaScript("wsapi.togglePlayPause()") res.send("Play/Pause toggle") @@ -546,9 +544,9 @@ export class BrowserWindow { BrowserWindow.win.webContents.send('send-remote-pair-url', url); }) if (process.platform === "darwin") { - app.setUserActivity('com.CiderCollective.remote.pair', { - ip: `${BrowserWindow.getIP()}` - }, `http://${BrowserWindow.getIP()}:${this.remotePort}`); + app.setUserActivity('com.CiderCollective.remote.pair', { + ip: `${BrowserWindow.getIP()}` + }, `http://${BrowserWindow.getIP()}:${this.remotePort}`); } // Get previews for normalization ipcMain.on("getPreviewURL", (_event, url) => { @@ -580,7 +578,7 @@ export class BrowserWindow { }) ipcMain.on('share-menu', async (_event, url) => { - if ( process.platform != 'darwin') return; + if (process.platform != 'darwin') return; //https://www.electronjs.org/docs/latest/api/share-menu console.log('[Share Sheet - App.ts]', url) const options = { @@ -593,11 +591,6 @@ export class BrowserWindow { }) - - - - - /* ********************************************************************************************* * Window Events * **********************************************************************************************/ @@ -662,118 +655,6 @@ export class BrowserWindow { shell.openExternal(x.url).catch(console.error); return {action: "deny"}; }); - - /* ********************************************************************************************* - * Menu - * **********************************************************************************************/ - //@ts-ignore - console.log(path.join(__dirname, '../../src/renderer/views/svg/smartphone.svg')) - const isMac = process.platform === 'darwin'; - //TODO: Figure out the icons - const remoteIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/smartphone.svg')).toPNG() - const soundIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/headphones.svg')).toPNG() - const aboutIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/info.svg')).toPNG() - const settingsIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/settings.svg')).toPNG() - const logoutIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/log-out.svg')).toPNG() - const ciderIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/assets/logocute.png')) - const template = [ - // { role: 'appMenu' } - ...(isMac ? [{ - label: app.name, - submenu: [ - { label: 'Web Remote', accelerator: 'CommandOrControl+W', sublabel: 'Opens in external window', click: () => BrowserWindow.win.webContents.executeJavaScript(`ipcRenderer.invoke('showQR')`)}, //accelerator - { label: 'Audio Settings', accelerator: 'CommandOrControl+Shift+A', click: () => BrowserWindow.win.webContents.executeJavaScript(`app.modals.audioSettings = true`)}, - { label: 'About', accelerator: 'CommandOrControl+Shift+B', click: () => BrowserWindow.win.webContents.executeJavaScript(`app.appRoute('about'`)}, - { label: 'Settings', accelerator: 'CommandOrControl+,', click: () => BrowserWindow.win.webContents.executeJavaScript(`app.appRoute('settings')`)}, - { label: 'Logout', accelerator: 'CommandOrControl+Shift+O', click: () => BrowserWindow.win.webContents.executeJavaScript(`app.unauthorize(); document.location.reload()`)}, - { type: 'separator' }, - { role: 'quit' } - ] - }] : []), - // { role: 'viewMenu' } - { - label: 'View', - submenu: [ - { role: 'reload' }, - { role: 'forceReload' }, - { role: 'toggleDevTools' }, - { type: 'separator' }, - { role: 'resetZoom' }, - { role: 'zoomIn' }, - { role: 'zoomOut' }, - { type: 'separator' }, - { role: 'togglefullscreen' } - ] - }, - // { role: 'windowMenu' } - { - label: 'Window', - submenu: [ - { role: 'minimize' }, - { role: 'zoom' }, - ...(isMac ? [ - { type: 'separator' }, - { role: 'front' }, - { type: 'separator' }, - { role: 'window' } - ] : [ - { role: 'close' } - ]) - ] - }, - { - role: 'help', - submenu: [ - { - label: 'Discord', - accelerator: 'CommandOrControl+Shift+D', - click: async () => { - const { shell } = require('electron') - await shell.openExternal('https://discord.gg/applemusic') - } - }, - { - label: 'Donate', - accelerator: 'CommandOrControl+D', - icon: ciderIcon, - click: async () => { - const { shell } = require('electron') - await shell.openExternal('https://opencollective.com/ciderapp/') - } - }, - { - label: 'Report a...', - submenu: [ - { - label: 'Bug', - click: async () => { - const {shell} = require('electron') - await shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=bug%2Ctriage&template=bug_report.yaml&title=%5BBug%5D%3A+") - } - }, - { - label: 'Feature Request', - click: async () => { - const {shell} = require('electron') - await shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=enhancement%2Ctriage&template=feature_request.yaml&title=%5BEnhancement%5D%3A+") - } - }, - { - label: 'Translation Report/Request', - click: async () => { - const {shell} = require('electron') - await shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=%F0%9F%8C%90+Translations&template=translation.yaml&title=%5BTranslation%5D%3A+") - } - }, - ] - }, - ] - } - ] - //@ts-ignore - const menu = Menu.buildFromTemplate(template) - Menu.setApplicationMenu(menu) - } /** diff --git a/src/main/base/utils.ts b/src/main/base/utils.ts index 5197a6eb..96b937d0 100644 --- a/src/main/base/utils.ts +++ b/src/main/base/utils.ts @@ -12,6 +12,8 @@ export class utils { */ private static paths: any = { srcPath: path.join(__dirname, "../../src"), + rendererPath: path.join(__dirname, "../../src/renderer"), + mainPath: path.join(__dirname, "../../src/main"), resourcePath: path.join(__dirname, "../../resources"), i18nPath: path.join(__dirname, "../../src/i18n"), ciderCache: path.resolve(app.getPath("userData"), "CiderCache"), diff --git a/src/main/plugins/menubar.ts b/src/main/plugins/menubar.ts new file mode 100644 index 00000000..3477a5d7 --- /dev/null +++ b/src/main/plugins/menubar.ts @@ -0,0 +1,197 @@ +import {app, Menu, shell} from "electron"; + +export default class Thumbar { + /** + * Private variables for interaction in plugins + */ + private _win: any; + private _app: any; + private _store: any; + + /** + * Base Plugin Details (Eventually implemented into a GUI in settings) + */ + public name: string = 'Menubar Plugin'; + public description: string = 'Creates the menubar'; + public version: string = '1.0.0'; + public author: string = 'Core / Quack'; + + /** + * Thumbnail Toolbar Assets + * NATIVE-IMAGE DOESN'T SUPPORT SVG + private icons: { [key: string]: Electron.NativeImage } = { + remoteIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/smartphone.svg')).toPNG(), + soundIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/headphones.svg')).toPNG(), + aboutIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/info.svg')).toPNG(), + settingsIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/settings.svg')).toPNG(), + logoutIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/log-out.svg')).toPNG(), + ciderIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'assets/logocute.png')).toPNG(), + } + */ + + /** + * Menubar Assets + * @private + */ + private isMac: boolean = process.platform === 'darwin'; + private menubarTemplate: any = [ + { + label: app.name, + submenu: [ + { + label: 'Web Remote', + accelerator: 'CommandOrControl+Shift+W', + sublabel: 'Opens in external window', + click: () => this._win.webContents.executeJavaScript(`ipcRenderer.invoke('showQR')`) + }, //accelerator + { + label: 'Audio Settings', + accelerator: 'CommandOrControl+Shift+A', + click: () => this._win.webContents.executeJavaScript(`app.modals.audioSettings = true`) + }, + { + label: 'About', + accelerator: 'CommandOrControl+Shift+B', + click: () => this._win.webContents.executeJavaScript(`app.appRoute('about'`) + }, + { + label: 'Settings', + accelerator: 'CommandOrControl+,', + click: () => this._win.webContents.executeJavaScript(`app.appRoute('settings')`) + }, + { + label: 'Logout', + accelerator: 'CommandOrControl+Shift+O', + click: () => this._win.webContents.executeJavaScript(`app.unauthorize()`) + }, + {type: 'separator'}, + {role: 'quit'} + ] + }, + { + label: 'View', + submenu: [ + {role: 'reload'}, + {role: 'forceReload'}, + {role: 'toggleDevTools'}, + {type: 'separator'}, + {role: 'resetZoom'}, + {role: 'zoomIn'}, + {role: 'zoomOut'}, + {type: 'separator'}, + {role: 'togglefullscreen'} + ] + }, + { + label: 'Window', + submenu: [ + {role: 'minimize'}, + {role: 'zoom'}, + ...(this.isMac ? [ + {type: 'separator'}, + {role: 'front'}, + {type: 'separator'}, + {role: 'window'} + ] : [ + {role: 'close'} + ]) + ] + }, + { + label: 'Support', + role: 'help', + submenu: [ + { + label: 'Discord', + click: () => shell.openExternal("https://discord.gg/AppleMusic").catch(console.error) + }, + { + label: 'GitHub Wiki', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/wiki/Troubleshooting").catch(console.error) + }, + { + label: 'About', + click: () => this._win.webContents.executeJavaScript(`app.appRoute('about')`) + }, + {type: 'separator'}, + { + label: 'Report a...', + submenu: [ + { + label: 'Bug', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=bug%2Ctriage&template=bug_report.yaml&title=%5BBug%5D%3A+").catch(console.error) + }, + { + label: 'Feature Request', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=enhancement%2Ctriage&template=feature_request.yaml&title=%5BEnhancement%5D%3A+").catch(console.error) + }, + { + label: 'Translation Report/Request', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=%F0%9F%8C%90+Translations&template=translation.yaml&title=%5BTranslation%5D%3A+").catch(console.error) + }, + ] + }, + {type: 'separator'}, + { + label: 'View License', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/blob/main/LICENSE").catch(console.error) + }, + {type: 'separator'}, + { + label: 'Toggle Developer Tools', + accelerator: 'Option+CommandOrControl+I', + click: () => this._win.webContents.openDevTools() + }, + { + label: 'Open Configuration File in Editor', + click: () => this._store.openInEditor() + } + ] + } + ] + + /******************************************************************************************* + * Public Methods + * ****************************************************************************************/ + + /** + * Runs on plugin load (Currently run on application start) + */ + constructor(app: any, store: any) { + this._app = app; + this._store = store + console.debug(`[Plugin][${this.name}] Loading Complete.`); + } + + /** + * Runs on app ready + */ + onReady(win: Electron.BrowserWindow): void { + this._win = win; + Menu.setApplicationMenu(Menu.buildFromTemplate(this.menubarTemplate)) + } + + /** + * Runs on app stop + */ + onBeforeQuit(): void { + console.debug(`[Plugin][${this.name}] Stopped.`); + } + + /** + * Runs on playback State Change + * @param attributes Music Attributes (attributes.status = current state) + */ + onPlaybackStateDidChange(attributes: object): void { + + } + + /** + * Runs on song change + * @param attributes Music Attributes + */ + onNowPlayingItemDidChange(attributes: object): void { + + } + +} diff --git a/src/main/plugins/thumbar.ts b/src/main/plugins/thumbar.ts index 4644920e..2ba1f1a9 100644 --- a/src/main/plugins/thumbar.ts +++ b/src/main/plugins/thumbar.ts @@ -20,7 +20,7 @@ export default class Thumbar { /** * Thumbnail Toolbar Assets */ - private icons: { pause: Electron.NativeImage, play: Electron.NativeImage, next: Electron.NativeImage, previous: Electron.NativeImage } = { + private icons: { [key: string]: Electron.NativeImage } = { pause: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_pause.png`)), play: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_play.png`)), next: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_next.png`)), From c86d66d142014d56bed0038ef54f3b8724f1bf3d Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sun, 6 Feb 2022 09:39:23 +0000 Subject: [PATCH 07/54] Small change in category for menubar.ts --- src/main/plugins/menubar.ts | 73 +++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/src/main/plugins/menubar.ts b/src/main/plugins/menubar.ts index 3477a5d7..5d729a8b 100644 --- a/src/main/plugins/menubar.ts +++ b/src/main/plugins/menubar.ts @@ -36,36 +36,17 @@ export default class Thumbar { private isMac: boolean = process.platform === 'darwin'; private menubarTemplate: any = [ { - label: app.name, + label: app.getName(), submenu: [ - { - label: 'Web Remote', - accelerator: 'CommandOrControl+Shift+W', - sublabel: 'Opens in external window', - click: () => this._win.webContents.executeJavaScript(`ipcRenderer.invoke('showQR')`) - }, //accelerator - { - label: 'Audio Settings', - accelerator: 'CommandOrControl+Shift+A', - click: () => this._win.webContents.executeJavaScript(`app.modals.audioSettings = true`) - }, - { - label: 'About', - accelerator: 'CommandOrControl+Shift+B', - click: () => this._win.webContents.executeJavaScript(`app.appRoute('about'`) - }, - { - label: 'Settings', - accelerator: 'CommandOrControl+,', - click: () => this._win.webContents.executeJavaScript(`app.appRoute('settings')`) - }, - { - label: 'Logout', - accelerator: 'CommandOrControl+Shift+O', - click: () => this._win.webContents.executeJavaScript(`app.unauthorize()`) - }, - {type: 'separator'}, - {role: 'quit'} + { role: 'about' }, + { type: 'separator' }, + { role: 'services' }, + { type: 'separator' }, + { role: 'hide' }, + { role: 'hideOthers' }, + { role: 'unhide' }, + { type: 'separator' }, + { role: 'quit' } ] }, { @@ -79,7 +60,7 @@ export default class Thumbar { {role: 'zoomIn'}, {role: 'zoomOut'}, {type: 'separator'}, - {role: 'togglefullscreen'} + {role: 'togglefullscreen'}, ] }, { @@ -94,7 +75,37 @@ export default class Thumbar { {role: 'window'} ] : [ {role: 'close'} - ]) + ]), + {type: 'separator'}, + { + label: 'Web Remote', + accelerator: 'CommandOrControl+Shift+W', + sublabel: 'Opens in external window', + click: () => this._win.webContents.executeJavaScript(`ipcRenderer.invoke('showQR')`) + }, + { + label: 'Audio Settings', + accelerator: 'CommandOrControl+Shift+A', + click: () => this._win.webContents.executeJavaScript(`app.modals.audioSettings = true`) + }, + { + label: 'Settings', + accelerator: 'CommandOrControl+,', + click: () => this._win.webContents.executeJavaScript(`app.appRoute('settings')`) + } + ] + }, + { + label: 'Account', + submenu: [ + { + label: 'Account Settings', + click: () => this._win.webContents.executeJavaScript(`app.appRoute('apple-account-settings')`) + }, + { + label: 'Sign Out', + click: () => this._win.webContents.executeJavaScript(`app.unauthorize()`) + } ] }, { From 0131a1a70adf75f490696cd1c9d7a07ec4bbbd62 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sun, 6 Feb 2022 10:58:30 +0000 Subject: [PATCH 08/54] Update to audio quality setting clarity (Translators note i18n README.md) - Changed audio quality setting to match MusicKit audio options (Low -> Standard) - Added descriptions for audio quality options - Audio quality now uses string for setting instead of direct bitrate option. --- src/i18n/README.md | 11 ++++++++++- src/i18n/en_US.jsonc | 10 +++++----- src/main/base/store.ts | 2 +- src/renderer/index.js | 20 +++++--------------- src/renderer/views/pages/settings.ejs | 13 ++++++------- 5 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/i18n/README.md b/src/i18n/README.md index 4e77d616..1f5d47d4 100644 --- a/src/i18n/README.md +++ b/src/i18n/README.md @@ -55,4 +55,13 @@ Update 05/02/2022 09:00 UTC * `settings.header.audio.quality.lossless`: Added for `en_US`. * `settings.header.audio.quality.lossless.description`: Added for `en_US`. * `settings.option.audio.enableAdvancedFunctionality.ciderPPE`: Added for `en_US`. -* `settings.option.audio.enableAdvancedFunctionality.ciderPPE.description`: Added for `en_US`. \ No newline at end of file +* `settings.option.audio.enableAdvancedFunctionality.ciderPPE.description`: Added for `en_US`. + +Update 06/02/2022 10:35 UTC + +* `settings.header.audio.quality.hireslossless.description`: Brackets removed, handled in renderer. +* `settings.header.audio.quality.lossless.description`: Brackets removed, handled in renderer. +* `settings.header.audio.quality.high.description`: Added for `en_US`. +* `settings.header.audio.quality.auto`: Removed as default for MusicKit is 256. +* `settings.header.audio.quality.standard`: Replaced `settings.header.audio.quality.low` to match MusicKit naming. +* `settings.header.audio.quality.standard.description`: Added for `en_US`. \ No newline at end of file diff --git a/src/i18n/en_US.jsonc b/src/i18n/en_US.jsonc index 91bc9d14..997dc576 100644 --- a/src/i18n/en_US.jsonc +++ b/src/i18n/en_US.jsonc @@ -222,13 +222,13 @@ "settings.header.audio.description": "Adjust the audio settings for Cider.", "settings.option.audio.quality": "Audio Quality", // Dropdown "settings.header.audio.quality.hireslossless": "Hi-Res Lossless", - "settings.header.audio.quality.hireslossless.description": "(up to 24-bit/192 kHz)", + "settings.header.audio.quality.hireslossless.description": "up to 24-bit/192 kHz", "settings.header.audio.quality.lossless": "Lossless", - "settings.header.audio.quality.lossless.description": "(up to 24-bit/48 kHz)", - "settings.header.audio.quality.enhanced": "Enhanced", + "settings.header.audio.quality.lossless.description": "up to 24-bit/48 kHz", "settings.header.audio.quality.high": "High", - "settings.header.audio.quality.low": "Low", - "settings.header.audio.quality.auto": "Auto", + "settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "Standard", + "settings.header.audio.quality.standard.description": "64 kbps", "settings.option.audio.seamlessTransition": "Seamless Audio Transition", // Toggle "settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization , Equalizers and Visualizers, however on some systems this may cause stuttering in audio tracks.", diff --git a/src/main/base/store.ts b/src/main/base/store.ts index c8ac6280..7a4fd3ae 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -28,7 +28,7 @@ export class Store { "volume": 1, "lastVolume": 1, "muted": false, - "quality": "256", + "quality": "HIGH", "seamless_audio": true, "normalization": false, "ciderPPE": false, diff --git a/src/renderer/index.js b/src/renderer/index.js index 50128982..86dcfa65 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -670,23 +670,13 @@ const app = new Vue({ window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue.items)) }; - // Load saved quality - switch (app.cfg.audio.quality) { - case "extreme": - app.mk.bitrate = app.cfg.audio.quality = 990 - break; - case "high": - app.mk.bitrate = app.cfg.audio.quality = 256 - break; - case "low": - app.mk.bitrate = app.cfg.audio.quality = 64 - break; - default: - // app.mk.bitrate = app.cfg.audio.quality - break; + if (typeof MusicKit.PlaybackBitrate[app.cfg.audio.quality] !== "string") { + app.mk.bitrate = MusicKit.PlaybackBitrate[app.cfg.audio.quality] + } else { + app.mk.bitrate = 256 + app.cfg.audio.quality = "HIGH" } - // load last played track try { let lastItem = window.localStorage.getItem("currentTrack") diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 99da6a3d..99272f5c 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -35,11 +35,10 @@
@@ -823,8 +822,8 @@ } }, - changeAudioQuality: function () { - app.mk.bitrate = app.cfg.audio.quality + changeAudioQuality: function () {1 + app.mk.bitrate = MusicKit.PlaybackBitrate[app.cfg.audio.quality]; }, toggleUserInfo: function () { app.chrome.hideUserInfo = !app.cfg.visual.showuserinfo From d08b2966d083f84f763e54a630ff5900a1b02177 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Sun, 6 Feb 2022 18:24:59 +0000 Subject: [PATCH 09/54] CSS Fixes for PPE button --- src/renderer/style.less | 68 ++++++++++++++------------- src/renderer/views/app/chrome-top.ejs | 9 ++-- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/renderer/style.less b/src/renderer/style.less index 181abb32..7d4d8f86 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -1126,51 +1126,53 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl width: 100%; } -.app-chrome .app-chrome-item > .app-playback-controls .song-name { - font-weight: 600; - text-align: center; - font-size: 13px; - height: 1.3em; - line-height: 1.3em; - white-space: nowrap; - max-width: 360px; +.app-chrome .app-chrome-item > .app-playback-controls { + .song-name { + font-weight: 600; + text-align: center; + font-size: 13px; + height: 1.3em; + line-height: 1.3em; + white-space: nowrap; + max-width: 360px; - .song-name-normal { - height: inherit; - } + .song-name-normal { + height: inherit; + } - &.song-artist-marquee { - > marquee { - //margin-bottom: -3px; + &.song-artist-marquee { + > marquee { + //margin-bottom: -3px; + } + } + + .explicit-icon { + background-image: url("./assets/explicit.svg"); + height: 9px; + width: 13px; + filter: contrast(0); + background-repeat: no-repeat; + margin-left: 3px; } } - .explicit-icon { - background-image: url("./assets/explicit.svg"); - height: 9px; - width: 13px; - filter: contrast(0); - background-repeat: no-repeat; - margin-left: 3px; - } - .lossless-icon { - background-image: url("http://localhost:9000/assets/lossless.svg"); - height: 9px; - width: 36px; - filter: contrast(0); - background-repeat: no-repeat; - margin-left: 3px; - background-size: contain; + background-image: url("./assets/lossless.svg") !important; } .ppe-icon { - background-image: url("./assets/ppe.svg"); - height: 12px; - width: 13px; + background-image: url("./assets/ppe.svg") !important; + } + + .audio-type { filter: contrast(0); background-repeat: no-repeat; background-size: contain; + height: 15px; + width: 15px; + position: absolute; + right: 0; + margin-bottom: 15px; } } diff --git a/src/renderer/views/app/chrome-top.ejs b/src/renderer/views/app/chrome-top.ejs index 1a7f92ab..d9d946fd 100644 --- a/src/renderer/views/app/chrome-top.ejs +++ b/src/renderer/views/app/chrome-top.ejs @@ -50,17 +50,14 @@
-
+
{{ mk.nowPlayingItem["attributes"]["name"] }}
-
+
Date: Mon, 7 Feb 2022 02:42:05 +0100 Subject: [PATCH 10/54] Update Hungarian (hu_HU) language files (#357) --- src/i18n/hu_HU.jsonc | 128 +++++++++++++++++++++++++------------------ 1 file changed, 75 insertions(+), 53 deletions(-) diff --git a/src/i18n/hu_HU.jsonc b/src/i18n/hu_HU.jsonc index 005590c3..65bd88fa 100644 --- a/src/i18n/hu_HU.jsonc +++ b/src/i18n/hu_HU.jsonc @@ -1,11 +1,9 @@ { // Base File - // i18n Info "i18n.languageName": "Magyar", // name of language in native language "i18n.languageNameEnglish": "Hungarian", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@Greenoliv @Rias @BenjaminStonawski", // Authors, if you contribute to this file feel free to add your name seperated with a space - + "i18n.authors": "@Greenoliv @Amaru @BenjaminStonawski", // Authors, if you contribute to this file feel free to add your name seperated with a space // App info "app.name": "Cider", @@ -22,7 +20,7 @@ // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", - "term.applePodcasts": "Apple Podcasts", + "term.applePodcasts": "Apple Podcastok", "term.itunes": "iTunes", "term.github": "GitHub", "term.discord": "Discord", @@ -46,9 +44,9 @@ "term.playlists": "Lejátszási listák", "term.playlist": "Lejátszási lista", "term.newPlaylist": "Új lejátszási lista", - "term.newPlaylistFolder": "Új lejátszási lista mappa", + "term.newPlaylistFolder": "Új mappa", "term.createNewPlaylist": "Új lejátszási lista létrehozása", - "term.createNewPlaylistFolder": "Új lejátszási lista mappa létrehozása", + "term.createNewPlaylistFolder": "Új mappa létrehozása", "term.deletePlaylist": "Biztosan szeretné törölni a lejátszási listát?", "term.play": "Lejátszás", "term.pause": "Megállítás", @@ -60,6 +58,7 @@ "term.mute": "Némítás", "term.unmute": "Némítás feloldása", "term.share": "Megosztás", + "term.share.success": "Másolva a vágólapra", "term.settings": "Beállítások", "term.seeAll": "Összes", "term.sortBy": "Rendezés", @@ -104,35 +103,49 @@ "term.time.second": "másodperc", "term.fullscreenView": "Teljes képernyős mód", "term.defaultView": "Alapértelmezett nézet", - "term.spacializedAudioSetting": "Térbeli hangzás", + "term.spacializedAudioSetting": "Térbeli hang", "term.clearAll": "Összes törlése", "term.recentStations": "Nemrég játszott", "term.language": "Nyelv", - "term.funLanguages": "Mókás", + "term.funLanguages": "Fantázianyelvek", "term.noLyrics": "Betöltés... / Dalszöveg nem található. / Instrumentális.", "term.copyright": "Szerzői jog", "term.rightsReserved": "Minden jog fenntartva.", "term.sponsor": "Támogasd a projektet", "term.ciderTeam": "A Cider csapata", "term.developer": "Fejlesztő", - "term.socialTeam": "Szociális csapat", + "term.socialTeam": "Közösségi csapat", "term.socials": "Szociális", - "term.contributors": "Közreműködők", + "term.contributors": "Hozzájárulók", "term.equalizer": "Hangszínszabályozó", "term.reset": "Visszaállítás", "term.tracks": "zeneszám", // Assume x amount of tracks. e.g. 50 tracks "term.videos": "Videók", "term.menu": "Menü", - "term.check": "Bejelöl", - "term.aboutArtist": "További információ {{artistName}} előadóról", // e.g. 'About Doja Cat' - "term.updateCider": "Cider frissítése", - + "term.check": "Ellenőrzés", + "term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat' + "term.updateCider": "A Cider frissítése", + "term.topResult": "Legjobb találatok", // Search Results + "term.sharedPlaylists": "Megosztott lejátszási listák", // Search Results + "term.people": "Profilok", // Search Results + "term.newpreset.name": "New EQ Preset Name", // Equalizer Preset + "term.addedpreset": "Preset hozzáadva", + "term.deletepreset.warn": "Are you sure you want to delete this preset?", + "term.deletedpreset": "Preset törölve", + "term.musicVideos": "Videóklipek", // Search page friendlyTypes + "term.stations": "Állomások", + "term.curators": "Curators", + "term.appleCurators": "Apple Curators", + "term.radioShows": "Radio Shows", + "term.recordLabels": "Record Labels", + "term.videoExtras": "Videóextrák", + "term.top": "Top", // Home "home.title": "Kezdőlap", "home.recentlyPlayed": "Nemrég játszott", "home.recentlyAdded": "Nemrég hozzáadott", "home.artistsFeed": "Az előadóid feedje", - "home.artistsFeed.noArtist": "Kövess néhány előadót, hogy a legújabb zenéi itt megjelenhessenek.", + "home.artistsFeed.noArtist": "Kövess néhány előadót, hogy a legújabb zenéik itt megjelenjenek", "home.madeForYou": "Személyre szabva", "home.friendsListeningTo": "A barátaid épp ezt hallgatják", "home.followedArtists": "Követett előadók", @@ -141,7 +154,6 @@ "error.connectionError": "Hiba történt az Apple Musichoz való csatlakozás közben.", "error.noResults": "Nincs találat", "error.noResults.description": "Próbálkozzon új kereséssel", - //Podcasts "podcast.followOnCider": "Követés a Cideren", "podcast.followedOnCider": "Követve a Cideren", @@ -151,13 +163,12 @@ "podcast.episodes": "Epizódok", "podcast.playEpisode": "Epizód lejátszása", "podcast.website": "Podcast weboldala", - // Actions - "action.addToLibrary": "Hozzáadás a könyvtárhoz", - "action.addToLibrary.success": "Hozzáadva a könyvtárhoz", + "action.addToLibrary": "Hozzáadás a Könyvtárhoz", + "action.addToLibrary.success": "Hozzáadva a Könyvtárhoz", "action.addToLibrary.error": "Hiba a hozzáadáskor.", "action.removeFromLibrary": "Törlés a Könytárból", - "action.removeFromLibrary.success": "Törölve a könyvtárból", + "action.removeFromLibrary.success": "Törölve a Könyvtárból", "action.addToQueue": "Hozzáadás a várólistához", "action.addToQueue.success": "Hozzáadva a várólistához", "action.addToQueue.error": "Sikertelen hozzáadás a várólistához", @@ -182,51 +193,62 @@ "action.moveToTop": "Mozgatás legfelülre", "action.share": "Megosztás", "action.rename": "Átnevezés", - "action.love": "Kedvelés", - "action.unlove": "Kedvelés visszavonása", - "action.dislike": "Nem kedvelem", - "action.undoDislike": "Nem kedvelés visszavonása", - "action.showWebRemoteQR": "Távirányító QR kód megjelenítése", + "action.love": "Szeretem", + "action.unlove": "Mégsem szeretem", + "action.dislike": "Kevesebb ilyen javasolása", + "action.undoDislike": "A Kevesebb ilyen javasolása visszavonása", + "action.showWebRemoteQR": "Távirányító QR kód", "action.playTracksNext": "${app.selectedMediaItems.length} zenék lejátszása következőnek", "action.playTracksLater": "${app.selectedMediaItems.length} zenék lejátszása később", "action.removeTracks": "${self.selectedItems.length} zenék eltávolítása a várólistáról", "action.import": "Importálás", "action.export": "Exportálás", "action.showAlbum": "Teljes album megjelenítése", - // Waiting on Core for moving plugin to app.ts "action.tray.minimize": "Kicsinyítés a tálcára", "action.tray.quit": "Kilépés", "action.tray.show": "Megjelenítés", - + "action.update": "Frissítés", + "action.copy": "Másolás", + "action.newpreset": "Új Preset...", // Equalizer Preset + "action.deletepreset": "Preset törlése", // Settings - General "settings.header.general": "Általános", - "settings.header.general.description": "A Cider általános beállításainak módosítása", + "settings.header.general.description": "A Cider általános beállításainak módosítása.", "settings.option.general.language": "Nyelv", - // Language optgroups "settings.option.general.language.main": "Nyelvek", - "settings.option.general.language.fun": "Mókás nyelvek", - "settings.option.general.language.unsorted": "Nem besorolható", - + "settings.option.general.language.fun": "Fantázianyelvek", + "settings.option.general.language.unsorted": "Azonosítatlan", // Settings - Audio "settings.header.audio": "Hang", - "settings.header.audio.description": "A Cider hangbeállításainak módosítása", + "settings.header.audio.description": "A Cider hangbeállításainak módosítása.", "settings.option.audio.quality": "Hangminőség", // Dropdown - "settings.header.audio.quality.high": "Magas", - "settings.header.audio.quality.low": "Alacsony", - "settings.header.audio.quality.auto": "Automatikus", + "settings.header.audio.quality.hireslossless": "Nagy felbontású veszteségmentes", + "settings.header.audio.quality.hireslossless.description": "max. 24-bit/192 kHz sebességen", + "settings.header.audio.quality.lossless": "Veszteségmentes", + "settings.header.audio.quality.lossless.description": "max. up to 24-bit/48 kHz sebességen", + "settings.header.audio.quality.high": "High", + "settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "Standard", + "settings.header.audio.quality.standard.description": "64 kbps", "settings.option.audio.seamlessTransition": "Szünetmentes lejátszás", // Toggle "settings.option.audio.enableAdvancedFunctionality": "Haladó funkcionalitás engedélyezése", // Toggle - "settings.option.audio.enableAdvancedFunctionality.description": "Az AudioContext funkció engedélyezése lehetővé teszi a fejlettebb hangfunkciókat, például a normalizásást, a hangszínszabályozót és a vizualizáció funkciókat, azonban egyes számítógépeken ez akadozást okozhat a hangsávokban.", + "settings.option.audio.enableAdvancedFunctionality.description": "Az AudioContext funkció engedélyezése lehetővé teszi a fejlettebb hangfunkciókat, például a Normalizásást, az Equalizereket és a Visualizer funkciókat, azonban egyes számítógépeken ez akadozást okozhat a hangsávokban.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Pszichoakusztikus Módosítások amik minden hangot felerősítenek és ütősebbé tesznek | Készítette Maikiwi", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Erősség", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Megváltoztatja a hangra végzett feldolgozás erősségét. (Az Agresszív mód nemkívánatos eredményeket hozhat!)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Szokásos", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresszív", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizálás", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizálja az egyes zeneszámok hangosabb részeit, hogy egységesebb hallgatási élményt hozzon létre.", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Térbeli hangzás", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Térbeli hangzás és a hang háromdimenziósabbá tétele (Ez nem összekeverendő a Dolby Atmos-szal!)", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Térbeli hang", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Térbeli hang és a hang háromdimenziósabbá tétele (Ez nem összekeverendő a Dolby Atmos-szal!)", // Settings - Visual "settings.header.visual": "Vizuális", "settings.header.visual.description": "A Cider vizuális beállításainak módosítása.", "settings.option.visual.windowBackgroundStyle": "Ablak háttér stílusa", // Toggle - "settings.header.visual.windowBackgroundStyle.none": "Egyik sem", + "settings.header.visual.windowBackgroundStyle.none": "Sehol", "settings.header.visual.windowBackgroundStyle.artwork": "Borító", "settings.header.visual.windowBackgroundStyle.image": "Kép", "settings.option.visual.animatedArtwork": "Animált borító", // Dropdown @@ -244,22 +266,24 @@ "settings.option.visual.hardwareAcceleration.description": "Újraindítás szükséges", "settings.header.visual.hardwareAcceleration.default": "Alap", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.theme": "Téma", + // Settings - Visual - Theme name + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Sötét", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Személyes adatok mutatása", // Toggle - // Settings - Lyrics "settings.header.lyrics": "Dalszöveg", "settings.header.lyrics.description": "A Cider dalszöveg beállításainak módosítása.", "settings.option.lyrics.enableMusixmatch": "MusixMatch dalszövegek engedélyezése", // Toggle - "settings.option.lyrics.enableMusixmatchKaraoke": "Karaoke mód bekapcsolása (Csak MusixMatch esetén)", // Toggle + "settings.option.lyrics.enableMusixmatchKaraoke": "Karaoke mód bekapcsolása (Csak MusixMatch)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "MusixMatch fordítás nyelve", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "YouTube dalszövegek engedélyezése a zenei videóknál", // Toggle - // Settings - Connectivity - "settings.header.connectivity": "Csatlakozhatóságok", + "settings.header.connectivity": "Csatlakozások", "settings.header.connectivity.description": "A Cider csatlakozás beállításainak módosítása.", "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown - "settings.option.connectivity.playbackNotifications": "Értesítés új dal lejátszásakor", // Toggle + "settings.option.connectivity.playbackNotifications": "Lejátszás értesítések", // Toggle // Refer to term.disabled for the disabled option "settings.header.connectivity.discordRPC.cider": "Megjelenítés 'Cider'-ként", "settings.header.connectivity.discordRPC.appleMusic": "Megjelenítés 'Apple Music'-ként", @@ -267,20 +291,21 @@ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Késleltetés (%)", "settings.option.connectivity.lastfmScrobble.nowPlaying": "LastFM Now Playing engedélyezése", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "A közreműködő előadók eltávolítása a dal címéből (LastFM)", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)", "settings.option.connectivity.lastfmScrobble.filterLoop": "Loopolt zeneszám szűrése (LastFM)", // Refer to term.connect for the connect button - // Settings - Experimental "settings.header.experimental": "Kísérleti", "settings.header.experimental.description": "A Cider kísérleti beállításainak módosítása.", "settings.option.experimental.compactUI": "Kompakt UI", // Toggle "settings.option.experimental.close_button_hide": "A bezárás gomb rejtse el az alkalmazást", + "settings.option.experimental.copy_log": "Napló másolása a vágólapra", + "settings.option.experimental.inline_playlists": "Inline Playlists and Albums", // Refer to term.disabled & term.enabled - + // Spatialization Menu "spatial.notTurnedOn": "A térbeli hangzás ki van kapcsolva, használatához kapcsolja be.", - "spatial.spatialProperties": "Térbeli hangzás", + "spatial.spatialProperties": "Térbeli hang", "spatial.width": "Szélesség", "spatial.height": "Magasság", "spatial.depth": "Hosszúság", @@ -298,14 +323,11 @@ "spatial.down": "Lent", "spatial.listener": "Hallgató", "spatial.audioSource": "Hangforrás", - // Settings - Unfinished "settings.header.unfinished": "Befejezetlen", - // Web Remote "remote.web.title": "Cider Remote", "remote.web.description": "Olvasd be ezt a QR-kódot a telefonoddal, hogy tudd vezérelni a lejátszót.", - // About - "about.thanks": "Köszönet a Cider Collective csapatának és minden közreműködőnek." + "about.thanks": "Köszönet a Cider Collective csapatának és minden hozzájárulónak." } From ca4880368bf07d830756edb1bd078d3565f2ac1b Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 6 Feb 2022 18:59:09 -0800 Subject: [PATCH 11/54] i18n sync core's changes --- src/i18n/ja_JP.jsonc | 2 +- src/i18n/zh_CN.jsonc | 2 +- src/i18n/zh_TW.jsonc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/ja_JP.jsonc b/src/i18n/ja_JP.jsonc index d1867969..8b95e83d 100644 --- a/src/i18n/ja_JP.jsonc +++ b/src/i18n/ja_JP.jsonc @@ -203,7 +203,7 @@ "settings.header.audio.quality.lossless.description": "(最大解像度 24 ビット/48 kHz)", "settings.header.audio.quality.enhanced": "エンハンスド", "settings.header.audio.quality.high": "高品質", - "settings.header.audio.quality.low": "高効率", + "settings.header.audio.quality.standard": "高効率", "settings.header.audio.quality.auto": "自動", "settings.option.audio.seamlessTransition": "曲間なしで再生", // Toggle "settings.option.audio.enableAdvancedFunctionality": "先進的な機能", // Toggle diff --git a/src/i18n/zh_CN.jsonc b/src/i18n/zh_CN.jsonc index 0ebcb5ab..2c163650 100644 --- a/src/i18n/zh_CN.jsonc +++ b/src/i18n/zh_CN.jsonc @@ -203,7 +203,7 @@ "settings.header.audio.quality.lossless.description": "(最高 24 位/48 kHz)", "settings.header.audio.quality.enhanced": "数字增强", "settings.header.audio.quality.high": "高音质", - "settings.header.audio.quality.low": "高效率", + "settings.header.audio.quality.standard": "高效率", "settings.header.audio.quality.auto": "自动", "settings.option.audio.seamlessTransition": "无缝播放", // Toggle "settings.option.audio.enableAdvancedFunctionality": "进阶功能", // Toggle diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index 0e40cf5b..615d218d 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -204,7 +204,7 @@ "settings.header.audio.quality.lossless.description": "(高達 24-bit/48 kHz)", "settings.header.audio.quality.enhanced": "數位增强", "settings.header.audio.quality.high": "高品質", - "settings.header.audio.quality.low": "高效率", + "settings.header.audio.quality.standard": "高效率", "settings.header.audio.quality.auto": "自動", "settings.option.audio.seamlessTransition": "無間斷播放", // Toggle "settings.option.audio.enableAdvancedFunctionality": "進階機能", // Toggle From c38d6ab542bad30870818b4cc951eeb12bc9b412 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 6 Feb 2022 20:37:29 -0800 Subject: [PATCH 12/54] Update zh_TW.jsonc --- src/i18n/zh_TW.jsonc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index 615d218d..d0fdcd4e 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -240,6 +240,7 @@ "settings.option.visual.hardwareAcceleration.description": "需要重新啟動 Cider 才會生效", "settings.header.visual.hardwareAcceleration.default": "預設", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.theme": "主題", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle // Settings - General (Reserved) @@ -258,6 +259,7 @@ "settings.header.connectivity": "外部連接", "settings.header.connectivity.description": "調整 Cider 與外部的連接", "settings.option.connectivity.discordRPC": "Discord 動態", // Dropdown + "settings.option.connectivity.playbackNotifications": "播放通知", // Toggle // Refer to term.disabled for the disabled option "settings.header.connectivity.discordRPC.cider": "顯示正在玩 'Cider'", "settings.header.connectivity.discordRPC.appleMusic": "顯示正在玩 'Apple Music'", @@ -274,6 +276,8 @@ "settings.option.experimental.compactUI": "緊凑型 UI", // Toggle "settings.option.experimental.closeButtonBehaviour": "關閉按鈕操作", // Dropdown "settings.option.experimental.close_button_hide": "關閉按鈕會隱藏 Cider", + "settings.option.experimental.copy_log": "複製執行紀錄檔剪貼簿", + "settings.option.experimental.inline_playlists": "Inline Playlists and Albums", // Refer to term.disabled & term.enabled // Spatialization Menu From 8b582cb0ddab36a867049e9008a38fdd4d7cc4f1 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 6 Feb 2022 20:44:07 -0800 Subject: [PATCH 13/54] Update zh_TW.jsonc --- src/i18n/zh_TW.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index d0fdcd4e..ec07080b 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -277,7 +277,7 @@ "settings.option.experimental.closeButtonBehaviour": "關閉按鈕操作", // Dropdown "settings.option.experimental.close_button_hide": "關閉按鈕會隱藏 Cider", "settings.option.experimental.copy_log": "複製執行紀錄檔剪貼簿", - "settings.option.experimental.inline_playlists": "Inline Playlists and Albums", + "settings.option.experimental.inline_playlists": "將播放列表做為行内元素顯示", // Refer to term.disabled & term.enabled // Spatialization Menu From 31101a3fc00f8612e84c2b57c9460c1b1c425f86 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 6 Feb 2022 23:20:45 -0800 Subject: [PATCH 14/54] hello auto preamp --- src/main/base/store.ts | 1 - src/renderer/audio/audio.js | 40 ++++++++++----------- src/renderer/style.less | 2 +- src/renderer/views/components/equalizer.ejs | 35 +++++------------- src/renderer/views/pages/settings.ejs | 21 ++++++----- 5 files changed, 41 insertions(+), 58 deletions(-) diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 7a4fd3ae..eeac1e9c 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -62,7 +62,6 @@ export class Store { 'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000], 'gain': [0,0,0,0,0,0,0,0,0,0], 'Q' : [1,1,1,1,1,1,1,1,1,1], - 'preamp' : 0, 'mix' : 1, 'vibrantBass' : 0, 'presets': [], diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index caabddaf..c22ef29c 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -126,11 +126,10 @@ var CiderAudio = { let VIBRANTBASSBANDS = app.cfg.audio.vibrantBass.frequencies; let VIBRANTBASSGAIN = app.cfg.audio.vibrantBass.gain; let VIBRANTBASSQ = app.cfg.audio.vibrantBass.Q; - LLPW_Q = [5, 1, 3.536, 1.25, 8.409, 1.25, 14.14, 7.071, 5, 0.625, 16.82, 20, 20, 20, 28.28, 28.28, 28.28, 20, 33.64, 33.64, 10, 28.28, 7.071, 3.856]; - LLPW_GAIN = [0.38, -1.81, -0.23, -0.51, 0.4, 0.84, 0.36, -0.34, 0.27, -1.2, -0.42, -0.67, 0.81, 1.31, -0.71, 0.68, -1.04, 0.79, -0.73, -1.33, 1.17, 0.57, 0.35, 6.33]; - LLPW_FREQUENCIES = [16.452, 24.636, 37.134, 74.483, 159.54, 308.18, 670.21, 915.81, 1200.7, 2766.4, 2930.6, 4050.6, 4409.1, 5395.2, 5901.6, 6455.5, 7164.1, 7724.1, 8449, 10573, 12368, 14198, 17910, 18916]; - CiderAudio.audioNodes.audioBands = []; CiderAudio.audioNodes.vibrantbassNode = []; - CiderAudio.audioNodes.llpw = []; CiderAudio.audioNodes.llpwEnabled = 0; + let LLPW_Q = [5, 1, 3.536, 1.25, 8.409, 1.25, 14.14, 7.071, 5, 0.625, 16.82, 20, 20, 20, 28.28, 28.28, 28.28, 20, 33.64, 33.64, 10, 28.28, 7.071, 3.856]; + let LLPW_GAIN = [0.38, -1.81, -0.23, -0.51, 0.4, 0.84, 0.36, -0.34, 0.27, -1.2, -0.42, -0.67, 0.81, 1.31, -0.71, 0.68, -1.04, 0.79, -0.73, -1.33, 1.17, 0.57, 0.35, 6.33]; + let LLPW_FREQUENCIES = [16.452, 24.636, 37.134, 74.483, 159.54, 308.18, 670.21, 915.81, 1200.7, 2766.4, 2930.6, 4050.6, 4409.1, 5395.2, 5901.6, 6455.5, 7164.1, 7724.1, 8449, 10573, 12368, 14198, 17910, 18916]; + CiderAudio.audioNodes.audioBands = []; CiderAudio.audioNodes.vibrantbassNode = []; CiderAudio.audioNodes.llpw = []; for (i = 0; i < BANDS.length; i++) { CiderAudio.audioNodes.audioBands[i] = CiderAudio.context.createBiquadFilter(); @@ -139,7 +138,7 @@ var CiderAudio = { CiderAudio.audioNodes.audioBands[i].Q.value = Q[i]; CiderAudio.audioNodes.audioBands[i].gain.value = GAIN[i] * app.cfg.audio.equalizer.mix; } - + for (i = 0; i < LLPW_FREQUENCIES.length; i++) { CiderAudio.audioNodes.llpw[i] = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.llpw[i].type = 'peaking'; // 'peaking'; @@ -150,38 +149,39 @@ var CiderAudio = { CiderAudio.audioNodes.preampNode = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.preampNode.type = 'highshelf'; - CiderAudio.audioNodes.preampNode.frequency.value = 0; // allow all - CiderAudio.audioNodes.preampNode.gain.value = app.cfg.audio.equalizer.preamp; + CiderAudio.audioNodes.preampNode.frequency.value = 0; // Passthrough + if (CiderAudio.audioNodes.llpwEnabled === 1) {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain.concat(CiderAudio.audioNodes.llpw[23].gain.value)));} + else {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain));} for (i = 0; i < VIBRANTBASSBANDS.length; i++) { - CiderAudio.audioNodes.vibrantbassNode[i] = CiderAudio.context.createBiquadFilter(); - CiderAudio.audioNodes.vibrantbassNode[i].type = 'peaking'; // 'peaking'; - CiderAudio.audioNodes.vibrantbassNode[i].frequency.value = VIBRANTBASSBANDS[i]; - CiderAudio.audioNodes.vibrantbassNode[i].Q.value = VIBRANTBASSQ[i]; - CiderAudio.audioNodes.vibrantbassNode[i].gain.value = VIBRANTBASSGAIN[i] * app.cfg.audio.vibrantBass.multiplier; - } + CiderAudio.audioNodes.vibrantbassNode[i] = CiderAudio.context.createBiquadFilter(); + CiderAudio.audioNodes.vibrantbassNode[i].type = 'peaking'; // 'peaking'; + CiderAudio.audioNodes.vibrantbassNode[i].frequency.value = VIBRANTBASSBANDS[i]; + CiderAudio.audioNodes.vibrantbassNode[i].Q.value = VIBRANTBASSQ[i]; + CiderAudio.audioNodes.vibrantbassNode[i].gain.value = VIBRANTBASSGAIN[i] * app.cfg.audio.vibrantBass.multiplier;} + if (app.cfg.audio.spatial) { try{ CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination); } catch(e){} - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.preampNode); } else { try{ CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){} - CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.preampNode); } + CiderAudio.audioNodes.preampNode.connect(CiderAudio.audioNodes.llpw[0]); + for (i = 1; i < LLPW_FREQUENCIES.length; i ++) { CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]); } - CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.preampNode); - - CiderAudio.audioNodes.preampNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]); - + CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.vibrantbassNode[0]); for (i = 1; i < VIBRANTBASSBANDS.length; i ++) { CiderAudio.audioNodes.vibrantbassNode[i-1].connect(CiderAudio.audioNodes.vibrantbassNode[i]); } CiderAudio.audioNodes.vibrantbassNode[VIBRANTBASSBANDS.length-1].connect(CiderAudio.audioNodes.audioBands[0]); + for (i = 1; i < BANDS.length; i ++) { CiderAudio.audioNodes.audioBands[i-1].connect(CiderAudio.audioNodes.audioBands[i]); diff --git a/src/renderer/style.less b/src/renderer/style.less index 7d4d8f86..c7903888 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -5942,7 +5942,7 @@ body.no-gpu { .modal-window { height: 330px; max-height: 330px; - width: 800px; + width: 740px; max-width: 800px; overflow: hidden; diff --git a/src/renderer/views/components/equalizer.ejs b/src/renderer/views/components/equalizer.ejs index 3a5e12cb..2d4f6f3b 100644 --- a/src/renderer/views/components/equalizer.ejs +++ b/src/renderer/views/components/equalizer.ejs @@ -23,11 +23,6 @@ Vibrant Bass
-
- - - Preamp -
{{$root.cfg.audio.equalizer.mix}} @@ -128,7 +123,6 @@ this.frequencies = [] this.gain = [] this.Q = [] - this.preamp = 0 this.mix = 1 this.vibrantBass = 0 this.userGenerated = true @@ -140,7 +134,6 @@ 'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000], 'gain': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Q': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -150,7 +143,6 @@ 'frequencies': [32, 75, 125, 197, 500, 1000, 2000, 3040, 8000, 16000], 'gain': [0, 2.1, 0, 0.8, 0, 0, 0, -1.5, 0, 0], 'Q': [1, 0.7, 1, 1.5, 1, 1, 1, 2, 1, 1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -160,7 +152,6 @@ 'frequencies': [32, 63, 125, 250, 466, 1000, 2000, 4000, 8000, 20000], 'gain': [0, 0, 0, 0, -2, 0, 0, 0, 0, 10], 'Q': [1, 1, 1, 1, 0.6, 1, 1, 1, 1, 0.1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -170,7 +161,6 @@ 'frequencies': [32, 75, 125, 220, 700, 1000, 2000, 4000, 10000, 16000], 'gain': [0, -8, 0, -0.1, -3, 0, 0, 0, 4, 0], 'Q': [1, 0.2, 1, 2.0, 1.4, 1, 1, 1, 0.1, 1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -180,7 +170,6 @@ 'frequencies': [20, 63, 125, 250, 400, 1000, 2000, 4000, 8000, 20000], 'gain': [-22, 0, 0, 0, -3, 0, 1.8, 0, 0, 3.5], 'Q': [0.3, 1, 1, 1, 2.0, 1, 0.7, 1, 1, 0.8], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -190,7 +179,6 @@ 'frequencies': [20, 63, 155, 250, 500, 1000, 2000, 5000, 11000, 16000], 'gain': [-15, 0, -3, 0, 0, 0, 0, 3.1, 0, 0], 'Q': [0.5, 1, 2, 1, 1, 1, 1, 1.5, 0.1, 1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -200,7 +188,6 @@ 'frequencies': [32, 63, 125, 250, 500, 1128, 2000, 4057, 8000, 16000], 'gain': [0, 0, 0, 0, 0, 2, 0, -6.4, 0, 0], 'Q': [1, 1, 1, 1, 1, 2, 1, 1, 1, 1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -210,7 +197,6 @@ 'frequencies': [35, 63, 125, 250, 500, 800, 2000, 4000, 8000, 20000], 'gain': [5, 0, 0, 0, 0, -5, 0, 0, 0, 5], 'Q': [0.1, 1, 1, 1, 1, 0.6, 1, 1, 1, 0.2], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -221,7 +207,6 @@ 'frequencies': [45.53,88.06,116.18,161.3,247.05,295.6,365.79,495.13,716.85,960.76], 'gain': [-0.36,4.07,-1.3,1.92,0.77,-0.53,-1.33,0.44,0.46,-0.5], 'Q': [1.768,0.625,5,8.409,10,16.82,5.946,7.071,20,10], - 'preamp': -2, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -232,7 +217,6 @@ 'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000], 'gain': [2.7, 2.2, 1.6, 1.4, 0.6, 0, 0, 0, 0, 0], 'Q': [1.4, 1.4, 1.4, 1.4, 1.4, 1, 1, 1, 1, 1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -242,7 +226,6 @@ 'frequencies': [32, 63, 160, 250, 500, 1000, 2000, 3500, 8000, 20000], 'gain': [2.7, 2.2, 1.6, 1.4, 0.6, 0, 0, 0, 0, 0], 'Q': [0.7, 0.7, 0.7, 0.7, 0.7, 1, 1, 1, 1, 1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, 'userGenerated': false @@ -333,18 +316,20 @@ app.cfg.audio.vibrantBass.multiplier = app.cfg.audio.equalizer.vibrantBass / 10 for (var i = 0; i < 21; i++) { CiderAudio.audioNodes.vibrantbassNode[i].gain.value = app.cfg.audio.vibrantBass.gain[i] * (app.cfg.audio.equalizer.vibrantBass / 10); - } - }, - changePreamp() { - CiderAudio.audioNodes.preampNode.gain.value = app.cfg.audio.equalizer.preamp; + } }, changeMix() { for (var i = 0; i < 10; i++) { CiderAudio.audioNodes.audioBands[i].gain.value = app.cfg.audio.equalizer.gain[i] * app.cfg.audio.equalizer.mix } }, + changePreamp() { + if (CiderAudio.audioNodes.llpwEnabled === 1) {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain.concat(CiderAudio.audioNodes.llpw[23].gain.value)));} + else {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain));} + }, changeGain(i) { CiderAudio.audioNodes.audioBands[i].gain.value = app.cfg.audio.equalizer.gain[i] * app.cfg.audio.equalizer.mix + this.changePreamp() }, changeFreq(i) { CiderAudio.audioNodes.audioBands[i].frequency.value = app.cfg.audio.equalizer.frequencies[i] @@ -357,10 +342,10 @@ 'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000], 'gain': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'Q': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - 'preamp': 0, 'mix': 1, 'vibrantBass': 0, }) + CiderAudio.audioNodes.preampNode.gain.value = 0; if (app.cfg.audio.equalizer.userGenerated) { this.saveSelectedPreset() } @@ -375,7 +360,6 @@ newPreset.frequencies = eqSettings.frequencies newPreset.gain = eqSettings.gain newPreset.Q = eqSettings.Q - newPreset.preamp = eqSettings.preamp newPreset.mix = eqSettings.mix newPreset.vibrantBass = eqSettings.vibrantBass app.cfg.audio.equalizer.presets.push(newPreset) @@ -393,14 +377,13 @@ preset.frequencies = app.cfg.audio.equalizer.frequencies preset.gain = app.cfg.audio.equalizer.gain preset.Q = app.cfg.audio.equalizer.Q - preset.preamp = app.cfg.audio.equalizer.preamp preset.mix = app.cfg.audio.equalizer.mix preset.vibrantBass = app.cfg.audio.equalizer.vibrantBass notyf.success("Saved Preset") }, exportPreset() { const preset = app.cfg.audio.equalizer.presets.find(p => p.preset == app.cfg.audio.equalizer.preset) - const jsonObj = {"name": preset.name, "author": app.chrome.userinfo.attributes.name, "frequency": preset.frequencies, "gain": preset.gain, "q": preset.Q, "preamp": preset.preamp, "mix": preset.mix, "vibrantBass": preset.vibrantBass}; + const jsonObj = {"name": preset.name, "author": app.chrome.userinfo.attributes.name, "frequency": preset.frequencies, "gain": preset.gain, "q": preset.Q, "mix": preset.mix, "vibrantBass": preset.vibrantBass}; ipcRenderer.send("export-eq", jsonObj) }, importPreset() { @@ -411,7 +394,6 @@ newPreset.frequencies = result.frequency newPreset.gain = result.gain newPreset.Q = result.q - newPreset.preamp = result.preamp newPreset.mix = result.mix newPreset.vibrantBass = result.vibrantBass app.cfg.audio.equalizer.presets.push(newPreset) @@ -423,7 +405,6 @@ }, applyPreset(preset) { Object.assign(this.$root.cfg.audio.equalizer, preset) - this.changePreamp() this.changeVibrantBass() for (var i = 0; i < 10; i++) { this.changeGain(i) diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 99272f5c..7e86bfb3 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -68,7 +68,7 @@ {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPE.description')}}
- +
@@ -78,10 +78,10 @@ {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description')}}
- -
@@ -804,17 +804,20 @@ CiderAudio.normalizerOff() } }, - ciderPPECompatibility: function () { - if (app.cfg.audio.spatial) { - notyf.error("CAP is not compatible with Spatialization. Please disable Spatialization to continue.") + ciderPPE: function () { + if (app.cfg.advanced.ciderPPE) { + if (app.cfg.audio.spatial) { app.cfg.advanced.ciderPPE = false; - } - }, + notyf.error("CAP is not compatible with Spatialization. Please disable Spatialization to continue.") + } + }}, toggleSpatial: function () { if (app.cfg.audio.spatial) { if (!app.cfg.advanced.ciderPPE) { CiderAudio.spatialOn()} - else { + else { + CiderAudio.spatialOff() + app.cfg.audio.spatial = false; notyf.error("Spatialization is not compatible with CAP. Please disable CAP to continue.") } } else { From d46905e7d6375ee7a5aa48362a5ffd2c23d21a1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=A5=E5=8F=A1?= <46503943+jay900604@users.noreply.github.com> Date: Mon, 7 Feb 2022 16:02:45 +0800 Subject: [PATCH 15/54] Update zh_TW.jsonc (#364) Update TW language. --- src/i18n/zh_TW.jsonc | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index ec07080b..e8f4c9fa 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -8,7 +8,7 @@ "i18n.languageName": "繁體中文(台灣)", // name of language in native language "i18n.languageNameEnglish": "Trad. Chinese (Taiwan)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space + "i18n.authors": "@maikirakiwi @jay900604", // Authors, if you contribute to this file feel free to add your name seperated with a space // Dialogs @@ -99,7 +99,7 @@ "term.fullscreenView": "全螢幕顯示", "term.defaultView": "預設顯示", "term.audioSettings": "音訊設定", - "term.spacializedAudioSetting": "音訊空間化設定", + "term.spacializedAudioSetting": "空間音訊設定", "term.clearAll": "清空", "term.recentStations": "最近收聽的廣播", "term.language": "語言", @@ -107,6 +107,7 @@ "term.copyright": "版權聲明", "term.rightsReserved": "保留所有權利。", "term.sponsor": "贊助", + "term.socials": "社群", "term.ciderTeam": "Cider 團隊", "term.developer": "開發者", "term.socialTeam": "公關團隊", @@ -182,8 +183,8 @@ "action.playTracksNext": "插播 ${app.selectedMediaItems.length} 首歌曲", "action.playTracksLater": "最後播放 ${app.selectedMediaItems.length} 首歌曲", "action.removeTracks": "從待播清單刪除 ${self.selectedItems.length} 首歌曲", - "action.import": "輸入", - "action.export": "輸出", + "action.import": "匯入", + "action.export": "匯出", "action.showAlbum": "顯示專輯", "action.tray.minimize": "最小化", "action.tray.quit": "關閉", @@ -197,27 +198,27 @@ // Settings - Audio "settings.header.audio": "音訊", "settings.header.audio.description": "調整 Cider 的音訊設定", - "settings.option.audio.quality": "音訊音質", // Dropdown + "settings.option.audio.quality": "音訊品質", // Dropdown "settings.header.audio.quality.hireslossless": "高品質無損壓縮", "settings.header.audio.quality.hireslossless.description": "(高達 24-bit/192 kHz)", "settings.header.audio.quality.lossless": "無損壓縮", "settings.header.audio.quality.lossless.description": "(高達 24-bit/48 kHz)", - "settings.header.audio.quality.enhanced": "數位增强", + "settings.header.audio.quality.enhanced": "數位增強", "settings.header.audio.quality.high": "高品質", "settings.header.audio.quality.standard": "高效率", "settings.header.audio.quality.auto": "自動", "settings.option.audio.seamlessTransition": "無間斷播放", // Toggle "settings.option.audio.enableAdvancedFunctionality": "進階機能", // Toggle - "settings.option.audio.enableAdvancedFunctionality.description": "啟用 AudioContext 將解鎖類似音訊標準化和等化器的進階機能。但是會在部分電腦造成音樂卡頓。", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數位增强音訊處理™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.description": "啟用 AudioContext 將開啟類似音訊平衡和等化器的進階設定。但這並不一定適合每部電腦,可能會發生音樂卡頓。", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數位增強音訊處理™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "將欺騙您的大腦使其感受近似保真壓縮的音質。| 由 Maikiwi 設計", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "數位增强音訊處理設置", // Toggle - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "將更改音訊處理的激進程度(增强選項有可能會引起雜訊)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "數位增強音訊處理設定", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "將更改音訊處理的激進/振奮程度(增強選項有可能會引起雜訊)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "標準", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "增强", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音訊標準化", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "將平衡輕柔和響亮的歌曲,建立更統一的聆聽體驗。", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "音訊空間化", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音訊平衡", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "將平衡輕柔和響亮的歌曲,建立更統一舒適的聆聽體驗。", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "空間音訊", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "將音訊進行空間化處理來製造一個更立體的聆聽體驗(註:此功能不是官方的杜比全景聲)", // Settings - Visual "settings.header.visual": "外觀", @@ -237,7 +238,7 @@ "settings.header.visual.animatedArtworkQuality.extreme": "極高", "settings.option.visual.animatedWindowBackground": "動態視窗背景", // Toggle "settings.option.visual.hardwareAcceleration": "硬體加速", // Dropdown - "settings.option.visual.hardwareAcceleration.description": "需要重新啟動 Cider 才會生效", + "settings.option.visual.hardwareAcceleration.description": "需要重新啟動 Cider 才會套用", "settings.header.visual.hardwareAcceleration.default": "預設", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "主題", @@ -273,15 +274,15 @@ // Settings - Experimental "settings.header.experimental": "實驗性功能", "settings.header.experimental.description": "調整 Cider 的實驗性功能", - "settings.option.experimental.compactUI": "緊凑型 UI", // Toggle + "settings.option.experimental.compactUI": "緊凑的介面", // Toggle "settings.option.experimental.closeButtonBehaviour": "關閉按鈕操作", // Dropdown - "settings.option.experimental.close_button_hide": "關閉按鈕會隱藏 Cider", + "settings.option.experimental.close_button_hide": "關閉按鈕將 Cider 隱藏至系統列", "settings.option.experimental.copy_log": "複製執行紀錄檔剪貼簿", "settings.option.experimental.inline_playlists": "將播放列表做為行内元素顯示", // Refer to term.disabled & term.enabled // Spatialization Menu - "spatial.spatialProperties" : "空間化屬性", + "spatial.spatialProperties" : "空間音訊屬性設定", "spatial.width" : "寬度", "spatial.height" : "高度", "spatial.depth" : "深度", @@ -290,7 +291,7 @@ "spatial.roomDimensions" : "空間尺寸", "spatial.roomPositions" : "空間位置", "spatial.setDimensions" : "設定尺寸", - "spatial.setPositions" : "設定位置", + "spatial.setPositions" : "套用設定", "spatial.up" : "上", "spatial.front" : "前", "spatial.left" : "左", @@ -301,7 +302,7 @@ "spatial.audioSource" : "音訊來源", // Settings - Unfinished - "settings.header.unfinished": "未完成", + "settings.header.unfinished": "未開發完成的功能", // Web Remote "remote.web.title": "Cider 遠端操控", From cb9ffae3a54d3c35ae74a9b190d7e63740773b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=A5=E5=8F=A1?= <46503943+jay900604@users.noreply.github.com> Date: Mon, 7 Feb 2022 20:28:37 +0800 Subject: [PATCH 16/54] Update zh_TW.jsonc Update TW language. --- src/i18n/zh_TW.jsonc | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index e8f4c9fa..3cc992ad 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -54,6 +54,7 @@ "term.mute": "靜音", "term.unmute": "取消靜音", "term.share": "分享", + "term.share.success": "已複製至剪貼簿", "term.settings": "設定", "term.seeAll": "顯示全部", "term.sortBy": "排序", @@ -71,7 +72,7 @@ "term.viewAs.list": "列表", "term.size": "大小", "term.size.normal": "正常", - "term.size.compact": "緊凑", + "term.size.compact": "緊密", "term.enable": "啟用", "term.disable": "停用", "term.enabled": "已啟用", @@ -106,14 +107,14 @@ "term.noLyrics": "正在載入。。/ 無歌詞結果 / 純音樂", "term.copyright": "版權聲明", "term.rightsReserved": "保留所有權利。", - "term.sponsor": "贊助", - "term.socials": "社群", + "term.sponsor": "贊助我們", + "term.socials": "社群平台", "term.ciderTeam": "Cider 團隊", "term.developer": "開發者", "term.socialTeam": "公關團隊", "term.contributors": "貢獻者", "term.equalizer": "等化器", - "term.reset": "重置", + "term.reset": "重設", "term.tracks": "首歌曲", // Assume x amount of tracks. e.g. 50 tracks "term.videos": "影片", "term.menu": "選單", @@ -191,9 +192,13 @@ "action.tray.show": "顯示", "action.update": "更新", "action.copy": "複製", - "action.newpreset": "新預設", // Equalizer Preset + "action.newpreset": "新增預設", // Equalizer Preset "action.deletepreset": "刪除預設", // Equalizer Preset - + + // Language optgroups + "settings.option.general.language.main": "語言", + "settings.option.general.language.fun": "特殊語言", + "settings.option.general.language.unsorted": "未分類", // Settings - Audio "settings.header.audio": "音訊", @@ -208,14 +213,14 @@ "settings.header.audio.quality.standard": "高效率", "settings.header.audio.quality.auto": "自動", "settings.option.audio.seamlessTransition": "無間斷播放", // Toggle - "settings.option.audio.enableAdvancedFunctionality": "進階機能", // Toggle + "settings.option.audio.enableAdvancedFunctionality": "進階音訊功能", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "啟用 AudioContext 將開啟類似音訊平衡和等化器的進階設定。但這並不一定適合每部電腦,可能會發生音樂卡頓。", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數位增強音訊處理™️", // Toggle - "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "將欺騙您的大腦使其感受近似保真壓縮的音質。| 由 Maikiwi 設計", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "將欺騙您的大腦讓您感受到近似保真壓縮的音質。| 由 Maikiwi 設計", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "數位增強音訊處理設定", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "將更改音訊處理的激進/振奮程度(增強選項有可能會引起雜訊)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "標準", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "增强", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "增強", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音訊平衡", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "將平衡輕柔和響亮的歌曲,建立更統一舒適的聆聽體驗。", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "空間音訊", // Toggle @@ -226,6 +231,7 @@ "settings.option.visual.windowBackgroundStyle": "視窗背景樣式", // Toggle "settings.header.visual.windowBackgroundStyle.none": "空白", "settings.header.visual.windowBackgroundStyle.artwork": "專輯封面", + "settings.header.visual.windowBackgroundStyle.image": "圖片", "settings.option.visual.animatedArtwork": "動態專輯封面", // Dropdown "settings.header.visual.animatedArtwork.always": "總是顯示", "settings.header.visual.animatedArtwork.limited": "只在藝人頁面和專輯封面顯示", @@ -242,6 +248,9 @@ "settings.header.visual.hardwareAcceleration.default": "預設", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "主題", + // Settings - Visual - Theme name + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "暗黑模式", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle // Settings - General (Reserved) @@ -260,7 +269,7 @@ "settings.header.connectivity": "外部連接", "settings.header.connectivity.description": "調整 Cider 與外部的連接", "settings.option.connectivity.discordRPC": "Discord 動態", // Dropdown - "settings.option.connectivity.playbackNotifications": "播放通知", // Toggle + "settings.option.connectivity.playbackNotifications": "歌曲播放通知", // Toggle // Refer to term.disabled for the disabled option "settings.header.connectivity.discordRPC.cider": "顯示正在玩 'Cider'", "settings.header.connectivity.discordRPC.appleMusic": "顯示正在玩 'Apple Music'", @@ -274,14 +283,15 @@ // Settings - Experimental "settings.header.experimental": "實驗性功能", "settings.header.experimental.description": "調整 Cider 的實驗性功能", - "settings.option.experimental.compactUI": "緊凑的介面", // Toggle + "settings.option.experimental.compactUI": "使用緊密的介面設計", // Toggle "settings.option.experimental.closeButtonBehaviour": "關閉按鈕操作", // Dropdown "settings.option.experimental.close_button_hide": "關閉按鈕將 Cider 隱藏至系統列", - "settings.option.experimental.copy_log": "複製執行紀錄檔剪貼簿", + "settings.option.experimental.copy_log": "複製執行紀錄檔至剪貼簿", "settings.option.experimental.inline_playlists": "將播放列表做為行内元素顯示", // Refer to term.disabled & term.enabled // Spatialization Menu + "spatial.notTurnedOn": "空間音訊目前是關閉狀態, 請先啟用再使用。", "spatial.spatialProperties" : "空間音訊屬性設定", "spatial.width" : "寬度", "spatial.height" : "高度", From a758eb3f506a326b87b5d26fee06702d77f87851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=A5=E5=8F=A1?= <46503943+jay900604@users.noreply.github.com> Date: Mon, 7 Feb 2022 20:31:34 +0800 Subject: [PATCH 17/54] Update zh_TW.jsonc --- src/i18n/zh_TW.jsonc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index 3cc992ad..c1e99179 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -291,7 +291,7 @@ // Refer to term.disabled & term.enabled // Spatialization Menu - "spatial.notTurnedOn": "空間音訊目前是關閉狀態, 請先啟用再使用。", + "spatial.notTurnedOn": "空間音訊目前是關閉狀態,請先啟用再使用。", "spatial.spatialProperties" : "空間音訊屬性設定", "spatial.width" : "寬度", "spatial.height" : "高度", From e468b1fa83eae0543647ef1deccfae88ff1eec04 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Mon, 7 Feb 2022 14:31:18 +0000 Subject: [PATCH 18/54] Added various controls to menubar, changed volumewheel function --- src/main/base/store.ts | 5 +-- src/main/plugins/menubar.ts | 31 ++++++++++++++++++ src/renderer/index.js | 47 ++++++++++++++------------- src/renderer/views/app/chrome-top.ejs | 2 +- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/src/main/base/store.ts b/src/main/base/store.ts index eeac1e9c..6aae5ae9 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -26,6 +26,7 @@ export class Store { }, "audio": { "volume": 1, + "volumeStep": 0.02, "lastVolume": 1, "muted": false, "quality": "HIGH", @@ -34,10 +35,6 @@ export class Store { "ciderPPE": false, "ciderPPE_value": 0.5, "spatial": false, - "maxVolume": 1, - "volumePrecision": 0.1, - "volumeRoundMax": 0.9, - "volumeRoundMin": 0.1, "spatial_properties": { "presets": [], "gain": 0.8, diff --git a/src/main/plugins/menubar.ts b/src/main/plugins/menubar.ts index 5d729a8b..ec484b40 100644 --- a/src/main/plugins/menubar.ts +++ b/src/main/plugins/menubar.ts @@ -95,6 +95,37 @@ export default class Thumbar { } ] }, + { + label: 'Controls', + submenu: [ + { + label: 'Pause / Play', + accelerator: 'Space', + click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.playPause()`) + }, + { + label: 'Next', + accelerator: 'CommandOrControl+Right', + click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.next()`) + }, + { + label: 'Previous', + accelerator: 'CommandOrControl+Left', + click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.previous()`) + }, + { type: 'separator' }, + { + label: 'Volume Up', + accelerator: 'CommandOrControl+Up', + click: () => this._win.webContents.executeJavaScript(`app.volumeUp()`) + }, + { + label: 'Volume Down', + accelerator: 'CommandOrControl+Down', + click: () => this._win.webContents.executeJavaScript(`app.volumeDown()`) + } + ] + }, { label: 'Account', submenu: [ diff --git a/src/renderer/index.js b/src/renderer/index.js index 86dcfa65..e5dba229 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -3307,29 +3307,32 @@ const app = new Vue({ } }) }, + checkScrollDirectionIsUp(event) { + if (event.wheelDelta) { + return event.wheelDelta > 0; + } + return event.deltaY < 0; + }, + volumeUp() { + if ((app.mk.volume + app.cfg.audio.volumeStep) > 1) { + app.mk.volume = 1; + console.log('setting to 1') + } else { + console.log('volume up') + app.mk.volume += app.cfg.audio.volumeStep; + } + }, + volumeDown() { + if ((app.mk.volume - app.cfg.audio.volumeStep) < 0) { + app.mk.volume = 0; + console.log('settings to 0') + } else { + console.log('volume down') + app.mk.volume -= app.cfg.audio.volumeStep; + } + }, volumeWheel(event) { - if (this.cfg.audio.maxVolume < 1.0 && this.cfg.audio.maxVolume > 0.01) { - this.cfg.audio.volumePrecision = 0.01 - this.cfg.audio.volumeRoundMax = this.cfg.audio.maxVolume - 0.01 - this.cfg.audio.volumeRoundMin = 0.01 - } - if (event.deltaY < 0) { - if (this.mk.volume < this.cfg.audio.maxVolume) { - if (this.mk.volume <= this.cfg.audio.volumeRoundMax) { - this.mk.volume += this.cfg.audio.volumePrecision - } else { - this.mk.volume = this.cfg.audio.maxVolume - } - } - } else if (event.deltaY > 0) { - if (this.mk.volume > 0) { - if (this.mk.volume >= this.cfg.audio.volumeRoundMin) { - this.mk.volume -= this.cfg.audio.volumePrecision - } else { - this.mk.volume = 0 - } - } - } + app.checkScrollDirectionIsUp(event) ? app.volumeUp() : app.volumeDown() }, muteButtonPressed() { if (this.cfg.audio.muted) { diff --git a/src/renderer/views/app/chrome-top.ejs b/src/renderer/views/app/chrome-top.ejs index d9d946fd..15fa6f2f 100644 --- a/src/renderer/views/app/chrome-top.ejs +++ b/src/renderer/views/app/chrome-top.ejs @@ -108,7 +108,7 @@
-
From 3340fb93df9e56caf8f7e93e57c531bcfdc5bfbb Mon Sep 17 00:00:00 2001 From: booploops <49113086+booploops@users.noreply.github.com> Date: Mon, 7 Feb 2022 10:04:41 -0800 Subject: [PATCH 19/54] removed some comments, fixed app not loading in yarn start. --- src/renderer/index.js | 82 ------------------- .../ameframework.less} | 0 src/renderer/style.less | 2 +- src/renderer/views/app/chrome-top.ejs | 2 +- 4 files changed, 2 insertions(+), 84 deletions(-) rename src/renderer/{ameframework.css => less/ameframework.less} (100%) diff --git a/src/renderer/index.js b/src/renderer/index.js index e5dba229..7000a24b 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -3073,23 +3073,6 @@ const app = new Vue({ }) self.$store.commit("setLCDArtwork", img) }) - - // Vibrant.from(this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"].replace('{w}', size).replace('{h}', size)).getPalette().then(palette=>{ - // let angle = "140deg" - // let gradient = "" - // let colors = Object.values(palette).filter(color=>color!=null) - // if(colors.length > 0){ - // let stops = [] - // colors.forEach(color=>{ - // stops.push(`${self._rgbToRgb(color._rgb)} 0%`) - // }) - // stops.push(`${self._rgbToRgb(colors[0]._rgb)} 100%`) - // gradient = `linear-gradient(${angle}, ${stops.join(", ")}` - // } - // - // document.querySelector("#app").style.setProperty("--bgColor", gradient) - // }).setQuantizer(Vibrant.Quantizer.WebWorker) - try { clearInterval(bginterval); } catch (err) { @@ -3114,47 +3097,6 @@ const app = new Vue({ } }, 200) }, - - // getNowPlayingArtwork(size = 600) { - // if (typeof this.mk.nowPlayingItem === "undefined") return; - // let interval = setInterval(() => { - - // try { - // if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] != this.currentTrackIDBG && document.querySelector('.app-playback-controls .artwork')) { - // this.currentTrackIDBG = this.mk.nowPlayingItem["id"]; - // if (document.querySelector('.app-playback-controls .artwork') != null) { - // clearInterval(interval); - // } - // if (app.mk.nowPlayingItem.attributes.artwork != null && app.mk.nowPlayingItem.attributes.artwork.url != null && app.mk.nowPlayingItem.attributes.artwork.url!= '' ) { - // document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${decodeURI((this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"])).replace('{w}', size).replace('{h}', size)}")`); - // try { - // clearInterval(interval); - // } catch (err) { - // } - // } else { - // this.setLibraryArt() - // } - // } else if (this.mk.nowPlayingItem["id"] == this.currentTrackID) { - // try { - // clearInterval(interval); - // } catch (err) { - // } - // } - // } catch (e) { - // if (this.mk.nowPlayingItem && this.mk.nowPlayingItem["id"] && document.querySelector('.app-playback-controls .artwork')) { - // this.setLibraryArt() - // try { - // clearInterval(interval); - // } catch (err) { - // } - - // } - - // } - // }, 200) - - - // }, async getCurrentArtURL() { try { this.currentArtUrl = ''; @@ -3169,11 +3111,6 @@ const app = new Vue({ data = data.data.data[0]; if (data != null && data !== "" && data.attributes != null && data.attributes.artwork != null) { this.currentArtUrl = (data["attributes"]["artwork"]["url"] ?? '').replace('{w}', 50).replace('{h}', 50); - // if (this.currentArtUrl != ""){ - // let attr = MusicKitInterop.getAttributes(); - // attr.artwork.url = this.currentArtUrl; - // ipcRenderer.send('forceUpdateRPC',attr) - // } try { document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`); } catch (e) { @@ -3398,18 +3335,11 @@ const app = new Vue({ } }, async nowPlayingContextMenu(event) { - // function revisedRandId() { - // return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(2, 10); - // } let self = this let data_type = this.mk.nowPlayingItem.playParams.kind let item_id = this.mk.nowPlayingItem.attributes.playParams.id ?? this.mk.nowPlayingItem.id let isLibrary = this.mk.nowPlayingItem.attributes.playParams.isLibrary ?? false let params = {"fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library", "t": "1"} - // let res = await app.mkapi(data_type, isLibrary , item_id, params); - // if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) { - // item_id = res.relationships.library.data[0].id - // } app.selectedMediaItems = [] app.select_selectMediaItem(item_id, data_type, 0, '12344', isLibrary) let useMenu = "normal" @@ -3473,7 +3403,6 @@ const app = new Vue({ "disabled": false, "action": function () { app.addToLibrary(app.mk.nowPlayingItem.id); - // if (!isLibrary) {app.addToLibrary(item_id); this.mk.nowPlayingItem.attributes.playParams["isLibrary"] = true} else { app.removeFromLibrary(data_type,item_id); this.mk.nowPlayingItem.attributes.playParams["isLibrary"] = false}; } }, { @@ -3499,21 +3428,10 @@ const app = new Vue({ } } if (this.contextExt) { - // if this.context-ext.normal is true append all options to the 'normal' menu which is a kvp of arrays if (this.contextExt.normal) { menus.normal.items = menus.normal.items.concat(this.contextExt.normal) } } - - // isLibrary = await app.inLibrary([this.mk.nowPlayingItem]) - // console.warn(isLibrary) - // if(isLibrary.length != 0) { - // if (isLibrary[0].attributes.inLibrary) { - // menus.normal.items.find(x => x.id == "addToLibrary").disabled = true - // } - // }else{ - // menus.normal.items.find(x => x.id == "addToLibrary").disabled = true - // } this.showMenuPanel(menus[useMenu], event) try { diff --git a/src/renderer/ameframework.css b/src/renderer/less/ameframework.less similarity index 100% rename from src/renderer/ameframework.css rename to src/renderer/less/ameframework.less diff --git a/src/renderer/style.less b/src/renderer/style.less index c7903888..4b88be9c 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -1,10 +1,10 @@ -@import url("ameframework.css"); @import url("assets/fonts/Inter/inter.css"); @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap'); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:wght@100;300;400;500;700;900&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap"); +@import url("less/ameframework.less"); @import url("less/bootstrap.less"); @import url("less/notyf.less"); diff --git a/src/renderer/views/app/chrome-top.ejs b/src/renderer/views/app/chrome-top.ejs index 15fa6f2f..8f2d2207 100644 --- a/src/renderer/views/app/chrome-top.ejs +++ b/src/renderer/views/app/chrome-top.ejs @@ -57,7 +57,7 @@ v-if="mk.nowPlayingItem['attributes']['contentRating'] == 'explicit'" style="display: inline-block">
-
+
Date: Mon, 7 Feb 2022 10:32:37 -0800 Subject: [PATCH 20/54] removed CiderContextMenu, cleaned out some unused files --- src/main/base/browserwindow.ts | 2 - src/renderer/index.js | 73 ----- .../components/mediaitem-square-large.ejs | 244 --------------- .../views/components/mediaitem-square-sp.ejs | 293 ------------------ src/renderer/views/components/queue-item.ejs | 65 ---- 5 files changed, 677 deletions(-) delete mode 100644 src/renderer/views/components/mediaitem-square-large.ejs delete mode 100644 src/renderer/views/components/mediaitem-square-sp.ejs delete mode 100644 src/renderer/views/components/queue-item.ejs diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index 9c701a04..1082f59a 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -54,7 +54,6 @@ export class BrowserWindow { "components/equalizer", "components/add-to-playlist", "components/queue", - "components/queue-item", "components/mediaitem-scroller-horizontal", "components/mediaitem-scroller-horizontal-large", "components/mediaitem-scroller-horizontal-sp", @@ -62,7 +61,6 @@ export class BrowserWindow { "components/mediaitem-list-item", "components/mediaitem-hrect", "components/mediaitem-square", - "components/mediaitem-square-sp", "components/mediaitem-mvview", "components/libraryartist-item", "components/listennow-child", diff --git a/src/renderer/index.js b/src/renderer/index.js index 7000a24b..8e24659f 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -1,78 +1,5 @@ Vue.use(VueObserveVisibility); var notyf = new Notyf(); -// This is going to suck to code -var CiderContextMenu = { - Menu: function (event) { - this.items = [] - }, - async Create(event, menudata) { - var menuBackground = document.createElement("div"); - var menu = document.createElement("div"); - menu.classList.add("context-menu-body"); - menu.classList.add("context-menu-open"); - menuBackground.classList.add("context-menu"); - menu.style.left = 0 + "px"; - menu.style.top = 0 + "px"; - menu.style.position = "absolute"; - menu.style.zIndex = "99909"; - menu.addEventListener("animationend", function () { - menu.classList.remove("context-menu-open"); - }, {once: true}); - - function close() { - menuBackground.style.pointerEvents = "none"; - menu.classList.add("context-menu-close"); - menu.addEventListener("animationend", function () { - menuBackground.remove(); - menu.remove(); - }, {once: true}); - } - - // when menubackground is clicked, remove it - menuBackground.addEventListener("click", close); - menuBackground.addEventListener("contextmenu", close); - - // add menu to menuBackground - menuBackground.appendChild(menu); - - document.body.appendChild(menuBackground); - - if (typeof menudata.items == "object") { - menudata.items = Object.values(menudata.items); - } - - console.log(menudata); - - // for each item in menudata create a menu item - for (var i = 0; i < menudata.items.length; i++) { - let item = document.createElement("button") - - if (menudata.items[i]["disabled"] === true) { - continue - } - item.tabIndex = 0 - item.classList.add("context-menu-item") - if (menudata.items[i]["icon"]) { - item.innerHTML += `` - } - item.innerHTML += menudata.items[i].name - item.onclick = menudata.items[i].action - menu.appendChild(item) - } - menu.style.width = (menu.offsetWidth + 10) + "px"; - menu.style.left = event.clientX + "px"; - menu.style.top = event.clientY + "px"; - // if menu would be off the screen, move it into view, but preserve the width - if (menu.offsetLeft + menu.offsetWidth > window.innerWidth) { - menu.style.left = (window.innerWidth - menu.offsetWidth) + "px"; - } - if (menu.offsetTop + menu.offsetHeight > window.innerHeight) { - menu.style.top = (window.innerHeight - menu.offsetHeight) + "px"; - } - - return menuBackground; - } -} const MusicKitObjects = { LibraryPlaylist: function () { diff --git a/src/renderer/views/components/mediaitem-square-large.ejs b/src/renderer/views/components/mediaitem-square-large.ejs deleted file mode 100644 index a969e10b..00000000 --- a/src/renderer/views/components/mediaitem-square-large.ejs +++ /dev/null @@ -1,244 +0,0 @@ - - - \ No newline at end of file diff --git a/src/renderer/views/components/mediaitem-square-sp.ejs b/src/renderer/views/components/mediaitem-square-sp.ejs deleted file mode 100644 index 89859695..00000000 --- a/src/renderer/views/components/mediaitem-square-sp.ejs +++ /dev/null @@ -1,293 +0,0 @@ - - - \ No newline at end of file diff --git a/src/renderer/views/components/queue-item.ejs b/src/renderer/views/components/queue-item.ejs deleted file mode 100644 index 0dd56c64..00000000 --- a/src/renderer/views/components/queue-item.ejs +++ /dev/null @@ -1,65 +0,0 @@ - - - \ No newline at end of file From 21026816fe8a917bfe4c785c59532e4c324816b7 Mon Sep 17 00:00:00 2001 From: Core <64542347+coredev-uk@users.noreply.github.com> Date: Mon, 7 Feb 2022 19:23:22 +0000 Subject: [PATCH 21/54] Renamed and changed convertToMins function to work with larger values --- src/renderer/index.js | 22 ++++++++++++++++---- src/renderer/views/app/chrome-top.ejs | 4 ++-- src/renderer/views/components/fullscreen.ejs | 4 ++-- src/renderer/views/components/miniplayer.ejs | 4 ++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/renderer/index.js b/src/renderer/index.js index 7000a24b..69b0b739 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -1242,10 +1242,24 @@ const app = new Vue({ return this.playerLCD.playbackDuration } }, - convertToMins(time) { - let mins = Math.floor(time / 60) - let seconds = (Math.floor(time % 60) / 100).toFixed(2) - return `${mins}:${seconds.replace("0.", "")}` + convertTime(time) { + if (typeof time !== "number") { + time = parseInt(time) + } + + const timeGates = { + 600: 15, + 3600: 14, + 36000: 12, + } + + for (let key in timeGates) { + if (time < key) { + return new Date(time * 1000).toISOString().substring(timeGates[key], 19) + } + } + + return new Date(time * 1000).toISOString().substring(11, 19) }, hashCode(str) { let hash = 0, diff --git a/src/renderer/views/app/chrome-top.ejs b/src/renderer/views/app/chrome-top.ejs index 8f2d2207..e38ee43e 100644 --- a/src/renderer/views/app/chrome-top.ejs +++ b/src/renderer/views/app/chrome-top.ejs @@ -80,8 +80,8 @@
-

{{ convertToMins(getSongProgress()) }}

-

{{ convertToMins(mk.currentPlaybackDuration) }} +

{{ convertTime(getSongProgress()) }}

+

{{ convertTime(mk.currentPlaybackDuration) }}

diff --git a/src/renderer/views/components/fullscreen.ejs b/src/renderer/views/components/fullscreen.ejs index 76551f09..51093c60 100644 --- a/src/renderer/views/components/fullscreen.ejs +++ b/src/renderer/views/components/fullscreen.ejs @@ -41,8 +41,8 @@
-

{{ app.convertToMins(app.getSongProgress()) }}

-

{{ app.convertToMins(app.mk.currentPlaybackDuration) }}

+

{{ app.convertTime(app.getSongProgress()) }}

+

{{ app.convertTime(app.mk.currentPlaybackDuration) }}

-

{{ app.convertToMins(app.getSongProgress()) }}

-

{{ app.convertToMins(app.mk.currentPlaybackDuration) }}

+

{{ app.convertTime(app.getSongProgress()) }}

+

{{ app.convertTime(app.mk.currentPlaybackDuration) }}

Date: Tue, 8 Feb 2022 00:21:57 +0000 Subject: [PATCH 22/54] Added slovak translation (#373) --- src/i18n/sk_SK.jsonc | 311 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100644 src/i18n/sk_SK.jsonc diff --git a/src/i18n/sk_SK.jsonc b/src/i18n/sk_SK.jsonc new file mode 100644 index 00000000..95100010 --- /dev/null +++ b/src/i18n/sk_SK.jsonc @@ -0,0 +1,311 @@ +{ // Base File + + // i18n Info + "i18n.languageName": "Slovenčina (SK)", // name of language in native language + "i18n.languageNameEnglish": "Slovak (SK)", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "@jurosic", // Authors, if you contribute to this file feel free to add your name seperated with a space + + // App info + "app.name": "Cider", + + "date.format": "${d} ${m}, ${y}", + + // Dialogs + "dialog.cancel": "Zrušit", + "dialog.ok": "OK", + + // Notification + "notification.updatingLibrarySongs": "Aktualizujem pesničky v knižnici...", + "notification.updatingLibraryAlbums": "Aktualizujem albumy v knižnici...", + "notification.updatingLibraryArtists": "Aktualizujem tvorcov v knižnici...", + // Terms + "term.appleInc": "Apple Inc.", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", + "term.itunes": "iTunes", + "term.github": "GitHub", + "term.discord": "Discord", + "term.learnMore": "Zistiť viac", + "term.accountSettings": "Nastavenia účtu", + "term.logout": "Odhlásiť", + "term.login": "Prihlásiť", + "term.about": "About", + "term.privateSession": "Osobný Session", + "term.queue": "Poradie", + "term.search": "Vyhládavať", + "term.library": "Knižnica", + "term.listenNow": "Počúvať teraz", + "term.browse": "Prehliadávať", + "term.radio": "Rádio", + "term.recentlyAdded": "Nedávno Pridané", + "term.songs": "Pesničky", + "term.albums": "Albumy", + "term.artists": "Tvorcovia", + "term.podcasts": "Podcasty", + "term.playlists": "Playlisty", + "term.playlist": "Playlist", + "term.newPlaylist": "Nový Playlist", + "term.newPlaylistFolder": "Nový Priečinok Playlistov", + "term.createNewPlaylist": "Urobiť Nový Playlist", + "term.createNewPlaylistFolder": "Urobiť Nový Priečinok Playlistov", + "term.deletePlaylist": "Ste si istý že chcete zmazat tento playlist?", + "term.play": "Play", + "term.pause": "Pause", + "term.previous": "Previous", + "term.next": "Next", + "term.shuffle": "Shuffle", + "term.repeat": "Repeat", + "term.volume": "Hlasitosť", + "term.mute": "Ztlmiť", + "term.unmute": "Vypnúť Ztlmenie", + "term.share": "Zdielať", + "term.settings": "Nastavenia", + "term.seeAll": "Vidieť Všetko", + "term.sortBy": "Zodariť Podľa", + "term.sortBy.album": "Album", + "term.sortBy.artist": "Tvorca", + "term.sortBy.name": "Názov", + "term.sortBy.genre": "Žáner", + "term.sortBy.releaseDate": "Dátum Vydania", + "term.sortBy.duration": "Dĺžka", + "term.sortOrder": "A-Z", + "term.sortOrder.ascending": "Vzostupne", + "term.sortOrder.descending": "Zostupne", + "term.viewAs": "Zobraziť Ako", + "term.viewAs.coverArt": "Náhľadovka", + "term.viewAs.list": "List", + "term.size": "Velkosť", + "term.size.normal": "Normal", + "term.size.compact": "Compact", + "term.enable": "Zapnúť", + "term.disable": "Vypnúť", + "term.enabled": "Zapnuté", + "term.disabled": "Vypnuté", + "term.connect": "Pripojiť", + "term.connecting": "Pripájam", + "term.disconnect": "Odpojiť", + "term.authed": "Authentikovaný", + "term.confirm": "Podvrdiť ?", + "term.more": "Viac", + "term.less": "Menej", + "term.showMore": "Ukázať viac", + "term.showLess": "Ukázať menej", + "term.topSongs" : "Top Pesničky", + "term.latestReleases": "Najnovšie vydania", + "term.time.added": "Pridané", + "term.time.released": "Vydané", + "term.time.updated": "Aktualizované", + "term.time.hours": "hodín", + "term.time.hour": "hodina", + "term.time.minutes": "minút", + "term.time.minute": "minúta", + "term.time.seconds": "sekúnd", + "term.time.second": "sekunda", + "term.fullscreenView": "Zobrazenie na celej obrazovke", + "term.defaultView": "Default View", + "term.audioSettings": "Nastavenia Zvuku", + "term.clearAll": "Vyčistiť Všetko", + "term.recentStations": "Nedávne Stanice", + "term.language": "Jazyk", + "term.funLanguages": "Zábava", + "term.noLyrics": "Načítavam... / Text nebol najdený./ Instrumental.", + "term.copyright": "Copyright", + "term.rightsReserved": "All Rights Reserved.", + "term.sponsor": "Sponzoruj tento projekt", + "term.ciderTeam": "Cider Team", + "term.developer": "Developer", + "term.socialTeam": "Social Team", + "term.socials": "Socials", + "term.contributors": "Contributors", + "term.equalizer": "Equalizer", + "term.reset": "Resetovať", + "term.tracks": "pesničiek", // Assume x amount of tracks. e.g. 50 tracks + "term.videos": "Videá", + "term.menu": "Menu", + "term.check": "Skontrolovať", + "term.aboutArtist": "Viac o {{artistName}}", // e.g. 'About Doja Cat' + "term.updateCider": "Aktualizovať Cider", + + // Home + "home.title": "Domov", + "home.recentlyPlayed": "Nedávno Prehrané", + "home.recentlyAdded": "Nedávno Pridané", + "home.artistsFeed": "Feed Tvojho Tvorcu", + "home.artistsFeed.noArtist": "Najprv sleduj niektorých tvorcov, ich pesničky potom budú tu", + "home.madeForYou": "Robené Pre Teba", + "home.friendsListeningTo": "Kamaráti počúvajú", + "home.followedArtists": "Sledovaný Tvorcovia", + // Errors + "error.appleMusicSubRequired": "Apple Music potrebuje subscription.", + "error.connectionError": "Pri pripojovaní ku Apple Music sa vyskytol problém", + "error.noResults": "Žiadne výsledky", + "error.noResults.description": "Skús nové vyhľádavanie", + + //Podcasts + "podcast.followOnCider": "Sleduj na Cider", + "podcast.followedOnCider": "Sledované na Cider", + "podcast.subscribeOnItunes": "Odoberaj na iTunes", + "podcast.subscribedOnItunes": "Odoberane na iTunes", + "podcast.itunesStore": "iTunes Obchod", + "podcast.episodes": "Epizódy", + "podcast.playEpisode": "Prehraj Epizódu", + "podcast.website": "Stránka Podcastu", + + // Actions + "action.addToLibrary": "Pridaj do Knižnice", + "action.addToLibrary.success": "Pridané do Knižnice", + "action.addToLibrary.error": "Pri pridávani do Knižnice sa vzskytol problém", + "action.removeFromLibrary": "Odstrániť z Knižnice", + "action.removeFromLibrary.success": "Odstránene z Knižnice", + "action.addToQueue": "Pridať do Poradia", + "action.addToQueue.success": "Pridané do Poradia", + "action.addToQueue.error": "Pri pridávaní do Poradia sa vyskytol problém", + "action.removeFromQueue": "Odstrániť z Poradia", + "action.removeFromQueue.success": "Odstránené z Poradia", + "action.removeFromQueue.error": "Pri odstranovaní z Poradia sa vyskytol probém", + "action.createPlaylist": "Urobiť nový Playlist", + "action.addToPlaylist": "Pridať do Playlistu", + "action.removeFromPlaylist": "Odstrániť z Playlistu", + "action.addToFavorites": "Pridať do Obľubéných", + "action.follow": "Sledovať", + "action.follow.success": "Sleduješ", + "action.follow.error": "Pri Sledovaní sa vyskytol problém", + "action.unfollow": "Zrušit Sledovanie", + "action.unfollow.success": "Sledovanie Zrušené", + "action.unfollow.error": "Pri zrušení sledovania sa vyskytol problém", + "action.playNext": "Hrať Ďalšie", + "action.playLater": "Hrať Neskor", + "action.startRadio": "Zapnúť Rádio", + "action.goToArtist": "Ku Tvorcovi", + "action.goToAlbum": "Ku Albumu", + "action.moveToTop": "Premiestniť Hore", + "action.share": "Zdielať", + "action.rename": "Premenovať", + "action.love": "Love", + "action.unlove": "Unlove", + "action.dislike": "Dislike", + "action.undoDislike": "Zrušiť dislike", + "action.showWebRemoteQR": "Web Remote", + "action.playTracksNext": "Hrať ${app.selectedMediaItems.length} pesničiek ďalej", + "action.playTracksLater": "Hrať ${app.selectedMediaItems.length} pesničiek neskôr", + "action.removeTracks": "Odstrániť ${self.selectedItems.length} pesničiek z poradia", + "action.import": "Importovať", + "action.export": "Exportovať", + "action.showAlbum": "Zobraziť Celý Album", + "action.tray.minimize": "Minimaizovať", + "action.tray.quit": "Odísť", + "action.tray.show": "Ukázať", + "action.update": "Aktualizovať", + + // Settings - General + "settings.header.general": "všeobecné", + "settings.header.general.description": "Zmeniť všeobecné nastavenia pre Cider.", + "settings.option.general.language": "Jazyk", + + // Language optgroups + "settings.option.general.language.main": "Jazyky", + "settings.option.general.language.fun": "Zábanve Jazyky", + "settings.option.general.language.unsorted": "Nepotriedené", + + // Settings - Audio + "settings.header.audio": "Zvuk", + "settings.header.audio.description": "Zmeniť nastavenia zvuku pre Cider.", + "settings.option.audio.quality": "Kvalita zvuku", // Dropdown + "settings.header.audio.quality.high": "Vysoká", + "settings.header.audio.quality.low": "Nizká", + "settings.header.audio.quality.auto": "Automatické", + "settings.option.audio.seamlessTransition": "Hladký Prevod Zvuku", // Toggle + "settings.option.audio.enableAdvancedFunctionality": "Zapnút Pokročilé Nastavenia Zvuku", // Toggle + "settings.option.audio.enableAdvancedFunctionality.description": "Zapnutie AudioContext funkcionality dovolí rozšírené funkcie zvuku ako Zvuková Normalizávia , Equalizéry a Visualízery, ale na niektorých systémoch to može spôsobiť problémy so zvukom.", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalízacia Zvuku", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizuje silu zvuku v pesničkách pre hľadší počúvací zážitok", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Priestorový Zvuk", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Priestorový zvuk urobí zvuk 3-dimenzionálny (poznámka: Toto nie je Dolby Atmos)", + // Settings - Visual + "settings.header.visual": "Visuálne", + "settings.header.visual.description": "Zmenit Visuálne nastavenia pre Cider.", + "settings.option.visual.windowBackgroundStyle": "Štýl pozadia okna", // Toggle + "settings.header.visual.windowBackgroundStyle.none": "Žiadne", + "settings.header.visual.windowBackgroundStyle.artwork": "Náhľadovka", + "settings.header.visual.windowBackgroundStyle.image": "Obrátok", + "settings.option.visual.animatedArtwork": "Animované Náhľadovky", // Dropdown + "settings.header.visual.animatedArtwork.always": "Vždy", + "settings.header.visual.animatedArtwork.limited": "Limitované pre stránky a špecialne vydania", + "settings.header.visual.animatedArtwork.disable": "Vypnuť Všade", + "settings.option.visual.animatedArtworkQuality": "Kvalita Animovanej Náhľadovky", // Dropdown + "settings.header.visual.animatedArtworkQuality.low": "Nízka", + "settings.header.visual.animatedArtworkQuality.medium": "Stredná", + "settings.header.visual.animatedArtworkQuality.high": "Vysoká", + "settings.header.visual.animatedArtworkQuality.veryHigh": "Veľmi Vysoká", + "settings.header.visual.animatedArtworkQuality.extreme": "Extrémna", + "settings.option.visual.animatedWindowBackground": "Pozadie Animováneho Okna", // Toggle + "settings.option.visual.hardwareAcceleration": "Hardvérova Akcelerácia", // Dropdown + "settings.option.visual.hardwareAcceleration.description": "Vyžaduje Reštart", + "settings.header.visual.hardwareAcceleration.default": "Predvoľba", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + // Refer to term.disabled for the disabled option + "settings.option.visual.showPersonalInfo": "Zobraziť osobné informácie", // Toggle + + // Settings - Lyrics + "settings.header.lyrics": "Text", + "settings.header.lyrics.description": "Zmenit nastavenia textu pre Cider.", + "settings.option.lyrics.enableMusixmatch": "Zapnúť Musixmatch Texty", // Toggle + "settings.option.lyrics.enableMusixmatchKaraoke": "Zapnúť Karaoke Režim (Iba pre Musixmatch)", // Toggle + "settings.option.lyrics.musixmatchPreferredLanguage": "Predvolený jazyk pre Musixmatch prekladanie", // Dropdown + "settings.option.lyrics.enableYoutubeLyrics": "Zapnúť Youtube Lyrics pre videá", // Toggle + + // Settings - Connectivity + "settings.header.connectivity": "Konektivita", + "settings.header.connectivity.description": "Zmeniť nastavenia konektivity pre Cider.", + "settings.option.connectivity.discordRPC": "Zobraziť status v Discord", // Dropdown + "settings.option.connectivity.playbackNotifications": "Notifikácie", // Toggle + // Refer to term.disabled for the disabled option + "settings.header.connectivity.discordRPC.cider": "Zobraziť ako 'Cider'", + "settings.header.connectivity.discordRPC.appleMusic": "Zobraziť ako 'Apple Music'", + "settings.option.connectivity.discordRPC.clearOnPause": "Vypnút Discord status pri Pauze", // Toggle + "settings.option.connectivity.lastfmScrobble": "Last.fm zaznamenanie počúvanej hudby", // Option to Connect + "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Oneskorenie (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Zapnúť Last.fm Now Playing", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Odstrániť tvorcov z počúvanej pesničky (Last.fm)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrovať loopované pesničky (Last.fm)", + // Refer to term.connect for the connect button + + // Settings - Experimental + "settings.header.experimental": "Experimentálne", + "settings.header.experimental.description": "Zmeniť experimentálne nastavenia pre Cider.", + "settings.option.experimental.compactUI": "Compact UI", // Toggle + "settings.option.experimental.close_button_hide": "Zatvoriť by malo skriť aplikáciu", + // Refer to term.disabled & term.enabled + + // Spatialization Menu + "spatial.notTurnedOn": "Priestorový Zvuk je vypnutý. Prosím najprv ho zapnite.", + "spatial.spatialProperties": "Špeciálne Nastavenia", + "spatial.width": "Šírka", + "spatial.height": "Výška", + "spatial.depth": "Hĺbka", + "spatial.gain": "Gain", + "spatial.roomMaterials": "Materiály Priestoru", + "spatial.roomDimensions": "Velkosť Priestoru", + "spatial.roomPositions": "Pozicia v Priestoru", + "spatial.setDimensions": "Nastaviť Rozmery", + "spatial.setPositions": "Nastavit Pozíciu", + "spatial.up": "Hore", + "spatial.front": "V predu", + "spatial.left": "V ľavo", + "spatial.right": "V pravo", + "spatial.back": "V zadu", + "spatial.down": "Dole", + "spatial.listener": "Listener", + "spatial.audioSource": "Zdroj zvuku", + + // Settings - Unfinished + "settings.header.unfinished": "Nedokončené", + + // Web Remote + "remote.web.title": "Cider Remote", + "remote.web.description": "Naskenujte QR kód aby ste si spárovali telefón s touto Cider session", + + // About + "about.thanks": "Ďakujeme Cider Tímu, Komunite a Kontribútorom, bez vás by to nebolo možné." +} From c0d6481300d7ffe7ad48c55490fce8b8822a00cb Mon Sep 17 00:00:00 2001 From: GamingLiamStudios Date: Tue, 8 Feb 2022 11:38:33 +1100 Subject: [PATCH 23/54] Update Auto-Updator (#368) * Update .gitignore * Add Update Cider Branch selection * Add circle-ci API call * More testing * Maybe fix 'Update Cider' button * Another debug log * remove async in ipc 'check-for-update' * remove everything except debug log * semicolon * revert to async and change ipc name * more semicolon * Extract BaseURL from circleci API response * Fix compile error + rename ipc back to 'check-for-update' * Remove debug log * Update i18n files with new 'updateCider' term location * Update en_OWO.json * Fixed formatting in i18n files * Fix formatting elsewhere * Move 'Update Cider' i18n stuff from 'experimental' to 'general' * Do that thing @quacksire wanted me to do. 'for vue' * Fix bad merge * Revert Formatting. DO NOT OPEN IN AN AUTOFORMATTING IDE. USE VSCODE WEB/CODESPACES IF YOU NEED TO ACTUALLY CHANGE SOMETHING IN THE RENDERER Co-authored-by: Quacksire <19170969+quacksire@users.noreply.github.com> --- .gitignore | 1 + src/i18n/en_OWO.jsonc | 36 +- src/i18n/en_PISS.jsonc | 55 +-- src/i18n/en_SGA.jsonc | 87 ++-- src/i18n/en_US.jsonc | 31 +- src/i18n/es_ES.jsonc | 606 +++++++++++++------------- src/i18n/fr_FR.jsonc | 70 +-- src/i18n/hu_HU.jsonc | 57 ++- src/i18n/ja_JP.jsonc | 100 +++-- src/i18n/ko_KR.jsonc | 45 +- src/i18n/sv_SE.jsonc | 62 +-- src/i18n/zh_CN.jsonc | 98 +++-- src/i18n/zh_HK.jsonc | 107 ++--- src/i18n/zh_TW.jsonc | 51 ++- src/i18n/zh_yue.jsonc | 111 ++--- src/main/base/browserwindow.ts | 25 +- src/main/base/store.ts | 9 +- src/renderer/views/pages/settings.ejs | 39 +- 18 files changed, 865 insertions(+), 725 deletions(-) diff --git a/.gitignore b/.gitignore index 4f9409f1..acc6dfb9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ dist build .flatpak* +yarn-cache # Misc .idea diff --git a/src/i18n/en_OWO.jsonc b/src/i18n/en_OWO.jsonc index 8db529b0..7e15e260 100644 --- a/src/i18n/en_OWO.jsonc +++ b/src/i18n/en_OWO.jsonc @@ -3,17 +3,22 @@ "i18n.languageName": "Engwish (OwO)", // name of language in native language "i18n.languageNameEnglish": "Engwish (OwO)", // name of language in English "i18n.category": "fun", // main = real language, fun = fun community languages - "i18n.authors": "@deerwithacurl", // Authors, if you contribute to this file feel free to add your name seperated with a space + "i18n.authors": "@deerwithacurl @gamingliamstudios", // Authors, if you contribute to this file feel free to add your name seperated with a space + // App info "app.name": "Cidew", + "date.format": "${m} ${d}, ${y}", + // Dialogs "dialog.cancel": "Nu", "dialog.ok": "Oki", + // Notification "notification.updatingLibrarySongs": "Updating wibwawy songs...", "notification.updatingLibraryAlbums": "Updating wibwawy awbums...", "notification.updatingLibraryArtists": "Updating wibwawy awtists...", + // Terms "term.appleInc": "Appwe Inc.", "term.appleMusic": "Appwe Mewsic", @@ -121,7 +126,6 @@ "term.menu": "Menuwu", "term.check": "Check", "term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "Update Cidew", "term.topResult": "Top Wesuwt", // Search Results "term.sharedPlaylists": "Shawed Pwaywists", // Search Results "term.people": "Peopwe", // Search Results @@ -137,6 +141,7 @@ "term.recordLabels": "Wecowd Wabews", "term.videoExtras": "Videowo Extwas", "term.top": "Top", + // Home "home.title": "Home", "home.recentlyPlayed": "Wecentwy Pwayed", @@ -146,12 +151,14 @@ "home.madeForYou": "Made Fow Chu", "home.friendsListeningTo": "Fwiends Wistening To", "home.followedArtists": "Fowwowed Awtists", + // Errors "error.appleMusicSubRequired": "Appwe Music wequiwes a subscwiption.", "error.connectionError": "Thewe was a pwobwem connecting to Appwe Mewsic.", "error.noResults": "No Wesuwts.", "error.noResults.description": "Twy a new seawch.", - //Podcasts + + // Podcasts "podcast.followOnCider": "Fowwow On Cidew", "podcast.followedOnCider": "Fowwowing On Cidew", "podcast.subscribeOnItunes": "Subscwibe On iTuwunes", @@ -160,6 +167,7 @@ "podcast.episodes": "Episowodes", "podcast.playEpisode": "Pway Episowode", "podcast.website": "Pawdcast Website", + // Actions "action.addToLibrary": "Add to Wibwawy", "action.addToLibrary.success": "Added to Wibwawy", @@ -207,14 +215,24 @@ "action.update": "Update", "action.newpreset": "New Pweset...", // Equalizer Preset "action.deletepreset": "Dewete Pweset", + // Settings - General "settings.header.general": "Genewaw", "settings.header.general.description": "Adjust the genewaw settings fow Cidew.", "settings.option.general.language": "Wanguage", + // Language optgroups "settings.option.general.language.main": "Wanguages", "settings.option.general.language.fun": "Fun Wanguages", "settings.option.general.language.unsorted": "Unsowted", + + // Update Cider + "settings.option.general.updateCider": "Update Cidew", // Button + "settings.option.general.updateCider.branch": "Cidew Update Bwanch", // Dropdown + "settings.option.general.updateCider.branch.description": "Sewect the bwanch to uwpdate Cidew to", + "settings.option.general.updateCider.branch.main": "Stabwe", + "settings.option.general.updateCider.branch.develop": "Devewopment", + // Settings - Audio "settings.header.audio": "Audiowo", "settings.header.audio.description": "Adjust the audiowo settings fow Cidew.", @@ -231,7 +249,7 @@ "settings.option.audio.enableAdvancedFunctionality.description": "Enabwing AudiowoContext functionawity wiww awwow fow extended audiowo featuwes wike Audiowo Nowmawization, Equalizews and Visuawizews, howevew on some systems dis may cause stuttewing in audiowo twacks.", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cidew Adwenawine Pwocessow™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacouwstic enhancements that makes evewything souwnd both wichew and mowe wivewy. | Designed by Maikiwi", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP stwength", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Stwength", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the stwength of the pwocessing done to the auwdio. (Aggwessive may yiewd uwndesiwabwe wesuwwts)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standawd", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggwessive", @@ -239,6 +257,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Nowmawizes peak vowume fow individuaw twacks to cweate a moar unifowm wistening expewience.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audiowo Spatiawization", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatiawize audiowo and make audiowo moar 3-dimensionaw (note: Dis is not Dowby Atmos)", + // Settings - Visual "settings.header.visual": "Visuaw", "settings.header.visual.description": "Adjust the visuaw settings fow Cidew.", @@ -263,6 +282,7 @@ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Show Pewsonaw Info", // Toggle + // Settings - Lyrics "settings.header.lyrics": "Wywics", "settings.header.lyrics.description": "Adjust the wywics settings fow Cidew.", @@ -270,6 +290,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "Enabwe Kawaoke Mode (Musixmatch onwy)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Twanswation Pwefewwed Wanguage", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "Enabwe YouTube Wywics fow Mewsic Videowos", // Toggle + // Settings - Connectivity "settings.header.connectivity": "Connectivity", "settings.header.connectivity.description": "Adjust the connectivity settings fow Cidew.", @@ -285,11 +306,13 @@ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Wemove featuwing awtists fwom song titwe (Wast.fm)", "settings.option.connectivity.lastfmScrobble.filterLoop": "Fiwtew wooped twack (Wast.fm)", // Refer to term.connect for the connect button + // Settings - Experimental "settings.header.experimental": "Expewimentaw", "settings.header.experimental.description": "Adjust the expewimentaw settings fow Cidew.", "settings.option.experimental.compactUI": "Wittwe UI", // Toggle "settings.option.experimental.close_button_hide": "Cwose Button Shouwd Hide the Appwication", + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.notTurnedOn": "Audiowo Spatiawization is disabwed. To use, pwease enabwe it fiwst.", @@ -311,11 +334,14 @@ "spatial.down": "Down", "spatial.listener": "Wistenew", "spatial.audioSource": "Audiowo Souwce", + // Settings - Unfinished "settings.header.unfinished": "Unfinished", + // Web Remote - "remote.web.title": "Cider Wiimote", + "remote.web.title": "Cidew Wiimote", "remote.web.description": "Scan da QR code to paiw chur phone up with dis Cidew instance", + // About "about.thanks": "Majow tanks to da Cidew Cowwective Team and aww of ouw contwibutows." } \ No newline at end of file diff --git a/src/i18n/en_PISS.jsonc b/src/i18n/en_PISS.jsonc index 07dd925c..619ca375 100644 --- a/src/i18n/en_PISS.jsonc +++ b/src/i18n/en_PISS.jsonc @@ -1,16 +1,15 @@ { // Base File - // i18n Info - "i18n.languageName": "piss", // name of language in native language + "i18n.languageName": "piss", // name of language in native language "i18n.languageNameEnglish": "English (piss)", // name of language in English "i18n.category": "fun", // main = real language, fun = fun community languages "i18n.authors": "@SoNothingMC @saboooor", // Authors, if you contribute to this file feel free to add your name seperated with a space - + // App info "app.name": "piss", - - "date.format": "${y}-${m}-${d}", // ISO 8601 for the win! + "date.format": "${y}-${m}-${d}", // ISO 8601 for the win! + // Dialogs "dialog.cancel": "no piss", "dialog.ok": "yes piss", @@ -19,6 +18,7 @@ "notification.updatingLibrarySongs": "pisssing all over your songs", "notification.updatingLibraryAlbums": "pissing all over your albums", "notification.updatingLibraryArtists": "pissing all over your idols", + // Terms "term.appleInc": "piss Inc.", "term.appleMusic": "piss music", @@ -93,10 +93,10 @@ "term.less": "piss less", "term.showMore": "more piss", "term.showLess": "less piss", - "term.topSongs" : "top piss", + "term.topSongs": "top piss", "term.latestReleases": "latest piss collection", "term.time.added": "pissed", - "term.time.released": "pissed", + "term.time.released": "pissed", "term.time.updated": "pissed", "term.time.hours": "hours", "term.time.hour": "hour", @@ -123,12 +123,11 @@ "term.equalizer": "advanced piss configuration", "term.reset": "repiss", "term.tracks": "pisses", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "piss videos", + "term.videos": "piss videos", "term.menu": "piss menu", "term.check": "piss!", "term.aboutArtist": "about pisser {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "piss on cider", - "term.topResult": "top piss", // Search Results + "term.topResult": "top piss", // Search Results "term.sharedPlaylists": "shared pisslists", // Search Results "term.people": "pissers", // Search Results "term.newpreset.name": "new advanced piss prepiss name", // Equalizer Preset @@ -153,13 +152,14 @@ "home.madeForYou": "pissed for you", "home.friendsListeningTo": "friends pissing to", "home.followedArtists": "followed pissers", + // Errors "error.appleMusicSubRequired": "piss music requires, like y'know, an actual piss music subscription to actually use.", "error.connectionError": "oh, piss.", "error.noResults": "no piss found", "error.noResults.description": "try pissing somewhere else (or press Enter/Return to search)", - //Podcasts + // Podcasts "podcast.followOnCider": "piss on Cider", "podcast.followedOnCider": "pissed on Cider", "podcast.subscribeOnItunes": "piss on iPiss", @@ -215,19 +215,22 @@ "action.tray.show": "piss back", "action.update": "piss!", "action.copy": "copiss", - "action.newpreset": "new prepiss...", // Equalizer Preset + "action.newpreset": "new prepiss...", // Equalizer Preset "action.deletepreset": "unpiss prepiss", // Settings - General "settings.header.general": "general", "settings.header.general.description": "the dumping place for settings when there are no other places to put them into", - "settings.option.general.language": "piss around the world", + "settings.option.general.language": "piss around the world", // Language optgroups "settings.option.general.language.main": "actaul human languages", "settings.option.general.language.fun": "piss languages", "settings.option.general.language.unsorted": "???? who put this here", - + + // Update Cider + "settings.option.general.updateCider": "piss on cider", // Button + // Settings - Audio "settings.header.audio": "piss sounds", "settings.header.audio.description": "change how your piss sounds", @@ -249,8 +252,9 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "protect your eardrums from overly loud/slient pisses", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "3D piss", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "this aint the dolby atmos you are looking for but its still pretty crazy so check it out", + // Settings - Visual - "settings.header.visual": "piss appearance", + "settings.header.visual": "piss appearance", "settings.header.visual.description": "change how your piss looks", "settings.option.visual.windowBackgroundStyle": "background piss", // Toggle "settings.header.visual.windowBackgroundStyle.none": "no piss", @@ -269,14 +273,13 @@ "settings.option.visual.animatedWindowBackground": "moving background piss", // Toggle "settings.option.visual.hardwareAcceleration": "make Cider piss faster", // Dropdown "settings.option.visual.hardwareAcceleration.description": "you need to relaunch Cider", - "settings.header.visual.hardwareAcceleration.default": "default piss", - "settings.header.visual.hardwareAcceleration.webGPU": "WebPISS", + "settings.header.visual.hardwareAcceleration.default": "default piss", + "settings.header.visual.hardwareAcceleration.webGPU": "WebPISS", "settings.header.visual.theme": "colored piss", // Settings - Visual - Theme name "settings.option.visual.theme.default": "regular piss", "settings.option.visual.theme.dark": "black piss", - // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "show yourself to the pissiverse", // Toggle @@ -298,12 +301,12 @@ "settings.header.connectivity.discordRPC.appleMusic": "piss as 'piss music'", "settings.option.connectivity.discordRPC.clearOnPause": "flush Pisscord rich pissence when holding your piss", // Toggle "settings.option.connectivity.lastfmScrobble": "Piss.fm scrobbling", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "Piss.fm scrobble delay (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "push now playing data to Piss.fm", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "remove featured pissers from piss names (Piss.fm)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "filter same piss (Piss.fm)", + "settings.option.connectivity.lastfmScrobble.delay": "Piss.fm scrobble delay (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "push now playing data to Piss.fm", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "remove featured pissers from piss names (Piss.fm)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "filter same piss (Piss.fm)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "piss lab", "settings.header.experimental.description": "mitochondria is the powerhouse of the cell", @@ -311,8 +314,8 @@ "settings.option.experimental.close_button_hide": "play hide-and-seek when clicking close button", "settings.option.experimental.copy_log": "copy sewage to pissboard", "settings.option.experimental.inline_playlists": "inpiss pisslists and piss collections", - // Refer to term.disabled & term.enabled + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.notTurnedOn": "3D piss is not on. turn it on lol", "spatial.spatialProperties": "3D properties", @@ -333,7 +336,7 @@ "spatial.down": "the piss on the floor", "spatial.listener": "you", "spatial.audioSource": "piss source", - + // Settings - Unfinished "settings.header.unfinished": "DLC piss", @@ -343,4 +346,4 @@ // About "about.thanks": "thanks to the Cider Collective team and all the pisseneers putting this together" -} +} \ No newline at end of file diff --git a/src/i18n/en_SGA.jsonc b/src/i18n/en_SGA.jsonc index dacce06e..a04520b5 100644 --- a/src/i18n/en_SGA.jsonc +++ b/src/i18n/en_SGA.jsonc @@ -1,7 +1,6 @@ { - // i18n Info - "i18n.languageName": "┤ᖋ|:ᖋᔮᒣ╎ᔮ ᖋ|:i!⍑ᖋᕊᒷᒣ", // name of language in native language + "i18n.languageName": "┤ᖋ|:ᖋᔮᒣ╎ᔮ ᖋ|:i!⍑ᖋᕊᒷᒣ", // name of language in native language "i18n.languageNameEnglish": "Galactic Alphabet", // name of language in English "i18n.category": "fun", // main = real language, fun = fun community languages "i18n.authors": "@kyw504100", // Authors, if you contribute to this file feel free to add your name seperated with a space @@ -10,7 +9,7 @@ "app.name": "ᔮ╎↸ᒷ∷", "date.format": "${m} ${d}, ${y}", - + // Dialogs "dialog.cancel": "ᔮᖋリᔮᒷ|:", "dialog.ok": "ᒍ·ǀ·", @@ -19,6 +18,7 @@ "notification.updatingLibrarySongs": "⚍i!↸ᖋᒣ╎リ┤ |:╎ᕊ∷ᖋ∷॥ ϟᒍリ┤ϟ...", "notification.updatingLibraryAlbums": "⚍i!↸ᖋᒣ╎リ┤ |:╎ᕊ∷ᖋ∷॥ ᖋ|:ᕊ⚍ᒲϟ...", "notification.updatingLibraryArtists": "⚍i!↸ᖋᒣ╎リ┤ |:╎ᕊ∷ᖋ∷॥ ᖋ∷ᒣ╎ϟᒣϟ...", + // Terms "term.appleInc": "ᖋi!i!|:ᒷ ╎リᔮ.", "term.appleMusic": "ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ", @@ -93,10 +93,10 @@ "term.less": "|:ᒷϟϟ", "term.showMore": "ϟ⍑ᒍ∴ ᒲᒍ∷ᒷ", "term.showLess": "ϟ⍑ᒍ∴ |:ᒷϟϟ", - "term.topSongs" : "ᒣᒍi! ϟᒍリ┤ϟ", + "term.topSongs": "ᒣᒍi! ϟᒍリ┤ϟ", "term.latestReleases": "|:ᖋᒣᒷϟᒣ ∷ᒷ|:ᒷᖋϟᒷϟ", "term.time.added": "ᖋ↸↸ᒷ↸", - "term.time.released": "∷ᒷ|:ᒷᖋϟᒷ↸", + "term.time.released": "∷ᒷ|:ᒷᖋϟᒷ↸", "term.time.updated": "⚍i!↸ᖋᒣᒷ↸", "term.time.hours": "⍑ᒍ⚍∷ϟ", "term.time.hour": "⍑ᒍ⚍∷", @@ -124,11 +124,10 @@ "term.reset": "∷ᒷϟᒷᒣ", "term.tracks": "ᒣ∷ᖋᔮ·ǀ·ϟ", // Assume x amount of tracks. e.g. 50 tracks "term.videos": "⍊╎↸ᒷᒍ", - "term.menu": "ᒲᒷ⚍リ", + "term.menu": "ᒲᒷ⚍リ", "term.check": "ᔮ⍑ᒷᔮ·ǀ·", "term.aboutArtist": "ᖋᕊᒍ⚍ᒣ {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "⚍i!↸ᖋᒣᒷ ᔮ╎↸ᒷ∷", - "term.topResult": "ᒣᒍi! ∷ᒷϟ⚍|:ᒣ", // Search Results + "term.topResult": "ᒣᒍi! ∷ᒷϟ⚍|:ᒣ", // Search Results "term.sharedPlaylists": "ϟ⍑ᖋ∷ᒷ↸ i!|:ᖋ॥|:╎ϟᒣϟ", // Search Results "term.people": "i!ᒷᒍi!|:ᒷ", // Search Results "term.newpreset.name": "リᒷ∴ ᒷᑑ i!∷ᒷϟᒷᒣ リᖋᒲᒷ", // Equalizer Preset @@ -153,13 +152,14 @@ "home.madeForYou": "ᒲᖋ↸ᒷ ⎓ᒍ∷ ॥ᒍ⚍", "home.friendsListeningTo": "⎓∷╎ᒷリ↸ϟ |:╎ϟᒣᒷリ╎リ┤ ᒣᒍ", "home.followedArtists": "⎓ᒍ|:|:ᒍ∴ᒷ↸ ᖋ∷ᒣ╎ϟᒣϟ", + // Errors "error.appleMusicSubRequired": "ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ ∷ᒷᑑ⚍╎∷ᒷϟ ᖋ ϟ⚍ᕊϟᔮ∷╎i!ᒣ╎ᒍリ.", "error.connectionError": "ᒣ⍑ᒷ∷ᒷ ∴ᖋϟ ᖋ i!∷ᒍᕊ|:ᒷᒲ ᔮᒍリリᒷᔮᒣ╎リ┤ ᒣᒍ ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ.", "error.noResults": "リᒍ ∷ᒷϟ⚍|:ᒣϟ.", "error.noResults.description": "ᒣ∷॥ ᖋ リᒷ∴ ϟᒷᖋ∷ᔮ⍑.", - //Podcasts + // Podcasts "podcast.followOnCider": "⎓ᒍ|:|:ᒍ∴ ᒍリ ᔮ╎↸ᒷ∷", "podcast.followedOnCider": "⎓ᒍ|:|:ᒍ∴╎リ┤ ᒍリ ᔮ╎↸ᒷ∷", "podcast.subscribeOnItunes": "ϟ⚍ᕊϟᔮ∷╎ᕊᒷ ᒍリ ╎ᒣ⚍リᒷϟ", @@ -215,7 +215,7 @@ "action.tray.show": "ϟ⍑ᒍ∴", "action.update": "⚍i!↸ᖋᒣᒷ", "action.copy": "ᔮᒍi!॥", - "action.newpreset": "リᒷ∴ i!∷ᒷϟᒷᒣ...", // Equalizer Preset + "action.newpreset": "リᒷ∴ i!∷ᒷϟᒷᒣ...", // Equalizer Preset "action.deletepreset": "↸ᒷ|:ᒷᒣᒷ i!∷ᒷϟᒷᒣ", // Settings - General @@ -228,6 +228,9 @@ "settings.option.general.language.fun": "⎓⚍リ |:ᖋリ┤⚍ᖋ┤ᒷϟ", "settings.option.general.language.unsorted": "⚍リϟᒍ∷ᒣᒷ↸", + // Update Cider + "settings.option.general.updateCider": "⚍i!↸ᖋᒣᒷ ᔮ╎↸ᒷ∷", + // Settings - Audio "settings.header.audio": "ᖋ⚍↸╎ᒍ", "settings.header.audio.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ᖋ⚍↸╎ᒍ ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.", @@ -248,8 +251,9 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "リᒍ∷ᒲᖋ|:╎∩ᒷϟ i!ᒷᖋ·ǀ· ⍊ᒍ|:⚍ᒲᒷ ⎓ᒍ∷ ╎リ↸╎⍊╎↸⚍ᖋ|: ᒣ∷ᖋᔮ·ǀ·ϟ ᒣᒍ ᔮ∷ᒷᖋᒣᒷ ᖋ ᒲᒍ∷ᒷ ⚍リ╎⎓ᒍ∷ᒲ |:╎ϟᒣᒷリ╎リ┤ ᒷ/i!ᒷ∷╎ᒷリᔮᒷ.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ᖋ⚍↸╎ᒍ ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ϟi!ᖋᒣ╎ᖋ|:╎∩ᒷ ᖋ⚍↸╎ᒍ ᖋリ↸ ᒲᖋ·ǀ·ᒷ ᖋ⚍↸╎ᒍ ᒲᒍ∷ᒷ 3-↸╎ᒲᒷリϟ╎ᒍリᖋ|: (リᒍᒣᒷ: ᒣ⍑╎ϟ ╎ϟ リᒍᒣ ↸ᒍ|:ᕊ॥ ᖋᒣᒲᒍϟ)", + // Settings - Visual - "settings.header.visual": "⍊╎ϟ⚍ᖋ|:", + "settings.header.visual": "⍊╎ϟ⚍ᖋ|:", "settings.header.visual.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ⍊╎ϟ⚍ᖋ| ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.", "settings.option.visual.windowBackgroundStyle": "∴╎リ↸ᒍ∴ ᕊᖋᔮ·ǀ·┤∷ᒍ⚍リ↸ ϟᒣ॥|:ᒷ", // Toggle "settings.header.visual.windowBackgroundStyle.none": "リᒍリᒷ", @@ -268,14 +272,13 @@ "settings.option.visual.animatedWindowBackground": "ᖋリ╎ᒲᖋᒣᒷ↸ ∴╎リ↸ᒍ∴ ᕊᖋᔮ·ǀ·┤∷ᒍ⚍リ↸", // Toggle "settings.option.visual.hardwareAcceleration": "⍑ᖋ∷↸∴ᖋ∷ᒷ ᖋᔮᔮᒷ|:ᒷ∷ᖋᒣ╎ᒍリ", // Dropdown "settings.option.visual.hardwareAcceleration.description": "∷ᒷᑑ⚍╎∷ᒷϟ ∷ᒷ|:ᖋ⚍リᔮ⍑", - "settings.header.visual.hardwareAcceleration.default": "↸ᒷ⎓ᖋ⚍|:ᒣ", - "settings.header.visual.hardwareAcceleration.webGPU": "∴ᒷᕊ┤i!⚍", + "settings.header.visual.hardwareAcceleration.default": "↸ᒷ⎓ᖋ⚍|:ᒣ", + "settings.header.visual.hardwareAcceleration.webGPU": "∴ᒷᕊ┤i!⚍", "settings.header.visual.theme": "ᒣ⍑ᒷᒲᒷ", - + // Settings - Visual - Theme name "settings.option.visual.theme.default": "ᔮ╎↸ᒷ∷", "settings.option.visual.theme.dark": "↸ᖋ∷·ǀ·", - // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "ϟ⍑ᒍ∴ i!ᒷ∷ϟᒍリᖋ|: ╎リ⎓ᒍ", // Toggle @@ -286,7 +289,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "ᒷリᖋᕊ|:ᒷ ·ǀ·ᖋ∷ᖋᒍ·ǀ·ᒷ ᒲᒍ↸ᒷ (ᒲ⚍ϟ╎̇/ᒲᖋᒣᔮ⍑ ᒍリ|:॥)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "ᒲ⚍ϟ╎̇/ᒲᖋᒣᔮ⍑ ᒣ∷ᖋリϟ|:ᖋᒣ╎ᒍリ i!∷ᒷ⎓ᒷ∷∷ᒷ↸ |:ᖋリ┤⚍ᖋ┤ᒷ", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "ᒷリᖋᕊ|:ᒷ ॥ᒍ⚍ᒣ⚍ᕊᒷ |:॥∷╎ᔮϟ ⎓ᒍ∷ ᒲ⚍ϟ╎ᔮ ⍊╎↸ᒷᒍϟ", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "ᔮᒍリリᒷᔮᒣ╎⍊╎ᒣ॥", "settings.header.connectivity.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ᔮᒍリリᒷᔮᒣ╎⍊╎ᒣ॥ ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.", @@ -297,12 +300,12 @@ "settings.header.connectivity.discordRPC.appleMusic": "↸╎ϟi!|:ᖋ॥ ᖋϟ 'ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ'", "settings.option.connectivity.discordRPC.clearOnPause": "ᔮ|:ᒷᖋ∷ ↸╎ϟᔮᒍ∷↸ ∷╎ᔮ⍑ i!∷ᒷϟᒷリᔮᒷ ᒍリ i!ᖋ⚍ϟᒷ", // Toggle "settings.option.connectivity.lastfmScrobble": "|:ᖋϟᒣ.⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:╎リ┤", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "|:ᖋϟᒣ.⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:ᒷ ↸ᒷ|:ᖋ॥ (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "ᒷリᖋᕊ|:ᒷ |:ᖋϟᒣ.⎓ᒲ リᒍ∴ i!|:ᖋ॥╎リ┤", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "∷ᒷᒲᒍ⍊ᒷ ⎓ᒷᖋᒣ⚍∷╎リ┤ ᖋ∷ᒣ╎ϟᒣϟ ⎓∷ᒍᒲ ϟᒍリ┤ ᒣ╎ᒣ|:ᒷ (|:ᖋϟᒣ.⎓ᒲ)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "⎓╎|:ᒣᒷ∷ |:ᒍᒍi!ᒷ↸ ᒣ∷ᖋᔮ·ǀ· (|:ᖋϟᒣ.⎓ᒲ)", + "settings.option.connectivity.lastfmScrobble.delay": "|:ᖋϟᒣ.⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:ᒷ ↸ᒷ|:ᖋ॥ (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "ᒷリᖋᕊ|:ᒷ |:ᖋϟᒣ.⎓ᒲ リᒍ∴ i!|:ᖋ॥╎リ┤", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "∷ᒷᒲᒍ⍊ᒷ ⎓ᒷᖋᒣ⚍∷╎リ┤ ᖋ∷ᒣ╎ϟᒣϟ ⎓∷ᒍᒲ ϟᒍリ┤ ᒣ╎ᒣ|:ᒷ (|:ᖋϟᒣ.⎓ᒲ)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "⎓╎|:ᒣᒷ∷ |:ᒍᒍi!ᒷ↸ ᒣ∷ᖋᔮ·ǀ· (|:ᖋϟᒣ.⎓ᒲ)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "ᒷ/i!ᒷ∷╎ᒲᒷリᒣᖋ|:", "settings.header.experimental.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ᒷ/i!ᒷ∷╎ᒲᒷリᒣᖋ|: ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.", @@ -310,36 +313,36 @@ "settings.option.experimental.close_button_hide": "ᔮ|:ᒍϟᒷ ᕊ⚍ᒣᒣᒍリ ϟ⍑ᒍ⚍|:↸ ⍑╎↸ᒷ ᒣ⍑ᒷ ᖋi!i!|:╎ᔮᖋᒣ╎ᒍリ", "settings.option.experimental.copy_log": "ᔮᒍi!॥ |:ᒍ┤ϟ ᒣᒍ ᔮ|:╎i!ᕊᒍᖋ∷↸", "settings.option.experimental.inline_playlists": "╎リ|:╎リᒷ i!|:ᖋ॥|:╎ϟᒣϟ ᖋリ↸ ᖋ|:ᕊ⚍ᒲϟ", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.notTurnedOn": "ᖋ⚍↸╎ᒍ ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ ╎ϟ ↸╎ϟᖋᕊ|:ᒷ↸. ᒣᒍ ⚍ϟᒷ, i!|:ᒷᖋϟᒷ ᒷリᖋᕊ|:ᒷ ╎ᒣ ⎓╎∷ϟᒣ.", - "spatial.spatialProperties" : "ϟi!ᖋᒣ╎ᖋ|: i!∷ᒍi!ᒷ∷ᒣ╎ᒷϟ", - "spatial.width" : "∴╎↸ᒣ⍑", - "spatial.height" : "⍑ᒷ╎┤⍑ᒣ", - "spatial.depth" : "↸ᒷi!ᒣ⍑", - "spatial.gain" : "┤ᖋ╎リ", - "spatial.roomMaterials" : "∷ᒍᒍᒲ ᒲᖋᒣᒷ∷╎ᖋ|:ϟ", - "spatial.roomDimensions" : "∷ᒍᒍᒲ ↸╎ᒲᒷリϟ╎ᒍリϟ", - "spatial.roomPositions" : "∷ᒍᒍᒲ i!ᒍϟ╎ᒣ╎ᒍリϟ", - "spatial.setDimensions" : "ϟᒷᒣ ↸╎ᒲᒷリϟ╎ᒍリϟ", - "spatial.setPositions" : "ϟᒷᒣ i!ᒍϟ╎ᒣ╎ᒍリϟ", - "spatial.up" : "⚍i!", - "spatial.front" : "⎓∷ᒍリᒣ", - "spatial.left" : "|:ᒷ⎓ᒣ", - "spatial.right" : "∷╎┤⍑ᒣ", - "spatial.back" : "ᕊᖋᔮ·ǀ·", - "spatial.down" : "↸ᒍ∴リ", - "spatial.listener" : "|:╎ϟᒣᒷリᒷ∷", - "spatial.audioSource" : "ᖋ⚍↸╎ᒍ ϟᒍ⚍∷ᔮᒷ", + "spatial.spatialProperties": "ϟi!ᖋᒣ╎ᖋ|: i!∷ᒍi!ᒷ∷ᒣ╎ᒷϟ", + "spatial.width": "∴╎↸ᒣ⍑", + "spatial.height": "⍑ᒷ╎┤⍑ᒣ", + "spatial.depth": "↸ᒷi!ᒣ⍑", + "spatial.gain": "┤ᖋ╎リ", + "spatial.roomMaterials": "∷ᒍᒍᒲ ᒲᖋᒣᒷ∷╎ᖋ|:ϟ", + "spatial.roomDimensions": "∷ᒍᒍᒲ ↸╎ᒲᒷリϟ╎ᒍリϟ", + "spatial.roomPositions": "∷ᒍᒍᒲ i!ᒍϟ╎ᒣ╎ᒍリϟ", + "spatial.setDimensions": "ϟᒷᒣ ↸╎ᒲᒷリϟ╎ᒍリϟ", + "spatial.setPositions": "ϟᒷᒣ i!ᒍϟ╎ᒣ╎ᒍリϟ", + "spatial.up": "⚍i!", + "spatial.front": "⎓∷ᒍリᒣ", + "spatial.left": "|:ᒷ⎓ᒣ", + "spatial.right": "∷╎┤⍑ᒣ", + "spatial.back": "ᕊᖋᔮ·ǀ·", + "spatial.down": "↸ᒍ∴リ", + "spatial.listener": "|:╎ϟᒣᒷリᒷ∷", + "spatial.audioSource": "ᖋ⚍↸╎ᒍ ϟᒍ⚍∷ᔮᒷ", // Settings - Unfinished "settings.header.unfinished": "⚍リ⎓╎リ╎ϟ⍑ᒷ↸", - + // Web Remote "remote.web.title": "ᔮ╎↸ᒷ∷ ∷ᒷᒲᒍᒣᒷ", "remote.web.description": "ϟᔮᖋリ ᒣ⍑ᒷ ᑑ∷ ᔮᒍ↸ᒷ ᒣᒍ i!ᖋ╎∷ ॥ᒍ⚍∷ i!⍑ᒍリᒷ ⚍i! ∴╎ᒣ⍑ ᒣ⍑╎ϟ ᔮ╎↸ᒷ∷ ╎リϟᒣᖋリᔮᒷ", - + // About "about.thanks": "ᒲᖋ⋮ᒍ∷ ᒣ⍑ᖋリ·ǀ·ϟ ᒣᒍ ᒣ⍑ᒷ ᔮ╎↸ᒷ∷ ᔮᒍ|:|:ᒷᔮᒣ╎⍊ᒷ ᒣᒷᖋᒲ ᖋリ↸ ᖋ|:|: ᒍ⎓ ᒍ⚍∷ ᔮᒍリᒣ∷╎ᕊ⚍ᒣᒍ∷ϟ." } \ No newline at end of file diff --git a/src/i18n/en_US.jsonc b/src/i18n/en_US.jsonc index 997dc576..2bce04b9 100644 --- a/src/i18n/en_US.jsonc +++ b/src/i18n/en_US.jsonc @@ -4,16 +4,21 @@ "i18n.languageNameEnglish": "English (US)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space + // App info "app.name": "Cider", + "date.format": "${m} ${d}, ${y}", + // Dialogs "dialog.cancel": "Cancel", "dialog.ok": "OK", + // Notification "notification.updatingLibrarySongs": "Updating library songs...", "notification.updatingLibraryAlbums": "Updating library albums...", "notification.updatingLibraryArtists": "Updating library artists...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -122,7 +127,6 @@ "term.menu": "Menu", "term.check": "Check", "term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "Update Cider", "term.topResult": "Top Result", // Search Results "term.sharedPlaylists": "Shared Playlists", // Search Results "term.people": "People", // Search Results @@ -138,6 +142,7 @@ "term.recordLabels": "Record Labels", "term.videoExtras": "Video Extras", "term.top": "Top", + // Home "home.title": "Home", "home.recentlyPlayed": "Recently Played", @@ -147,12 +152,14 @@ "home.madeForYou": "Made For You", "home.friendsListeningTo": "Friends Listening To", "home.followedArtists": "Followed Artists", + // Errors "error.appleMusicSubRequired": "Apple Music requires a subscription.", "error.connectionError": "There was a problem connecting to Apple Music.", "error.noResults": "No Results.", "error.noResults.description": "Try a new search.", - //Podcasts + + // Podcasts "podcast.followOnCider": "Follow On Cider", "podcast.followedOnCider": "Following On Cider", "podcast.subscribeOnItunes": "Subscribe On iTunes", @@ -161,6 +168,7 @@ "podcast.episodes": "Episodes", "podcast.playEpisode": "Play Episode", "podcast.website": "Podcast Website", + // Actions "action.addToLibrary": "Add to Library", "action.addToLibrary.success": "Added to Library", @@ -209,14 +217,24 @@ "action.copy": "Copy", "action.newpreset": "New Preset...", // Equalizer Preset "action.deletepreset": "Delete Preset", + // Settings - General "settings.header.general": "General", "settings.header.general.description": "Adjust the general settings for Cider.", "settings.option.general.language": "Language", + // Language optgroups "settings.option.general.language.main": "Languages", "settings.option.general.language.fun": "Fun Languages", "settings.option.general.language.unsorted": "Unsorted", + + // Update Cider + "settings.option.general.updateCider": "Update Cider", // Button. Refer to term.check for the check button + "settings.option.general.updateCider.branch": "Cider Update Branch", // Dropdown + "settings.option.general.updateCider.branch.description": "Select the branch to update Cider to", + "settings.option.general.updateCider.branch.main": "Stable", + "settings.option.general.updateCider.branch.develop": "Development", + // Settings - Audio "settings.header.audio": "Audio", "settings.header.audio.description": "Adjust the audio settings for Cider.", @@ -242,6 +260,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialize audio and make audio more 3-dimensional (note: This is not Dolby Atmos)", + // Settings - Visual "settings.header.visual": "Visual", "settings.header.visual.description": "Adjust the visual settings for Cider.", @@ -265,11 +284,13 @@ "settings.header.visual.hardwareAcceleration.default": "Default", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "Theme", + // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "Dark", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Show Personal Info", // Toggle + // Settings - Lyrics "settings.header.lyrics": "Lyrics", "settings.header.lyrics.description": "Adjust the lyrics settings for Cider.", @@ -277,6 +298,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "Enable Karaoke Mode (Musixmatch only)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Translation Preferred Language", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "Enable Youtube Lyrics for Music Videos", // Toggle + // Settings - Connectivity "settings.header.connectivity": "Connectivity", "settings.header.connectivity.description": "Adjust the connectivity settings for Cider.", @@ -292,6 +314,7 @@ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)", "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)", // Refer to term.connect for the connect button + // Settings - Experimental "settings.header.experimental": "Experimental", "settings.header.experimental.description": "Adjust the experimental settings for Cider.", @@ -299,6 +322,7 @@ "settings.option.experimental.close_button_hide": "Close Button Should Hide the Application", "settings.option.experimental.copy_log": "Copy logs to clipboard", "settings.option.experimental.inline_playlists": "Inline Playlists and Albums", + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.notTurnedOn": "Audio Spatialization is disabled. To use, please enable it first.", @@ -320,11 +344,14 @@ "spatial.down": "Down", "spatial.listener": "Listener", "spatial.audioSource": "Audio Source", + // Settings - Unfinished "settings.header.unfinished": "Unfinished", + // Web Remote "remote.web.title": "Cider Remote", "remote.web.description": "Scan the QR code to pair your phone up with this Cider instance", + // About "about.thanks": "Major thanks to the Cider Collective Team and all of our contributors." } \ No newline at end of file diff --git a/src/i18n/es_ES.jsonc b/src/i18n/es_ES.jsonc index 6ad1ee9d..9a0bf149 100644 --- a/src/i18n/es_ES.jsonc +++ b/src/i18n/es_ES.jsonc @@ -1,312 +1,316 @@ { // Base File + // i18n Info + "i18n.languageName": "Español (ES)", // name of language in native language + "i18n.languageNameEnglish": "Spanish (Spain)", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "@j.fl220", // Authors, if you contribute to this file feel free to add your name seperated with a space + + // App info + "app.name": "Cider", + + "date.format": "${d} ${m}, ${y}", + + // Dialogs + "dialog.cancel": "Cancelar", + "dialog.ok": "Aceptar", + + // Notification + "notification.updatingLibrarySongs": "Actualizando canciones de la biblioteca...", + "notification.updatingLibraryAlbums": "Actualizando álbumes de la biblioteca...", + "notification.updatingLibraryArtists": "Actualizando biblioteca de artistas...", + + // Terms + "term.appleInc": "Apple Inc.", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", + "term.itunes": "iTunes", + "term.github": "GitHub", + "term.discord": "Discord", + "term.learnMore": "Leer más", + "term.accountSettings": "Ajustes de la cuenta", + "term.logout": "Cerrar sesión", + "term.login": "Iniciar sesión", + "term.about": "Más información", + "term.privateSession": "Sesión privada", + "term.queue": "En cola", + "term.search": "Buscar", + "term.library": "Biblioteca", + "term.listenNow": "Escuchar", + "term.browse": "Explorar", + "term.radio": "Radio", + "term.recentlyAdded": "Añadido recientemente", + "term.songs": "Canciones", + "term.albums": "Álbumes", + "term.artists": "Artistas", + "term.podcasts": "Podcasts", + "term.playlists": "Playlists", + "term.playlist": "Playlist", + "term.newPlaylist": "Nueva playlist", + "term.newPlaylistFolder": "Nueva carpeta de playlists", + "term.createNewPlaylist": "Crear nueva playlists", + "term.createNewPlaylistFolder": "Crear nueva carpeta de playlists", + "term.deletePlaylist": "¿Está seguro que desea eliminar esta playlist?", + "term.play": "Reproducir", + "term.pause": "Pausar", + "term.previous": "Anterior", + "term.next": "Siguiente", + "term.shuffle": "Aleatorio", + "term.repeat": "Repetir", + "term.volume": "Volumen", + "term.mute": "Silenciar", + "term.unmute": "Desilenciar", + "term.share": "Compartir", + "term.settings": "Ajustes", + "term.seeAll": "Ver todo", + "term.sortBy": "Ordenar por", + "term.sortBy.album": "Álbum", + "term.sortBy.artist": "Artista", + "term.sortBy.name": "Nombre", + "term.sortBy.genre": "Género", + "term.sortBy.releaseDate": "Fecha de lanzamiento", + "term.sortBy.duration": "Duración", + "term.sortOrder": "A-Z", + "term.sortOrder.ascending": "Ascendiente", + "term.sortOrder.descending": "Descendiente", + "term.viewAs": "Ver como", + "term.viewAs.coverArt": "Carátula", + "term.viewAs.list": "Lista", + "term.size": "Tamaño", + "term.size.normal": "Normal", + "term.size.compact": "Compacto", + "term.enable": "Habilitar", + "term.disable": "Deshabilitar", + "term.enabled": "Activado", + "term.disabled": "Desactivado", + "term.connect": "Conectar", + "term.connecting": "Conectando", + "term.disconnect": "Desconectado", + "term.authed": "Autentificado", + "term.confirm": "¿Confirmar?", + "term.more": "Más", + "term.less": "Menos", + "term.showMore": "Mostrar más", + "term.showLess": "Mostrar menos", + "term.topSongs": "Top canciones", + "term.latestReleases": "Últimos lanzamientos", + "term.time.added": "Añadido", + "term.time.released": "Lanzado", + "term.time.updated": "Actualizado", + "term.time.hours": "horas", + "term.time.hour": "hora", + "term.time.minutes": "minutos", + "term.time.minute": "minuto", + "term.time.seconds": "segundos", + "term.time.second": "segundo", + "term.fullscreenView": "Pantalla completa", + "term.defaultView": "Vista por defecto", + "term.audioSettings": "Ajustes de audio", + "term.clearAll": "Borrar todo", + "term.recentStations": "Radios recientes", + "term.language": "Idioma", + "term.funLanguages": "Divertido", + "term.noLyrics": "Cargando... / Letra no encontrada./ Instrumental.", + "term.copyright": "Copyright", + "term.rightsReserved": "Todos los derechos reservados.", + "term.sponsor": "Apoya este proyecto", + "term.ciderTeam": "Equipo Cider", + "term.developer": "Desarrollador", + "term.socialTeam": "Equipo RRSS", + "term.socials": "Redes sociales", + "term.contributors": "Contribuidores", + "term.equalizer": "Equalizador", + "term.reset": "Resetear", + "term.tracks": "canciones", // Assume x amount of tracks. e.g. 50 tracks + "term.videos": "Vídeos", + "term.menu": "Menú", + "term.check": "Comprobar", + "term.aboutArtist": "Más sobre {{artistName}}", // e.g. 'About Doja Cat' + + // Home + "home.title": "Inicio", + "home.recentlyPlayed": "Reproducciones recientes", + "home.recentlyAdded": "Añadido recientemente", + "home.artistsFeed": "Historial de tus artistas", + "home.artistsFeed.noArtist": "Sigue primero a algunos artistas y sus últimos lanzamientos aparecerán aquí", + "home.madeForYou": "Hecho para ti", + "home.friendsListeningTo": "Tus amigos están escuchando", + "home.followedArtists": "Artistas que sigues", + + // Errors + "error.appleMusicSubRequired": "Apple Music necesita una suscripción.", + "error.connectionError": "Ha habido un problema al conectar con Apple Music.", + "error.noResults": "Sin resultados", + "error.noResults.description": "Intenta otra búsqueda.", + + // Podcasts + "podcast.followOnCider": "Seguir en Cider", + "podcast.followedOnCider": "Siguiendo en Cider", + "podcast.subscribeOnItunes": "Suscribirse en iTunes", + "podcast.subscribedOnItunes": "Suscrito en iTunes", + "podcast.itunesStore": "Tienda de iTunes", + "podcast.episodes": "Episodios", + "podcast.playEpisode": "Iniciar Episodio", + "podcast.website": "Pagina del podcast", + + // Actions + "action.addToLibrary": "Añadir a la biblioteca", + "action.addToLibrary.success": "Añadido a la biblioteca", + "action.addToLibrary.error": "Error al añadir a la biblioteca", + "action.removeFromLibrary": "Eliminar de la biblioteca", + "action.removeFromLibrary.success": "Eliminado de la biblioteca", + "action.addToQueue": "Añadir a la cola", + "action.addToQueue.success": "Añadido a la cola", + "action.addToQueue.error": "Error al añadirlo a la cola", + "action.removeFromQueue": "Elimiar de la cola", + "action.removeFromQueue.success": "Eliminado de la cola", + "action.removeFromQueue.error": "Error al eliminarlo de la cola", + "action.createPlaylist": "Crear nueva playlist", + "action.addToPlaylist": "Añadir a la playlist", + "action.removeFromPlaylist": "Eliminar de la playlist", + "action.addToFavorites": "Añadir a favoritos", + "action.follow": "Seguir", + "action.follow.success": "Siguiendo", + "action.follow.error": "Error al seguir", + "action.unfollow": "Dejar de seguir", + "action.unfollow.success": "Has dejado de seguirle", + "action.unfollow.error": "Error al dejar de seguir", + "action.playNext": "Reproducir a continuación", + "action.playLater": "Reproducir al final", + "action.startRadio": "Crear emisora", + "action.goToArtist": "Ir al artista", + "action.goToAlbum": "Mostrar álbum", + "action.moveToTop": "Mover a arriba", + "action.share": "Compartir", + "action.rename": "Renombrar", + "action.love": "Me gusta", + "action.unlove": "Eliminar me gusta", + "action.dislike": "Sugerir menos este estilo", + "action.undoDislike": "Sugerir este estilo", + "action.showWebRemoteQR": "Conexión remota", + "action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} siguiente canción", + "action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} como última canción", + "action.removeTracks": "Eliminar ${self.selectedItems.length} canciones de la cola", + "action.import": "Importar", + "action.export": "Exportar", + "action.showAlbum": "Mostrar álbum completo", + "action.tray.minimize": "Mover a la bandeja", + "action.tray.quit": "Salir", + "action.tray.show": "Abrir", + "action.update": "Actualizar", + + // Settings - General + "settings.header.general": "General", + "settings.header.general.description": "Ajustes generales de Cider.", + "settings.option.general.language": "Idioma", + + // Language optgroups + "settings.option.general.language.main": "Idiomas", + "settings.option.general.language.fun": "Idiomas divertidos", + "settings.option.general.language.unsorted": "Sin clasificar", - // i18n Info - "i18n.languageName": "Español (ES)", // name of language in native language - "i18n.languageNameEnglish": "Spanish (Spain)", // name of language in English - "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@j.fl220", // Authors, if you contribute to this file feel free to add your name seperated with a space + // Update Cider + "settings.option.general.updateCider": "Actualizar Cider", // Button - // App info - "app.name": "Cider", + // Settings - Audio + "settings.header.audio": "Audio", + "settings.header.audio.description": "Ajustes del audio de Cider.", + "settings.option.audio.quality": "Calidad de audio", // Dropdown + "settings.header.audio.quality.high": "Alto", + "settings.header.audio.quality.low": "Bajo", + "settings.header.audio.quality.auto": "Auto", + "settings.option.audio.seamlessTransition": "Transición de audio perfecta", // Toggle + "settings.option.audio.enableAdvancedFunctionality": "Activar funciones avanzadas", // Toggle + "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como Normalización de audio, Ecualizadores y Visualizadores; sin embargo, en algunos sistemas esto puede causar interrupciones en las canciones.", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizar volumen", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza los picos altos de canciones para hacer la experiencia de escucha mejor.", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Espacialización del audio", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Espacializa más el audio y conviértelo más 3-dimensional (nota: Esto no es Dolby Atmos)", - "date.format": "${d} ${m}, ${y}", - - // Dialogs - "dialog.cancel": "Cancelar", - "dialog.ok": "Aceptar", + // Settings - Visual + "settings.header.visual": "Visual", + "settings.header.visual.description": "Ajustes visuales para Cider.", + "settings.option.visual.windowBackgroundStyle": "Estilo del fondo de la ventana", // Toggle + "settings.header.visual.windowBackgroundStyle.none": "Nada", + "settings.header.visual.windowBackgroundStyle.artwork": "Carátula", + "settings.header.visual.windowBackgroundStyle.image": "Imagen", + "settings.option.visual.animatedArtwork": "Carátula animada", // Dropdown + "settings.header.visual.animatedArtwork.always": "Habilitar siempre", + "settings.header.visual.animatedArtwork.limited": "Limitado a algunas páginas", + "settings.header.visual.animatedArtwork.disable": "Deshabilitar en todas partes", + "settings.option.visual.animatedArtworkQuality": "Calidad de la carátula animada", // Dropdown + "settings.header.visual.animatedArtworkQuality.low": "Bajo", + "settings.header.visual.animatedArtworkQuality.medium": "Medio", + "settings.header.visual.animatedArtworkQuality.high": "Alto", + "settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto", + "settings.header.visual.animatedArtworkQuality.extreme": "Extrema", + "settings.option.visual.animatedWindowBackground": "Fondo de la ventana animado", // Toggle + "settings.option.visual.hardwareAcceleration": "Aceleración del hardware", // Dropdown + "settings.option.visual.hardwareAcceleration.description": "La app requiere reinicio", + "settings.header.visual.hardwareAcceleration.default": "Por defecto", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + // Refer to term.disabled for the disabled option + "settings.option.visual.showPersonalInfo": "Mostrar información personal", // Toggle - // Notification - "notification.updatingLibrarySongs": "Actualizando canciones de la biblioteca...", - "notification.updatingLibraryAlbums": "Actualizando álbumes de la biblioteca...", - "notification.updatingLibraryArtists": "Actualizando biblioteca de artistas...", - // Terms - "term.appleInc": "Apple Inc.", - "term.appleMusic": "Apple Music", - "term.applePodcasts": "Apple Podcasts", - "term.itunes": "iTunes", - "term.github": "GitHub", - "term.discord": "Discord", - "term.learnMore": "Leer más", - "term.accountSettings": "Ajustes de la cuenta", - "term.logout": "Cerrar sesión", - "term.login": "Iniciar sesión", - "term.about": "Más información", - "term.privateSession": "Sesión privada", - "term.queue": "En cola", - "term.search": "Buscar", - "term.library": "Biblioteca", - "term.listenNow": "Escuchar", - "term.browse": "Explorar", - "term.radio": "Radio", - "term.recentlyAdded": "Añadido recientemente", - "term.songs": "Canciones", - "term.albums": "Álbumes", - "term.artists": "Artistas", - "term.podcasts": "Podcasts", - "term.playlists": "Playlists", - "term.playlist": "Playlist", - "term.newPlaylist": "Nueva playlist", - "term.newPlaylistFolder": "Nueva carpeta de playlists", - "term.createNewPlaylist": "Crear nueva playlists", - "term.createNewPlaylistFolder": "Crear nueva carpeta de playlists", - "term.deletePlaylist": "¿Está seguro que desea eliminar esta playlist?", - "term.play": "Reproducir", - "term.pause": "Pausar", - "term.previous": "Anterior", - "term.next": "Siguiente", - "term.shuffle": "Aleatorio", - "term.repeat": "Repetir", - "term.volume": "Volumen", - "term.mute": "Silenciar", - "term.unmute": "Desilenciar", - "term.share": "Compartir", - "term.settings": "Ajustes", - "term.seeAll": "Ver todo", - "term.sortBy": "Ordenar por", - "term.sortBy.album": "Álbum", - "term.sortBy.artist": "Artista", - "term.sortBy.name": "Nombre", - "term.sortBy.genre": "Género", - "term.sortBy.releaseDate": "Fecha de lanzamiento", - "term.sortBy.duration": "Duración", - "term.sortOrder": "A-Z", - "term.sortOrder.ascending": "Ascendiente", - "term.sortOrder.descending": "Descendiente", - "term.viewAs": "Ver como", - "term.viewAs.coverArt": "Carátula", - "term.viewAs.list": "Lista", - "term.size": "Tamaño", - "term.size.normal": "Normal", - "term.size.compact": "Compacto", - "term.enable": "Habilitar", - "term.disable": "Deshabilitar", - "term.enabled": "Activado", - "term.disabled": "Desactivado", - "term.connect": "Conectar", - "term.connecting": "Conectando", - "term.disconnect": "Desconectado", - "term.authed": "Autentificado", - "term.confirm": "¿Confirmar?", - "term.more": "Más", - "term.less": "Menos", - "term.showMore": "Mostrar más", - "term.showLess": "Mostrar menos", - "term.topSongs" : "Top canciones", - "term.latestReleases": "Últimos lanzamientos", - "term.time.added": "Añadido", - "term.time.released": "Lanzado", - "term.time.updated": "Actualizado", - "term.time.hours": "horas", - "term.time.hour": "hora", - "term.time.minutes": "minutos", - "term.time.minute": "minuto", - "term.time.seconds": "segundos", - "term.time.second": "segundo", - "term.fullscreenView": "Pantalla completa", - "term.defaultView": "Vista por defecto", - "term.audioSettings": "Ajustes de audio", - "term.clearAll": "Borrar todo", - "term.recentStations": "Radios recientes", - "term.language": "Idioma", - "term.funLanguages": "Divertido", - "term.noLyrics": "Cargando... / Letra no encontrada./ Instrumental.", - "term.copyright": "Copyright", - "term.rightsReserved": "Todos los derechos reservados.", - "term.sponsor": "Apoya este proyecto", - "term.ciderTeam": "Equipo Cider", - "term.developer": "Desarrollador", - "term.socialTeam": "Equipo RRSS", - "term.socials": "Redes sociales", - "term.contributors": "Contribuidores", - "term.equalizer": "Equalizador", - "term.reset": "Resetear", - "term.tracks": "canciones", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "Vídeos", - "term.menu": "Menú", - "term.check": "Comprobar", - "term.aboutArtist": "Más sobre {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "Actualizar Cider", - - // Home - "home.title": "Inicio", - "home.recentlyPlayed": "Reproducciones recientes", - "home.recentlyAdded": "Añadido recientemente", - "home.artistsFeed": "Historial de tus artistas", - "home.artistsFeed.noArtist": "Sigue primero a algunos artistas y sus últimos lanzamientos aparecerán aquí", - "home.madeForYou": "Hecho para ti", - "home.friendsListeningTo": "Tus amigos están escuchando", - "home.followedArtists": "Artistas que sigues", - // Errors - "error.appleMusicSubRequired": "Apple Music necesita una suscripción.", - "error.connectionError": "Ha habido un problema al conectar con Apple Music.", - "error.noResults": "Sin resultados", - "error.noResults.description": "Intenta otra búsqueda.", + // Settings - Lyrics + "settings.header.lyrics": "Letras", + "settings.header.lyrics.description": "Ajuste las letras para Cider", + "settings.option.lyrics.enableMusixmatch": "Habilitar las letras de Musixmatch", // Toggle + "settings.option.lyrics.enableMusixmatchKaraoke": "Habilita el modo Karaoke (solo con Musixmatch)", // Toggle + "settings.option.lyrics.musixmatchPreferredLanguage": "Idioma de traducción por defecto en Musixmatch", // Dropdown + "settings.option.lyrics.enableYoutubeLyrics": "Habilitar las letras de Youtube para los videos con música", // Toggle - //Podcasts - "podcast.followOnCider": "Seguir en Cider", - "podcast.followedOnCider": "Siguiendo en Cider", - "podcast.subscribeOnItunes": "Suscribirse en iTunes", - "podcast.subscribedOnItunes": "Suscrito en iTunes", - "podcast.itunesStore": "Tienda de iTunes", - "podcast.episodes": "Episodios", - "podcast.playEpisode": "Iniciar Episodio", - "podcast.website": "Pagina del podcast", + // Settings - Connectivity + "settings.header.connectivity": "Conectividad", + "settings.header.connectivity.description": "Ajusta la conectividad para Cider.", + "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown + "settings.option.connectivity.playbackNotifications": "Notificaciones de reproducción", // Toggle + // Refer to term.disabled for the disabled option + "settings.header.connectivity.discordRPC.cider": "Mostrar como 'Cider'", + "settings.header.connectivity.discordRPC.appleMusic": "Mostrar como 'Apple Music'", + "settings.option.connectivity.discordRPC.clearOnPause": "Quitar Discord Rich Presence en pausa", // Toggle + "settings.option.connectivity.lastfmScrobble": "Scrobbling Last.fm", // Option to Connect + "settings.option.connectivity.lastfmScrobble.delay": "Delay del Scrobbling en Last.fm (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Habilitar 'Escuchando ahora' en Last.fm", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Eliminar artistas destacados del título de la canción (Last.fm)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar pista en bucle (Last.fm)", + // Refer to term.connect for the connect button - // Actions - "action.addToLibrary": "Añadir a la biblioteca", - "action.addToLibrary.success": "Añadido a la biblioteca", - "action.addToLibrary.error": "Error al añadir a la biblioteca", - "action.removeFromLibrary": "Eliminar de la biblioteca", - "action.removeFromLibrary.success": "Eliminado de la biblioteca", - "action.addToQueue": "Añadir a la cola", - "action.addToQueue.success": "Añadido a la cola", - "action.addToQueue.error": "Error al añadirlo a la cola", - "action.removeFromQueue": "Elimiar de la cola", - "action.removeFromQueue.success": "Eliminado de la cola", - "action.removeFromQueue.error": "Error al eliminarlo de la cola", - "action.createPlaylist": "Crear nueva playlist", - "action.addToPlaylist": "Añadir a la playlist", - "action.removeFromPlaylist": "Eliminar de la playlist", - "action.addToFavorites": "Añadir a favoritos", - "action.follow": "Seguir", - "action.follow.success": "Siguiendo", - "action.follow.error": "Error al seguir", - "action.unfollow": "Dejar de seguir", - "action.unfollow.success": "Has dejado de seguirle", - "action.unfollow.error": "Error al dejar de seguir", - "action.playNext": "Reproducir a continuación", - "action.playLater": "Reproducir al final", - "action.startRadio": "Crear emisora", - "action.goToArtist": "Ir al artista", - "action.goToAlbum": "Mostrar álbum", - "action.moveToTop": "Mover a arriba", - "action.share": "Compartir", - "action.rename": "Renombrar", - "action.love": "Me gusta", - "action.unlove": "Eliminar me gusta", - "action.dislike": "Sugerir menos este estilo", - "action.undoDislike": "Sugerir este estilo", - "action.showWebRemoteQR": "Conexión remota", - "action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} siguiente canción", - "action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} como última canción", - "action.removeTracks": "Eliminar ${self.selectedItems.length} canciones de la cola", - "action.import": "Importar", - "action.export": "Exportar", - "action.showAlbum": "Mostrar álbum completo", - "action.tray.minimize": "Mover a la bandeja", - "action.tray.quit": "Salir", - "action.tray.show": "Abrir", - "action.update": "Actualizar", + // Settings - Experimental + "settings.header.experimental": "En pruebas", + "settings.header.experimental.description": "Ajustes en pruebas para Cider.", + "settings.option.experimental.compactUI": "Interfaz de usuario compacto", // Toggle + "settings.option.experimental.close_button_hide": "El botón de cerrar minimizará la aplicación en la bandeja", - // Settings - General - "settings.header.general": "General", - "settings.header.general.description": "Ajustes generales de Cider.", - "settings.option.general.language": "Idioma", + // Refer to term.disabled & term.enabled + // Spatialization Menu + "spatial.notTurnedOn": "La espacialización del audio esta desactivada. Para usarlo primero actívelo.", + "spatial.spatialProperties": "Propiedades espaciales", + "spatial.width": "Ancho", + "spatial.height": "Altura", + "spatial.depth": "Profundidad", + "spatial.gain": "Ganancia", + "spatial.roomMaterials": "Material de la habitación", + "spatial.roomDimensions": "Dimensión de la habitación", + "spatial.roomPositions": "Posiciones de la habitación", + "spatial.setDimensions": "Establecer dimensiones", + "spatial.setPositions": "Establecer posiciones", + "spatial.up": "Arriba", + "spatial.front": "Delante", + "spatial.left": "Izquierda", + "spatial.right": "Derecha", + "spatial.back": "Atrás", + "spatial.down": "Abajo", + "spatial.listener": "Oyente", + "spatial.audioSource": "Salida del audio", - // Language optgroups - "settings.option.general.language.main": "Idiomas", - "settings.option.general.language.fun": "Idiomas divertidos", - "settings.option.general.language.unsorted": "Sin clasificar", - - // Settings - Audio - "settings.header.audio": "Audio", - "settings.header.audio.description": "Ajustes del audio de Cider.", - "settings.option.audio.quality": "Calidad de audio", // Dropdown - "settings.header.audio.quality.high": "Alto", - "settings.header.audio.quality.low": "Bajo", - "settings.header.audio.quality.auto": "Auto", - "settings.option.audio.seamlessTransition": "Transición de audio perfecta", // Toggle - "settings.option.audio.enableAdvancedFunctionality": "Activar funciones avanzadas", // Toggle - "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como Normalización de audio, Ecualizadores y Visualizadores; sin embargo, en algunos sistemas esto puede causar interrupciones en las canciones.", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizar volumen", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza los picos altos de canciones para hacer la experiencia de escucha mejor.", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Espacialización del audio", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Espacializa más el audio y conviértelo más 3-dimensional (nota: Esto no es Dolby Atmos)", - // Settings - Visual - "settings.header.visual": "Visual", - "settings.header.visual.description": "Ajustes visuales para Cider.", - "settings.option.visual.windowBackgroundStyle": "Estilo del fondo de la ventana", // Toggle - "settings.header.visual.windowBackgroundStyle.none": "Nada", - "settings.header.visual.windowBackgroundStyle.artwork": "Carátula", - "settings.header.visual.windowBackgroundStyle.image": "Imagen", - "settings.option.visual.animatedArtwork": "Carátula animada", // Dropdown - "settings.header.visual.animatedArtwork.always": "Habilitar siempre", - "settings.header.visual.animatedArtwork.limited": "Limitado a algunas páginas", - "settings.header.visual.animatedArtwork.disable": "Deshabilitar en todas partes", - "settings.option.visual.animatedArtworkQuality": "Calidad de la carátula animada", // Dropdown - "settings.header.visual.animatedArtworkQuality.low": "Bajo", - "settings.header.visual.animatedArtworkQuality.medium": "Medio", - "settings.header.visual.animatedArtworkQuality.high": "Alto", - "settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto", - "settings.header.visual.animatedArtworkQuality.extreme": "Extrema", - "settings.option.visual.animatedWindowBackground": "Fondo de la ventana animado", // Toggle - "settings.option.visual.hardwareAcceleration": "Aceleración del hardware", // Dropdown - "settings.option.visual.hardwareAcceleration.description": "La app requiere reinicio", - "settings.header.visual.hardwareAcceleration.default": "Por defecto", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", - // Refer to term.disabled for the disabled option - "settings.option.visual.showPersonalInfo": "Mostrar información personal", // Toggle + // Settings - Unfinished + "settings.header.unfinished": "Sin acabar", + "settings.header.unfinished.description": "Ajustes siendo testeados, no están acabados.", - // Settings - Lyrics - "settings.header.lyrics": "Letras", - "settings.header.lyrics.description": "Ajuste las letras para Cider", - "settings.option.lyrics.enableMusixmatch": "Habilitar las letras de Musixmatch", // Toggle - "settings.option.lyrics.enableMusixmatchKaraoke": "Habilita el modo Karaoke (solo con Musixmatch)", // Toggle - "settings.option.lyrics.musixmatchPreferredLanguage": "Idioma de traducción por defecto en Musixmatch", // Dropdown - "settings.option.lyrics.enableYoutubeLyrics": "Habilitar las letras de Youtube para los videos con música", // Toggle + // Web Remote + "remote.web.title": "Cider Remoto", + "remote.web.description": "Escanee el código QR para emparejar su teléfono con su cliente de Cider", - // Settings - Connectivity - "settings.header.connectivity": "Conectividad", - "settings.header.connectivity.description": "Ajusta la conectividad para Cider.", - "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown - "settings.option.connectivity.playbackNotifications": "Notificaciones de reproducción", // Toggle - // Refer to term.disabled for the disabled option - "settings.header.connectivity.discordRPC.cider": "Mostrar como 'Cider'", - "settings.header.connectivity.discordRPC.appleMusic": "Mostrar como 'Apple Music'", - "settings.option.connectivity.discordRPC.clearOnPause": "Quitar Discord Rich Presence en pausa", // Toggle - "settings.option.connectivity.lastfmScrobble": "Scrobbling Last.fm", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "Delay del Scrobbling en Last.fm (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "Habilitar 'Escuchando ahora' en Last.fm", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Eliminar artistas destacados del título de la canción (Last.fm)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar pista en bucle (Last.fm)", - // Refer to term.connect for the connect button - - // Settings - Experimental - "settings.header.experimental": "En pruebas", - "settings.header.experimental.description": "Ajustes en pruebas para Cider.", - "settings.option.experimental.compactUI": "Interfaz de usuario compacto", // Toggle - "settings.option.experimental.close_button_hide": "El botón de cerrar minimizará la aplicación en la bandeja", - // Refer to term.disabled & term.enabled - - // Spatialization Menu - "spatial.notTurnedOn": "La espacialización del audio esta desactivada. Para usarlo primero actívelo.", - "spatial.spatialProperties": "Propiedades espaciales", - "spatial.width": "Ancho", - "spatial.height": "Altura", - "spatial.depth": "Profundidad", - "spatial.gain": "Ganancia", - "spatial.roomMaterials": "Material de la habitación", - "spatial.roomDimensions": "Dimensión de la habitación", - "spatial.roomPositions": "Posiciones de la habitación", - "spatial.setDimensions": "Establecer dimensiones", - "spatial.setPositions": "Establecer posiciones", - "spatial.up": "Arriba", - "spatial.front": "Delante", - "spatial.left": "Izquierda", - "spatial.right": "Derecha", - "spatial.back": "Atrás", - "spatial.down": "Abajo", - "spatial.listener": "Oyente", - "spatial.audioSource": "Salida del audio", - - // Settings - Unfinished - "settings.header.unfinished": "Sin acabar", - "settings.header.unfinished.description": "Ajustes siendo testeados, no están acabados.", - - // Web Remote - "remote.web.title": "Cider Remoto", - "remote.web.description": "Escanee el código QR para emparejar su teléfono con su cliente de Cider", - - // About - "about.thanks": "Muchísimas gracias al equipo de Cider Collective y también a todos nuestros contribuidores." - } + // About + "about.thanks": "Muchísimas gracias al equipo de Cider Collective y también a todos nuestros contribuidores." +} \ No newline at end of file diff --git a/src/i18n/fr_FR.jsonc b/src/i18n/fr_FR.jsonc index ad8b26cb..cf05144b 100644 --- a/src/i18n/fr_FR.jsonc +++ b/src/i18n/fr_FR.jsonc @@ -1,24 +1,24 @@ { // Base File - // i18n Info - "i18n.languageName": "Français", // name of language in native language + "i18n.languageName": "Français", // name of language in native language "i18n.languageNameEnglish": "French", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@ErwanGit", // Authors, if you contribute to this file feel free to add your name seperated with a space - + // App info "app.name": "Cider", - + "date.format": "${d} ${m} ${y}", // Dialogs "dialog.cancel": "Annuler", "dialog.ok": "OK", - + // Notification "notification.updatingLibrarySongs": "Mise à jour des chansons de la bibliothèque...", "notification.updatingLibraryAlbums": "Mise à jour des albums de la bibliothèque...", "notification.updatingLibraryArtists": "Mise à jour des artistes de la bibliothèque...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -93,10 +93,10 @@ "term.less": "Moins", "term.showMore": "Afficher plus", "term.showLess": "Afficher moins", - "term.topSongs" : "Meilleurs titres", + "term.topSongs": "Meilleurs titres", "term.latestReleases": "Dernières sorties", "term.time.added": "Ajouté", - "term.time.released": "Publié", + "term.time.released": "Publié", "term.time.updated": "Mis à jour", "term.time.hours": "heures", "term.time.hour": "heure", @@ -123,12 +123,11 @@ "term.equalizer": "Égaliseur", "term.reset": "Réinitialiser", "term.tracks": "musiques", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "Vidéos", + "term.videos": "Vidéos", "term.menu": "Menu", "term.check": "Vérifier", "term.aboutArtist": "À propos de {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "Mettre à jour Cider", - "term.topResult": "Meilleurs résultats", // Search Results + "term.topResult": "Meilleurs résultats", // Search Results "term.sharedPlaylists": "Playlists partagées", // Search Results "term.people": "Personnes", // Search Results "term.newpreset.name": "Nouveau nom du préréglage de l'égaliseur", // Equalizer Preset @@ -143,7 +142,7 @@ "term.recordLabels": "Labels de disques", "term.videoExtras": "Vidéos bonus", "term.top": "Top", - + // Home "home.title": "Accueil", "home.recentlyPlayed": "Joué récemment", @@ -153,13 +152,14 @@ "home.madeForYou": "Fait pour vous", "home.friendsListeningTo": "Vos amis écoutent", "home.followedArtists": "Artistes suivis", + // Errors "error.appleMusicSubRequired": "Apple Music nécessite un abonnement.", "error.connectionError": "Il y a eu un problème de connexion à Apple Music.", "error.noResults": "Aucun résultat.", "error.noResults.description": "Essayez une nouvelle recherche.", - - //Podcasts + + // Podcasts "podcast.followOnCider": "Suivre sur Cider", "podcast.followedOnCider": "Suivi sur Cider", "podcast.subscribeOnItunes": "Suivre sur iTunes", @@ -168,7 +168,7 @@ "podcast.episodes": "Épisodes", "podcast.playEpisode": "Lire l'épisode", "podcast.website": "Site du podcast", - + // Actions "action.addToLibrary": "Ajouter à la bibliothèque", "action.addToLibrary.success": "Ajouté à la bibliothèque", @@ -215,18 +215,21 @@ "action.tray.show": "Afficher", "action.update": "Mettre à jour", "action.copy": "Copier", - "action.newpreset": "Nouveau préréglage...", // Equalizer Preset + "action.newpreset": "Nouveau préréglage...", // Equalizer Preset "action.deletepreset": "Supprimer le préréglage", - + // Settings - General "settings.header.general": "Général", "settings.header.general.description": "Ajuster les paramètres généraux de Cider.", "settings.option.general.language": "Langue", - + // Language optgroups "settings.option.general.language.main": "Langues", "settings.option.general.language.fun": "Langues amusantes", "settings.option.general.language.unsorted": "Non trié", + + // Update Cider + "settings.option.general.updateCider": "Mettre à jour Cider", // Button // Settings - Audio "settings.header.audio": "Audio", @@ -249,8 +252,9 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour créer une expérience d'écoute plus uniforme.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spatialisation audio", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialiser l'audio et rendre l'audio plus tridimensionnel (note: Ce n'est pas Dolby Atmos)", + // Settings - Visual - "settings.header.visual": "Visuel", + "settings.header.visual": "Visuel", "settings.header.visual.description": "Ajuster les paramètres visuels de Cider.", "settings.option.visual.windowBackgroundStyle": "Style d'arrière-plan de la fenêtre", // Toggle "settings.header.visual.windowBackgroundStyle.none": "Aucun", @@ -269,17 +273,16 @@ "settings.option.visual.animatedWindowBackground": "Arrière-plan de fenêtre animé", // Toggle "settings.option.visual.hardwareAcceleration": "Accélération matérielle", // Dropdown "settings.option.visual.hardwareAcceleration.description": "Nécessite un relancement", - "settings.header.visual.hardwareAcceleration.default": "Défaut", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.hardwareAcceleration.default": "Défaut", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "Thème", - + // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "Sombre", - // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Afficher vos informations personnelles", // Toggle - + // Settings - Lyrics "settings.header.lyrics": "Paroles", "settings.header.lyrics.description": "Ajuster les paramètres des paroles pour Cider.", @@ -287,7 +290,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "Activer le mode karaoké (Musixmatch seulement)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Langue préférée pour les traductions Musixmatch", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "Activer les paroles YouTube pour les vidéos de musique", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "Connectivité", "settings.header.connectivity.description": "Ajuster les paramètres de connectivité de Cider.", @@ -298,12 +301,12 @@ "settings.header.connectivity.discordRPC.appleMusic": "Afficher comme 'Apple Music'", "settings.option.connectivity.discordRPC.clearOnPause": "Désactiver le Discord Rich Presence quand la musique est en pause", // Toggle "settings.option.connectivity.lastfmScrobble": "Scrobble LastFM", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "Délai de Scrobble LastFM (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer la lecture en cours sur LastFM", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer les titres en boucle (LastFM)", + "settings.option.connectivity.lastfmScrobble.delay": "Délai de Scrobble LastFM (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer la lecture en cours sur LastFM", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer les titres en boucle (LastFM)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "Expérimental", "settings.header.experimental.description": "Ajuster les paramètres expérimentaux de Cider.", @@ -311,8 +314,8 @@ "settings.option.experimental.close_button_hide": "Le bouton de fermeture doit masquer l'application", "settings.option.experimental.copy_log": "Copier les logs dans le presse-papier", "settings.option.experimental.inline_playlists": "Playlists et albums en ligne", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.notTurnedOn": "La spatialisation audio est désactivée. Pour l'utiliser, vous devez d'abord l'activer.", "spatial.spatialProperties": "Propriétés spatiales", @@ -336,12 +339,11 @@ // Settings - Unfinished "settings.header.unfinished": "Inachevée", - + // Web Remote "remote.web.title": "Cider à distance", "remote.web.description": "Scanner le QR code pour associer votre téléphone avec cette instance Cider", - + // About "about.thanks": "Un grand merci à l'équipe de la Cider Collective et à tous nos contributeurs." -} - \ No newline at end of file +} \ No newline at end of file diff --git a/src/i18n/hu_HU.jsonc b/src/i18n/hu_HU.jsonc index 65bd88fa..7f2e65ff 100644 --- a/src/i18n/hu_HU.jsonc +++ b/src/i18n/hu_HU.jsonc @@ -1,22 +1,24 @@ { // Base File // i18n Info - "i18n.languageName": "Magyar", // name of language in native language + "i18n.languageName": "Magyar", // name of language in native language "i18n.languageNameEnglish": "Hungarian", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@Greenoliv @Amaru @BenjaminStonawski", // Authors, if you contribute to this file feel free to add your name seperated with a space + // App info "app.name": "Cider", - + "date.format": "${m} ${d}, ${y}", - + // Dialogs "dialog.cancel": "Mégsem", "dialog.ok": "OK", - + // Notification "notification.updatingLibrarySongs": "Zenekönyvtár frissítése...", "notification.updatingLibraryAlbums": "Albumok frissítése...", "notification.updatingLibraryArtists": "Előadók frissítése...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -90,10 +92,10 @@ "term.less": "Kevesebb", "term.showMore": "Mutass többet", "term.showLess": "Mutass kevesebbet", - "term.topSongs" : "A legjobb dalok", + "term.topSongs": "A legjobb dalok", "term.latestReleases": "Új megjelenések", "term.time.added": "Hozzáadva", - "term.time.released": "Kiadva", + "term.time.released": "Kiadva", "term.time.updated": "Frissítve", "term.time.hours": "óra", "term.time.hour": "óra", @@ -120,11 +122,10 @@ "term.equalizer": "Hangszínszabályozó", "term.reset": "Visszaállítás", "term.tracks": "zeneszám", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "Videók", + "term.videos": "Videók", "term.menu": "Menü", "term.check": "Ellenőrzés", "term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "A Cider frissítése", "term.topResult": "Legjobb találatok", // Search Results "term.sharedPlaylists": "Megosztott lejátszási listák", // Search Results "term.people": "Profilok", // Search Results @@ -140,6 +141,7 @@ "term.recordLabels": "Record Labels", "term.videoExtras": "Videóextrák", "term.top": "Top", + // Home "home.title": "Kezdőlap", "home.recentlyPlayed": "Nemrég játszott", @@ -149,12 +151,14 @@ "home.madeForYou": "Személyre szabva", "home.friendsListeningTo": "A barátaid épp ezt hallgatják", "home.followedArtists": "Követett előadók", + // Errors "error.appleMusicSubRequired": "Apple Music előfizetés szükséges.", "error.connectionError": "Hiba történt az Apple Musichoz való csatlakozás közben.", "error.noResults": "Nincs találat", "error.noResults.description": "Próbálkozzon új kereséssel", - //Podcasts + + // Podcasts "podcast.followOnCider": "Követés a Cideren", "podcast.followedOnCider": "Követve a Cideren", "podcast.subscribeOnItunes": "Feliratkozás az iTunesban", @@ -163,6 +167,7 @@ "podcast.episodes": "Epizódok", "podcast.playEpisode": "Epizód lejátszása", "podcast.website": "Podcast weboldala", + // Actions "action.addToLibrary": "Hozzáadás a Könyvtárhoz", "action.addToLibrary.success": "Hozzáadva a Könyvtárhoz", @@ -211,14 +216,20 @@ "action.copy": "Másolás", "action.newpreset": "Új Preset...", // Equalizer Preset "action.deletepreset": "Preset törlése", + // Settings - General "settings.header.general": "Általános", "settings.header.general.description": "A Cider általános beállításainak módosítása.", "settings.option.general.language": "Nyelv", + // Language optgroups "settings.option.general.language.main": "Nyelvek", "settings.option.general.language.fun": "Fantázianyelvek", "settings.option.general.language.unsorted": "Azonosítatlan", + + // Update Cider + "settings.option.general.updateCider": "A Cider frissítése", // Button + // Settings - Audio "settings.header.audio": "Hang", "settings.header.audio.description": "A Cider hangbeállításainak módosítása.", @@ -235,7 +246,7 @@ "settings.option.audio.enableAdvancedFunctionality": "Haladó funkcionalitás engedélyezése", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "Az AudioContext funkció engedélyezése lehetővé teszi a fejlettebb hangfunkciókat, például a Normalizásást, az Equalizereket és a Visualizer funkciókat, azonban egyes számítógépeken ez akadozást okozhat a hangsávokban.", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle - "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Pszichoakusztikus Módosítások amik minden hangot felerősítenek és ütősebbé tesznek | Készítette Maikiwi", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Pszichoakusztikus Módosítások amik minden hangot felerősítenek és ütősebbé tesznek | Készítette Maikiwi", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Erősség", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Megváltoztatja a hangra végzett feldolgozás erősségét. (Az Agresszív mód nemkívánatos eredményeket hozhat!)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Szokásos", @@ -244,8 +255,9 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizálja az egyes zeneszámok hangosabb részeit, hogy egységesebb hallgatási élményt hozzon létre.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Térbeli hang", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Térbeli hang és a hang háromdimenziósabbá tétele (Ez nem összekeverendő a Dolby Atmos-szal!)", + // Settings - Visual - "settings.header.visual": "Vizuális", + "settings.header.visual": "Vizuális", "settings.header.visual.description": "A Cider vizuális beállításainak módosítása.", "settings.option.visual.windowBackgroundStyle": "Ablak háttér stílusa", // Toggle "settings.header.visual.windowBackgroundStyle.none": "Sehol", @@ -264,14 +276,16 @@ "settings.option.visual.animatedWindowBackground": "Animált ablakháttér", // Toggle "settings.option.visual.hardwareAcceleration": "Hardveres gyorsítás", // Dropdown "settings.option.visual.hardwareAcceleration.description": "Újraindítás szükséges", - "settings.header.visual.hardwareAcceleration.default": "Alap", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.hardwareAcceleration.default": "Alap", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "Téma", + // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "Sötét", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Személyes adatok mutatása", // Toggle + // Settings - Lyrics "settings.header.lyrics": "Dalszöveg", "settings.header.lyrics.description": "A Cider dalszöveg beállításainak módosítása.", @@ -279,6 +293,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "Karaoke mód bekapcsolása (Csak MusixMatch)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "MusixMatch fordítás nyelve", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "YouTube dalszövegek engedélyezése a zenei videóknál", // Toggle + // Settings - Connectivity "settings.header.connectivity": "Csatlakozások", "settings.header.connectivity.description": "A Cider csatlakozás beállításainak módosítása.", @@ -289,11 +304,12 @@ "settings.header.connectivity.discordRPC.appleMusic": "Megjelenítés 'Apple Music'-ként", "settings.option.connectivity.discordRPC.clearOnPause": "Discord Rich Presence törlése megállításnál", // Toggle "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Késleltetés (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "LastFM Now Playing engedélyezése", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "Loopolt zeneszám szűrése (LastFM)", + "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Késleltetés (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "LastFM Now Playing engedélyezése", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Loopolt zeneszám szűrése (LastFM)", // Refer to term.connect for the connect button + // Settings - Experimental "settings.header.experimental": "Kísérleti", "settings.header.experimental.description": "A Cider kísérleti beállításainak módosítása.", @@ -301,8 +317,8 @@ "settings.option.experimental.close_button_hide": "A bezárás gomb rejtse el az alkalmazást", "settings.option.experimental.copy_log": "Napló másolása a vágólapra", "settings.option.experimental.inline_playlists": "Inline Playlists and Albums", - // Refer to term.disabled & term.enabled + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.notTurnedOn": "A térbeli hangzás ki van kapcsolva, használatához kapcsolja be.", "spatial.spatialProperties": "Térbeli hang", @@ -323,11 +339,14 @@ "spatial.down": "Lent", "spatial.listener": "Hallgató", "spatial.audioSource": "Hangforrás", + // Settings - Unfinished "settings.header.unfinished": "Befejezetlen", + // Web Remote "remote.web.title": "Cider Remote", "remote.web.description": "Olvasd be ezt a QR-kódot a telefonoddal, hogy tudd vezérelni a lejátszót.", + // About "about.thanks": "Köszönet a Cider Collective csapatának és minden hozzájárulónak." -} +} \ No newline at end of file diff --git a/src/i18n/ja_JP.jsonc b/src/i18n/ja_JP.jsonc index 8b95e83d..7b31f748 100644 --- a/src/i18n/ja_JP.jsonc +++ b/src/i18n/ja_JP.jsonc @@ -1,24 +1,24 @@ { - // App info - "app.name": "Cider", - - "date.format": "${y}年${m}月${d}日", - - // i18n Info - "i18n.languageName": "日本語", // name of language in native language + // i18n Info + "i18n.languageName": "日本語", // name of language in native language "i18n.languageNameEnglish": "Japanese", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space + // App info + "app.name": "Cider", + + "date.format": "${y}年${m}月${d}日", + // Dialogs "dialog.cancel": "キャンセル", "dialog.ok": "OK", - + // Notification "notification.updatingLibrarySongs": "ライブラリの更新中...", "notification.updatingLibraryAlbums": "ライブラリの更新中...", "notification.updatingLibraryArtists": "ライブラリの更新中...", - + // Terms "term.appleMusic": "Apple Music", // Follows brand term "term.applePodcasts": "Apple Podcasts", // Follows brand term @@ -85,10 +85,10 @@ "term.less": "減らす", "term.showMore": "もっと見る", "term.showLess": "表示数を少なくする", - "term.topSongs" : "トップソング", + "term.topSongs": "トップソング", "term.latestReleases": "ニューリリース", "term.time.added": "追加日", - "term.time.released": "配信開始日", + "term.time.released": "配信開始日", "term.time.updated": "最終更新日", "term.time.hours": "時間", "term.time.hour": "時間", @@ -114,12 +114,11 @@ "term.equalizer": "イコライザー", "term.reset": "リセット", "term.tracks": "曲", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "ビデオ", + "term.videos": "ビデオ", "term.menu": "メニュー", "term.check": "確認", "term.aboutArtist": "{{artistName}}について", // e.g. 'About Doja Cat' - "term.updateCider": "Cider 更新", - + // Home "home.title": "ホーム", "home.recentlyPlayed": "最近の再生", @@ -129,6 +128,7 @@ "home.madeForYou": "あなたにおすすめ", "home.friendsListeningTo": "友達が聴いている", "home.followedArtists": "フォローしているアーティスト", + // Errors "error.appleMusicSubRequired": "Apple Musicのサブスクリプションが必要です。", "error.connectionError": "Apple Musicに接続できません。", @@ -144,7 +144,7 @@ "podcast.episodes": "番組", "podcast.playEpisode": "再生", "podcast.website": "Podcast ウェブ", - + // Actions "action.addToLibrary": "ライブラリに追加", "action.addToLibrary.success": "ライブラリに追加されました", @@ -190,9 +190,9 @@ "action.tray.show": "表示", "action.update": "アップデート", "action.copy": "コピー", - "action.newpreset": "ニュープリセット", // Equalizer Preset - "action.deletepreset": "プリセットを削除", // Equalizer Preset - + "action.newpreset": "ニュープリセット", // Equalizer Preset + "action.deletepreset": "プリセットを削除", // Equalizer Preset + // Settings - Audio "settings.header.audio": "オーディオ", "settings.header.audio.description": "Ciderのオーディオ設定", @@ -218,6 +218,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "さまざまな曲の音量を均一にし、より整った音を楽しめるようにする機能です。", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "オーディオ空間化", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "オーディオを空間に分散させる機能です。 (ドルビーアトモスではありません)", + // Settings - Visual "settings.header.visual": "ビジュアル", "settings.header.visual.description": "Ciderのビジュアル設定", @@ -237,10 +238,11 @@ "settings.option.visual.animatedWindowBackground": "アプリウィンドウの背景をアニメーション化", // Toggle "settings.option.visual.hardwareAcceleration": "ハードウェア アクセラレーション", // Dropdown "settings.option.visual.hardwareAcceleration.description": "アプリを再起動する必要があります", - "settings.header.visual.hardwareAcceleration.default": "既定", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.hardwareAcceleration.default": "既定", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "プロフィールを表示", // Toggle + // Settings - General (Reserved) "settings.header.general": "一般", "settings.header.general.description": "Ciderの一般設定", @@ -252,7 +254,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "カラオケモードを有効にする (Musixmatchのみ)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "歌詞の優先言語", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "YouTubeの歌詞をミュージックビデオに使用する", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "アプリと連携", "settings.header.connectivity.description": "Ciderの連携設定", @@ -262,46 +264,48 @@ "settings.header.connectivity.discordRPC.appleMusic": "'Apple Music' を表示する", "settings.option.connectivity.discordRPC.clearOnPause": "一時停止時にDiscord Rich Presenceをクリアする", // Toggle "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable LastFM Now Playing", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)", + "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable LastFM Now Playing", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)", // Refer to term.connect for the connect button + // Settings - General - Update Cider + "settings.option.general.updateCider": "Cider 更新", // Button + // Settings - Experimental "settings.header.experimental": "試験的な機能", "settings.header.experimental.description": "開発中の実験的な機能は不完全で不安定である可能性があります", "settings.option.experimental.compactUI": "コンパクトインターフェース", // Toggle "settings.option.experimental.close_button_hide": "「閉じる」ボタンでアプリを隠します", // Dropdown - // Refer to term.disabled & term.enabled + // Refer to term.disabled & term.enabled // Spatialization Menu - "spatial.spatialProperties" : "空間化のプロパティ", - "spatial.width" : "幅", - "spatial.height" : "高さ", - "spatial.depth" : "奥行", - "spatial.gain" : "ゲイン", - "spatial.roomMaterials" : "部屋のマテリアル", - "spatial.roomDimensions" : "部屋の大きさ", - "spatial.roomPositions" : "部屋の位置", - "spatial.setDimensions" : "大きさを設定", - "spatial.setPositions" : "位置を設定", - "spatial.up" : "上", - "spatial.front" : "前", - "spatial.left" : "左", - "spatial.right" : "右", - "spatial.back" : "後", - "spatial.down" : "下", - "spatial.listener" : "リスナー", - "spatial.audioSource" : "音源", - + "spatial.spatialProperties": "空間化のプロパティ", + "spatial.width": "幅", + "spatial.height": "高さ", + "spatial.depth": "奥行", + "spatial.gain": "ゲイン", + "spatial.roomMaterials": "部屋のマテリアル", + "spatial.roomDimensions": "部屋の大きさ", + "spatial.roomPositions": "部屋の位置", + "spatial.setDimensions": "大きさを設定", + "spatial.setPositions": "位置を設定", + "spatial.up": "上", + "spatial.front": "前", + "spatial.left": "左", + "spatial.right": "右", + "spatial.back": "後", + "spatial.down": "下", + "spatial.listener": "リスナー", + "spatial.audioSource": "音源", + // Settings - Unfinished "settings.header.unfinished": "未完成", - + // Web Remote "remote.web.title": "Cider リモート", "remote.web.description": "QRコードを使用して、Ciderとスマートフォンをペアリングする", - + //About "about.thanks": "Cider Collective とご協力いただいた貢献者様に感謝申し上げます。" - -} +} \ No newline at end of file diff --git a/src/i18n/ko_KR.jsonc b/src/i18n/ko_KR.jsonc index 38bf5327..b821d188 100644 --- a/src/i18n/ko_KR.jsonc +++ b/src/i18n/ko_KR.jsonc @@ -1,14 +1,13 @@ { // Base File - // i18n Info "i18n.languageName": "한국어 (KR)", // name of language in native language "i18n.languageNameEnglish": "Korean (KR)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@Hazealign", // Authors, if you contribute to this file feel free to add your name seperated with a space - + // App info "app.name": "Cider", - + "date.format": "${y}. ${m}. ${d}", // Dialogs @@ -19,6 +18,7 @@ "notification.updatingLibrarySongs": "라이브러리의 노래를 업데이트하는 중입니다...", "notification.updatingLibraryAlbums": "라이브러리의 앨범을 업데이트하는 중입니다...", "notification.updatingLibraryArtists": "라이브러리의 아티스트를 업데이트하는 중입니다...", + // Terms "term.appleInc": "Apple Inc.", // Follows brand term "term.appleMusic": "Apple Music", // Follows brand term @@ -127,7 +127,6 @@ "term.menu": "메뉴", "term.check": "확인", "term.aboutArtist": "{{artistName}}에 대하여", // e.g. 'About Doja Cat' - "term.updateCider": "Cider 업데이트", "term.topResult": "Top Result", // Search Results "term.sharedPlaylists": "공유 플레이리스트", // Search Results "term.people": "프로필", // Search Results @@ -143,7 +142,7 @@ "term.recordLabels": "레코드 레이블", "term.videoExtras": "추가 비디오", "term.top": "Top", - + // Home "home.title": "홈", "home.recentlyPlayed": "최근 재생한 항목", @@ -153,13 +152,14 @@ "home.madeForYou": "나만을 위한 추천", "home.friendsListeningTo": "친구가 듣는 음악", "home.followedArtists": "팔로우한 아티스트", + // Errors "error.appleMusicSubRequired": "Apple Music은 구독을 필요로 합니다.", "error.connectionError": "Apple Music에 연결하지 못했습니다.", "error.noResults": "결과 없음", "error.noResults.description": "다시 시도해주세요.", - - //Podcasts + + // Podcasts "podcast.followOnCider": "Cider에서 팔로우하기", "podcast.followedOnCider": "팔로우 중", "podcast.subscribeOnItunes": "iTunes에서 구독", @@ -168,7 +168,7 @@ "podcast.episodes": "방송", "podcast.playEpisode": "재생", "podcast.website": "팟캐스트 사이트", - + // Actions "action.addToLibrary": "보관함에 추가", "action.addToLibrary.success": "보관함에 추가됨", @@ -217,17 +217,20 @@ "action.copy": "복사", "action.newpreset": "새 프리셋", // Equalizer Preset "action.deletepreset": "프리셋 삭제", - + // Settings - General "settings.header.general": "일반", "settings.header.general.description": "Cider의 일반 기능을 설정합니다.", "settings.option.general.language": "언어", - + // Language optgroups "settings.option.general.language.main": "언어", "settings.option.general.language.fun": "재미를 위한 언어", "settings.option.general.language.unsorted": "미분류", + // Update Cider + "settings.option.general.updateCider": "Cider 업데이트", // Button + // Settings - Audio "settings.header.audio": "오디오", "settings.header.audio.description": "Cider의 오디오 기능을 설정합니다.", @@ -242,6 +245,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "개별 트랙의 최대 볼륨을 정규화하여 보다 균일한 청취 경험을 제공합니다.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "오디오 공간화", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "오디오를 공간화하고 더욱 3차원적으로 만들어줍니다. (참고: 이 기능은 Dolby Atmos가 아닙니다.)", + // Settings - Visual "settings.header.visual": "시각", "settings.header.visual.description": "Cider의 시각 기능을 설정합니다.", @@ -265,14 +269,13 @@ "settings.header.visual.hardwareAcceleration.default": "기본", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "테마", - + // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "다크", - // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "개인 정보 보기", // Toggle - + // Settings - Lyrics "settings.header.lyrics": "가사", "settings.header.lyrics.description": "Cider의 가사 기능을 설정합니다.", @@ -280,7 +283,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "노래방 모드 활성화 (Musixmatch만 가능)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 번역 선호 언어", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "뮤직 비디오에 대한 유튜브 자막 활성화", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "연동", "settings.header.connectivity.description": "Cider의 연동 기능을 설정합니다.", @@ -296,16 +299,16 @@ "settings.option.connectivity.lastfmScrobble.removeFeatured": "곡 제목에서 피쳐링 아티스트를 제외하기 (Last.fm)", "settings.option.connectivity.lastfmScrobble.filterLoop": "루프 트랙을 필터하기 (Last.fm)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "실험실", "settings.header.experimental.description": "Cider의 실험적 기능을 설정합니다.", "settings.option.experimental.compactUI": "컴팩트 UI", // Toggle "settings.option.experimental.close_button_hide": "닫기 버튼이 애플리케이션을 가릴 것입니다", "settings.option.experimental.copy_log": "로그를 클립보드에 복사하기", - "settings.option.experimental.inline_playlists": "인라인 플레이리스트 및 앨범", + "settings.option.experimental.inline_playlists": "인라인 플레이리스트 및 앨범", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.notTurnedOn": "오디오 공간화가 비활성화되어있습니다. 사용하기 전에 먼저 활성화해주세요.", "spatial.spatialProperties": "공간 설정", @@ -326,14 +329,14 @@ "spatial.down": "아래", "spatial.listener": "사용자", "spatial.audioSource": "오디오 소스", - + // Settings - Unfinished "settings.header.unfinished": "미완성", - + // Web Remote "remote.web.title": "Cider 리모트", "remote.web.description": "QR 코드를 스캔해서 Cider와 스마트폰을 연결하기", - + // About "about.thanks": "Cider Collective Team과 모든 기여자들에게 감사합니다." -} +} \ No newline at end of file diff --git a/src/i18n/sv_SE.jsonc b/src/i18n/sv_SE.jsonc index 22953aee..abdd2d29 100644 --- a/src/i18n/sv_SE.jsonc +++ b/src/i18n/sv_SE.jsonc @@ -1,24 +1,24 @@ { // Base File - // i18n Info - "i18n.languageName": "Svenska (SE)", // name of language in native language + "i18n.languageName": "Svenska (SE)", // name of language in native language "i18n.languageNameEnglish": "Swedish (SE)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@thisismemeboi", // Authors, if you contribute to this file feel free to add your name seperated with a space - + // App info "app.name": "Cider", - + "date.format": "${d} ${m}, ${y}", // Dialogs "dialog.cancel": "Avbryt", "dialog.ok": "OK", - + // Notification "notification.updatingLibrarySongs": "Uppdaterar låtar i biblioteket...", "notification.updatingLibraryAlbums": "Uppdaterar album i biblioteket...", "notification.updatingLibraryArtists": "Uppdaterar artister i biblioteket...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -91,10 +91,10 @@ "term.less": "Mindre", "term.showMore": "Visa mer", "term.showLess": "Visa mindre", - "term.topSongs" : "Topplåtar", + "term.topSongs": "Topplåtar", "term.latestReleases": "Senaste releaserna", "term.time.added": "Tillagd", - "term.time.released": "Tillagd den", + "term.time.released": "Tillagd den", "term.time.updated": "Uppdaterad", "term.time.hours": "timmar", "term.time.hour": "timme", @@ -121,12 +121,11 @@ "term.equalizer": "EQ", "term.reset": "Återställ", "term.tracks": "låtar", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "Videor", + "term.videos": "Videor", "term.menu": "Meny", "term.check": "Sök efter uppdateringar", "term.aboutArtist": "Om {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "Uppdatera Cider", - + // Home "home.title": "Hem", "home.recentlyPlayed": "Senast spelade", @@ -136,13 +135,14 @@ "home.madeForYou": "Skapat för dig", "home.friendsListeningTo": "Vänner lyssnar på", "home.followedArtists": "Följda artister", + // Errors "error.appleMusicSubRequired": "Apple Music kräver en prenumeration.", "error.connectionError": "Ojdå. Det gick inte att ansluta till Apple Music.", "error.noResults": "Inga träffar.", "error.noResults.description": "Prova en ny sökning.", - - //Podcasts + + // Podcasts "podcast.followOnCider": "Följ på Cider", "podcast.followedOnCider": "Följer på Cider", "podcast.subscribeOnItunes": "Följ på iTunes", @@ -151,7 +151,7 @@ "podcast.episodes": "Avsnitt", "podcast.playEpisode": "Spela avsnitt", "podcast.website": "Öppna webbsida", - + // Actions "action.addToLibrary": "Lägg till i bibliotek", "action.addToLibrary.success": "Tillagd i biblioteket", @@ -197,16 +197,19 @@ "action.tray.quit": "Avsluta", "action.tray.show": "Visa Cider", "action.update": "Uppdatera", - + // Settings - General "settings.header.general": "Allmänt", "settings.header.general.description": "Ändra Ciders allmänna inställningar.", "settings.option.general.language": "Språk", - + // Language optgroups "settings.option.general.language.main": "Språk", "settings.option.general.language.fun": "Roliga språk", "settings.option.general.language.unsorted": "Osorterade", + + // Update Cider + "settings.option.general.updateCider": "Uppdatera Cider", // Button // Settings - Audio "settings.header.audio": "Ljud", @@ -222,8 +225,9 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliserar höga ljudnivåer för att förbättra ljudkvaliteten.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spiralljud", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Gör ljudet mer 3D (Ej Dolby Atmos)", + // Settings - Visual - "settings.header.visual": "Visuellt", + "settings.header.visual": "Visuellt", "settings.header.visual.description": "Ändra Ciders visuella inställningar.", "settings.option.visual.windowBackgroundStyle": "Stil för bakgrunden", // Toggle "settings.header.visual.windowBackgroundStyle.none": "Ingen", @@ -242,11 +246,11 @@ "settings.option.visual.animatedWindowBackground": "Animerad fönsterbakgrund", // Toggle "settings.option.visual.hardwareAcceleration": "Hårdvaruacceleration", // Dropdown "settings.option.visual.hardwareAcceleration.description": "kräver omstart", - "settings.header.visual.hardwareAcceleration.default": "Standard", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.hardwareAcceleration.default": "Standard", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Visa personlig information", // Toggle - + // Settings - Lyrics "settings.header.lyrics": "Låttext", "settings.header.lyrics.description": "Ändra Ciders låttextsinställningar.", @@ -254,7 +258,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "Aktivera karaokeläge (Endast Musixmatch)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Språk för låttextsöversättning (Endast Musixmatch)", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "Använd YouTube Lyrcis för videor", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "Anslutning", "settings.header.connectivity.description": "Ändra Ciders anslutningsinställningar.", @@ -265,19 +269,19 @@ "settings.header.connectivity.discordRPC.appleMusic": "På, visa som 'Apple Music'", "settings.option.connectivity.discordRPC.clearOnPause": "Rensa Discord notiser från Cider när du pausar", // Toggle "settings.option.connectivity.lastfmScrobble": "Last.fm integration", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "Last.fm fördröjning i %", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "Visa vad som spelas nu i Last.fm", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Visa inte extraartister i Last.fm", - "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrera bort loopade låtar i Last.fm", + "settings.option.connectivity.lastfmScrobble.delay": "Last.fm fördröjning i %", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Visa vad som spelas nu i Last.fm", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Visa inte extraartister i Last.fm", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrera bort loopade låtar i Last.fm", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "Experimentellt", "settings.header.experimental.description": "Ändra Ciders experimentella inställningar.", "settings.option.experimental.compactUI": "Kompakt gränssnitt", // Toggle "settings.option.experimental.close_button_hide": "Stängknappen gömmer Cider istället", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.notTurnedOn": "Spiralljud är av. Akrtivera det först.", "spatial.spatialProperties": "Spiralljudsintällningar", @@ -301,11 +305,11 @@ // Settings - Unfinished "settings.header.unfinished": "Ej tillgängligt", - + // Web Remote "remote.web.title": "Cider fjärrkontroll", "remote.web.description": "Skanna QR koden för att ansluta din telefon till Cider.", - + // About "about.thanks": "Stort tack till Ciders Collective Team och alla som har bidragit!" -} +} \ No newline at end of file diff --git a/src/i18n/zh_CN.jsonc b/src/i18n/zh_CN.jsonc index 2c163650..8844e83b 100644 --- a/src/i18n/zh_CN.jsonc +++ b/src/i18n/zh_CN.jsonc @@ -1,24 +1,24 @@ -{ +{ + // i18n Info + "i18n.languageName": "简体中文(中国)", // name of language in native language + "i18n.languageNameEnglish": "Simp. Chinese (China)", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space + // App info "app.name": "Cider", "date.format": "${y}年${m}月${d}日", - // i18n Info - "i18n.languageName": "简体中文(中国)", // name of language in native language - "i18n.languageNameEnglish": "Simp. Chinese (China)", // name of language in English - "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space - // Dialogs "dialog.cancel": "取消", "dialog.ok": "确定", - + // Notification "notification.updatingLibrarySongs": "正在更新资料库的歌曲信息...", "notification.updatingLibraryAlbums": "正在更新资料库的专辑信息...", "notification.updatingLibraryArtists": "正在更新资料库的艺人信息...", - + // Terms "term.appleMusic": "Apple Music", // Follows brand term "term.applePodcasts": "Apple Podcasts", // Follows brand term @@ -85,10 +85,10 @@ "term.less": "较少", "term.showMore": "显示更多", "term.showLess": "显示更少", - "term.topSongs" : "热门歌曲", + "term.topSongs": "热门歌曲", "term.latestReleases": "最新发行", "term.time.added": "添加于", - "term.time.released": "发行于", + "term.time.released": "发行于", "term.time.updated": "更新于", "term.time.hours": "小时", "term.time.hour": "小时", @@ -114,12 +114,11 @@ "term.equalizer": "均衡器", "term.reset": "重置", "term.tracks": "首歌曲", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "视频", + "term.videos": "视频", "term.menu": "菜单", "term.check": "检查", "term.aboutArtist": "关于{{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "更新 Cider", - + // Home "home.title": "主页", "home.recentlyPlayed": "最近播放", @@ -129,14 +128,14 @@ "home.madeForYou": "专属推荐", "home.friendsListeningTo": "朋友正在听", "home.followedArtists": "关注的艺人", - + // Errors "error.appleMusicSubRequired": "需要订阅 Apple Music 以使用 Cider", "error.connectionError": "无法连接到 Apple Music。", "error.noResults": "没有结果", "error.noResults.description": "尝试更改搜索条件。", - //Podcasts + // Podcasts "podcast.followOnCider": "在 Cider 中追踪", "podcast.followedOnCider": "已追踪", "podcast.subscribeOnItunes": "在 iTunes 上订阅", @@ -145,8 +144,7 @@ "podcast.episodes": "单集", "podcast.playEpisode": "播放单集", "podcast.website": "Podcast 网站", - - + // Actions "action.addToLibrary": "加入资料库", "action.addToLibrary.success": "成功加入资料库", @@ -192,7 +190,6 @@ "action.tray.show": "显示", "action.update": "更新", - // Settings - Audio "settings.header.audio": "音频", "settings.header.audio.description": "调整 Cider 的音频设置", @@ -214,6 +211,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "使所感知到的音频响度统一", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "音频空间化", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "使所感知到的音频更有立体感 (注: 这不是杜比全景声)", + // Settings - Visual "settings.header.visual": "外观", "settings.header.visual.description": "调整 Cider 的外观", @@ -233,13 +231,17 @@ "settings.option.visual.animatedWindowBackground": "动态窗口背景", // Toggle "settings.option.visual.hardwareAcceleration": "硬件加速", // Dropdown "settings.option.visual.hardwareAcceleration.description": "需要重启 Cider 才会生效", - "settings.header.visual.hardwareAcceleration.default": "默认", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.hardwareAcceleration.default": "默认", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "显示个人资料", // Toggle + // Settings - General (Reserved) "settings.header.general": "通用", "settings.header.general.description": "调整 Cider 的通用设置", + + // Settings - General - Update Cider + "settings.option.general.updateCider": "更新 Cider", // Button // Settings - Lyrics "settings.header.lyrics": "歌词", @@ -248,7 +250,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "启用卡拉 OK 模式(仅 Musixmatch)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌词语言偏好", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "播放 MV 时使用 YouTube 歌词", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "外部连接", "settings.header.connectivity.description": "调整Cider与外部应用的交互设置", @@ -258,45 +260,45 @@ "settings.header.connectivity.discordRPC.appleMusic": "显示正在玩 'Apple Music'", "settings.option.connectivity.discordRPC.clearOnPause": "暂停时清除Discord 动态", // Toggle "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 记录", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延迟 (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "启用 LastFM 正在播放", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "从歌名里去除艺人推荐 (LastFM)", + "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延迟 (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "启用 LastFM 正在播放", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "从歌名里去除艺人推荐 (LastFM)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "实验性功能", "settings.header.experimental.description": "调整Cider的实验性功能", "settings.option.experimental.compactUI": "紧凑型 UI", // Toggle "settings.option.experimental.close_button_hide": "点击关闭按钮时仅隐藏窗口", - // Refer to term.disabled & term.enabled + // Refer to term.disabled & term.enabled // Spatialization Menu - "spatial.spatialProperties" : "空间属性", - "spatial.width" : "宽度", - "spatial.height" : "高度", - "spatial.depth" : "深度", + "spatial.spatialProperties": "空间属性", + "spatial.width": "宽度", + "spatial.height": "高度", + "spatial.depth": "深度", "spatial.gain": "增益", - "spatial.roomMaterials" : "空间材质", - "spatial.roomDimensions" : "空间尺寸", - "spatial.roomPositions" : "空间位置", - "spatial.setDimensions" : "设置尺寸", - "spatial.setPositions" : "设置位置", - "spatial.up" : "上", - "spatial.front" : "前", - "spatial.left" : "左", - "spatial.right" : "右", - "spatial.back" : "后", - "spatial.down" : "下", - "spatial.listener" : "您", - "spatial.audioSource" : "音源", - + "spatial.roomMaterials": "空间材质", + "spatial.roomDimensions": "空间尺寸", + "spatial.roomPositions": "空间位置", + "spatial.setDimensions": "设置尺寸", + "spatial.setPositions": "设置位置", + "spatial.up": "上", + "spatial.front": "前", + "spatial.left": "左", + "spatial.right": "右", + "spatial.back": "后", + "spatial.down": "下", + "spatial.listener": "您", + "spatial.audioSource": "音源", + // Settings - Unfinished "settings.header.unfinished": "未完成", - + // Web Remote "remote.web.title": "Cider 远程控制", "remote.web.description": "扫描以下的二维码以控制 Cider", - + //About "about.thanks": "郑重感谢 Cider Collective 以及为这个项目提供支持的贡献者。" -} +} \ No newline at end of file diff --git a/src/i18n/zh_HK.jsonc b/src/i18n/zh_HK.jsonc index 39a735b8..b0618dae 100644 --- a/src/i18n/zh_HK.jsonc +++ b/src/i18n/zh_HK.jsonc @@ -1,24 +1,24 @@ { - // i18n Info - "i18n.languageName": "繁體中文(香港)", // name of language in native language + "i18n.languageName": "繁體中文(香港)", // name of language in native language "i18n.languageNameEnglish": "Trad. Chinese (Hong Kong)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@kyw504100 @maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space - + // App info "app.name": "Cider", - - "date.format": "${y}年${m}月${d}日", - + + "date.format": "${y}年${m}月${d}日", + // Dialogs "dialog.cancel": "取消", "dialog.ok": "確認", - + // Notification "notification.updatingLibrarySongs": "正在更新資料庫的歌曲...", "notification.updatingLibraryAlbums": "正在更新資料庫的專輯...", "notification.updatingLibraryArtists": "正在更新資料庫的藝人...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", // Follows brand term @@ -93,10 +93,10 @@ "term.less": "較少", "term.showMore": "顯示更多", "term.showLess": "顯示較少", - "term.topSongs" : "熱門歌曲", + "term.topSongs": "熱門歌曲", "term.latestReleases": "最新發行", "term.time.added": "加入於", - "term.time.released": "發行於", + "term.time.released": "發行於", "term.time.updated": "更新於", "term.time.hours": "小時", "term.time.hour": "小時", @@ -123,12 +123,11 @@ "term.equalizer": "均衡器", "term.reset": "重設", "term.tracks": "首歌曲", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "影片", - "term.menu": "選項", + "term.videos": "影片", + "term.menu": "選項", "term.check": "檢查", "term.aboutArtist": "關於 {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "更新 Cider", - "term.topResult": "熱門搜尋結果", // Search Results + "term.topResult": "熱門搜尋結果", // Search Results "term.sharedPlaylists": "播放列表", // Search Results "term.people": "個人檔案", // Search Results "term.newpreset.name": "新均衡器範本名稱", // Equalizer Preset @@ -137,13 +136,13 @@ "term.deletedpreset": "已刪除", "term.musicVideos": "MV", // Search page friendlyTypes "term.stations": "電台", - //"term.curators": "Curators", - //"term.appleCurators": "Apple Curators", + //"term.curators": "Curators", + //"term.appleCurators": "Apple Curators", "term.radioShows": "廣播單集", "term.recordLabels": "唱片公司", "term.videoExtras": "影片特輯", - //"term.top": "Top", - + //"term.top": "Top", + // Home "home.title": "主頁", "home.recentlyPlayed": "最近播放", @@ -153,13 +152,14 @@ "home.madeForYou": "為您推薦", "home.friendsListeningTo": "朋友正在聆聽", "home.followedArtists": "追蹤的藝人", + // Errors "error.appleMusicSubRequired": "需要訂閱Apple Music以使用Cider", "error.connectionError": "無法連接到 Apple Music。", "error.noResults": "沒有結果", "error.noResults.description": "請嘗試新的搜尋內容。", - - //Podcasts + + // Podcasts "podcast.followOnCider": "在Cider上追蹤", "podcast.followedOnCider": "已在Cider上追蹤", "podcast.subscribeOnItunes": "在iTunes上訂閱", @@ -168,7 +168,7 @@ "podcast.episodes": "單集", "podcast.playEpisode": "播放單集", "podcast.website": "Podcast 網頁", - + // Actions "action.addToLibrary": "加入資料庫", "action.addToLibrary.success": "成功加入資料庫", @@ -215,7 +215,7 @@ "action.tray.show": "顯示", "action.update": "更新", "action.copy": "複製", - "action.newpreset": "新增範本", //Equallizer preset + "action.newpreset": "新增範本", //Equallizer preset "action.deletepreset": "刪除範本", // Settings - General @@ -227,6 +227,9 @@ "settings.option.general.language.main": "語言", "settings.option.general.language.fun": "惡搞語言", "settings.option.general.language.unsorted": "未分類", + + // Update Cider + "settings.option.general.updateCider": "更新 Cider", // Button // Settings - Audio "settings.header.audio": "音訊", @@ -248,6 +251,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "將平衡輕柔和響亮的歌曲,建立更統一的聆聽體驗。", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "空間音訊", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "將音訊進行空間化處理來製造一個更立體的聆聽體驗(注:此功能不是官方的杜比全景聲)", + // Settings - Visual "settings.header.visual": "外觀", "settings.header.visual.description": "調整Cider的外觀", @@ -268,14 +272,13 @@ "settings.option.visual.animatedWindowBackground": "動態窗口背景", // Toggle "settings.option.visual.hardwareAcceleration": "硬體加速", // Dropdown "settings.option.visual.hardwareAcceleration.description": "需要重啓 Cider 才能生效", - "settings.header.visual.hardwareAcceleration.default": "預設", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.hardwareAcceleration.default": "預設", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "主題", - + // Settings - Visual - Theme name "settings.option.visual.theme.default": "預設", "settings.option.visual.theme.dark": "午夜暗", - // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle @@ -286,7 +289,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "啟用卡拉OK模式(僅限Musixmatch)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌詞語言偏好", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "播放 MV 時使用 YouTube 歌詞", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "外部連結", "settings.header.connectivity.description": "調整Cider與外部的連結", @@ -300,46 +303,46 @@ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble 延遲 (%)", "settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 Last.fm 正在播放", "settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (Last.fm)", - //"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)", + //"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "實驗性功能", "settings.header.experimental.description": "調整Cider的實驗性功能", "settings.option.experimental.compactUI": "緊凑型 UI", // Toggle "settings.option.experimental.close_button_hide": "以關閉按鈕來隱藏 Cider", "settings.option.experimental.copy_log": "複製運行記錄檔至剪貼簿", - //"settings.option.experimental.inline_playlists": "Inline Playlists and Albums", - // Refer to term.disabled & term.enabled + //"settings.option.experimental.inline_playlists": "Inline Playlists and Albums", + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.notTurnedOn": "請先在設定中啟用空間音訊。", - "spatial.spatialProperties" : "空間音訊屬性", - "spatial.width" : "闊度", - "spatial.height" : "高度", - "spatial.depth" : "深度", - "spatial.gain" : "增益", - "spatial.roomMaterials" : "空間材質", - "spatial.roomDimensions" : "空間大小", - "spatial.roomPositions" : "空間位置", - "spatial.setDimensions" : "大小設定", - "spatial.setPositions" : "位置設定", - "spatial.up" : "上方", - "spatial.front" : "前方", - "spatial.left" : "左方", - "spatial.right" : "右方", - "spatial.back" : "後方", - "spatial.down" : "下方", - "spatial.listener" : "觀眾", - "spatial.audioSource" : "音源", - + "spatial.spatialProperties": "空間音訊屬性", + "spatial.width": "闊度", + "spatial.height": "高度", + "spatial.depth": "深度", + "spatial.gain": "增益", + "spatial.roomMaterials": "空間材質", + "spatial.roomDimensions": "空間大小", + "spatial.roomPositions": "空間位置", + "spatial.setDimensions": "大小設定", + "spatial.setPositions": "位置設定", + "spatial.up": "上方", + "spatial.front": "前方", + "spatial.left": "左方", + "spatial.right": "右方", + "spatial.back": "後方", + "spatial.down": "下方", + "spatial.listener": "觀眾", + "spatial.audioSource": "音源", + // Settings - Unfinished "settings.header.unfinished": "未完成", - + // Web Remote "remote.web.title": "遙距控制 Cider", "remote.web.description": "掃描以下的二維碼以控制 Cider", - - //About + + // About "about.thanks": "感謝 Cider Collective 以及所有貢獻者所作出的貢獻。" } \ No newline at end of file diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index c1e99179..5a7ef4da 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -1,24 +1,24 @@ { - // App info - "app.name": "Cider", - - "date.format": "${y}年${m}月${d}日", - // i18n Info - "i18n.languageName": "繁體中文(台灣)", // name of language in native language + "i18n.languageName": "繁體中文(台灣)", // name of language in native language "i18n.languageNameEnglish": "Trad. Chinese (Taiwan)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@maikirakiwi @jay900604", // Authors, if you contribute to this file feel free to add your name seperated with a space + // App info + "app.name": "Cider", + + "date.format": "${y}年${m}月${d}日", // Dialogs "dialog.cancel": "取消", "dialog.ok": "確定", - + // Notification "notification.updatingLibrarySongs": "正在更新資料庫的歌曲...", "notification.updatingLibraryAlbums": "正在更新資料庫的專輯...", "notification.updatingLibraryArtists": "正在更新資料庫的藝人...", + // Terms "term.appleMusic": "Apple Music", // Follows brand term "term.applePodcasts": "Apple Podcasts", // Follows brand term @@ -86,10 +86,10 @@ "term.less": "更少", "term.showMore": "顯示更多", "term.showLess": "顯示更少", - "term.topSongs" : "熱門歌曲", + "term.topSongs": "熱門歌曲", "term.latestReleases": "最新發行", "term.time.added": "加入於", - "term.time.released": "發行於", + "term.time.released": "發行於", "term.time.updated": "更改於", "term.time.hours": "小時", "term.time.hour": "小時", @@ -116,11 +116,10 @@ "term.equalizer": "等化器", "term.reset": "重設", "term.tracks": "首歌曲", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "影片", + "term.videos": "影片", "term.menu": "選單", "term.check": "檢查", "term.aboutArtist": "關於{{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "更新 Cider", // Home "home.title": "首頁", @@ -131,13 +130,14 @@ "home.madeForYou": "為您推薦", "home.friendsListeningTo": "朋友正在聆聽", "home.followedArtists": "追蹤的藝人", + // Errors "error.appleMusicSubRequired": "需要訂閱 Apple Music 以使用 Cider", "error.connectionError": "無法連接到 Apple Music。", "error.noResults": "沒有結果", "error.noResults.description": "嘗試新的搜尋項目。", - - //Podcasts + + // Podcasts "podcast.followOnCider": "在 Cider 上追蹤", "podcast.followedOnCider": "已追蹤", "podcast.subscribeOnItunes": "在 iTunes 上訂閱", @@ -146,7 +146,7 @@ "podcast.episodes": "單集", "podcast.playEpisode": "播放單集", "podcast.website": "Podcast 網站", - + // Actions "action.addToLibrary": "加入資料庫", "action.addToLibrary.success": "成功加入資料庫", @@ -199,6 +199,9 @@ "settings.option.general.language.main": "語言", "settings.option.general.language.fun": "特殊語言", "settings.option.general.language.unsorted": "未分類", + + // Update Cider + "settings.option.general.updateCider": "更新 Cider", // Button // Settings - Audio "settings.header.audio": "音訊", @@ -225,6 +228,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "將平衡輕柔和響亮的歌曲,建立更統一舒適的聆聽體驗。", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "空間音訊", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "將音訊進行空間化處理來製造一個更立體的聆聽體驗(註:此功能不是官方的杜比全景聲)", + // Settings - Visual "settings.header.visual": "外觀", "settings.header.visual.description": "調整 Cider 的外觀", @@ -245,14 +249,15 @@ "settings.option.visual.animatedWindowBackground": "動態視窗背景", // Toggle "settings.option.visual.hardwareAcceleration": "硬體加速", // Dropdown "settings.option.visual.hardwareAcceleration.description": "需要重新啟動 Cider 才會套用", - "settings.header.visual.hardwareAcceleration.default": "預設", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.hardwareAcceleration.default": "預設", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "主題", // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "暗黑模式", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle + // Settings - General (Reserved) "settings.header.general": "一般", "settings.header.general.description": "調整 Cider 的一般設定", @@ -264,7 +269,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "啟用K歌模式(僅限Musixmatch)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌詞語言偏好", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "播放 MV 時使用 YouTube 歌詞", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "外部連接", "settings.header.connectivity.description": "調整 Cider 與外部的連接", @@ -275,11 +280,11 @@ "settings.header.connectivity.discordRPC.appleMusic": "顯示正在玩 'Apple Music'", "settings.option.connectivity.discordRPC.clearOnPause": "暫停時清除 Discord 動態", // Toggle "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 記錄", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延遲 (%)", + "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延遲 (%)", "settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 LastFM 目前聆聽", // Toggle - "settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (LastFM)", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (LastFM)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "實驗性功能", "settings.header.experimental.description": "調整 Cider 的實驗性功能", @@ -288,8 +293,8 @@ "settings.option.experimental.close_button_hide": "關閉按鈕將 Cider 隱藏至系統列", "settings.option.experimental.copy_log": "複製執行紀錄檔至剪貼簿", "settings.option.experimental.inline_playlists": "將播放列表做為行内元素顯示", - // Refer to term.disabled & term.enabled + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.notTurnedOn": "空間音訊目前是關閉狀態,請先啟用再使用。", "spatial.spatialProperties" : "空間音訊屬性設定", @@ -317,7 +322,7 @@ // Web Remote "remote.web.title": "Cider 遠端操控", "remote.web.description": "掃描以下的行動條碼以操控 Cider", - + //About "about.thanks": "著重感謝 Cider Collective 的成員以及所有為項目付出的貢獻者。" -} +} \ No newline at end of file diff --git a/src/i18n/zh_yue.jsonc b/src/i18n/zh_yue.jsonc index e3692746..6fec3bfb 100644 --- a/src/i18n/zh_yue.jsonc +++ b/src/i18n/zh_yue.jsonc @@ -1,24 +1,24 @@ { - // i18n Info "i18n.languageName": "廣東話(香港)", // name of language in native language "i18n.languageNameEnglish": "Cantonese (Hong Kong)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@tszngaiyip @strikesnc", // Authors, if you contribute to this file feel free to add your name seperated with a space - + // App info "app.name": "Cider", - + "date.format": "${y}年${m}月${d}日", // Dialogs "dialog.cancel": "取消", "dialog.ok": "確認", - + // Notification "notification.updatingLibrarySongs": "更新緊資料庫嘅歌曲...", "notification.updatingLibraryAlbums": "更新緊資料庫嘅專輯...", "notification.updatingLibraryArtists": "更新緊資料庫嘅藝人...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -93,10 +93,10 @@ "term.less": "少啲", "term.showMore": "顯示多啲", "term.showLess": "顯示少啲", - "term.topSongs" : "熱門歌曲", + "term.topSongs": "熱門歌曲", "term.latestReleases": "最新出嘅", "term.time.added": "加入於", - "term.time.released": "發行於", + "term.time.released": "發行於", "term.time.updated": "更新於", "term.time.hours": "粒鐘", "term.time.hour": "粒鐘", @@ -123,12 +123,11 @@ "term.equalizer": "均衡器 (EQ)", "term.reset": "重設", "term.tracks": "首歌", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "影片", - "term.menu": "選項", + "term.videos": "影片", + "term.menu": "選項", "term.check": "檢查", "term.aboutArtist": "關於 {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "更新 Cider", - "term.topResult": "熱門搜尋結果", // Search Results + "term.topResult": "熱門搜尋結果", // Search Results "term.sharedPlaylists": "播放清單", // Search Results "term.people": "個人檔案", // Search Results "term.newpreset.name": "新EQ範本嘅名", // Equalizer Preset @@ -137,12 +136,12 @@ "term.deletedpreset": "刪除咗", "term.musicVideos": "MV", // Search page friendlyTypes "term.stations": "電台", - //"term.curators": "Curators", - //"term.appleCurators": "Apple Curators", + //"term.curators": "Curators", + //"term.appleCurators": "Apple Curators", "term.radioShows": "電台單集", "term.recordLabels": "唱片公司", "term.videoExtras": "相關嘅片", - //"term.top": "Top", + //"term.top": "Top", // Home "home.title": "主頁", @@ -153,13 +152,14 @@ "home.madeForYou": "為你而整", "home.friendsListeningTo": "你啲Friend聽緊", "home.followedArtists": "Follow左嘅藝人", + // Errors "error.appleMusicSubRequired": "需要訂閱Apple Music先可以用Cider。", "error.connectionError": "連接唔到Apple Music。", "error.noResults": "冇結果。", "error.noResults.description": "重新搵過啦。", - - //Podcasts + + // Podcasts "podcast.followOnCider": "喺Cider上Follow", "podcast.followedOnCider": "喺Cider上Follow左", "podcast.subscribeOnItunes": "喺iTunes上訂閱", @@ -168,7 +168,7 @@ "podcast.episodes": "單集", "podcast.playEpisode": "播呢集", "podcast.website": "Podcast 網頁", - + // Actions "action.addToLibrary": "加入資料庫", "action.addToLibrary.success": "加入咗資料庫", @@ -215,18 +215,21 @@ "action.tray.show": "顯示", "action.update": "更新", "action.copy": "複製", - "action.newpreset": "新增範本", // Equalizer Preset + "action.newpreset": "新增範本", // Equalizer Preset "action.deletepreset": "刪除範本", - + // Settings - General "settings.header.general": "一般", "settings.header.general.description": "調整Cider嘅一般設定", "settings.option.general.language": "語言", - + // Language optgroups "settings.option.general.language.main": "語言", "settings.option.general.language.fun": "惡搞語言", "settings.option.general.language.unsorted": "未分類", + + // Update Cider + "settings.option.general.updateCider": "更新 Cider", // Button // Settings - Audio "settings.header.audio": "音訊", @@ -242,8 +245,9 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "平衡輕柔同響亮嘅歌曲,令你有統一嘅聆聽體驗。", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "空間音訊", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "空間化音訊,製造一個更立體嘅聆聽體驗(注意:呢個功能唔係官方嘅杜比全景聲)", + // Settings - Visual - "settings.header.visual": "外觀", + "settings.header.visual": "外觀", "settings.header.visual.description": "調整Cider嘅外觀", "settings.option.visual.windowBackgroundStyle": "視窗背景樣式", // Toggle "settings.header.visual.windowBackgroundStyle.none": "空白", @@ -262,17 +266,16 @@ "settings.option.visual.animatedWindowBackground": "動態視窗背景", // Toggle "settings.option.visual.hardwareAcceleration": "硬體加速", // Dropdown "settings.option.visual.hardwareAcceleration.description": "需要重開Cider先會生效", - "settings.header.visual.hardwareAcceleration.default": "預設", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.hardwareAcceleration.default": "預設", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "主題", - + // Settings - Visual - Theme name "settings.option.visual.theme.default": "預設", "settings.option.visual.theme.dark": "黑色", - // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle - + // Settings - Lyrics "settings.header.lyrics": "歌詞", "settings.header.lyrics.description": "調整Cider嘅歌詞設定", @@ -280,7 +283,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "開啟唱K模式(僅限Musixmatch)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌詞語言偏好", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "播放MV嘅時候用YouTube字幕", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "外部連結", "settings.header.connectivity.description": "調整Cider同外部嘅連結", @@ -291,49 +294,49 @@ "settings.header.connectivity.discordRPC.appleMusic": "顯示為'Apple Music'", "settings.option.connectivity.discordRPC.clearOnPause": "暫停時清除 Discord 狀態", // Toggle "settings.option.connectivity.lastfmScrobble": "Last.FM Scrobbling 記錄", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "Last.FM Scrobble 延遲 (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 Last.FM 正在播放", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (Last.FM)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.FM)", + "settings.option.connectivity.lastfmScrobble.delay": "Last.FM Scrobble 延遲 (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 Last.FM 正在播放", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (Last.FM)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.FM)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "實驗性功能", "settings.header.experimental.description": "調整Cider嘅實驗性功能", "settings.option.experimental.compactUI": "逼啲既 UI", // Toggle "settings.option.experimental.close_button_hide": "㩒交叉制嚟隱藏 Cider", "settings.option.experimental.copy_log": "將log複製喺剪貼簿", - //"settings.option.experimental.inline_playlists": "Inline Playlists and Albums", + //"settings.option.experimental.inline_playlists": "Inline Playlists and Albums", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.notTurnedOn": "唔該喺設定入面啟用左空間音訊先。", - "spatial.spatialProperties" : "空間音訊屬性", - "spatial.width" : "幾闊", - "spatial.height" : "幾高", - "spatial.depth" : "幾深", - "spatial.gain" : "增益", - "spatial.roomMaterials" : "空間材質", - "spatial.roomDimensions" : "空間大小", - "spatial.roomPositions" : "空間位置", - "spatial.setDimensions" : "大小設定", - "spatial.setPositions" : "位置設定", - "spatial.up" : "上面", - "spatial.front" : "前面", - "spatial.left" : "左邊", - "spatial.right" : "右邊", - "spatial.back" : "後面", - "spatial.down" : "下面", - "spatial.listener" : "觀眾", - "spatial.audioSource" : "音源", + "spatial.spatialProperties": "空間音訊屬性", + "spatial.width": "幾闊", + "spatial.height": "幾高", + "spatial.depth": "幾深", + "spatial.gain": "增益", + "spatial.roomMaterials": "空間材質", + "spatial.roomDimensions": "空間大小", + "spatial.roomPositions": "空間位置", + "spatial.setDimensions": "大小設定", + "spatial.setPositions": "位置設定", + "spatial.up": "上面", + "spatial.front": "前面", + "spatial.left": "左邊", + "spatial.right": "右邊", + "spatial.back": "後面", + "spatial.down": "下面", + "spatial.listener": "觀眾", + "spatial.audioSource": "音源", // Settings - Unfinished "settings.header.unfinished": "未搞掂", - + // Web Remote "remote.web.title": "遙距控制 Cider", "remote.web.description": "Scan 呢個 QR Code 去控制 Cider", - + // About "about.thanks": "多謝 Cider Collective 同埋所有合作人作出嘅貢獻。" -} +} \ No newline at end of file diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index 1082f59a..991ccbdf 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -529,18 +529,18 @@ export class BrowserWindow { MusicKit.getInstance().play(); }); `) - }) + }); //QR Code ipcMain.handle('showQR', async (_event, _) => { let url = `http://${BrowserWindow.getIP()}:${this.remotePort}`; shell.openExternal(`https://cider.sh/pair-remote?url=${Buffer.from(encodeURI(url)).toString('base64')}`).catch(console.error); - }) + }); ipcMain.on('get-remote-pair-url', (_event, _) => { let url = `http://${BrowserWindow.getIP()}:${this.remotePort}`; BrowserWindow.win.webContents.send('send-remote-pair-url', url); - }) + }); if (process.platform === "darwin") { app.setUserActivity('com.CiderCollective.remote.pair', { ip: `${BrowserWindow.getIP()}` @@ -557,14 +557,25 @@ export class BrowserWindow { console.log('sc', SoundCheckTag) BrowserWindow.win.webContents.send('SoundCheckTag', SoundCheckTag) }).catch(err => { - console.log(err) - }); + console.log(err) + }); }); ipcMain.on('check-for-update', async (_event) => { + const branch = utils.getStoreValue('general.update_branch') + let latestbranch = await fetch(`https://circleci.com/api/v1.1/project/gh/ciderapp/Cider/latest/artifacts?branch=${branch}&filter=successful`) + if (latestbranch.status != 200) { + console.log(`Error fetching latest artifact from the **${branch}** branch`) + return + } + + let latestbranchjson = await latestbranch.json() + let base_url = latestbranchjson[0].url + base_url = base_url.substr(0, base_url.lastIndexOf('/')) + const options: any = { provider: 'generic', - url: 'https://43-429851205-gh.circle-artifacts.com/0/%7E/Cider/dist/artifacts' //Base URL + url: `${base_url}` } /* * Have to handle the auto updaters seperatly until we can support macOS. electron-builder limitation -q @@ -573,7 +584,7 @@ export class BrowserWindow { const linux_autoUpdater = new AppImageUpdater(options) //Linux await win_autoUpdater.checkForUpdatesAndNotify() await linux_autoUpdater.checkForUpdatesAndNotify() - }) + }); ipcMain.on('share-menu', async (_event, url) => { if (process.platform != 'darwin') return; diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 6aae5ae9..df5edc19 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -11,7 +11,8 @@ export class Store { "discord_rpc": 1, // 0 = disabled, 1 = enabled as Cider, 2 = enabled as Apple Music "discord_rpc_clear_on_pause": true, "language": "en_US", // electron.app.getLocale().replace('-', '_') this can be used in future - "playbackNotifications": true + "playbackNotifications": true, + "update_branch": "main" }, "home": { "followedArtists": [], @@ -58,9 +59,9 @@ export class Store { 'preset': "default", 'frequencies': [32, 63, 125, 250, 500, 1000, 2000, 4000, 8000, 16000], 'gain': [0,0,0,0,0,0,0,0,0,0], - 'Q' : [1,1,1,1,1,1,1,1,1,1], - 'mix' : 1, - 'vibrantBass' : 0, + 'Q': [1,1,1,1,1,1,1,1,1,1], + 'mix': 1, + 'vibrantBass': 0, 'presets': [], 'userGenerated': false }, diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 7e86bfb3..0ed575bc 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -655,7 +655,7 @@
- {{$root.getLz('term.updateCider')}} + {{$root.getLz('settings.option.general.updateCider')}}
+
+
+ {{$root.getLz('settings.option.general.updateCider.branch')}}
+ ({{$root.getLz('settings.option.general.updateCider.branch.description')}}) +
+
+ +
+
{{$root.getLz('settings.option.experimental.copy_log')}} @@ -807,15 +823,17 @@ ciderPPE: function () { if (app.cfg.advanced.ciderPPE) { if (app.cfg.audio.spatial) { - app.cfg.advanced.ciderPPE = false; - notyf.error("CAP is not compatible with Spatialization. Please disable Spatialization to continue.") - } - }}, + app.cfg.advanced.ciderPPE = false; + notyf.error("CAP is not compatible with Spatialization. Please disable Spatialization to continue.") + } + } + }, toggleSpatial: function () { if (app.cfg.audio.spatial) { if (!app.cfg.advanced.ciderPPE) { - CiderAudio.spatialOn()} - else { + CiderAudio.spatialOn() + } + else { CiderAudio.spatialOff() app.cfg.audio.spatial = false; notyf.error("Spatialization is not compatible with CAP. Please disable CAP to continue.") @@ -823,10 +841,11 @@ } else { CiderAudio.spatialOff() } - + }, - changeAudioQuality: function () {1 - app.mk.bitrate = MusicKit.PlaybackBitrate[app.cfg.audio.quality]; + changeAudioQuality: function () { + 1 + app.mk.bitrate = MusicKit.PlaybackBitrate[app.cfg.audio.quality]; }, toggleUserInfo: function () { app.chrome.hideUserInfo = !app.cfg.visual.showuserinfo From 89a8ae3480044918ab2e8cb68683918ee1bdcef7 Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 17:22:26 -0800 Subject: [PATCH 24/54] Update package.json --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 93141b16..49175ab4 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "dist": "yarn build && electron-builder", "dist:all": "yarn build && electron-builder -mwl", "msft": "yarn build && electron-builder -c msft-package.json", - "postinstall": "electron-builder install-app-deps" + "postinstall": "electron-builder install-app-deps", + "circle:append-sha": "node resources/appendCommitToVersion" }, "dependencies": { "@sentry/electron": "^2.5.4", From 7c5688b5e58fa9d393ce5a225ba5d1e1d8834ceb Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 17:23:31 -0800 Subject: [PATCH 25/54] Create appendCommitToVersion.js --- resources/appendCommitToVersion.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 resources/appendCommitToVersion.js diff --git a/resources/appendCommitToVersion.js b/resources/appendCommitToVersion.js new file mode 100644 index 00000000..e3666f5d --- /dev/null +++ b/resources/appendCommitToVersion.js @@ -0,0 +1,23 @@ +if (!process.env['CIRCLECI']) { + console.log(`[CIRCLECI SCRIPT] CircleCI not found... Aborting script`) + return +} + +let fs = require('fs') + +var data = fs.readFileSync('package.json'); +var package = JSON.parse(data); + +//Six chars of commit sha +// https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables +let shortCommitSha = String(process.env['CIRCLE_SHA1']).slice(0,5) + + +package.version = `${package.version}-${shortCommitSha}` + + +fs.writeFile('package.json', newData, err => { + // error checking + if(err) throw err; + console.log("VERSION CHANGED"); +}); From da2d057c02fc0a3fb2b0efd349a28f70b84cc84a Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 17:24:34 -0800 Subject: [PATCH 26/54] Update config.yml --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7f531a89..0427fa0c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -42,6 +42,9 @@ jobs: #command: yarn test - store_test_results: path: test-results + - run: + name: Append Commit SHA to Version + command: yarn circle:append-sha - run: name: Generate Builds (Linux) command: yarn dist -l -p never From d3b8b8a952abbd3ddd0cf2a16377ab6a75035f77 Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:01:27 -0800 Subject: [PATCH 27/54] change to build num cause num nums --- resources/appendCommitToVersion.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/resources/appendCommitToVersion.js b/resources/appendCommitToVersion.js index e3666f5d..20e07934 100644 --- a/resources/appendCommitToVersion.js +++ b/resources/appendCommitToVersion.js @@ -8,12 +8,9 @@ let fs = require('fs') var data = fs.readFileSync('package.json'); var package = JSON.parse(data); -//Six chars of commit sha + // https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables -let shortCommitSha = String(process.env['CIRCLE_SHA1']).slice(0,5) - - -package.version = `${package.version}-${shortCommitSha}` +package.version = `${package.version}.${process.env['CIRCLE_BUILD_NUM']}` fs.writeFile('package.json', newData, err => { From 3d22203f949ae6c32b72b35ee99390f94d08aa81 Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:04:50 -0800 Subject: [PATCH 28/54] unbork bonk --- resources/appendCommitToVersion.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/appendCommitToVersion.js b/resources/appendCommitToVersion.js index 20e07934..3a9c6c13 100644 --- a/resources/appendCommitToVersion.js +++ b/resources/appendCommitToVersion.js @@ -13,7 +13,7 @@ var package = JSON.parse(data); package.version = `${package.version}.${process.env['CIRCLE_BUILD_NUM']}` -fs.writeFile('package.json', newData, err => { +fs.writeFile('package.json', package, err => { // error checking if(err) throw err; console.log("VERSION CHANGED"); From 861d260b951446f4779dd273e744a280b3bf0087 Mon Sep 17 00:00:00 2001 From: booploops <49113086+booploops@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:06:43 -0800 Subject: [PATCH 29/54] added song.link share option, temporarily is its own entry in context menus --- src/renderer/index.js | 30 ++- .../views/components/mediaitem-list-item.ejs | 189 ++++++++++-------- .../views/components/mediaitem-square.ejs | 12 ++ src/renderer/views/components/share-sheet.ejs | 88 ++++++++ 4 files changed, 231 insertions(+), 88 deletions(-) create mode 100644 src/renderer/views/components/share-sheet.ejs diff --git a/src/renderer/index.js b/src/renderer/index.js index b3b6b1bc..5dc7a5d8 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -271,6 +271,25 @@ const app = new Vue({ }, }, methods: { + songLinkShare(amUrl) { + notyf.open({type: "info", message: "Getting song.link share URL..."}) + let self = this + httpRequest = new XMLHttpRequest(); + httpRequest.open('GET', `https://api.song.link/v1-alpha.1/links?url=${amUrl}&userCountry=US`, true); + httpRequest.send(); + httpRequest.onreadystatechange = function () { + if (httpRequest.readyState === 4) { + if (httpRequest.status === 200) { + let response = JSON.parse(httpRequest.responseText); + console.log(response); + self.copyToClipboard(response.pageUrl) + } else { + console.log('There was a problem with the request.'); + notyf.error("There was a problem with the request.") + } + } + } + }, mainMenuVisibility(val) { if (val) { (this.chrome.userinfo.id) ? this.chrome.menuOpened = !this.chrome.menuOpened : false @@ -3364,7 +3383,16 @@ const app = new Vue({ app.copyToClipboard((u.data.data.length && u.data.data.length > 0) ? u.data.data[0].attributes.url : u.data.data.attributes.url) }) } - } + }, + { + "icon": "./assets/feather/share.svg", + "name": `${app.getLz('action.share')} (song.link)`, + "action": function () { + app.mkapi(app.mk.nowPlayingItem.attributes?.playParams?.kind ?? app.mk.nowPlayingItem.type ?? 'songs', false, app.mk.nowPlayingItem._songId ?? app.mk.nowPlayingItem.id ?? '').then(u => { + app.songLinkShare((u.data.data.length && u.data.data.length > 0) ? u.data.data[0].attributes.url : u.data.data.attributes.url) + }) + } + } ] } } diff --git a/src/renderer/views/components/mediaitem-list-item.ejs b/src/renderer/views/components/mediaitem-list-item.ejs index 4d5b49d1..b311bb95 100644 --- a/src/renderer/views/components/mediaitem-list-item.ejs +++ b/src/renderer/views/components/mediaitem-list-item.ejs @@ -90,17 +90,17 @@ } }, props: { - 'item': {type: Object, required: true}, - 'parent': {type: String, required: false}, - 'index': {type: Number, required: false, default: -1}, - 'show-artwork': {type: Boolean, default: true}, - 'show-library-status': {type: Boolean, default: true}, - 'show-meta-data': {type: Boolean, default: false}, - 'show-duration': {type: Boolean, default: true}, - 'showIndex': {type: Boolean, required: false}, - 'showIndexPlaylist': {type: Boolean, required: false}, - 'contextExt': {type: Object, required: false}, - 'class-list': {type: String, required: false, default: ""}, + 'item': { type: Object, required: true }, + 'parent': { type: String, required: false }, + 'index': { type: Number, required: false, default: -1 }, + 'show-artwork': { type: Boolean, default: true }, + 'show-library-status': { type: Boolean, default: true }, + 'show-meta-data': { type: Boolean, default: false }, + 'show-duration': { type: Boolean, default: true }, + 'showIndex': { type: Boolean, required: false }, + 'showIndexPlaylist': { type: Boolean, required: false }, + 'contextExt': { type: Object, required: false }, + 'class-list': { type: String, required: false, default: "" }, }, mounted() { let duration = this.item.attributes.durationInMillis ?? 0 @@ -115,8 +115,8 @@ return color }, async checkLibrary() { - if(this.addedToLibrary) {return this.addedToLibrary} - if(this.item.type.includes("library-playlists") || this.item.type.includes("station")) { + if (this.addedToLibrary) { return this.addedToLibrary } + if (this.item.type.includes("library-playlists") || this.item.type.includes("station")) { this.addedToLibrary = true return } @@ -126,10 +126,10 @@ return this.addedToLibrary }, getClasses() { - if(this.classList) { + if (this.classList) { this.addClasses = {} let classList = this.classList.split(' ') - for(let i = 0; i < classList.length; i++) { + for (let i = 0; i < classList.length; i++) { this.addClasses[classList[i]] = true } } @@ -259,7 +259,7 @@ for (let kind in itemsToPlay) { let ids = itemsToPlay[kind] if (ids.length > 0) { - app.mk.playNext({[kind + "s"]: itemsToPlay[kind]}) + app.mk.playNext({ [kind + "s"]: itemsToPlay[kind] }) } } console.log(itemsToPlay) @@ -281,7 +281,7 @@ for (let kind in itemsToPlay) { let ids = itemsToPlay[kind] if (ids.length > 0) { - app.mk.playLater({[kind + "s"]: itemsToPlay[kind]}) + app.mk.playLater({ [kind + "s"]: itemsToPlay[kind] }) } } app.selectedMediaItems = [] @@ -363,7 +363,7 @@ "name": app.getLz('action.playNext'), "icon": "./assets/arrow-bend-up.svg", "action": function () { - app.mk.playNext({[self.item.attributes.playParams.kind ?? self.item.type]: self.item.attributes.playParams.id ?? self.item.id}) + app.mk.playNext({ [self.item.attributes.playParams.kind ?? self.item.type]: self.item.attributes.playParams.id ?? self.item.id }) app.mk.queue._reindex() app.selectedMediaItems = [] } @@ -372,7 +372,7 @@ "name": app.getLz('action.playLater'), "icon": "./assets/arrow-bend-down.svg", "action": function () { - app.mk.playLater({[self.item.attributes.playParams.kind ?? self.item.type]: self.item.attributes.playParams.id ?? self.item.id}) + app.mk.playLater({ [self.item.attributes.playParams.kind ?? self.item.type]: self.item.attributes.playParams.id ?? self.item.id }) app.mk.queue._reindex() app.selectedMediaItems = [] } @@ -381,7 +381,7 @@ "icon": "./assets/feather/radio.svg", "name": app.getLz('action.startRadio'), "action": function () { - app.mk.setStationQueue({song: self.item.attributes.playParams.id ?? self.item.id}).then(() => { + app.mk.setStationQueue({ song: self.item.attributes.playParams.id ?? self.item.id }).then(() => { app.mk.play() app.selectedMediaItems = [] }) @@ -405,12 +405,26 @@ "icon": "./assets/feather/share.svg", "name": app.getLz('action.share'), "action": function () { - if (!self.item.attributes.url && self.item.relationships){ - if (self.item.relationships.catalog){ - app.mkapi(self.item.attributes.playParams.kind, false, self.item.relationships.catalog.data[0].id).then(u => {self.app.copyToClipboard((u.data.data.length && u.data.data.length > 0)? u.data.data[0].attributes.url : u.data.data.attributes.url)}) + if (!self.item.attributes.url && self.item.relationships) { + if (self.item.relationships.catalog) { + app.mkapi(self.item.attributes.playParams.kind, false, self.item.relationships.catalog.data[0].id).then(u => { self.app.copyToClipboard((u.data.data.length && u.data.data.length > 0) ? u.data.data[0].attributes.url : u.data.data.attributes.url) }) } - }else { - self.app.copyToClipboard(self.item.attributes.url)} + } else { + self.app.copyToClipboard(self.item.attributes.url) + } + } + }, + { + "icon": "./assets/feather/share.svg", + "name": `${app.getLz('action.share')} (song.link)`, + "action": function () { + if (!self.item.attributes.url && self.item.relationships) { + if (self.item.relationships.catalog) { + app.mkapi(self.item.attributes.playParams.kind, false, self.item.relationships.catalog.data[0].id).then(u => { self.app.songLinkShare((u.data.data.length && u.data.data.length > 0) ? u.data.data[0].attributes.url : u.data.data.attributes.url) }) + } + } else { + self.app.songLinkShare(self.item.attributes.url) + } } } ] @@ -430,30 +444,30 @@ try { await this.checkLibrary().then(res => { console.log(res) - if(res) { + if (res) { menus.normal.items.find(x => x.id == 'addToLibrary').hidden = true menus.normal.items.find(x => x.id == 'removeFromLibrary').hidden = false - }else{ + } else { menus.normal.items.find(x => x.id == 'addToLibrary').disabled = false } }) - }catch(e) { + } catch (e) { } - try{ - let rating = await app.getRating(self.item) - if (rating == 0) { - menus.normal.headerItems.find(x => x.id == 'love').disabled = false - menus.normal.headerItems.find(x => x.id == 'dislike').disabled = false - } else if (rating == 1) { - menus.normal.headerItems.find(x => x.id == 'unlove').hidden = false - menus.normal.headerItems.find(x => x.id == 'love').hidden = true - } else if (rating == -1) { - menus.normal.headerItems.find(x => x.id == 'undo_dislike').hidden = false - menus.normal.headerItems.find(x => x.id == 'dislike').hidden = true - } - } catch(err) { + try { + let rating = await app.getRating(self.item) + if (rating == 0) { + menus.normal.headerItems.find(x => x.id == 'love').disabled = false + menus.normal.headerItems.find(x => x.id == 'dislike').disabled = false + } else if (rating == 1) { + menus.normal.headerItems.find(x => x.id == 'unlove').hidden = false + menus.normal.headerItems.find(x => x.id == 'love').hidden = true + } else if (rating == -1) { + menus.normal.headerItems.find(x => x.id == 'undo_dislike').hidden = false + menus.normal.headerItems.find(x => x.id == 'dislike').hidden = true + } + } catch (err) { } }, @@ -474,7 +488,7 @@ }, async removeFromLibrary() { let item = this.item - let params = {"fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library"} + let params = { "fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library" } let id = item.id ?? item.attributes.playParams.id let res = await app.mkapi(item.attributes.playParams.kind ?? item.type, item.attributes.playParams.isLibrary ?? false, item.attributes.playParams.id ?? item.id, params); if (res && res.relationships && res.relationships.library && res.relationships.library.data && res.relationships.library.data.length > 0) { @@ -502,10 +516,10 @@ let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind; console.log(item, parent, childIndex, kind, id, isLibrary, kind == "playlists", id.startsWith("p.") || id.startsWith("pl.u")) app.mk.stop().then(() => { - if (parent != null && childIndex != null) { - app.queueParentandplayChild(parent, childIndex, item); - } - else if (kind.includes("playlist") && (id.startsWith("p.") || id.startsWith("pl."))){ + if (parent != null && childIndex != null) { + app.queueParentandplayChild(parent, childIndex, item); + } + else if (kind.includes("playlist") && (id.startsWith("p.") || id.startsWith("pl."))) { function shuffleArray(array) { for (var i = array.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); @@ -514,58 +528,59 @@ array[j] = temp; } } - app.mk.setQueue({[truekind]: [item.attributes.playParams.id ?? item.id]}).then(function () { - app.mk.play().then(function (){ - var playlistId = id - function getPlaylist(id, isLibrary){ - if (isLibrary){ - return this.app.mk.api.v3.music(`/v1/me/library/playlists/${id}`) - } else { return this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`)} + app.mk.setQueue({ [truekind]: [item.attributes.playParams.id ?? item.id] }).then(function () { + app.mk.play().then(function () { + var playlistId = id + function getPlaylist(id, isLibrary) { + if (isLibrary) { + return this.app.mk.api.v3.music(`/v1/me/library/playlists/${id}`) + } else { return this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/playlists/${id}`) } + } + try { + getPlaylist(id, isLibrary).then(res => { + //let query = res.relationships.tracks.data.map(item => new MusicKit.MediaItem(item)); + //if (app.mk.shuffleMode == 1){shuffleArray(query); } + // console.log(query) + // app.mk.queue.append(query) + if (!res.data.relationships.tracks.next) { + return + } else { + getPlaylistTracks(res.data.relationships.tracks.next) } - try { - getPlaylist(id, isLibrary).then(res => { - //let query = res.relationships.tracks.data.map(item => new MusicKit.MediaItem(item)); - //if (app.mk.shuffleMode == 1){shuffleArray(query); } - // console.log(query) - // app.mk.queue.append(query) - if (!res.data.relationships.tracks.next) { - return - } else { - getPlaylistTracks(res.data.relationships.tracks.next) - } - function getPlaylistTracks(next) { - app.apiCall(app.musicBaseUrl + next, res => { - // if (res.id != playlistId || next.includes(playlistId)) { - // return - // } - console.log('nextres', res) - let query = res.data.map(item => new MusicKit.MediaItem(item)) - if (app.mk.shuffleMode == 1){shuffleArray(query); console.log('shf')} - app.mk.queue.append(query) + function getPlaylistTracks(next) { + app.apiCall(app.musicBaseUrl + next, res => { + // if (res.id != playlistId || next.includes(playlistId)) { + // return + // } + console.log('nextres', res) + let query = res.data.map(item => new MusicKit.MediaItem(item)) + if (app.mk.shuffleMode == 1) { shuffleArray(query); console.log('shf') } + app.mk.queue.append(query) - if (res.next) { - getPlaylistTracks(res.next) - } - }) + if (res.next) { + getPlaylistTracks(res.next) } }) - } catch (e) {} + } + }) + } catch (e) { } - }) - }) + }) + }) - } - else { - app.playMediaItemById(item.attributes.playParams.id ?? item.id, item.attributes.playParams.kind ?? item.type, item.attributes.playParams.isLibrary ?? false, item.attributes.url) - }}) + } + else { + app.playMediaItemById(item.attributes.playParams.id ?? item.id, item.attributes.playParams.kind ?? item.type, item.attributes.playParams.isLibrary ?? false, item.attributes.url) + } + }) }, - route(){ + route() { let kind = (this.item.attributes.playParams ? (this.item.attributes.playParams.kind ?? (this.item.type ?? '')) : (this.item.type ?? '')); - if (kind.toLowerCase().includes('album') || kind.toLowerCase().includes('playlist')){ + if (kind.toLowerCase().includes('album') || kind.toLowerCase().includes('playlist')) { app.routeView(this.item) } else { this.playTrack() @@ -573,4 +588,4 @@ } } }); - + \ No newline at end of file diff --git a/src/renderer/views/components/mediaitem-square.ejs b/src/renderer/views/components/mediaitem-square.ejs index bdb39c17..6bf861d9 100644 --- a/src/renderer/views/components/mediaitem-square.ejs +++ b/src/renderer/views/components/mediaitem-square.ejs @@ -402,6 +402,18 @@ }else { self.app.copyToClipboard(self.item.attributes.url)} } + }, + { + "icon": "./assets/feather/share.svg", + "name": `${app.getLz('action.share')} (song.link)`, + "action": function () { + if (!self.item.attributes.url && self.item.relationships){ + if (self.item.relationships.catalog){ + app.mkapi(self.item.attributes.playParams.kind, false, self.item.relationships.catalog.data[0].id).then(u => {self.app.songLinkShare((u.data.data.length && u.data.data.length > 0)? u.data.data[0].attributes.url : u.data.data.attributes.url)}) + } + }else { + self.app.songLinkShare(self.item.attributes.url)} + } } ] } diff --git a/src/renderer/views/components/share-sheet.ejs b/src/renderer/views/components/share-sheet.ejs new file mode 100644 index 00000000..ee093413 --- /dev/null +++ b/src/renderer/views/components/share-sheet.ejs @@ -0,0 +1,88 @@ + + + \ No newline at end of file From fb8697629e08e4af258c1c0e544a0943a6a968c8 Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:08:59 -0800 Subject: [PATCH 30/54] unbork unbork bonk --- resources/appendCommitToVersion.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/appendCommitToVersion.js b/resources/appendCommitToVersion.js index 3a9c6c13..b22c418e 100644 --- a/resources/appendCommitToVersion.js +++ b/resources/appendCommitToVersion.js @@ -13,7 +13,7 @@ var package = JSON.parse(data); package.version = `${package.version}.${process.env['CIRCLE_BUILD_NUM']}` -fs.writeFile('package.json', package, err => { +fs.writeFile('package.json', JSON.stringify(package), err => { // error checking if(err) throw err; console.log("VERSION CHANGED"); From c1fb6ed49b53fbb54cd31154a3a862158171f990 Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:17:54 -0800 Subject: [PATCH 31/54] Enable CircleCI Commit Appending --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49175ab4..3c6db051 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "cider", "applicationId": "Cider", "productName": "Cider", - "version": "1.1.0", + "version": "1.1", "description": "A new look into listening and enjoying music in style and performance.", "license": "AGPL-3.0", "main": "./build/index.js", From 6b331cb22f5f899f720a93e3a59062395de936f2 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Tue, 8 Feb 2022 09:40:46 +0700 Subject: [PATCH 32/54] fix #372 --- src/renderer/views/components/mediaitem-list-item.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/views/components/mediaitem-list-item.ejs b/src/renderer/views/components/mediaitem-list-item.ejs index b311bb95..132d7b24 100644 --- a/src/renderer/views/components/mediaitem-list-item.ejs +++ b/src/renderer/views/components/mediaitem-list-item.ejs @@ -29,7 +29,7 @@
-
+
Date: Tue, 8 Feb 2022 14:14:05 +1100 Subject: [PATCH 33/54] Fix local builds (#375) --- .circleci/config.yml | 4 ++-- package.json | 4 ++-- resources/appendCommitToVersion.js | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0427fa0c..b9f291ec 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -43,8 +43,8 @@ jobs: - store_test_results: path: test-results - run: - name: Append Commit SHA to Version - command: yarn circle:append-sha + name: Append Commit BuildID to Version + command: yarn circle:append-bid - run: name: Generate Builds (Linux) command: yarn dist -l -p never diff --git a/package.json b/package.json index 3c6db051..484c8170 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "cider", "applicationId": "Cider", "productName": "Cider", - "version": "1.1", + "version": "1.1.0", "description": "A new look into listening and enjoying music in style and performance.", "license": "AGPL-3.0", "main": "./build/index.js", @@ -26,7 +26,7 @@ "dist:all": "yarn build && electron-builder -mwl", "msft": "yarn build && electron-builder -c msft-package.json", "postinstall": "electron-builder install-app-deps", - "circle:append-sha": "node resources/appendCommitToVersion" + "circle:append-bid": "node resources/appendBIDToVersion" }, "dependencies": { "@sentry/electron": "^2.5.4", diff --git a/resources/appendCommitToVersion.js b/resources/appendCommitToVersion.js index b22c418e..123deba9 100644 --- a/resources/appendCommitToVersion.js +++ b/resources/appendCommitToVersion.js @@ -8,9 +8,10 @@ let fs = require('fs') var data = fs.readFileSync('package.json'); var package = JSON.parse(data); +pvers = package.version.match(/\d+\./g) // https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables -package.version = `${package.version}.${process.env['CIRCLE_BUILD_NUM']}` +package.version = `${pvers[0]}.${pvers[1]}.${process.env['CIRCLE_BUILD_NUM']}` fs.writeFile('package.json', JSON.stringify(package), err => { From c817ba5267e192625ff234cf6358f0b7295c112f Mon Sep 17 00:00:00 2001 From: vapormusic Date: Tue, 8 Feb 2022 10:19:04 +0700 Subject: [PATCH 34/54] universal build --- package.json | 3 ++- src/renderer/index.js | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 3c6db051..957f49bd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "cider", "applicationId": "Cider", "productName": "Cider", - "version": "1.1", + "version": "1.1.0", "description": "A new look into listening and enjoying music in style and performance.", "license": "AGPL-3.0", "main": "./build/index.js", @@ -23,6 +23,7 @@ "start:darwin": "yarn build && ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers", "pack": "electron-builder --dir", "dist": "yarn build && electron-builder", + "dist:mac": "yarn build && electron-builder --mac --universal", "dist:all": "yarn build && electron-builder -mwl", "msft": "yarn build && electron-builder -c msft-package.json", "postinstall": "electron-builder install-app-deps", diff --git a/src/renderer/index.js b/src/renderer/index.js index 5dc7a5d8..4c5a5519 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -1884,7 +1884,7 @@ const app = new Vue({ self.library.backgroundNotification.show = false self.searchLibrarySongs() localStorage.setItem("librarySongs", JSON.stringify(library)) - console.log(library) + // console.log(library) } } @@ -1992,7 +1992,7 @@ const app = new Vue({ self.library.backgroundNotification.show = false localStorage.setItem("libraryAlbums", JSON.stringify(library)) self.searchLibraryAlbums(index) - console.log(library) + // console.log(library) } } @@ -2098,7 +2098,7 @@ const app = new Vue({ self.library.backgroundNotification.show = false localStorage.setItem("libraryArtists", JSON.stringify(library)) self.searchLibraryArtists(index) - console.log(library) + // console.log(library) } } From 82020e16d391bd79e7f548c5ab1c4d387382d275 Mon Sep 17 00:00:00 2001 From: GamingLiamStudios <58615717+GamingLiamStudios@users.noreply.github.com> Date: Tue, 8 Feb 2022 14:25:26 +1100 Subject: [PATCH 35/54] Fix local builds(again) (#376) * Replace mentions of commit SHA with BID * Fix local builds * shit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f9f6e38b..657f87ec 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "dist:all": "yarn build && electron-builder -mwl", "msft": "yarn build && electron-builder -c msft-package.json", "postinstall": "electron-builder install-app-deps", - "circle:append-bid": "node resources/appendBIDToVersion" + "circle:append-bid": "node resources/appendCommitToVersion" }, "dependencies": { "@sentry/electron": "^2.5.4", From 0ba24a236133441a0d472dfecb58ac75d84cdc63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20G=C3=BCm=C3=BC=C5=9F?= <10urgumus@gmail.com> Date: Tue, 8 Feb 2022 06:30:09 +0300 Subject: [PATCH 36/54] Update tr_TR.jsonc (#374) --- src/i18n/tr_TR.jsonc | 69 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/src/i18n/tr_TR.jsonc b/src/i18n/tr_TR.jsonc index ead8ddfd..828ecb59 100644 --- a/src/i18n/tr_TR.jsonc +++ b/src/i18n/tr_TR.jsonc @@ -21,8 +21,8 @@ // Terms "term.appleInc": "Apple", - "term.appleMusic": "Apple Müzik", - "term.applePodcasts": "Apple Podcastler", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", "term.itunes": "iTunes", "term.github": "GitHub", "term.discord": "Discord", @@ -124,6 +124,25 @@ "term.time.second": "saniye", "term.videos": "Video Klipler", "term.menu": "Menü", + "term.check": "Şimdi Kontrol Et", + "term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat' + "term.updateCider": "Güncellemeleri Denetle", + "term.share.success": "Panoya Kopyalandı", + "term.topResult": "En İyi Sonuç", // Search Results + "term.sharedPlaylists": "Paylaşılan Listeler", // Search Results + "term.people": "Kişiler", // Search Results + "term.newpreset.name": "Yeni Önayar İsmi", // Equalizer Preset + "term.addedpreset": "Önayar Kaydedildi", + "term.deletepreset.warn": "Bu önayarı silmek istediğinize emin misiniz?", + "term.deletedpreset": "Önayar Silindi", + "term.musicVideos": "Video Klipler", // Search page friendlyTypes + "term.stations": "İstasyonlar", + "term.curators": "Editörler", + "term.appleCurators": "Apple Editörleri", + "term.radioShows": "Radio Şovları", + "term.recordLabels": "Kayıt Stüdyoları", + "term.videoExtras": "Ekstra Videolar", + "term.top": "En İyi", // Home "home.title": "Ana Sayfa", @@ -193,8 +212,12 @@ "action.export": "Export", "action.showAlbum": "Tüm Albümü Göster", "action.tray.minimize": "Görev Çubuğuna Küçült", - "action.tray.quit": "'den Çık", - "action.tray.show": "'i Göster", + "action.tray.quit": "Çık", + "action.tray.show": "Göster", + "action.update": "Güncelle", + "action.copy": "Kopyala", + "action.newpreset": "Yeni Önayar...", // Equalizer Preset + "action.deletepreset": "Önayarı Sil", // Settings - General "settings.header.general": "Genel Ayarlar", @@ -206,12 +229,25 @@ "settings.option.general.language.fun": "Mizahi Diller", "settings.option.general.language.unsorted": "Henüz Tamamlanmamış Diller", + // Update Cider + "settings.option.general.updateCider": "Güncellemeleri Kontrol Et", // Button. Refer to term.check for the check button + "settings.option.general.updateCider.branch": "Seçilen GitHub Versiyonu", // Dropdown + "settings.option.general.updateCider.branch.description": "Cider'in hangi versiyonuna güncelleneceğini seçin", + "settings.option.general.updateCider.branch.main": "Stabil", + "settings.option.general.updateCider.branch.develop": "Deneysel", + // Settings - Audio "settings.header.audio": "Çalma / Oynatma", "settings.header.audio.description": "Cider'in sizin için en iyi dinleme deneyimini sağlayabilmesi için ses ayarlarınızı yapın.", "settings.option.audio.quality": "Ses Kalitesi", // Dropdown + "settings.header.audio.quality.hireslossless": "Yüksek Çözünürlüklü Kayıpsız", + "settings.header.audio.quality.hireslossless.description": "24-bit/192 kHz'e kadar", + "settings.header.audio.quality.lossless": "Kayıpsız", + "settings.header.audio.quality.lossless.description": "24-bit/48 kHz'e kadar", "settings.header.audio.quality.high": "Yüksek Kalite", - "settings.header.audio.quality.low": "Yüksek Verimlilik", + "settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "Standart", + "settings.header.audio.quality.standard.description": "64 kbps", "settings.header.audio.quality.auto": "Otomatik", "settings.option.audio.seamlessTransition": "Kesintisiz Ses Geçişi", // Toggle "settings.option.audio.enableAdvancedFunctionality": "Gelişmiş Ses Deneyimi", // Toggle @@ -220,6 +256,12 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Ses normalleştirme alçak ve yüksek sesli şarkıları dengeler ve daha düzgün bir dinleme deneyimi sağlar.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Uzamsal Ses", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Sesi uzamsallaştırın ve sesi daha 3 boyutlu hale getirin (not: Bu Dolby Atmos değildir)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenalin Prosesörü™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Müziğin hem daha zengin hem de daha canlı duyulmasını sağlayan Psikoakustik Geliştirme Sistemi | Maikiwi tarafından tasarlanmıştır.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Kuvveti", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Sese yapılan işlemin gücünü değiştirir. (Agresif istenmeyen sonuçlar doğurabilir)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standart", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif", // Settings - Visual "settings.header.visual": "Görünüm", @@ -243,8 +285,12 @@ "settings.option.visual.hardwareAcceleration.description": "Etki etmesi için uygulamayı yeniden başlatmak gerekir.", "settings.header.visual.hardwareAcceleration.default": "Varsayılan", "settings.header.visual.hardwareAcceleration.webGPU": "Gelişmiş", - // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Kullanıcı Adımı Göster", // Toggle + "settings.header.visual.theme": "Tema", + + // Settings - Visual - Theme name + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Karanlık", // Settings - Lyrics "settings.header.lyrics": "Şarkı Sözleri", @@ -274,12 +320,10 @@ "settings.header.experimental": "Deneysel", "settings.header.experimental.description": "Cider'deki deneysel özelliklere erişim sağlayın. (Not: Bazı özellikler düzgün çalışmayabilir.)", "settings.option.experimental.compactUI": "Kompakt Arayüz", // Toggle - "settings.option.experimental.closeButtonBehaviour": "Kapat düğmesi davranışı", - "settings.option.experimental.closeButtonBehaviour.quit": "Cider'den çık", - "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "Simge durumuna küçült", - "settings.option.experimental.closeButtonBehaviour.minimizeTray": "Görev çubuğuna küçült", - // Refer to term.disabled & term.enabled - + "settings.option.experimental.close_button_hide": "Kapatma Düğmesi Cider'i Küçültür", + "settings.option.experimental.copy_log": "Günlüğü Panoya Kopyala", + "settings.option.experimental.inline_playlists": "Listeleri ve Albümleri Açılır Pencere İle göster", + // Spatialization Menu "spatial.notTurnedOn": "Uzamsal ses devre dışı. Kullanabilmek için lütfen önce etkinleştirin.", "spatial.spatialProperties" : "Uzamsal Özellikler", @@ -310,5 +354,4 @@ //About "about.thanks": "Cider Collective Ekibine ve tüm katkıda bulunanlara çok teşekkür ederiz." - } \ No newline at end of file From 104006c0eca30b074403932e741d7e864237f67a Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 19:32:40 -0800 Subject: [PATCH 37/54] unbork unbork unbork bonk --- resources/appendCommitToVersion.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/appendCommitToVersion.js b/resources/appendCommitToVersion.js index 123deba9..c38a58c6 100644 --- a/resources/appendCommitToVersion.js +++ b/resources/appendCommitToVersion.js @@ -11,7 +11,7 @@ var package = JSON.parse(data); pvers = package.version.match(/\d+\./g) // https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables -package.version = `${pvers[0]}.${pvers[1]}.${process.env['CIRCLE_BUILD_NUM']}` +package.version = ${pvers[0]}${pvers[1]}${process.env['CIRCLE_BUILD_NUM']} fs.writeFile('package.json', JSON.stringify(package), err => { From 13ce2941816d4e47e30987aa1bb0c8796c0b31da Mon Sep 17 00:00:00 2001 From: Quacksire <19170969+quacksire@users.noreply.github.com> Date: Mon, 7 Feb 2022 19:35:44 -0800 Subject: [PATCH 38/54] unbork unbork unbork unbork bonk --- resources/appendCommitToVersion.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/appendCommitToVersion.js b/resources/appendCommitToVersion.js index c38a58c6..ef40f330 100644 --- a/resources/appendCommitToVersion.js +++ b/resources/appendCommitToVersion.js @@ -11,7 +11,7 @@ var package = JSON.parse(data); pvers = package.version.match(/\d+\./g) // https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables -package.version = ${pvers[0]}${pvers[1]}${process.env['CIRCLE_BUILD_NUM']} +package.version = `${pvers[0]}${pvers[1]}${process.env['CIRCLE_BUILD_NUM']}` fs.writeFile('package.json', JSON.stringify(package), err => { From a9aea9af99859fb463c373ba55c017346629b6c2 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Mon, 7 Feb 2022 19:58:54 -0800 Subject: [PATCH 39/54] fix volume steps --- src/main/base/store.ts | 3 ++- src/renderer/index.js | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/base/store.ts b/src/main/base/store.ts index df5edc19..da89a70a 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -27,7 +27,8 @@ export class Store { }, "audio": { "volume": 1, - "volumeStep": 0.02, + "volumeStep": 0.1, + "maxVolume": 1, "lastVolume": 1, "muted": false, "quality": "HIGH", diff --git a/src/renderer/index.js b/src/renderer/index.js index 4c5a5519..5e58911c 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -3212,8 +3212,8 @@ const app = new Vue({ }, volumeUp() { if ((app.mk.volume + app.cfg.audio.volumeStep) > 1) { - app.mk.volume = 1; - console.log('setting to 1') + app.mk.volume = app.cfg.audio.maxVolume; + console.log('setting max volume') } else { console.log('volume up') app.mk.volume += app.cfg.audio.volumeStep; @@ -3222,7 +3222,7 @@ const app = new Vue({ volumeDown() { if ((app.mk.volume - app.cfg.audio.volumeStep) < 0) { app.mk.volume = 0; - console.log('settings to 0') + console.log('setting volume to 0') } else { console.log('volume down') app.mk.volume -= app.cfg.audio.volumeStep; From ea7b06003c4be18f47532a17ae39fdcf04b8dd60 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Mon, 7 Feb 2022 20:39:17 -0800 Subject: [PATCH 40/54] Indonesian Translation courtesy of crystalshower#9918 --- src/i18n/in_ID.jsonc | 357 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 src/i18n/in_ID.jsonc diff --git a/src/i18n/in_ID.jsonc b/src/i18n/in_ID.jsonc new file mode 100644 index 00000000..91e63524 --- /dev/null +++ b/src/i18n/in_ID.jsonc @@ -0,0 +1,357 @@ +{ // Base File + // i18n Info + "i18n.languageName": "Bahasa Indonesia", // name of language in native language + "i18n.languageNameEnglish": "Indonesian", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "@crystalshower", // Authors, if you contribute to this file feel free to add your name seperated with a space + + // App info + "app.name": "Cider", + + "date.format": "${d} ${m}, ${y}", + + // Dialogs + "dialog.cancel": "Batal", + "dialog.ok": "OK", + + // Notification + "notification.updatingLibrarySongs": "Memperbarui Pustaka lagu...", + "notification.updatingLibraryAlbums": "Memperbarui Pustaka album...", + "notification.updatingLibraryArtists": "Memperbarui Pustaka artis...", + + // Terms + "term.appleInc": "Apple Inc.", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", + "term.itunes": "iTunes", + "term.github": "GitHub", + "term.discord": "Discord", + "term.learnMore": "Pelajari lebih lanjut", + "term.accountSettings": "Pengaturan Akun", + "term.logout": "Keluar", + "term.login": "Masuk", + "term.about": "Tentang", + "term.privateSession": "Sesi Pribadi", + "term.queue": "Antrian", + "term.history": "Riwayat", + "term.search": "Cari", + "term.library": "Pustaka", + "term.listenNow": "Dengarkan Sekarang", + "term.browse": "Telusuri", + "term.radio": "Radio", + "term.recentlyAdded": "Baru Ditambahkan", + "term.songs": "Lagu", + "term.albums": "Album", + "term.artists": "Artis", + "term.podcasts": "Podcasts", + "term.playlists": "Playlist", + "term.playlist": "Playlist", + "term.newPlaylist": "Playlist Baru", + "term.newPlaylistFolder": "Folder Playlist Baru", + "term.createNewPlaylist": "Buat Playlist Baru", + "term.createNewPlaylistFolder": "Buat Folder Playlist Baru", + "term.deletePlaylist": "Yakin ingin menghapus playlist ini?", + "term.play": "Mainkan", + "term.pause": "Jeda", + "term.previous": "Sebelumnya", + "term.next": "Selanjutnya", + "term.shuffle": "Acak", + "term.repeat": "Ulangi", + "term.volume": "Volume", + "term.mute": "Bisu", + "term.unmute": "Bunyikan", + "term.share": "Bagikan", + "term.share.success": "Disalin ke clipboard", + "term.settings": "Pengaturan", + "term.seeAll": "Lihat Semua", + "term.sortBy": "Urutkan Berdasarkan", + "term.sortBy.album": "Album", + "term.sortBy.artist": "Artis", + "term.sortBy.name": "Nama", + "term.sortBy.genre": "Genre", + "term.sortBy.releaseDate": "Tanggal Rilis", + "term.sortBy.duration": "Durasi", + "term.sortOrder": "A-Z", + "term.sortOrder.ascending": "Terkecil", + "term.sortOrder.descending": "Terbesar", + "term.viewAs": "Lihat Sebagai", + "term.viewAs.coverArt": "Cover Art", + "term.viewAs.list": "Daftar", + "term.size": "Ukuran", + "term.size.normal": "Normal", + "term.size.compact": "Kompak", + "term.enable": "Aktifkan", + "term.disable": "Nonaktifkan", + "term.enabled": "Diaktifkan", + "term.disabled": "Dinonaktikan", + "term.connect": "Sambungkan", + "term.connecting": "Menyambungkan", + "term.disconnect": "Terputus", + "term.authed": "Diotentikasi", + "term.confirm": "Konfirmasi?", + "term.more": "Selebihnya", + "term.less": "Lebih Sedikit", + "term.showMore": "Tampilkan lebih banyak", + "term.showLess": "Tampilkan lebih sedikit", + "term.topSongs": "Lagu Teratas", + "term.latestReleases": "Rilis Terbaru", + "term.time.added": "Ditambahkan", + "term.time.released": "Dirilis", + "term.time.updated": "Diperbarui", + "term.time.hours": "jam", + "term.time.hour": "jam", + "term.time.minutes": "menit", + "term.time.minute": "menit", + "term.time.seconds": "detik", + "term.time.second": "detik", + "term.fullscreenView": "Mode Layar Penuh", + "term.defaultView": "Mode Default", + "term.audioSettings": "Pengaturan Audio", + "term.clearAll": "Bersihkan Semua", + "term.recentStations": "Stasiun Terbaru", + "term.language": "Bahasa", + "term.funLanguages": "Senang-senang", + "term.noLyrics": "Memuat... / Lirik tidak ditermukan./ Instrumental.", + "term.copyright": "Hak cipta", + "term.rightsReserved": "Hak cipta dilindungi Undang-undang.", + "term.sponsor": "Sponsori proyek ini", + "term.ciderTeam": "Cider Team", + "term.developer": "Pengembang", + "term.socialTeam": "Social Team", + "term.socials": "Sosial", + "term.contributors": "Kontributor", + "term.equalizer": "Equalizer", + "term.reset": "Atur Ulang", + "term.tracks": "lagu", // Assume x amount of tracks. e.g. 50 tracks + "term.videos": "Video", + "term.menu": "Menu", + "term.check": "Cek", + "term.aboutArtist": "Tentang {{artistName}}", // e.g. 'About Doja Cat' + "term.topResult": "Hasil Teratas", // Search Results + "term.sharedPlaylists": "Playlist yang dibagikan", // Search Results + "term.people": "Orang", // Search Results + "term.newpreset.name": "Nama Preset EQ Baru", // Equalizer Preset + "term.addedpreset": "Preset Ditambahkan", + "term.deletepreset.warn": "Yakin ingin menghapus preset ini?", + "term.deletedpreset": "Preset dihapus", + "term.musicVideos": "Video Musik", // Search page friendlyTypes + "term.stations": "Stasiun", + "term.curators": "Kurator", + "term.appleCurators": "Kurator Apple", + "term.radioShows": "Acara Radio", + "term.recordLabels": "Label Rekaman", + "term.videoExtras": "Bonus Video", + "term.top": "Atas", + + // Home + "home.title": "Beranda", + "home.recentlyPlayed": "Baru Dimainkan", + "home.recentlyAdded": "Baru Ditambahkan", + "home.artistsFeed": "Artists Feed Anda", + "home.artistsFeed.noArtist": "Ikuti beberapa artis terlebih dahulu dan rilisan terbaru mereka akan ada di sini", + "home.madeForYou": "Dibuat Untuk Kamu", + "home.friendsListeningTo": "Teman Sedang Mendengarkan", + "home.followedArtists": "Artis Diikuti", + + // Errors + "error.appleMusicSubRequired": "Apple Music memerlukan langganan.", + "error.connectionError": "Terjadi masalah saat menyambungkan ke Apple Music.", + "error.noResults": "Tidak ada hasil.", + "error.noResults.description": "Coba pencarian baru.", + + // Podcasts + "podcast.followOnCider": "Ikuti Di Cider", + "podcast.followedOnCider": "Mengikuti Di Cider", + "podcast.subscribeOnItunes": "Langganan Di iTunes", + "podcast.subscribedOnItunes": "Berlangganan Di iTunes", + "podcast.itunesStore": "iTunes Store", + "podcast.episodes": "Episode", + "podcast.playEpisode": "Mainkan Episode", + "podcast.website": "Website Podcast", + + // Actions + "action.addToLibrary": "Tambahkan ke Pustaka", + "action.addToLibrary.success": "Ditambahkan ke Pustaka", + "action.addToLibrary.error": "Terjadi Kesalahan Saat Menambahkan Pustaka", + "action.removeFromLibrary": "Hapus dari Pustaka", + "action.removeFromLibrary.success": "Dihapus dari Pustaka", + "action.addToQueue": "Tambahkan ke Antrian", + "action.addToQueue.success": "Ditambahkan ke Antrian", + "action.addToQueue.error": "Terjadi Kesalahan Saat Menambahkan ke Antrean", + "action.removeFromQueue": "Hapus dari Antrian", + "action.removeFromQueue.success": "Dihapus dari Antrian", + "action.removeFromQueue.error": "Terjadi Kesalahan Saat Menghapus Antrian", + "action.createPlaylist": "Buat Playlist Baru", + "action.addToPlaylist": "Tambahkan ke Playlist", + "action.removeFromPlaylist": "Hapus dari Playlist", + "action.addToFavorites": "Tambahkan ke Favorit", + "action.follow": "Ikuti", + "action.follow.success": "Diikuti", + "action.follow.error": "Kesalahan Dalam Mengikuti", + "action.unfollow": "Berhenti Mengikuti", + "action.unfollow.success": "Sudah Tidak Mengikuti", + "action.unfollow.error": "Terjadi Kesalahan Saat Berhenti Mengikuti", + "action.playNext": "Mainkan Selanjutnya", + "action.playLater": "Mainkan Nanti", + "action.startRadio": "Mulai Radio", + "action.goToArtist": "Lihat Halaman Artis", + "action.goToAlbum": "Lihat Halaman Album", + "action.moveToTop": "Pindah ke Atas", + "action.share": "Bagikan", + "action.rename": "Ubah Nama", + "action.love": "Suka", + "action.unlove": "Batal Suka", + "action.dislike": "Tidak Suka", + "action.undoDislike": "Batalkan Tidak Suka", + "action.showWebRemoteQR": "Remot Web", + "action.playTracksNext": "Mainkan ${app.selectedMediaItems.length} lagu selanjutnya", + "action.playTracksLater": "Mainkan ${app.selectedMediaItems.length} lagu nanti", + "action.removeTracks": "Hapus ${self.selectedItems.length} lagu dari antrian", + "action.import": "Impor", + "action.export": "Ekspor", + "action.showAlbum": "Tampilkan Album Sepenuhnya", + "action.tray.minimize": "Sembunyikan ke Tray", + "action.tray.quit": "Keluar", + "action.tray.show": "Tampilkan", + "action.update": "Perbarui", + "action.copy": "Salin", + "action.newpreset": "Preset Baru...", // Equalizer Preset + "action.deletepreset": "Hapus Preset", + + // Settings - General + "settings.header.general": "Umum", + "settings.header.general.description": "Sesuaikan pengaturan umum untuk Cider.", + "settings.option.general.language": "Bahasa", + + // Language optgroups + "settings.option.general.language.main": "Bahasa", + "settings.option.general.language.fun": "Bahasa Candaan", + "settings.option.general.language.unsorted": "Tidak disortir", + + // Update Cider + "settings.option.general.updateCider": "Perbarui Cider", // Button. Refer to term.check for the check button + "settings.option.general.updateCider.branch": "Branch Pembaruan Cider", // Dropdown + "settings.option.general.updateCider.branch.description": "Pilih branch untuk memperbarui Cider", + "settings.option.general.updateCider.branch.main": "Stable", + "settings.option.general.updateCider.branch.develop": "Development", + + // Settings - Audio + "settings.header.audio": "Audio", + "settings.header.audio.description": "Sesuaikan pengaturan audio untuk Cider.", + "settings.option.audio.quality": "Kualitas Audio", // Dropdown + "settings.header.audio.quality.hireslossless": "Hi-Res Lossless", + "settings.header.audio.quality.hireslossless.description": "sampai dari 24-bit/192 kHz", + "settings.header.audio.quality.lossless": "Lossless", + "settings.header.audio.quality.lossless.description": "sampai dari 24-bit/48 kHz", + "settings.header.audio.quality.high": "Tinggi", + "settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "Standar", + "settings.header.audio.quality.standard.description": "64 kbps", + "settings.option.audio.seamlessTransition": "Transisi Audio Mulus", // Toggle + "settings.option.audio.enableAdvancedFunctionality": "Aktifkan Fungsi Lanjutan", // Toggle + "settings.option.audio.enableAdvancedFunctionality.description": "Mengaktifkan fungsionalitas AudioContext memungkinkan fitur audio yang lanjutan seperti Normalisasi Audio, Equalizer dan Visualizer. Namun pada beberapa perangkat dapat menyebabkan tersendatnya audio.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Peningkatan Psikoakustik yang membuat semuanya terdengar lebih jelas dan lebih hidup | Dirancang oleh Maikiwi.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Kekuatan CAP", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Mengubah kekuatan pemrosesan yang dilakukan pada audio. (Agresif dapat menghasilkan hasil yang tidak diinginkan)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standar", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisasi Audio", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Menormalkan puncak volume untuk masing-masing lagu demi menciptakan pengalaman mendengarkan yang lebih seragam.", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spasialisasi Audio", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Atur ruang audio dan buat audio lebih 3 dimensi (NB: Bukan Dolby Atmos)", + + // Settings - Visual + "settings.header.visual": "Visual", + "settings.header.visual.description": "Sesuaikan pengaturan visual untuk Cider.", + "settings.option.visual.windowBackgroundStyle": "Gaya Latar Belakang Jendela", // Toggle + "settings.header.visual.windowBackgroundStyle.none": "Tidak Ada", + "settings.header.visual.windowBackgroundStyle.artwork": "Artwork", + "settings.header.visual.windowBackgroundStyle.image": "Gambar", + "settings.option.visual.animatedArtwork": "Artwork Bergerak", // Dropdown + "settings.header.visual.animatedArtwork.always": "Selalu", + "settings.header.visual.animatedArtwork.limited": "Terbatas untuk halaman dan entri khusus", + "settings.header.visual.animatedArtwork.disable": "Matikan di semua tempat", + "settings.option.visual.animatedArtworkQuality": "Kualitas Artwork Bergerak", // Dropdown + "settings.header.visual.animatedArtworkQuality.low": "Rendah", + "settings.header.visual.animatedArtworkQuality.medium": "Medium", + "settings.header.visual.animatedArtworkQuality.high": "Tinggi", + "settings.header.visual.animatedArtworkQuality.veryHigh": "Sangat Tinggi", + "settings.header.visual.animatedArtworkQuality.extreme": "Paling Tinggi", + "settings.option.visual.animatedWindowBackground": "Jendela Latar Belakang Bergerak", // Toggle + "settings.option.visual.hardwareAcceleration": "Akselerasi Perangkat Keras (HW Acceleration)", // Dropdown + "settings.option.visual.hardwareAcceleration.description": "Membutuhkan dibuka ulang", + "settings.header.visual.hardwareAcceleration.default": "Default", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.theme": "Tema", + + // Settings - Visual - Theme name + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Gelap", + // Refer to term.disabled for the disabled option + "settings.option.visual.showPersonalInfo": "Tampilkan Info Pribadi", // Toggle + + // Settings - Lyrics + "settings.header.lyrics": "Lyrics", + "settings.header.lyrics.description": "Sesuaikan pengaturan lirik untuk Cider.", + "settings.option.lyrics.enableMusixmatch": "Aktifkan Lirik Musixmatch", // Toggle + "settings.option.lyrics.enableMusixmatchKaraoke": "Aktifkan Mode Karaoke (khusus Musixmatch)", // Toggle + "settings.option.lyrics.musixmatchPreferredLanguage": "Bahasa Terjemahan Musixmatch", // Dropdown + "settings.option.lyrics.enableYoutubeLyrics": "Aktifkan Lirik Youtube untuk Video Musik", // Toggle + + // Settings - Connectivity + "settings.header.connectivity": "Konektivitas", + "settings.header.connectivity.description": "Sesuaikan pengaturan konektivitas untuk Cider.", + "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown + "settings.option.connectivity.playbackNotifications": "Pemberitahuan Pemutaran", // Toggle + // Refer to term.disabled for the disabled option + "settings.header.connectivity.discordRPC.cider": "Tampilkan sebagai 'Cider'", + "settings.header.connectivity.discordRPC.appleMusic": "Tampilkan sebagai 'Apple Music'", + "settings.option.connectivity.discordRPC.clearOnPause": "Sembunyikan Discord Rich Presence saat dijeda", // Toggle + "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", // Option to Connect + "settings.option.connectivity.lastfmScrobble.delay": "Delay Last.fm Scrobble (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Aktifkan Last.fm Now Playing", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Hapus featuring artist dari judul lagu (Last.fm)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter lagu yang diulang (Last.fm)", + // Refer to term.connect for the connect button + + // Settings - Experimental + "settings.header.experimental": "Eksperimental", + "settings.header.experimental.description": "Sesuaikan pengaturan eksperimental untuk Cider.", + "settings.option.experimental.compactUI": "UI Kompak", // Toggle + "settings.option.experimental.close_button_hide": "Tombol Tutup Menyembunyikan Aplikasi", + "settings.option.experimental.copy_log": "Salin log ke clipboard", + "settings.option.experimental.inline_playlists": "Playlist dan Album Sebaris", + + // Refer to term.disabled & term.enabled + // Spatialization Menu + "spatial.notTurnedOn": "Spasialisasi Audio dinonaktifkan. Untuk menggunakan, aktifkan terlebih dahulu.", + "spatial.spatialProperties": "Spatial Properties", + "spatial.width": "Lebar", + "spatial.height": "Tinggi", + "spatial.depth": "Kedalaman", + "spatial.gain": "Gain", + "spatial.roomMaterials": "Bahan Ruangan", + "spatial.roomDimensions": "Dimensi Ruangan", + "spatial.roomPositions": "Posisi Ruangan", + "spatial.setDimensions": "Atur Dimensi", + "spatial.setPositions": "Atur Posisi", + "spatial.up": "Atas", + "spatial.front": "Depan", + "spatial.left": "Kiri", + "spatial.right": "Kanan", + "spatial.back": "Belakang", + "spatial.down": "Bawah", + "spatial.listener": "Pendegar", + "spatial.audioSource": "Sumber Audio", + + // Settings - Unfinished + "settings.header.unfinished": "Belum Diselesaikan", + + // Web Remote + "remote.web.title": "Remote Cider", + "remote.web.description": "Pindai kode QR untuk memasangkan ponsel Anda dengan Cider.", + + // About + "about.thanks": "Terima kasih yang sebesar-besarnya kepada Cider Collective Team dan semua kontributor kami." + } \ No newline at end of file From d558d1fd4654b188e11ad72210a2c02d2d8d3bfc Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Mon, 7 Feb 2022 20:43:33 -0800 Subject: [PATCH 41/54] more volume thingies --- src/renderer/views/app/chrome-top.ejs | 2 +- src/renderer/views/components/miniplayer.ejs | 2 +- src/web-remote/views/index.ejs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/views/app/chrome-top.ejs b/src/renderer/views/app/chrome-top.ejs index e38ee43e..fa2e3012 100644 --- a/src/renderer/views/app/chrome-top.ejs +++ b/src/renderer/views/app/chrome-top.ejs @@ -108,7 +108,7 @@
-
diff --git a/src/renderer/views/components/miniplayer.ejs b/src/renderer/views/components/miniplayer.ejs index 40ecabe9..606ea49a 100644 --- a/src/renderer/views/components/miniplayer.ejs +++ b/src/renderer/views/components/miniplayer.ejs @@ -83,7 +83,7 @@
-
diff --git a/src/web-remote/views/index.ejs b/src/web-remote/views/index.ejs index 46915075..ad46c5a5 100644 --- a/src/web-remote/views/index.ejs +++ b/src/web-remote/views/index.ejs @@ -172,7 +172,7 @@
-
From 00ec349f711d9a1e76a5b590659ec18dab84a1bf Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Mon, 7 Feb 2022 23:06:14 -0800 Subject: [PATCH 42/54] Fix fix fix volume steps --- src/renderer/views/app/chrome-top.ejs | 2 +- src/renderer/views/components/fullscreen.ejs | 2 +- src/renderer/views/components/miniplayer.ejs | 2 +- src/web-remote/views/index.ejs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/renderer/views/app/chrome-top.ejs b/src/renderer/views/app/chrome-top.ejs index fa2e3012..422fb24c 100644 --- a/src/renderer/views/app/chrome-top.ejs +++ b/src/renderer/views/app/chrome-top.ejs @@ -108,7 +108,7 @@
-
diff --git a/src/renderer/views/components/fullscreen.ejs b/src/renderer/views/components/fullscreen.ejs index 51093c60..e2c30f33 100644 --- a/src/renderer/views/components/fullscreen.ejs +++ b/src/renderer/views/components/fullscreen.ejs @@ -80,7 +80,7 @@
-
diff --git a/src/renderer/views/components/miniplayer.ejs b/src/renderer/views/components/miniplayer.ejs index 606ea49a..8c268588 100644 --- a/src/renderer/views/components/miniplayer.ejs +++ b/src/renderer/views/components/miniplayer.ejs @@ -83,7 +83,7 @@
-
diff --git a/src/web-remote/views/index.ejs b/src/web-remote/views/index.ejs index ad46c5a5..46915075 100644 --- a/src/web-remote/views/index.ejs +++ b/src/web-remote/views/index.ejs @@ -172,7 +172,7 @@
-
From 0f6fe2c84cd531ba342a90b4dda0c435bc84b658 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Mon, 7 Feb 2022 23:11:59 -0800 Subject: [PATCH 43/54] fix CAP (I think) --- src/renderer/audio/audio.js | 17 +++++++++-------- src/renderer/views/components/equalizer.ejs | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index c22ef29c..f195e0c8 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -30,7 +30,7 @@ var CiderAudio = { CiderAudio.audioNodes.gainNode.disconnect(); } catch(e){} try{ CiderAudio.audioNodes.spatialNode.disconnect();} catch(e){} try{ - CiderAudio.audioNodes.preampNode.disconnect(); + // CiderAudio.audioNodes.preampNode.disconnect(); for (var i of CiderAudio.audioNodes.llpw){ i.disconnect(); } @@ -146,12 +146,13 @@ var CiderAudio = { CiderAudio.audioNodes.llpw[i].Q.value = LLPW_Q[i]; CiderAudio.audioNodes.llpw[i].gain.value = LLPW_GAIN[i] * app.cfg.audio.ciderPPE_value * CiderAudio.audioNodes.llpwEnabled; } - + /** CiderAudio.audioNodes.preampNode = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.preampNode.type = 'highshelf'; CiderAudio.audioNodes.preampNode.frequency.value = 0; // Passthrough - if (CiderAudio.audioNodes.llpwEnabled === 1) {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain.concat(CiderAudio.audioNodes.llpw[23].gain.value)));} - else {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain));} + CiderAudio.audioNodes.preampNode.gain.value = 0; + /** if (CiderAudio.audioNodes.llpwEnabled === 1) {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain.concat(CiderAudio.audioNodes.llpw[23].gain.value)));} + else {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain));}*/ for (i = 0; i < VIBRANTBASSBANDS.length; i++) { CiderAudio.audioNodes.vibrantbassNode[i] = CiderAudio.context.createBiquadFilter(); @@ -164,14 +165,14 @@ var CiderAudio = { if (app.cfg.audio.spatial) { try{ CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination); } catch(e){} - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.preampNode); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]); } else { try{ CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){} - CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.preampNode); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]); } - - CiderAudio.audioNodes.preampNode.connect(CiderAudio.audioNodes.llpw[0]); + + // CiderAudio.audioNodes.preampNode.connect(CiderAudio.audioNodes.llpw[0]); for (i = 1; i < LLPW_FREQUENCIES.length; i ++) { CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]); diff --git a/src/renderer/views/components/equalizer.ejs b/src/renderer/views/components/equalizer.ejs index 2d4f6f3b..af6b4c85 100644 --- a/src/renderer/views/components/equalizer.ejs +++ b/src/renderer/views/components/equalizer.ejs @@ -324,8 +324,8 @@ } }, changePreamp() { - if (CiderAudio.audioNodes.llpwEnabled === 1) {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain.concat(CiderAudio.audioNodes.llpw[23].gain.value)));} - else {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain));} + /** if (CiderAudio.audioNodes.llpwEnabled === 1) {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain.concat(CiderAudio.audioNodes.llpw[23].gain.value)));} + else {CiderAudio.audioNodes.preampNode.gain.value = (-Math.max(...app.cfg.audio.equalizer.gain));} */ }, changeGain(i) { CiderAudio.audioNodes.audioBands[i].gain.value = app.cfg.audio.equalizer.gain[i] * app.cfg.audio.equalizer.mix From 3cb8e35f4e9d608712367a8b5dd36681f5ca57d4 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Tue, 8 Feb 2022 14:25:12 +0700 Subject: [PATCH 44/54] arm64 mac --- package.json | 5 +++-- resources/afterPack.js | 9 +++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 657f87ec..f0b7b85a 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "start:darwin": "yarn build && ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers", "pack": "electron-builder --dir", "dist": "yarn build && electron-builder", - "dist:mac": "yarn build && electron-builder --mac --universal", + "dist:macarm" : "yarn build && electron-builder --mac --arm64", + "dist:universalNotWorking": "yarn build && electron-builder --mac --universal", "dist:all": "yarn build && electron-builder -mwl", "msft": "yarn build && electron-builder -c msft-package.json", "postinstall": "electron-builder install-app-deps", @@ -66,7 +67,7 @@ "@types/qrcode-terminal": "^0.12.0", "@types/ws": "^8.2.2", "electron": "git+https://github.com/castlabs/electron-releases.git", - "electron-builder": "^22.14.5", + "electron-builder": "^22.14.13", "electron-webpack": "^2.8.2", "musickit-typescript": "^1.2.4", "playwright": "^1.18.1", diff --git a/resources/afterPack.js b/resources/afterPack.js index 6c677c49..c70017c1 100644 --- a/resources/afterPack.js +++ b/resources/afterPack.js @@ -1,5 +1,6 @@ exports.default = function(context) { const { execSync } = require('child_process') + const fs = require('fs') if (process.platform !== 'darwin') return @@ -8,11 +9,15 @@ exports.default = function(context) { execSync('python3 -m pip install --upgrade castlabs-evs') console.log('Castlabs-evs update complete') - + console.log('VMP signing start') - + if (fs.existsSync('dist/mac')) execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac',{stdio: 'inherit'}) + if (fs.existsSync('dist/mac-arm64')) + execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac-arm64 -z',{stdio: 'inherit'}) + if (fs.existsSync('dist/mac-x64')) + execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac-x64',{stdio: 'inherit'}) console.log('VMP signing complete') } \ No newline at end of file From abea1a150d7f9d6e9312c5837872bcb8ce89481e Mon Sep 17 00:00:00 2001 From: vapormusic Date: Tue, 8 Feb 2022 14:57:55 +0700 Subject: [PATCH 45/54] the only way i think of to fix nsis that works --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index f0b7b85a..d232d542 100644 --- a/package.json +++ b/package.json @@ -171,7 +171,6 @@ "target": [ "dmg" ] - }, - "artifactName": "${productName}.${ext}" + } } } From 396c4c712161607e166dd1252d30f85cbd1c0530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=A5=E5=8F=A1?= <46503943+jay900604@users.noreply.github.com> Date: Tue, 8 Feb 2022 23:44:27 +0800 Subject: [PATCH 46/54] Update zh_TW.jsonc (#385) --- src/i18n/zh_TW.jsonc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index 5a7ef4da..c2190a45 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -202,6 +202,10 @@ // Update Cider "settings.option.general.updateCider": "更新 Cider", // Button + "settings.option.general.updateCider.branch": "Cider 更新通道", // Dropdown + "settings.option.general.updateCider.branch.description": "選擇您要接收 Cider 軟體更新的通道", + "settings.option.general.updateCider.branch.main": "穩定版(建議)", + "settings.option.general.updateCider.branch.develop": "開發者測試版(不穩定)", // Settings - Audio "settings.header.audio": "音訊", @@ -325,4 +329,4 @@ //About "about.thanks": "著重感謝 Cider Collective 的成員以及所有為項目付出的貢獻者。" -} \ No newline at end of file +} From 0161a6063a5ae96494808488da14b160d646a5eb Mon Sep 17 00:00:00 2001 From: Crystal <55697230+crystalshower@users.noreply.github.com> Date: Tue, 8 Feb 2022 22:45:12 +0700 Subject: [PATCH 47/54] grammar improvement (#379) --- src/i18n/in_ID.jsonc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/in_ID.jsonc b/src/i18n/in_ID.jsonc index 91e63524..d9d28529 100644 --- a/src/i18n/in_ID.jsonc +++ b/src/i18n/in_ID.jsonc @@ -147,7 +147,7 @@ "home.title": "Beranda", "home.recentlyPlayed": "Baru Dimainkan", "home.recentlyAdded": "Baru Ditambahkan", - "home.artistsFeed": "Artists Feed Anda", + "home.artistsFeed": "Feed Artis Anda", "home.artistsFeed.noArtist": "Ikuti beberapa artis terlebih dahulu dan rilisan terbaru mereka akan ada di sini", "home.madeForYou": "Dibuat Untuk Kamu", "home.friendsListeningTo": "Teman Sedang Mendengarkan", @@ -249,7 +249,7 @@ "settings.header.audio.quality.standard.description": "64 kbps", "settings.option.audio.seamlessTransition": "Transisi Audio Mulus", // Toggle "settings.option.audio.enableAdvancedFunctionality": "Aktifkan Fungsi Lanjutan", // Toggle - "settings.option.audio.enableAdvancedFunctionality.description": "Mengaktifkan fungsionalitas AudioContext memungkinkan fitur audio yang lanjutan seperti Normalisasi Audio, Equalizer dan Visualizer. Namun pada beberapa perangkat dapat menyebabkan tersendatnya audio.", + "settings.option.audio.enableAdvancedFunctionality.description": "Mengaktifkan fungsionalitas AudioContext memungkinkan fitur audio lanjutan seperti Normalisasi Audio, Equalizer dan Visualizer. Namun pada beberapa perangkat dapat menyebabkan tersendatnya audio.", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Peningkatan Psikoakustik yang membuat semuanya terdengar lebih jelas dan lebih hidup | Dirancang oleh Maikiwi.", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Kekuatan CAP", // Toggle From 7230ecb0808345ee9dc9f90e626515610e1f12c4 Mon Sep 17 00:00:00 2001 From: KaHim Chan Date: Tue, 8 Feb 2022 23:45:59 +0800 Subject: [PATCH 48/54] Irregular update 08/02 (#378) --- src/i18n/README.md | 24 +- src/i18n/de_DE.jsonc | 20 +- src/i18n/el_GR.jsonc | 22 +- src/i18n/en_HODOR.jsonc | 17 +- src/i18n/en_OWO.jsonc | 6 +- src/i18n/en_PISS.jsonc | 4 +- src/i18n/en_SGA.jsonc | 25 +- src/i18n/en_US.jsonc | 14 +- src/i18n/es_ES.jsonc | 6 +- src/i18n/fr_CA.jsonc | 16 +- src/i18n/fr_FR.jsonc | 696 +++++++++++++------------- src/i18n/hu_HU.jsonc | 4 +- src/i18n/it_IT.jsonc | 15 +- src/i18n/ja_JP.jsonc | 21 +- src/i18n/ko_KR.jsonc | 4 +- src/i18n/pt_BR.jsonc | 37 +- src/i18n/sv_SE.jsonc | 6 +- src/i18n/tr_TR.jsonc | 18 +- src/i18n/zh_CN.jsonc | 20 +- src/i18n/zh_HK.jsonc | 71 +-- src/i18n/zh_TW.jsonc | 15 +- src/i18n/zh_yue.jsonc | 10 +- src/renderer/index.js | 8 +- src/renderer/views/pages/about.ejs | 6 + src/renderer/views/pages/settings.ejs | 4 +- 25 files changed, 617 insertions(+), 472 deletions(-) diff --git a/src/i18n/README.md b/src/i18n/README.md index 1f5d47d4..db061fbd 100644 --- a/src/i18n/README.md +++ b/src/i18n/README.md @@ -1,4 +1,4 @@ -# Cider i18n +# Cider i18n Notices & Changelog Some notes about Cider's i18n support. @@ -21,7 +21,7 @@ been modified, the ones not mentioned in the list need modifying. * `term.sharedPlaylists`: "Shared Playlists" - Added for `en_US`. * `term.people`: "People" - Added for `en_US`. -Updated 02/02/2022 17:16 UTC +Update 02/02/2022 17:16 UTC * `term.newpreset.name`: Added for `en_US`. * `term.addedpreset`: Added for `en_US`. @@ -38,7 +38,7 @@ Updated 02/02/2022 17:16 UTC * `action.newpreset`: Added for `en_US`. * `action.deletepreset`: Added for `en_US`. -Updated 04/02/2022 10:00 UTC +Update 04/02/2022 10:00 UTC * `term.history`: Added for `en_US`. * `action.copy`: Added for `en_US`. @@ -64,4 +64,20 @@ Update 06/02/2022 10:35 UTC * `settings.header.audio.quality.high.description`: Added for `en_US`. * `settings.header.audio.quality.auto`: Removed as default for MusicKit is 256. * `settings.header.audio.quality.standard`: Replaced `settings.header.audio.quality.low` to match MusicKit naming. -* `settings.header.audio.quality.standard.description`: Added for `en_US`. \ No newline at end of file +* `settings.header.audio.quality.standard.description`: Added for `en_US`. + +Update 08/02/2022 10:20 UTC + +* `settings.option.general.updateCider`: Added for `en_US`. +* `settings.option.general.updateCider.branch`: Added for `en_US`. +* `settings.option.general.updateCider.branch.description`: Added for `en_US`. +* `settings.option.general.updateCider.branch.main`: Added for `en_US`. +* `settings.option.general.updateCider.branch.develop`: Added for `en_US`. +* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength`: Added for `en_US`. +* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description`: Added for `en_US`. +* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard`: Added for `en_US`. +* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive`: Added for `en_US`. +* `settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility`: Added for `en_US`. +* `settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility`: Added for `en_US`. +* `term.requestError`: Added for `en_US`. +* `term.song.link.generate`: Added for `en_US`. \ No newline at end of file diff --git a/src/i18n/de_DE.jsonc b/src/i18n/de_DE.jsonc index b5ef5017..57c29597 100644 --- a/src/i18n/de_DE.jsonc +++ b/src/i18n/de_DE.jsonc @@ -1,7 +1,7 @@ -{ // Base File +{ // i18n Info - "i18n.languageName": "Deutsch", // name of language in native language + "i18n.languageName": "Deutsch", // name of language in native language "i18n.languageNameEnglish": "German", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@motz0815", // Authors, if you contribute to this file feel free to add your name seperated with a space @@ -19,6 +19,7 @@ "notification.updatingLibrarySongs": "Aktualisiere Songs...", "notification.updatingLibraryAlbums": "Aktualisiere Alben...", "notification.updatingLibraryArtists": "Aktualisiere Künstler...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -117,7 +118,6 @@ "term.tracks": "Lieder", // Assume x amount of tracks. e.g. 50 tracks "term.videos": "Videos", "term.menu": "Menü", - "action.showAlbum": "Zeige ganzes Album", // Home "home.title": "Home", @@ -128,13 +128,14 @@ "home.madeForYou": "Für dich gemacht", "home.friendsListeningTo": "Freunde hören", "home.followedArtists": "Gefolgte Künstler", + // Errors "error.appleMusicSubRequired": "Apple Music benötigt ein Abonnement.", "error.connectionError": "Es ist ein Fehler aufgetreten, während sich mit Apple Music verbunden wurde.", "error.noResults": "Keine Ergebnisse.", "error.noResults.description": "Versuche einen anderen Suchbegriff.", - //Podcasts + // Podcasts "podcast.followOnCider": "Folge auf Cider", "podcast.followedOnCider": "Gefolgt auf Cider", "podcast.subscribeOnItunes": "Folge auf iTunes", @@ -183,6 +184,7 @@ "action.removeTracks": "Entferne ${self.selectedItems.length} Lieder aus der Warteschlange", "action.import": "Importieren", "action.export": "Exportieren", + "action.showAlbum": "Zeige ganzes Album", // Settings - General "settings.header.general": "Allgemein", @@ -193,6 +195,8 @@ "settings.option.general.language.main": "Sprachen", "settings.option.general.language.fun": "Lustige Sprachen", "settings.option.general.language.unsorted": "Unsortiert", + + // Update Cider // Settings - Audio "settings.header.audio": "Audio", @@ -208,6 +212,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalisiert die Lautstärke aller Lieder, um die Hörerfahrung einheitlicher zu machen.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Räumliches Audio", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Macht die Musik räumlicher (3D-Effekt) (Beachte: Dies ist kein Dolby Atmos)", + // Settings - Visual "settings.header.visual": "Visuell", "settings.header.visual.description": "Passe die visuellen Einstellungen für Cider an.", @@ -230,6 +235,9 @@ "settings.option.visual.hardwareAcceleration.description": "Erfordert Neustart der Anwendung", "settings.header.visual.hardwareAcceleration.default": "Normal", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Persönliche Daten anzeigen", // Toggle @@ -265,8 +273,8 @@ "settings.option.experimental.closeButtonBehaviour.quit": "Cider Schließen", "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "In Taskleiste minimieren", "settings.option.experimental.closeButtonBehaviour.minimizeTray": "In den Tray minimieren", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.spatialProperties" : "Räumliche Einstellungen", "spatial.width" : "Breite", @@ -296,4 +304,4 @@ // About "about.thanks": "Vielen lieben Dank an das Cider Collective Team und an alle Mithelfer." -} +} \ No newline at end of file diff --git a/src/i18n/el_GR.jsonc b/src/i18n/el_GR.jsonc index ca100520..9ab932d7 100644 --- a/src/i18n/el_GR.jsonc +++ b/src/i18n/el_GR.jsonc @@ -1,10 +1,10 @@ { // i18n Info - "i18n.languageName": "Ελληνικά", - "i18n.languageNameEnglish": "Greek", - "i18n.category": "main", - "i18n.authors": "@down-bad", + "i18n.languageName": "Ελληνικά", // name of language in native language + "i18n.languageNameEnglish": "Greek", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "@down-bad", // Authors, if you contribute to this file feel free to add your name seperated with a space // App info "app.name": "Cider", @@ -19,6 +19,7 @@ "notification.updatingLibrarySongs": "Ενημέρωση βιβλιοθήκης τραγουδιών...", "notification.updatingLibraryAlbums": "Ενημέρωση βιβλιοθήκης άλμπουμ...", "notification.updatingLibraryArtists": "Ενημέρωση βιβλιοθήκης καλλιτεχνών...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -117,7 +118,6 @@ "term.tracks": "τραγούδια", // Assume x amount of tracks. e.g. 50 tracks "term.videos": "Βίντεο", "term.menu": "Μενού", - "action.showAlbum": "Εμφάνιση ολόκληρου άλμπουμ", // Home "home.title": "Αρχική", @@ -128,13 +128,14 @@ "home.madeForYou": "Δημιουργήθηκε για εσάς", "home.friendsListeningTo": "Οι φίλοι σου ακούν", "home.followedArtists": "Καλλιτέχνες που ακολουθείτε", + // Errors "error.appleMusicSubRequired": "Το Apple Music απαιτεί μια συνδρομή.", "error.connectionError": "Δεν είναι δυνατή η σύνδεση με το Apple Music.", "error.noResults": "Κανένα αποτέλεσμα.", "error.noResults.description": "Δοκιμάστε μια νέα αναζήτηση.", - //Podcasts + // Podcasts "podcast.followOnCider": "Ακολούθηση στο Cider", "podcast.followedOnCider": "Ακολουθείτε στο Cider", "podcast.subscribeOnItunes": "Συνδρομή στο iTunes", @@ -183,6 +184,7 @@ "action.removeTracks": "Αφαίρεση ${self.selectedItems.length} τραγουδιών από την ουρά", "action.import": "Εισαγωγή", "action.export": "Εξαγωγή", + "action.showAlbum": "Εμφάνιση ολόκληρου άλμπουμ", // Settings - General "settings.header.general": "Γενικά", @@ -193,6 +195,8 @@ "settings.option.general.language.main": "Γλώσσες", "settings.option.general.language.fun": "Γλώσσες για πλάκα", "settings.option.general.language.unsorted": "Αταξινόμητες", + + // Update Cider // Settings - Audio "settings.header.audio": "Ήχος", @@ -208,6 +212,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Κανονικοποιεί την ένταση για μεμονωμένα κομμάτια για μια πιο ομοιόμορφη εμπειρία ακρόασης.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Χωρικοποίηση Ήχου", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Πιο τρισδιάστατος και χωρικοποιημένος ήχος (σημείωση: Αυτό δεν είναι Dolby Atmos)", + // Settings - Visual "settings.header.visual": "Οπτικά", "settings.header.visual.description": "Προσαρμογή οπτικών ρυθμίσεων για το Cider.", @@ -230,6 +235,9 @@ "settings.option.visual.hardwareAcceleration.description": "Απαιτεί επανεκκίνηση", "settings.header.visual.hardwareAcceleration.default": "Προεπιλογή", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Εμφάνιση προσωπικών στοιχείων", // Toggle @@ -265,8 +273,8 @@ "settings.option.experimental.closeButtonBehaviour.quit": "Έξοδος του Cider", "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "Ελαχιστοποίηση στη γραμμή εργασιών", "settings.option.experimental.closeButtonBehaviour.minimizeTray": "Ελαχιστοποίηση στη γωνία γραμμής εργασιών", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.spatialProperties" : "Χωρικές Ιδιότητες", "spatial.width" : "Πλάτος", diff --git a/src/i18n/en_HODOR.jsonc b/src/i18n/en_HODOR.jsonc index e925e968..57014914 100644 --- a/src/i18n/en_HODOR.jsonc +++ b/src/i18n/en_HODOR.jsonc @@ -1,7 +1,7 @@ { // HODOR // i18n Info - "i18n.languageName": "HODOR", // name of language in native language + "i18n.languageName": "HODOR", // name of language in native language "i18n.languageNameEnglish": "HODOR", // name of language in English "i18n.category": "fun", // main = real language, fun = fun community languages "i18n.authors": "HODOR", // Authors, if you contribute to this file feel free to add your name seperated with a space @@ -19,6 +19,7 @@ "notification.updatingLibrarySongs": "UPDATING HODOR HODORS...", "notification.updatingLibraryAlbums": "UPDATING HODOR HODORBUMS...", "notification.updatingLibraryArtists": "UPDATING HODOR HODORTISTS...", + // Terms "term.appleInc": "HODOR Inc.", "term.appleMusic": "HODOR MUSIC", @@ -139,7 +140,7 @@ "error.noResults": "NO HODOR.", "error.noResults.description": "TRY NEW HODOR.", - //Podcasts + // Podcasts "podcast.followOnCider": "FOLLOW ON HODOR", "podcast.followedOnCider": "FOLLOWING ON HODOR", "podcast.subscribeOnItunes": "SUBSCRIBE ON iHODOR", @@ -190,12 +191,11 @@ "action.import": "HODOR IN", "action.export": "HODOR OUT", "action.showAlbum": "SHOW HODOR HODOR", - // Waiting on Core for moving plugin to app.ts "action.tray.minimize": "HODOR TO TRAY", "action.tray.quit": "HODOR", "action.tray.show": "SEE", - // Settings - General (Reserved) + // Settings - General "settings.header.general": "HODORAL", "settings.header.general.description": "HODOR HODORAL HODOR FOR HODOR.", "settings.option.general.language": "HODOR SPEAKS", @@ -205,6 +205,8 @@ "settings.option.general.language.fun": "HODOR HODORS", "settings.option.general.language.unsorted": "NO HODORS", + // Update Cider + // Settings - Audio "settings.header.audio": "HODOR HEARS", "settings.header.audio.description": "ADJUST HODOR EARS FOR HODOR HODOR.", @@ -219,6 +221,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "NORMALIZES HODOR VOLUME FOR INDIVIDUAL HODORS TO HODOR A MORE HODOR LISTENING HODOR.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "HODOR SPATIALIZATION", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "SPATIALIZE HODOR AND MAKE HODOR MORE 3-HODOR (HODOR: THIS IS NOT HODOR ATMOS)", + // Settings - Visual "settings.header.visual": "HODOR SEES", "settings.header.visual.description": "ADJUST HODOR EYES FOR HODOR.", @@ -241,6 +244,9 @@ "settings.option.visual.hardwareAcceleration.description": "NEED RE HODOR", "settings.header.visual.hardwareAcceleration.default": "HODOR.", "settings.header.visual.hardwareAcceleration.webGPU": "WEB HODOR!!", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "SHOW HODOR NAME?", // Toggle @@ -276,8 +282,8 @@ "settings.option.experimental.closeButtonBehaviour.quit": "END HODOR", "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "MINIMIZE HODOR TO HODORBAR", "settings.option.experimental.closeButtonBehaviour.minimizeTray": "MINIMIZE HODOR TO HODORAY", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.notTurnedOn": "HODOR SPATIALIZATION IS HODOR. TO HODOR, PLEASE HODOR IT HODOR.", "spatial.spatialProperties" : "SPATIAL HODOR", @@ -308,5 +314,4 @@ //About "about.thanks": "HODOR THANKS TO THE HODOR TEAM AND ALL OF OUR HODORS." - } \ No newline at end of file diff --git a/src/i18n/en_OWO.jsonc b/src/i18n/en_OWO.jsonc index 7e15e260..95c680e9 100644 --- a/src/i18n/en_OWO.jsonc +++ b/src/i18n/en_OWO.jsonc @@ -1,4 +1,5 @@ -{ // Base File +{ + // i18n Info "i18n.languageName": "Engwish (OwO)", // name of language in native language "i18n.languageNameEnglish": "Engwish (OwO)", // name of language in English @@ -280,6 +281,9 @@ "settings.option.visual.hardwareAcceleration.description": "Wequiwes wewaunch", "settings.header.visual.hardwareAcceleration.default": "Defauwt", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Show Pewsonaw Info", // Toggle diff --git a/src/i18n/en_PISS.jsonc b/src/i18n/en_PISS.jsonc index 619ca375..b83885ac 100644 --- a/src/i18n/en_PISS.jsonc +++ b/src/i18n/en_PISS.jsonc @@ -1,4 +1,5 @@ -{ // Base File +{ + // i18n Info "i18n.languageName": "piss", // name of language in native language "i18n.languageNameEnglish": "English (piss)", // name of language in English @@ -280,6 +281,7 @@ // Settings - Visual - Theme name "settings.option.visual.theme.default": "regular piss", "settings.option.visual.theme.dark": "black piss", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "show yourself to the pissiverse", // Toggle diff --git a/src/i18n/en_SGA.jsonc b/src/i18n/en_SGA.jsonc index a04520b5..2174befe 100644 --- a/src/i18n/en_SGA.jsonc +++ b/src/i18n/en_SGA.jsonc @@ -1,4 +1,5 @@ { + // i18n Info "i18n.languageName": "┤ᖋ|:ᖋᔮᒣ╎ᔮ ᖋ|:i!⍑ᖋᕊᒷᒣ", // name of language in native language "i18n.languageNameEnglish": "Galactic Alphabet", // name of language in English @@ -134,6 +135,8 @@ "term.addedpreset": "ᖋ↸↸ᒷ↸ i!∷ᒷϟᒷᒣ", "term.deletepreset.warn": "ᖋ∷ᒷ ॥ᒍ⚍ ϟ⚍∷ᒷ ॥ᒍ⚍ ∴ᖋリᒣ ᒣᒍ ↸ᒷ|:ᒷᒣᒷ ᒣ⍑╎ϟ i!∷ᒷϟᒷᒣ?", "term.deletedpreset": "∷ᒷᒲᒍ⍊ᒷ↸ i!∷ᒷϟᒷᒣ", + "term.requestError": "ᒣ⍑ᒷ∷ᒷ ∴ᖋϟ ᖋ i!∷ᒍᕊ|:ᒷᒲ ∴╎ᒣ⍑ ᒣ⍑ᒷ ∷ᒷᑑ⚍ᒷϟᒣ.", + "term.song.link.generate": "┤ᒷᒣᒣ╎リ┤ ϟᒍリ┤.|:╎リ·ǀ· ϟ⍑ᖋ∷ᒷ ⚍∷|:...", "term.musicVideos": "ᒲ⚍ϟ╎ᔮ ⍊╎↸ᒷᒍϟ", // Search page friendlyTypes "term.stations": "ϟᒣᖋᒣ╎ᒍリϟ", "term.curators": "ᔮ⚍∷ᖋᒣᒍ∷ϟ", @@ -230,6 +233,10 @@ // Update Cider "settings.option.general.updateCider": "⚍i!↸ᖋᒣᒷ ᔮ╎↸ᒷ∷", + "settings.option.general.updateCider.branch": "ᔮ╎↸ᒷ∷ ⚍i!↸ᖋᒣᒷ ᕊ∷ᖋリᔮ⍑", // Dropdown + "settings.option.general.updateCider.branch.description": "ϟᒷ|:ᒷᔮᒣ ᒣ⍑ᒷ ᕊ∷ᖋリᔮ⍑ ᒣᒍ ⚍i!↸ᖋᒣᒷ ᔮ╎↸ᒷ∷ ᒣᒍ", + "settings.option.general.updateCider.branch.main": "ϟᒣᖋᕊ|:ᒷ", + "settings.option.general.updateCider.branch.develop": "↸ᒷ⍊ᒷ|:ᒍi!ᒲᒷリᒣ", // Settings - Audio "settings.header.audio": "ᖋ⚍↸╎ᒍ", @@ -240,18 +247,25 @@ "settings.header.audio.quality.lossless": "|:ᒍϟϟ|:ᒷϟϟ", "settings.header.audio.quality.lossless.description": "(⚍i! ᒣᒍ 24-ᕊ╎ᒣ/48 ·ǀ·⍑∩)", "settings.header.audio.quality.high": "⍑╎┤⍑", - "settings.header.audio.quality.low": "|:ᒍ∴", - "settings.header.audio.quality.auto": "ᖋ⚍ᒣᒍ", + "settings.header.audio.quality.high.description": "256 ·ǀ·ᕊi!ϟ", + "settings.header.audio.quality.standard": "ϟᒣᖋリ↸ᖋ∷↸", + "settings.header.audio.quality.standard.description": "64 ·ǀ·ᕊi!ϟ", "settings.option.audio.seamlessTransition": "ϟᒷᖋᒲ|:ᒷϟϟ ᖋ⚍↸╎ᒍ ᒣ∷ᖋリϟ╎ᒣ╎ᒍリ", // Toggle "settings.option.audio.enableAdvancedFunctionality": "ᒷリᖋᕊ|:ᒷ ᖋ↸⍊ᖋリᔮᒷ↸ ⎓⚍リᔮᒣ╎ᒍリᖋ|:╎ᒣ॥", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "ᒷリᖋᕊ|:╎リ┤ ᖋ⚍↸╎ᒍᔮᒍリᒣᒷ/ᒣ ⎓⚍リᔮᒣ╎ᒍリᖋ|:╎ᒣ॥ ∴╎|:|: ᖋ|:|:ᒍ∴ ⎓ᒍ∷ ᒷ/ᒣᒷリ↸ᒷ↸ ᖋ⚍↸╎ᒍ ⎓ᒷᖋᒣ⚍∷ᒷϟ |:╎·ǀ·ᒷ ᖋ⚍↸╎ᒍ リᒍ∷ᒲᖋ|:╎∩ᖋᒣ╎ᒍリ , ᒷᑑ⚍ᖋ|:╎∩ᒷ∷ϟ ᖋリ↸ ⍊╎ϟ⚍ᖋ|:╎∩ᒷ∷ϟ, ⍑ᒍ∴ᒷ⍊ᒷ∷ ᒍリ ϟᒍᒲᒷ ϟ॥ϟᒣᒷᒲϟ ᒣ⍑╎ϟ ᒲᖋ॥ ᔮᖋ⚍ϟᒷ ϟᒣ⚍ᒣᒣᒷ∷╎リ┤ ╎リ ᖋ⚍↸╎ᒍ ᒣ∷ᖋᔮ·ǀ·ϟ.", - "settings.option.audio.enableAdvancedFunctionality.decryptLLPW": "↸ᒷᔮ∷॥i!ᒣ |:ᒍϟϟ|:ᒷϟϟ i!|:ᖋ॥ᕊᖋᔮ·ǀ· ∴ᒍ∷·ǀ·⎓|:ᒍ∴", // Toggle - "settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description": "ᒷリᖋᕊ|:ᒷϟ ᒣ⍑ᒷ ᖋᕊ╎|:╎ᒣ॥ ⎓ᒍ∷ ᔮ╎↸ᒷ∷ ᒣᒍ ↸ᒷᔮ∷॥i!ᒣ |:ᒍϟϟ|:ᒷϟϟ ᖋ⚍↸╎ᒍ ⎓╎|:ᒷϟ. ᖋ ᒲ╎リᒍ∷ i!ᒷ∷⎓ᒍ∷ᒲᖋリᔮᒷ ⍑╎ᒣ ∴╎|:|: ᒍᔮᔮ⚍∷.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "ᔮ╎↸ᒷ∷ ᖋ↸∷ᒷリᖋ|:╎リᒷ i!∷ᒍᔮᒷϟϟᒍ∷™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "i!ϟ॥ᔮ⍑ᒍᖋᔮᒍ⚍ϟᒣ╎ᔮ ᒷリ⍑ᖋリᔮᒷᒲᒷリᒣϟ ᒣ⍑ᖋᒣ ᒲᖋ·ǀ·ᒷϟ ᒷ⍊ᒷ∷॥ᒣ⍑╎リ┤ ϟᒍ⚍リ↸ ᕊᒍᒣ⍑ ∷╎ᔮ⍑ᒷ∷ ᖋリ↸ ᒲᒍ∷ᒷ |:╎⍊ᒷ|:॥ | ↸ᒷϟ╎┤リᒷ↸ ᕊ॥ ᒲᖋ╎·ǀ·╎∴╎.", + "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "ᔮᖋi! ╎ϟ リᒍᒣ ᔮᒍᒲi!ᖋᒣ╎ᕊ|:ᒷ ∴╎ᒣ⍑ ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ. i!|:ᒷᖋϟᒷ ↸╎ϟᖋᕊ|:ᒷ ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ ᒣᒍ ᔮᒍリᒣ╎リ⚍ᒷ.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "ᔮᖋi! ϟᒣ∷ᒷリ┤ᒣ⍑", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "ᔮ⍑ᖋリ┤ᒷϟ ᒣ⍑ᒷ ϟᒣ∷ᒷリ┤ᒣ⍑ ᒍ⎓ ᒣ⍑ᒷ i!∷ᒍᔮᒷϟϟ╎リ┤ ↸ᒍリᒷ ᒣᒍ ᒣ⍑ᒷ ᖋ⚍↸╎ᒍ. (ᖋ┤┤∷ᒷϟϟ╎⍊ᒷ ᒲᖋ॥ ॥╎ᒷ|:↸ ⚍リ↸ᒷϟ╎∷ᖋᕊ|:ᒷ ∷ᒷϟ⚍|:ᒣϟ)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "ϟᒣᖋリ↸ᖋ∷↸", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "ᖋ┤┤∷ᒷϟϟ╎⍊ᒷ", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ᖋ⚍↸╎ᒍ リᒍ∷ᒲᖋ|:╎∩ᖋᒣ╎ᒍリ", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "リᒍ∷ᒲᖋ|:╎∩ᒷϟ i!ᒷᖋ·ǀ· ⍊ᒍ|:⚍ᒲᒷ ⎓ᒍ∷ ╎リ↸╎⍊╎↸⚍ᖋ|: ᒣ∷ᖋᔮ·ǀ·ϟ ᒣᒍ ᔮ∷ᒷᖋᒣᒷ ᖋ ᒲᒍ∷ᒷ ⚍リ╎⎓ᒍ∷ᒲ |:╎ϟᒣᒷリ╎リ┤ ᒷ/i!ᒷ∷╎ᒷリᔮᒷ.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ᖋ⚍↸╎ᒍ ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "ϟi!ᖋᒣ╎ᖋ|:╎∩ᒷ ᖋ⚍↸╎ᒍ ᖋリ↸ ᒲᖋ·ǀ·ᒷ ᖋ⚍↸╎ᒍ ᒲᒍ∷ᒷ 3-↸╎ᒲᒷリϟ╎ᒍリᖋ|: (リᒍᒣᒷ: ᒣ⍑╎ϟ ╎ϟ リᒍᒣ ↸ᒍ|:ᕊ॥ ᖋᒣᒲᒍϟ)", - + "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ ╎ϟ リᒍᒣ ᔮᒍᒲi!ᖋᒣ╎ᕊ|:ᒷ ∴╎ᒣ⍑ ᔮᖋi!. i!|:ᒷᖋϟᒷ ↸╎ϟᖋᕊ|:ᒷ ᔮᖋi! ᒣᒍ ᔮᒍリᒣ╎リ⚍ᒷ.", + // Settings - Visual "settings.header.visual": "⍊╎ϟ⚍ᖋ|:", "settings.header.visual.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ⍊╎ϟ⚍ᖋ| ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.", @@ -279,6 +293,7 @@ // Settings - Visual - Theme name "settings.option.visual.theme.default": "ᔮ╎↸ᒷ∷", "settings.option.visual.theme.dark": "↸ᖋ∷·ǀ·", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "ϟ⍑ᒍ∴ i!ᒷ∷ϟᒍリᖋ|: ╎リ⎓ᒍ", // Toggle diff --git a/src/i18n/en_US.jsonc b/src/i18n/en_US.jsonc index 2bce04b9..b4369a35 100644 --- a/src/i18n/en_US.jsonc +++ b/src/i18n/en_US.jsonc @@ -1,9 +1,10 @@ { // Base File + // i18n Info "i18n.languageName": "English (US)", // name of language in native language "i18n.languageNameEnglish": "English (US)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space + "i18n.authors": "@maikirakiwi @kyw504100", // Authors, if you contribute to this file feel free to add your name seperated with a space // App info "app.name": "Cider", @@ -134,6 +135,8 @@ "term.addedpreset": "Added Preset", "term.deletepreset.warn": "Are you sure you want to delete this preset?", "term.deletedpreset": "Removed preset", + "term.requestError": "There was a problem with the request.", + "term.song.link.generate": "Getting song.link share URL...", "term.musicVideos": "Music Videos", // Search page friendlyTypes "term.stations": "Stations", "term.curators": "Curators", @@ -252,6 +255,7 @@ "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization , Equalizers and Visualizers, however on some systems this may cause stuttering in audio tracks.", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes everything sound both richer and more lively | Designed by Maikiwi.", + "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP is not compatible with Spatialization. Please disable Spatialization to continue.", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard", @@ -260,6 +264,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialize audio and make audio more 3-dimensional (note: This is not Dolby Atmos)", + "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization is not compatible with CAP. Please disable CAP to continue.", // Settings - Visual "settings.header.visual": "Visual", @@ -288,6 +293,7 @@ // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "Dark", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Show Personal Info", // Toggle @@ -344,14 +350,14 @@ "spatial.down": "Down", "spatial.listener": "Listener", "spatial.audioSource": "Audio Source", - + // Settings - Unfinished "settings.header.unfinished": "Unfinished", - + // Web Remote "remote.web.title": "Cider Remote", "remote.web.description": "Scan the QR code to pair your phone up with this Cider instance", - + // About "about.thanks": "Major thanks to the Cider Collective Team and all of our contributors." } \ No newline at end of file diff --git a/src/i18n/es_ES.jsonc b/src/i18n/es_ES.jsonc index 9a0bf149..89845ac3 100644 --- a/src/i18n/es_ES.jsonc +++ b/src/i18n/es_ES.jsonc @@ -1,4 +1,5 @@ -{ // Base File +{ + // i18n Info "i18n.languageName": "Español (ES)", // name of language in native language "i18n.languageNameEnglish": "Spanish (Spain)", // name of language in English @@ -248,6 +249,9 @@ "settings.option.visual.hardwareAcceleration.description": "La app requiere reinicio", "settings.header.visual.hardwareAcceleration.default": "Por defecto", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Mostrar información personal", // Toggle diff --git a/src/i18n/fr_CA.jsonc b/src/i18n/fr_CA.jsonc index 132cf845..c05df4c7 100644 --- a/src/i18n/fr_CA.jsonc +++ b/src/i18n/fr_CA.jsonc @@ -1,7 +1,7 @@ -{ // Base File +{ // i18n Info - "i18n.languageName": "Français (CA)", // name of language in native language + "i18n.languageName": "Français (CA)", // name of language in native language "i18n.languageNameEnglish": "French (CA)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "brock#7527", // Authors, if you contribute to this file feel free to add your name seperated with a space @@ -19,6 +19,7 @@ "notification.updatingLibrarySongs": "Rafraîchir des chansons...", "notification.updatingLibraryAlbums": "Rafraîchir des albums...", "notification.updatingLibraryArtists": "Rafraîchir des artistes...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -128,13 +129,14 @@ "home.madeForYou": "Creér pour toi", "home.friendsListeningTo": "Amis écoutant", "home.followedArtists": "Artistes suivis", + // Errors "error.appleMusicSubRequired": "Apple Music nécessite un abonnement.", "error.connectionError": "Un problème est survenu lors de la connexion à Apple Music.", "error.noResults": "Pas de resultats.", "error.noResults.description": "Essayez une nouvelle recherche.", - //Podcasts + // Podcasts "podcast.followOnCider": "Suivez sur Cider", "podcast.followedOnCider": "Suivi sur Cider", "podcast.subscribeOnItunes": "S'abonner sur iTunes", @@ -193,6 +195,8 @@ "settings.option.general.language.main": "Langue", "settings.option.general.language.fun": "Langues amusantes", "settings.option.general.language.unsorted": "Non trié", + + // Update Cider // Settings - Audio "settings.header.audio": "Audio", @@ -208,6 +212,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour créer une expérience d'écoute plus uniforme.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialisez l'audio et rendez l'audio plus tridimensionnel (remarque: il ne s'agit pas de Dolby Atmos)", + // Settings - Visual "settings.header.visual": "Visuel", "settings.header.visual.description": "Ajustez les réglages visuels de Cider.", @@ -230,6 +235,9 @@ "settings.option.visual.hardwareAcceleration.description": "Nécessite une relance", "settings.header.visual.hardwareAcceleration.default": "Défaut", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Afficher les informations personnelles", // Toggle @@ -265,8 +273,8 @@ "settings.option.experimental.closeButtonBehaviour.quit": "Quitter Cider", "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "Réduire à la barre des tâches", "settings.option.experimental.closeButtonBehaviour.minimizeTray": "Réduire dans le bac", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.spatialProperties" : "Propriétés spatiales", "spatial.width" : "Largeur", diff --git a/src/i18n/fr_FR.jsonc b/src/i18n/fr_FR.jsonc index cf05144b..910f23c7 100644 --- a/src/i18n/fr_FR.jsonc +++ b/src/i18n/fr_FR.jsonc @@ -1,349 +1,351 @@ -{ // Base File - // i18n Info - "i18n.languageName": "Français", // name of language in native language - "i18n.languageNameEnglish": "French", // name of language in English - "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@ErwanGit", // Authors, if you contribute to this file feel free to add your name seperated with a space - - // App info - "app.name": "Cider", - - "date.format": "${d} ${m} ${y}", - - // Dialogs - "dialog.cancel": "Annuler", - "dialog.ok": "OK", - - // Notification - "notification.updatingLibrarySongs": "Mise à jour des chansons de la bibliothèque...", - "notification.updatingLibraryAlbums": "Mise à jour des albums de la bibliothèque...", - "notification.updatingLibraryArtists": "Mise à jour des artistes de la bibliothèque...", - - // Terms - "term.appleInc": "Apple Inc.", - "term.appleMusic": "Apple Music", - "term.applePodcasts": "Apple Podcasts", - "term.itunes": "iTunes", - "term.github": "GitHub", - "term.discord": "Discord", - "term.learnMore": "En savoir plus", - "term.accountSettings": "Paramètres du compte", - "term.logout": "Déconnexion", - "term.login": "Connexion", - "term.about": "À propos", - "term.privateSession": "Session privée", - "term.queue": "File d'attente", - "term.history": "Historique", - "term.search": "Recherche", - "term.library": "Bibliothèque", - "term.listenNow": "Écoutez maintenant", - "term.browse": "Explorer", - "term.radio": "Radio", - "term.recentlyAdded": "Ajouté récemment", - "term.songs": "Musiques", - "term.albums": "Albums", - "term.artists": "Artistes", - "term.podcasts": "Podcasts", - "term.playlists": "Playlists", - "term.playlist": "Playlist", - "term.newPlaylist": "Nouvelle Playlist", - "term.newPlaylistFolder": "Nouveau dossier de playlist", - "term.createNewPlaylist": "Créer une nouvelle playlist", - "term.createNewPlaylistFolder": "Create New Playlist Folder", - "term.deletePlaylist": "Êtes-vous sûr de vouloir supprimer cette playlist ?", - "term.play": "Lecture", - "term.pause": "Pause", - "term.previous": "Précédent", - "term.next": "Suivant", - "term.shuffle": "Aléatoire", - "term.repeat": "Répéter", - "term.volume": "Volume", - "term.mute": "Rendre muet", - "term.unmute": "Ne plus rendre muet", - "term.share": "Partager", - "term.settings": "Paramètres", - "term.share.success": "Copié dans le presse-papier", - "term.seeAll": "Voir tout", - "term.sortBy": "Trier par", - "term.sortBy.album": "Album", - "term.sortBy.artist": "Artiste", - "term.sortBy.name": "Nom", - "term.sortBy.genre": "Genre", - "term.sortBy.releaseDate": "Date de sortie", - "term.sortBy.duration": "Durée", - "term.sortOrder": "A-Z", - "term.sortOrder.ascending": "Ascendant", - "term.sortOrder.descending": "Descendant", - "term.viewAs": "Voir comme", - "term.viewAs.coverArt": "Pochette d'album", - "term.viewAs.list": "Liste", - "term.size": "Taille", - "term.size.normal": "Normal", - "term.size.compact": "Compacte", - "term.enable": "Activer", - "term.disable": "Désactiver", - "term.enabled": "Activé", - "term.disabled": "Désactivé", - "term.connect": "Connecter", - "term.connecting": "Connexion", - "term.disconnect": "Déconnexion", - "term.authed": "Authentifié", - "term.confirm": "Confirmer ?", - "term.more": "Plus", - "term.less": "Moins", - "term.showMore": "Afficher plus", - "term.showLess": "Afficher moins", - "term.topSongs": "Meilleurs titres", - "term.latestReleases": "Dernières sorties", - "term.time.added": "Ajouté", - "term.time.released": "Publié", - "term.time.updated": "Mis à jour", - "term.time.hours": "heures", - "term.time.hour": "heure", - "term.time.minutes": "minutes", - "term.time.minute": "minute", - "term.time.seconds": "secondes", - "term.time.second": "seconde", - "term.fullscreenView": "Vue plein écran", - "term.defaultView": "Vue par défaut", - "term.spacializedAudioSetting": "Paramètres audio spatialisés", - "term.clearAll": "Tout effacer", - "term.recentStations": "Stations récentes", - "term.language": "Langue", - "term.funLanguages": "Amusant", - "term.noLyrics": "Chargement... / Paroles non trouvé./ Instrumental.", - "term.copyright": "Copyright", - "term.rightsReserved": "Tous droits réservés.", - "term.sponsor": "Soutenez ce projet", - "term.ciderTeam": "Équipe Cider", - "term.developer": "Développeur", - "term.socialTeam": "Équipe de communication", - "term.socials": "Réseaux sociaux", - "term.contributors": "Contributeurs", - "term.equalizer": "Égaliseur", - "term.reset": "Réinitialiser", - "term.tracks": "musiques", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "Vidéos", - "term.menu": "Menu", - "term.check": "Vérifier", - "term.aboutArtist": "À propos de {{artistName}}", // e.g. 'About Doja Cat' - "term.topResult": "Meilleurs résultats", // Search Results - "term.sharedPlaylists": "Playlists partagées", // Search Results - "term.people": "Personnes", // Search Results - "term.newpreset.name": "Nouveau nom du préréglage de l'égaliseur", // Equalizer Preset - "term.addedpreset": "Ajout d'un préréglage", - "term.deletepreset.warn": "Êtes-vous sûr de vouloir supprimer ce préréglage ?", - "term.deletedpreset": "Suppression d'un préréglage", - "term.musicVideos": "Vidéos musicales", // Search page friendlyTypes - "term.stations": "Stations", - "term.curators": "Curateurs", - "term.appleCurators": "Curateurs Apple", - "term.radioShows": "Émissions de radio", - "term.recordLabels": "Labels de disques", - "term.videoExtras": "Vidéos bonus", - "term.top": "Top", - - // Home - "home.title": "Accueil", - "home.recentlyPlayed": "Joué récemment", - "home.recentlyAdded": "Récemment ajouté", - "home.artistsFeed": "Votre file d'artistes", - "home.artistsFeed.noArtist": "Suivez d'abord certains artistes et leurs dernières sorties seront ici", - "home.madeForYou": "Fait pour vous", - "home.friendsListeningTo": "Vos amis écoutent", - "home.followedArtists": "Artistes suivis", - - // Errors - "error.appleMusicSubRequired": "Apple Music nécessite un abonnement.", - "error.connectionError": "Il y a eu un problème de connexion à Apple Music.", - "error.noResults": "Aucun résultat.", - "error.noResults.description": "Essayez une nouvelle recherche.", - - // Podcasts - "podcast.followOnCider": "Suivre sur Cider", - "podcast.followedOnCider": "Suivi sur Cider", - "podcast.subscribeOnItunes": "Suivre sur iTunes", - "podcast.subscribedOnItunes": "Suivi sur iTunes", - "podcast.itunesStore": "iTunes Store", - "podcast.episodes": "Épisodes", - "podcast.playEpisode": "Lire l'épisode", - "podcast.website": "Site du podcast", - - // Actions - "action.addToLibrary": "Ajouter à la bibliothèque", - "action.addToLibrary.success": "Ajouté à la bibliothèque", - "action.addToLibrary.error": "Erreur lors de l'ajout à la bibliothèque", - "action.removeFromLibrary": "Retirer de la bibliothèque", - "action.removeFromLibrary.success": "Retiré de la bibliothèque", - "action.addToQueue": "Ajouter à la file d'attente", - "action.addToQueue.success": "Ajouté à la file d'attente", - "action.addToQueue.error": "Erreur lors de l'ajout à la file d'attente", - "action.removeFromQueue": "Retirer de la file d'attente", - "action.removeFromQueue.success": "Retiré de la file d'attente", - "action.removeFromQueue.error": "Erreur lors du retrait de la file d'attente", - "action.createPlaylist": "Créer une nouvelle playlist", - "action.addToPlaylist": "Ajouter à une playlist", - "action.removeFromPlaylist": "Retirer de la playlist", - "action.addToFavorites": "Ajouter aux favoris", - "action.follow": "Suivre", - "action.follow.success": "Suivi", - "action.follow.error": "Erreur lors de l'abonnement", - "action.unfollow": "Se désabonner", - "action.unfollow.success": "Désabonné", - "action.unfollow.error": "Erreur lors du désabonnement", - "action.playNext": "Jouer après", - "action.playLater": "Jouer plus tard", - "action.startRadio": "Lancer la radio", - "action.goToArtist": "Aller à l'artiste", - "action.goToAlbum": "Aller à l'album", - "action.moveToTop": "Haut de page", - "action.share": "Partager", - "action.rename": "Renommer", - "action.love": "Aimer", - "action.unlove": "Ne plus aimer", - "action.dislike": "Je n'aime pas", - "action.undoDislike": "Je n'aime plus", - "action.showWebRemoteQR": "Afficher le QR Code de la télécommande à distance", - "action.playTracksNext": "Jouer ${app.selectedMediaItems.length} musiques après", - "action.playTracksLater": "Jouer ${app.selectedMediaItems.length} musiques plus tard", - "action.removeTracks": "Retirer ${self.selectedItems.length} musiques de la file d'attente", - "action.import": "Importer", - "action.export": "Exporter", - "action.showAlbum": "Afficher l'album complet", - "action.tray.minimize": "Réduire dans la barre d'outils", - "action.tray.quit": "Quitter", - "action.tray.show": "Afficher", - "action.update": "Mettre à jour", - "action.copy": "Copier", - "action.newpreset": "Nouveau préréglage...", // Equalizer Preset - "action.deletepreset": "Supprimer le préréglage", - - // Settings - General - "settings.header.general": "Général", - "settings.header.general.description": "Ajuster les paramètres généraux de Cider.", - "settings.option.general.language": "Langue", - - // Language optgroups - "settings.option.general.language.main": "Langues", - "settings.option.general.language.fun": "Langues amusantes", - "settings.option.general.language.unsorted": "Non trié", +{ - // Update Cider - "settings.option.general.updateCider": "Mettre à jour Cider", // Button - - // Settings - Audio - "settings.header.audio": "Audio", - "settings.header.audio.description": "Ajuster les paramètres audio de Cider.", - "settings.option.audio.quality": "Qualité Audio", // Dropdown - "settings.header.audio.quality.hireslossless": "Lossless haute qualité (Hi-Res)", - "settings.header.audio.quality.hireslossless.description": "(jusqu'à 24 bits/192 kHz)", - "settings.header.audio.quality.lossless": "Lossless", - "settings.header.audio.quality.lossless.description": "(jusqu'à 24 bits/48 kHz)", - "settings.header.audio.quality.enhanced": "Amélioré", - "settings.header.audio.quality.high": "Élevée", - "settings.header.audio.quality.low": "Faible", - "settings.header.audio.quality.auto": "Automatique", - "settings.option.audio.seamlessTransition": "Fondu audio transparent", // Toggle - "settings.option.audio.enableAdvancedFunctionality": "Activer les fonctions avancées", // Toggle - "settings.option.audio.enableAdvancedFunctionality.description": "L'activation de la fonctionnalité AudioContext permet d'utiliser des fonctions audio étendues telles que la normalisation du son, les égaliseurs et les visualiseurs. Toutefois, sur certains systèmes, cela peut provoquer des bégaiements dans les pistes audio.", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Moteur de traitement psycho-acoustique Cider", // Toggle - "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Un processus de traitement qui fait croire à votre cerveau que les fichiers sont de meilleure qualité.", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisation du son", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour créer une expérience d'écoute plus uniforme.", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spatialisation audio", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialiser l'audio et rendre l'audio plus tridimensionnel (note: Ce n'est pas Dolby Atmos)", - - // Settings - Visual - "settings.header.visual": "Visuel", - "settings.header.visual.description": "Ajuster les paramètres visuels de Cider.", - "settings.option.visual.windowBackgroundStyle": "Style d'arrière-plan de la fenêtre", // Toggle - "settings.header.visual.windowBackgroundStyle.none": "Aucun", - "settings.header.visual.windowBackgroundStyle.artwork": "Pochette d'album", - "settings.header.visual.windowBackgroundStyle.image": "Image", - "settings.option.visual.animatedArtwork": "Pochette d'album animée", // Dropdown - "settings.header.visual.animatedArtwork.always": "Toujours", - "settings.header.visual.animatedArtwork.limited": "Limité aux pages et aux entrées spéciales", - "settings.header.visual.animatedArtwork.disable": "Désactiver partout", - "settings.option.visual.animatedArtworkQuality": "Qualité de la pochette d'album animée", // Dropdown - "settings.header.visual.animatedArtworkQuality.low": "Faible", - "settings.header.visual.animatedArtworkQuality.medium": "Moyen", - "settings.header.visual.animatedArtworkQuality.high": "Élevée", - "settings.header.visual.animatedArtworkQuality.veryHigh": "Très élevée", - "settings.header.visual.animatedArtworkQuality.extreme": "Extrême", - "settings.option.visual.animatedWindowBackground": "Arrière-plan de fenêtre animé", // Toggle - "settings.option.visual.hardwareAcceleration": "Accélération matérielle", // Dropdown - "settings.option.visual.hardwareAcceleration.description": "Nécessite un relancement", - "settings.header.visual.hardwareAcceleration.default": "Défaut", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", - "settings.header.visual.theme": "Thème", - - // Settings - Visual - Theme name - "settings.option.visual.theme.default": "Cider", - "settings.option.visual.theme.dark": "Sombre", - // Refer to term.disabled for the disabled option - "settings.option.visual.showPersonalInfo": "Afficher vos informations personnelles", // Toggle - - // Settings - Lyrics - "settings.header.lyrics": "Paroles", - "settings.header.lyrics.description": "Ajuster les paramètres des paroles pour Cider.", - "settings.option.lyrics.enableMusixmatch": "Activer les paroles Musixmatch", // Toggle - "settings.option.lyrics.enableMusixmatchKaraoke": "Activer le mode karaoké (Musixmatch seulement)", // Toggle - "settings.option.lyrics.musixmatchPreferredLanguage": "Langue préférée pour les traductions Musixmatch", // Dropdown - "settings.option.lyrics.enableYoutubeLyrics": "Activer les paroles YouTube pour les vidéos de musique", // Toggle - - // Settings - Connectivity - "settings.header.connectivity": "Connectivité", - "settings.header.connectivity.description": "Ajuster les paramètres de connectivité de Cider.", - "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown - "settings.option.connectivity.playbackNotifications": "Notifications de lecture", // Toggle - // Refer to term.disabled for the disabled option - "settings.header.connectivity.discordRPC.cider": "Afficher comme 'Cider'", - "settings.header.connectivity.discordRPC.appleMusic": "Afficher comme 'Apple Music'", - "settings.option.connectivity.discordRPC.clearOnPause": "Désactiver le Discord Rich Presence quand la musique est en pause", // Toggle - "settings.option.connectivity.lastfmScrobble": "Scrobble LastFM", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "Délai de Scrobble LastFM (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer la lecture en cours sur LastFM", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer les titres en boucle (LastFM)", - // Refer to term.connect for the connect button - - // Settings - Experimental - "settings.header.experimental": "Expérimental", - "settings.header.experimental.description": "Ajuster les paramètres expérimentaux de Cider.", - "settings.option.experimental.compactUI": "Interface utilisateur compacte", // Toggle - "settings.option.experimental.close_button_hide": "Le bouton de fermeture doit masquer l'application", - "settings.option.experimental.copy_log": "Copier les logs dans le presse-papier", - "settings.option.experimental.inline_playlists": "Playlists et albums en ligne", - - // Refer to term.disabled & term.enabled - // Spatialization Menu - "spatial.notTurnedOn": "La spatialisation audio est désactivée. Pour l'utiliser, vous devez d'abord l'activer.", - "spatial.spatialProperties": "Propriétés spatiales", - "spatial.width": "Largeur", - "spatial.height": "Hauteur", - "spatial.depth": "Profondeur", - "spatial.gain": "Gain", - "spatial.roomMaterials": "Matériaux de la pièce", - "spatial.roomDimensions": "Dimensions de la pièce", - "spatial.roomPositions": "Positions de la pièce", - "spatial.setDimensions": "Définir les dimensions", - "spatial.setPositions": "Définir les positions", - "spatial.up": "Haut", - "spatial.front": "Avant", - "spatial.left": "Gauche", - "spatial.right": "Droite", - "spatial.back": "Retour", - "spatial.down": "Bas", - "spatial.listener": "Auditeur", - "spatial.audioSource": "Source Audio", - - // Settings - Unfinished - "settings.header.unfinished": "Inachevée", - - // Web Remote - "remote.web.title": "Cider à distance", - "remote.web.description": "Scanner le QR code pour associer votre téléphone avec cette instance Cider", - - // About - "about.thanks": "Un grand merci à l'équipe de la Cider Collective et à tous nos contributeurs." + // i18n Info + "i18n.languageName": "Français", // name of language in native language + "i18n.languageNameEnglish": "French", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "@ErwanGit", // Authors, if you contribute to this file feel free to add your name seperated with a space + + // App info + "app.name": "Cider", + + "date.format": "${d} ${m} ${y}", + + // Dialogs + "dialog.cancel": "Annuler", + "dialog.ok": "OK", + + // Notification + "notification.updatingLibrarySongs": "Mise à jour des chansons de la bibliothèque...", + "notification.updatingLibraryAlbums": "Mise à jour des albums de la bibliothèque...", + "notification.updatingLibraryArtists": "Mise à jour des artistes de la bibliothèque...", + + // Terms + "term.appleInc": "Apple Inc.", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", + "term.itunes": "iTunes", + "term.github": "GitHub", + "term.discord": "Discord", + "term.learnMore": "En savoir plus", + "term.accountSettings": "Paramètres du compte", + "term.logout": "Déconnexion", + "term.login": "Connexion", + "term.about": "À propos", + "term.privateSession": "Session privée", + "term.queue": "File d'attente", + "term.history": "Historique", + "term.search": "Recherche", + "term.library": "Bibliothèque", + "term.listenNow": "Écoutez maintenant", + "term.browse": "Explorer", + "term.radio": "Radio", + "term.recentlyAdded": "Ajouté récemment", + "term.songs": "Musiques", + "term.albums": "Albums", + "term.artists": "Artistes", + "term.podcasts": "Podcasts", + "term.playlists": "Playlists", + "term.playlist": "Playlist", + "term.newPlaylist": "Nouvelle Playlist", + "term.newPlaylistFolder": "Nouveau dossier de playlist", + "term.createNewPlaylist": "Créer une nouvelle playlist", + "term.createNewPlaylistFolder": "Create New Playlist Folder", + "term.deletePlaylist": "Êtes-vous sûr de vouloir supprimer cette playlist ?", + "term.play": "Lecture", + "term.pause": "Pause", + "term.previous": "Précédent", + "term.next": "Suivant", + "term.shuffle": "Aléatoire", + "term.repeat": "Répéter", + "term.volume": "Volume", + "term.mute": "Rendre muet", + "term.unmute": "Ne plus rendre muet", + "term.share": "Partager", + "term.settings": "Paramètres", + "term.share.success": "Copié dans le presse-papier", + "term.seeAll": "Voir tout", + "term.sortBy": "Trier par", + "term.sortBy.album": "Album", + "term.sortBy.artist": "Artiste", + "term.sortBy.name": "Nom", + "term.sortBy.genre": "Genre", + "term.sortBy.releaseDate": "Date de sortie", + "term.sortBy.duration": "Durée", + "term.sortOrder": "A-Z", + "term.sortOrder.ascending": "Ascendant", + "term.sortOrder.descending": "Descendant", + "term.viewAs": "Voir comme", + "term.viewAs.coverArt": "Pochette d'album", + "term.viewAs.list": "Liste", + "term.size": "Taille", + "term.size.normal": "Normal", + "term.size.compact": "Compacte", + "term.enable": "Activer", + "term.disable": "Désactiver", + "term.enabled": "Activé", + "term.disabled": "Désactivé", + "term.connect": "Connecter", + "term.connecting": "Connexion", + "term.disconnect": "Déconnexion", + "term.authed": "Authentifié", + "term.confirm": "Confirmer ?", + "term.more": "Plus", + "term.less": "Moins", + "term.showMore": "Afficher plus", + "term.showLess": "Afficher moins", + "term.topSongs": "Meilleurs titres", + "term.latestReleases": "Dernières sorties", + "term.time.added": "Ajouté", + "term.time.released": "Publié", + "term.time.updated": "Mis à jour", + "term.time.hours": "heures", + "term.time.hour": "heure", + "term.time.minutes": "minutes", + "term.time.minute": "minute", + "term.time.seconds": "secondes", + "term.time.second": "seconde", + "term.fullscreenView": "Vue plein écran", + "term.defaultView": "Vue par défaut", + "term.spacializedAudioSetting": "Paramètres audio spatialisés", + "term.clearAll": "Tout effacer", + "term.recentStations": "Stations récentes", + "term.language": "Langue", + "term.funLanguages": "Amusant", + "term.noLyrics": "Chargement... / Paroles non trouvé./ Instrumental.", + "term.copyright": "Copyright", + "term.rightsReserved": "Tous droits réservés.", + "term.sponsor": "Soutenez ce projet", + "term.ciderTeam": "Équipe Cider", + "term.developer": "Développeur", + "term.socialTeam": "Équipe de communication", + "term.socials": "Réseaux sociaux", + "term.contributors": "Contributeurs", + "term.equalizer": "Égaliseur", + "term.reset": "Réinitialiser", + "term.tracks": "musiques", // Assume x amount of tracks. e.g. 50 tracks + "term.videos": "Vidéos", + "term.menu": "Menu", + "term.check": "Vérifier", + "term.aboutArtist": "À propos de {{artistName}}", // e.g. 'About Doja Cat' + "term.topResult": "Meilleurs résultats", // Search Results + "term.sharedPlaylists": "Playlists partagées", // Search Results + "term.people": "Personnes", // Search Results + "term.newpreset.name": "Nouveau nom du préréglage de l'égaliseur", // Equalizer Preset + "term.addedpreset": "Ajout d'un préréglage", + "term.deletepreset.warn": "Êtes-vous sûr de vouloir supprimer ce préréglage ?", + "term.deletedpreset": "Suppression d'un préréglage", + "term.musicVideos": "Vidéos musicales", // Search page friendlyTypes + "term.stations": "Stations", + "term.curators": "Curateurs", + "term.appleCurators": "Curateurs Apple", + "term.radioShows": "Émissions de radio", + "term.recordLabels": "Labels de disques", + "term.videoExtras": "Vidéos bonus", + "term.top": "Top", + + // Home + "home.title": "Accueil", + "home.recentlyPlayed": "Joué récemment", + "home.recentlyAdded": "Récemment ajouté", + "home.artistsFeed": "Votre file d'artistes", + "home.artistsFeed.noArtist": "Suivez d'abord certains artistes et leurs dernières sorties seront ici", + "home.madeForYou": "Fait pour vous", + "home.friendsListeningTo": "Vos amis écoutent", + "home.followedArtists": "Artistes suivis", + + // Errors + "error.appleMusicSubRequired": "Apple Music nécessite un abonnement.", + "error.connectionError": "Il y a eu un problème de connexion à Apple Music.", + "error.noResults": "Aucun résultat.", + "error.noResults.description": "Essayez une nouvelle recherche.", + + // Podcasts + "podcast.followOnCider": "Suivre sur Cider", + "podcast.followedOnCider": "Suivi sur Cider", + "podcast.subscribeOnItunes": "Suivre sur iTunes", + "podcast.subscribedOnItunes": "Suivi sur iTunes", + "podcast.itunesStore": "iTunes Store", + "podcast.episodes": "Épisodes", + "podcast.playEpisode": "Lire l'épisode", + "podcast.website": "Site du podcast", + + // Actions + "action.addToLibrary": "Ajouter à la bibliothèque", + "action.addToLibrary.success": "Ajouté à la bibliothèque", + "action.addToLibrary.error": "Erreur lors de l'ajout à la bibliothèque", + "action.removeFromLibrary": "Retirer de la bibliothèque", + "action.removeFromLibrary.success": "Retiré de la bibliothèque", + "action.addToQueue": "Ajouter à la file d'attente", + "action.addToQueue.success": "Ajouté à la file d'attente", + "action.addToQueue.error": "Erreur lors de l'ajout à la file d'attente", + "action.removeFromQueue": "Retirer de la file d'attente", + "action.removeFromQueue.success": "Retiré de la file d'attente", + "action.removeFromQueue.error": "Erreur lors du retrait de la file d'attente", + "action.createPlaylist": "Créer une nouvelle playlist", + "action.addToPlaylist": "Ajouter à une playlist", + "action.removeFromPlaylist": "Retirer de la playlist", + "action.addToFavorites": "Ajouter aux favoris", + "action.follow": "Suivre", + "action.follow.success": "Suivi", + "action.follow.error": "Erreur lors de l'abonnement", + "action.unfollow": "Se désabonner", + "action.unfollow.success": "Désabonné", + "action.unfollow.error": "Erreur lors du désabonnement", + "action.playNext": "Jouer après", + "action.playLater": "Jouer plus tard", + "action.startRadio": "Lancer la radio", + "action.goToArtist": "Aller à l'artiste", + "action.goToAlbum": "Aller à l'album", + "action.moveToTop": "Haut de page", + "action.share": "Partager", + "action.rename": "Renommer", + "action.love": "Aimer", + "action.unlove": "Ne plus aimer", + "action.dislike": "Je n'aime pas", + "action.undoDislike": "Je n'aime plus", + "action.showWebRemoteQR": "Afficher le QR Code de la télécommande à distance", + "action.playTracksNext": "Jouer ${app.selectedMediaItems.length} musiques après", + "action.playTracksLater": "Jouer ${app.selectedMediaItems.length} musiques plus tard", + "action.removeTracks": "Retirer ${self.selectedItems.length} musiques de la file d'attente", + "action.import": "Importer", + "action.export": "Exporter", + "action.showAlbum": "Afficher l'album complet", + "action.tray.minimize": "Réduire dans la barre d'outils", + "action.tray.quit": "Quitter", + "action.tray.show": "Afficher", + "action.update": "Mettre à jour", + "action.copy": "Copier", + "action.newpreset": "Nouveau préréglage...", // Equalizer Preset + "action.deletepreset": "Supprimer le préréglage", + + // Settings - General + "settings.header.general": "Général", + "settings.header.general.description": "Ajuster les paramètres généraux de Cider.", + "settings.option.general.language": "Langue", + + // Language optgroups + "settings.option.general.language.main": "Langues", + "settings.option.general.language.fun": "Langues amusantes", + "settings.option.general.language.unsorted": "Non trié", + + // Update Cider + "settings.option.general.updateCider": "Mettre à jour Cider", // Button + + // Settings - Audio + "settings.header.audio": "Audio", + "settings.header.audio.description": "Ajuster les paramètres audio de Cider.", + "settings.option.audio.quality": "Qualité Audio", // Dropdown + "settings.header.audio.quality.hireslossless": "Lossless haute qualité (Hi-Res)", + "settings.header.audio.quality.hireslossless.description": "(jusqu'à 24 bits/192 kHz)", + "settings.header.audio.quality.lossless": "Lossless", + "settings.header.audio.quality.lossless.description": "(jusqu'à 24 bits/48 kHz)", + "settings.header.audio.quality.enhanced": "Amélioré", + "settings.header.audio.quality.high": "Élevée", + "settings.header.audio.quality.low": "Faible", + "settings.header.audio.quality.auto": "Automatique", + "settings.option.audio.seamlessTransition": "Fondu audio transparent", // Toggle + "settings.option.audio.enableAdvancedFunctionality": "Activer les fonctions avancées", // Toggle + "settings.option.audio.enableAdvancedFunctionality.description": "L'activation de la fonctionnalité AudioContext permet d'utiliser des fonctions audio étendues telles que la normalisation du son, les égaliseurs et les visualiseurs. Toutefois, sur certains systèmes, cela peut provoquer des bégaiements dans les pistes audio.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Moteur de traitement psycho-acoustique Cider", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Un processus de traitement qui fait croire à votre cerveau que les fichiers sont de meilleure qualité.", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisation du son", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour créer une expérience d'écoute plus uniforme.", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spatialisation audio", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialiser l'audio et rendre l'audio plus tridimensionnel (note: Ce n'est pas Dolby Atmos)", + + // Settings - Visual + "settings.header.visual": "Visuel", + "settings.header.visual.description": "Ajuster les paramètres visuels de Cider.", + "settings.option.visual.windowBackgroundStyle": "Style d'arrière-plan de la fenêtre", // Toggle + "settings.header.visual.windowBackgroundStyle.none": "Aucun", + "settings.header.visual.windowBackgroundStyle.artwork": "Pochette d'album", + "settings.header.visual.windowBackgroundStyle.image": "Image", + "settings.option.visual.animatedArtwork": "Pochette d'album animée", // Dropdown + "settings.header.visual.animatedArtwork.always": "Toujours", + "settings.header.visual.animatedArtwork.limited": "Limité aux pages et aux entrées spéciales", + "settings.header.visual.animatedArtwork.disable": "Désactiver partout", + "settings.option.visual.animatedArtworkQuality": "Qualité de la pochette d'album animée", // Dropdown + "settings.header.visual.animatedArtworkQuality.low": "Faible", + "settings.header.visual.animatedArtworkQuality.medium": "Moyen", + "settings.header.visual.animatedArtworkQuality.high": "Élevée", + "settings.header.visual.animatedArtworkQuality.veryHigh": "Très élevée", + "settings.header.visual.animatedArtworkQuality.extreme": "Extrême", + "settings.option.visual.animatedWindowBackground": "Arrière-plan de fenêtre animé", // Toggle + "settings.option.visual.hardwareAcceleration": "Accélération matérielle", // Dropdown + "settings.option.visual.hardwareAcceleration.description": "Nécessite un relancement", + "settings.header.visual.hardwareAcceleration.default": "Défaut", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.theme": "Thème", + + // Settings - Visual - Theme name + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Sombre", + + // Refer to term.disabled for the disabled option + "settings.option.visual.showPersonalInfo": "Afficher vos informations personnelles", // Toggle + + // Settings - Lyrics + "settings.header.lyrics": "Paroles", + "settings.header.lyrics.description": "Ajuster les paramètres des paroles pour Cider.", + "settings.option.lyrics.enableMusixmatch": "Activer les paroles Musixmatch", // Toggle + "settings.option.lyrics.enableMusixmatchKaraoke": "Activer le mode karaoké (Musixmatch seulement)", // Toggle + "settings.option.lyrics.musixmatchPreferredLanguage": "Langue préférée pour les traductions Musixmatch", // Dropdown + "settings.option.lyrics.enableYoutubeLyrics": "Activer les paroles YouTube pour les vidéos de musique", // Toggle + + // Settings - Connectivity + "settings.header.connectivity": "Connectivité", + "settings.header.connectivity.description": "Ajuster les paramètres de connectivité de Cider.", + "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown + "settings.option.connectivity.playbackNotifications": "Notifications de lecture", // Toggle + // Refer to term.disabled for the disabled option + "settings.header.connectivity.discordRPC.cider": "Afficher comme 'Cider'", + "settings.header.connectivity.discordRPC.appleMusic": "Afficher comme 'Apple Music'", + "settings.option.connectivity.discordRPC.clearOnPause": "Désactiver le Discord Rich Presence quand la musique est en pause", // Toggle + "settings.option.connectivity.lastfmScrobble": "Scrobble LastFM", // Option to Connect + "settings.option.connectivity.lastfmScrobble.delay": "Délai de Scrobble LastFM (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer la lecture en cours sur LastFM", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer les titres en boucle (LastFM)", + // Refer to term.connect for the connect button + + // Settings - Experimental + "settings.header.experimental": "Expérimental", + "settings.header.experimental.description": "Ajuster les paramètres expérimentaux de Cider.", + "settings.option.experimental.compactUI": "Interface utilisateur compacte", // Toggle + "settings.option.experimental.close_button_hide": "Le bouton de fermeture doit masquer l'application", + "settings.option.experimental.copy_log": "Copier les logs dans le presse-papier", + "settings.option.experimental.inline_playlists": "Playlists et albums en ligne", + + // Refer to term.disabled & term.enabled + // Spatialization Menu + "spatial.notTurnedOn": "La spatialisation audio est désactivée. Pour l'utiliser, vous devez d'abord l'activer.", + "spatial.spatialProperties": "Propriétés spatiales", + "spatial.width": "Largeur", + "spatial.height": "Hauteur", + "spatial.depth": "Profondeur", + "spatial.gain": "Gain", + "spatial.roomMaterials": "Matériaux de la pièce", + "spatial.roomDimensions": "Dimensions de la pièce", + "spatial.roomPositions": "Positions de la pièce", + "spatial.setDimensions": "Définir les dimensions", + "spatial.setPositions": "Définir les positions", + "spatial.up": "Haut", + "spatial.front": "Avant", + "spatial.left": "Gauche", + "spatial.right": "Droite", + "spatial.back": "Retour", + "spatial.down": "Bas", + "spatial.listener": "Auditeur", + "spatial.audioSource": "Source Audio", + + // Settings - Unfinished + "settings.header.unfinished": "Inachevée", + + // Web Remote + "remote.web.title": "Cider à distance", + "remote.web.description": "Scanner le QR code pour associer votre téléphone avec cette instance Cider", + + // About + "about.thanks": "Un grand merci à l'équipe de la Cider Collective et à tous nos contributeurs." } \ No newline at end of file diff --git a/src/i18n/hu_HU.jsonc b/src/i18n/hu_HU.jsonc index 7f2e65ff..28882427 100644 --- a/src/i18n/hu_HU.jsonc +++ b/src/i18n/hu_HU.jsonc @@ -1,4 +1,5 @@ -{ // Base File +{ + // i18n Info "i18n.languageName": "Magyar", // name of language in native language "i18n.languageNameEnglish": "Hungarian", // name of language in English @@ -283,6 +284,7 @@ // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "Sötét", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Személyes adatok mutatása", // Toggle diff --git a/src/i18n/it_IT.jsonc b/src/i18n/it_IT.jsonc index 5c3589f0..be903cd5 100644 --- a/src/i18n/it_IT.jsonc +++ b/src/i18n/it_IT.jsonc @@ -1,4 +1,4 @@ -{ // Base File +{ // i18n Info "i18n.languageName": "Italiano", // name of language in native language @@ -19,6 +19,7 @@ "notification.updatingLibrarySongs": "Aggiornamento raccolta brani...", "notification.updatingLibraryAlbums": "Aggornamento raccolta album...", "notification.updatingLibraryArtists": "Aggiornamento raccolta artisti...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -134,13 +135,14 @@ "home.madeForYou": "Per Te", "home.friendsListeningTo": "Ascoltato da Amici", "home.followedArtists": "Artisti Seguiti", + // Errors "error.appleMusicSubRequired": "Apple Music ha bisogno di un abbonamento.", "error.connectionError": "C'è stato un problema nella connessione a Apple Music.", "error.noResults": "Nessun risultato.", "error.noResults.description": "Prova un'altra ricerca.", - //Podcasts + // Podcasts "podcast.followOnCider": "Segui in Cider", "podcast.followedOnCider": "Seguiti in Cider", "podcast.subscribeOnItunes": "Iscriviti in iTunes", @@ -191,7 +193,6 @@ "action.import": "Importa", "action.export": "Esporta", "action.showAlbum": "Mostra Album Intero", - // Waiting on Core for moving plugin to app.ts "action.tray.minimize": "Minimizza nel tray", "action.tray.quit": "Chiudi", "action.tray.show": "Mostra", @@ -205,6 +206,8 @@ "settings.option.general.language.main": "Lingue", "settings.option.general.language.fun": "Lingue da Scherzo", "settings.option.general.language.unsorted": "Non ordinato", + + // Update Cider // Settings - Audio "settings.header.audio": "Audio", @@ -220,6 +223,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizza il volume massimo nei brani per un'esperienza d'ascolto più uniforme.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spazializzazione Audio", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spazializza l'audio per dare un effetto più tridimensionale (nota: questo non è Dolby Atmos)", + // Settings - Visual "settings.header.visual": "Visuale", "settings.header.visual.description": "Cambia le impostazioni visuali per Cider.", @@ -242,6 +246,9 @@ "settings.option.visual.hardwareAcceleration.description": "Richiede riavvio del'app", "settings.header.visual.hardwareAcceleration.default": "Normale", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Mostra Informazione Personale", // Toggle @@ -277,8 +284,8 @@ "settings.option.experimental.closeButtonBehaviour.quit": "Chiudi Cider", "settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "Minimizza", "settings.option.experimental.closeButtonBehaviour.minimizeTray": "Minimizza Nel Tray", + // Refer to term.disabled & term.enabled - // Spatialization Menu "spatial.notTurnedOn": "Spazializzazione Audio è disattivata. Attivala prima.", "spatial.spatialProperties" : "Proprietà Spaziali", diff --git a/src/i18n/ja_JP.jsonc b/src/i18n/ja_JP.jsonc index 7b31f748..9729be9b 100644 --- a/src/i18n/ja_JP.jsonc +++ b/src/i18n/ja_JP.jsonc @@ -1,4 +1,5 @@ { + // i18n Info "i18n.languageName": "日本語", // name of language in native language "i18n.languageNameEnglish": "Japanese", // name of language in English @@ -135,7 +136,7 @@ "error.noResults": "見つかりませんでした", "error.noResults.description": "もう一度お試しください。", - //Podcasts + // Podcasts "podcast.followOnCider": "Ciderでフォロー", "podcast.followedOnCider": "フォロー中", "podcast.subscribeOnItunes": "iTunesで購読", @@ -192,7 +193,16 @@ "action.copy": "コピー", "action.newpreset": "ニュープリセット", // Equalizer Preset "action.deletepreset": "プリセットを削除", // Equalizer Preset + + // Settings - General + "settings.header.general": "一般", + "settings.header.general.description": "Ciderの一般設定", + // Language optgroups + + // Update Cider + "settings.option.general.updateCider": "Cider 更新", // Button + // Settings - Audio "settings.header.audio": "オーディオ", "settings.header.audio.description": "Ciderのオーディオ設定", @@ -240,12 +250,12 @@ "settings.option.visual.hardwareAcceleration.description": "アプリを再起動する必要があります", "settings.header.visual.hardwareAcceleration.default": "既定", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "プロフィールを表示", // Toggle - // Settings - General (Reserved) - "settings.header.general": "一般", - "settings.header.general.description": "Ciderの一般設定", // Settings - Lyrics "settings.header.lyrics": "歌詞", @@ -268,9 +278,6 @@ "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable LastFM Now Playing", "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)", // Refer to term.connect for the connect button - - // Settings - General - Update Cider - "settings.option.general.updateCider": "Cider 更新", // Button // Settings - Experimental "settings.header.experimental": "試験的な機能", diff --git a/src/i18n/ko_KR.jsonc b/src/i18n/ko_KR.jsonc index b821d188..583fada8 100644 --- a/src/i18n/ko_KR.jsonc +++ b/src/i18n/ko_KR.jsonc @@ -1,4 +1,5 @@ -{ // Base File +{ + // i18n Info "i18n.languageName": "한국어 (KR)", // name of language in native language "i18n.languageNameEnglish": "Korean (KR)", // name of language in English @@ -273,6 +274,7 @@ // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "다크", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "개인 정보 보기", // Toggle diff --git a/src/i18n/pt_BR.jsonc b/src/i18n/pt_BR.jsonc index dad04de4..fce8bbef 100644 --- a/src/i18n/pt_BR.jsonc +++ b/src/i18n/pt_BR.jsonc @@ -1,15 +1,16 @@ -{ // Base File +{ + + // i18n Info + "i18n.languageName": "Português ( brasileiro )", // name of language in native language + "i18n.languageNameEnglish": "Portuguese (Brazil)", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "", // Authors, if you contribute to this file feel free to add your name seperated with a space + // App info "app.name": "Cider", "date.format": "${d} ${m}, ${y}", - // i18n Info - "i18n.languageName": "Português ( brasileiro )", // name of language in native language - "i18n.languageNameEnglish": "Portuguese (Brazil)", // name of language in English - "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "", // Authors, if you contribute to this file feel free to add your name seperated with a space - // Dialogs "dialog.cancel": "Cancelar", "dialog.ok": "OK", @@ -105,6 +106,7 @@ "home.madeForYou": "Feito para Você", "home.friendsListeningTo": "Amigos Ouvindo", "home.followedArtists": "Artistas Seguidos", + // Errors "error.appleMusicSubRequired": "Necessário uma assinatura Apple Music.", @@ -142,6 +144,15 @@ "action.dislike": "Não Gostar", "action.undoDislike": "Deixar de Não Gostar", "action.showWebRemoteQR": "Mostrar o QR para Página Remota", + + // Settings - General + "settings.header.general": "Principal", + "settings.header.general.description": "Ajustar as definiçoes principais no Cider.", + + // Language optgroups + + // Update Cider + // Settings - Audio "settings.header.audio": "Audio", "settings.header.audio.description": "Ajustar as definições de audio no Cider.", @@ -156,6 +167,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza o volume alto para faixas individuais para criar uma experiência de audição mais uniforme.", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Espacial", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Espacialize o áudio e torne o áudio mais tridimensional (nota: isto não é Dolby Atmos)", + // Settings - Visual "settings.header.visual": "Visual", "settings.header.visual.description": "Ajustar as Definições de Visual do Cider.", @@ -178,12 +190,10 @@ "settings.header.visual.hardwareAcceleration.default": "Normal", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + // Settings - Visual - Theme name // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Mostrar Informaçoes Pessoais", // Toggle - // Settings - General (Reserved) - "settings.header.general": "Principal", - "settings.header.general.description": "Ajustar as definiçoes principais no Cider.", // Settings - Lyrics "settings.header.lyrics": "Letras", @@ -211,8 +221,8 @@ "settings.header.experimental": "Experimental", "settings.header.experimental.description": "Ajustar as definições experimental no Cider.", "settings.option.experimental.compactUI": "UI Compacto", // Toggle - // Refer to term.disabled & term.enabled + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.spatialProperties" : "Propriedades do Espacial", "spatial.width" : "Largura", @@ -232,13 +242,12 @@ "spatial.listener" : "Ouvinte", "spatial.audioSource" : "Fonte de Audio", - - - // Settings - Unfinished "settings.header.unfinished": "Inacabado", // Web Remote "remote.web.title": "Cider Remoto", "remote.web.description": "Digitalize o código QR para emparelhar seu telefone com esta instância Cider" + + // About } \ No newline at end of file diff --git a/src/i18n/sv_SE.jsonc b/src/i18n/sv_SE.jsonc index abdd2d29..bd47879b 100644 --- a/src/i18n/sv_SE.jsonc +++ b/src/i18n/sv_SE.jsonc @@ -1,4 +1,5 @@ -{ // Base File +{ + // i18n Info "i18n.languageName": "Svenska (SE)", // name of language in native language "i18n.languageNameEnglish": "Swedish (SE)", // name of language in English @@ -248,6 +249,9 @@ "settings.option.visual.hardwareAcceleration.description": "kräver omstart", "settings.header.visual.hardwareAcceleration.default": "Standard", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Visa personlig information", // Toggle diff --git a/src/i18n/tr_TR.jsonc b/src/i18n/tr_TR.jsonc index 828ecb59..214b2e17 100644 --- a/src/i18n/tr_TR.jsonc +++ b/src/i18n/tr_TR.jsonc @@ -1,4 +1,5 @@ { + // i18n Info "i18n.languageName": "Türkçe", // name of language in native language "i18n.languageNameEnglish": "Turkish", // name of language in English @@ -160,7 +161,7 @@ "error.noResults": "Hiç sonuç yok", "error.noResults.description": "Tekrar deneyin.", - //Podcasts + // Podcasts "podcast.followOnCider": "Cider'de Takip Et", "podcast.followedOnCider": "Cider'de Takip Ediliyor", "podcast.subscribeOnItunes": "itunes'de Abone Ol", @@ -252,16 +253,16 @@ "settings.option.audio.seamlessTransition": "Kesintisiz Ses Geçişi", // Toggle "settings.option.audio.enableAdvancedFunctionality": "Gelişmiş Ses Deneyimi", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "Gelişmiş ses deneyiminin etkinleştirilmesi, Ses Normalleştirme, Ekolayzer ve Görselleştirici gibi genişletilmiş ses özelliklerine izin verir, ancak bu durum bazı sistemlerde seste bozulmalara neden olabilir.", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Ses Normalleştirme", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Ses normalleştirme alçak ve yüksek sesli şarkıları dengeler ve daha düzgün bir dinleme deneyimi sağlar.", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Uzamsal Ses", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Sesi uzamsallaştırın ve sesi daha 3 boyutlu hale getirin (not: Bu Dolby Atmos değildir)", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenalin Prosesörü™️", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Müziğin hem daha zengin hem de daha canlı duyulmasını sağlayan Psikoakustik Geliştirme Sistemi | Maikiwi tarafından tasarlanmıştır.", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Kuvveti", // Toggle "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Sese yapılan işlemin gücünü değiştirir. (Agresif istenmeyen sonuçlar doğurabilir)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standart", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Ses Normalleştirme", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Ses normalleştirme alçak ve yüksek sesli şarkıları dengeler ve daha düzgün bir dinleme deneyimi sağlar.", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Uzamsal Ses", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Sesi uzamsallaştırın ve sesi daha 3 boyutlu hale getirin (not: Bu Dolby Atmos değildir)", // Settings - Visual "settings.header.visual": "Görünüm", @@ -285,13 +286,15 @@ "settings.option.visual.hardwareAcceleration.description": "Etki etmesi için uygulamayı yeniden başlatmak gerekir.", "settings.header.visual.hardwareAcceleration.default": "Varsayılan", "settings.header.visual.hardwareAcceleration.webGPU": "Gelişmiş", - "settings.option.visual.showPersonalInfo": "Kullanıcı Adımı Göster", // Toggle "settings.header.visual.theme": "Tema", // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "Karanlık", + // Refer to term.disabled for the disabled option + "settings.option.visual.showPersonalInfo": "Kullanıcı Adımı Göster", // Toggle + // Settings - Lyrics "settings.header.lyrics": "Şarkı Sözleri", "settings.header.lyrics.description": "Cider'in şarkı sözlerini nasıl görüntülemesini istediğini buradan ayarlayın.", @@ -324,12 +327,14 @@ "settings.option.experimental.copy_log": "Günlüğü Panoya Kopyala", "settings.option.experimental.inline_playlists": "Listeleri ve Albümleri Açılır Pencere İle göster", + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.notTurnedOn": "Uzamsal ses devre dışı. Kullanabilmek için lütfen önce etkinleştirin.", "spatial.spatialProperties" : "Uzamsal Özellikler", "spatial.width" : "Genişlik", "spatial.height" : "Yükseklik", "spatial.depth" : "Derinlik", + "spatial.gain" : "Kazanç", "spatial.roomMaterials" : "Oda Materyalleri", "spatial.roomDimensions" : "Oda Ölçüleri", "spatial.roomPositions" : "Oda Pozisyonu", @@ -343,7 +348,6 @@ "spatial.down" : "Aşağı", "spatial.listener" : "Dinleyici", "spatial.audioSource" : "Ses Kaynağı", - "spatial.gain" : "Kazanç", // Settings - Unfinished "settings.header.unfinished": "Geliştirme Aşamasında", diff --git a/src/i18n/zh_CN.jsonc b/src/i18n/zh_CN.jsonc index 8844e83b..75ea8e2d 100644 --- a/src/i18n/zh_CN.jsonc +++ b/src/i18n/zh_CN.jsonc @@ -1,4 +1,5 @@ { + // i18n Info "i18n.languageName": "简体中文(中国)", // name of language in native language "i18n.languageNameEnglish": "Simp. Chinese (China)", // name of language in English @@ -190,6 +191,15 @@ "action.tray.show": "显示", "action.update": "更新", + // Settings - General + "settings.header.general": "通用", + "settings.header.general.description": "调整 Cider 的通用设置", + + // Language optgroups + + // Update Cider + "settings.option.general.updateCider": "更新 Cider", // Button + // Settings - Audio "settings.header.audio": "音频", "settings.header.audio.description": "调整 Cider 的音频设置", @@ -233,16 +243,12 @@ "settings.option.visual.hardwareAcceleration.description": "需要重启 Cider 才会生效", "settings.header.visual.hardwareAcceleration.default": "默认", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + + // Settings - Visual - Theme name + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "显示个人资料", // Toggle - // Settings - General (Reserved) - "settings.header.general": "通用", - "settings.header.general.description": "调整 Cider 的通用设置", - - // Settings - General - Update Cider - "settings.option.general.updateCider": "更新 Cider", // Button - // Settings - Lyrics "settings.header.lyrics": "歌词", "settings.header.lyrics.description": "调整 Cider 的歌词设置", diff --git a/src/i18n/zh_HK.jsonc b/src/i18n/zh_HK.jsonc index b0618dae..516ff4b6 100644 --- a/src/i18n/zh_HK.jsonc +++ b/src/i18n/zh_HK.jsonc @@ -1,24 +1,25 @@ { + // i18n Info "i18n.languageName": "繁體中文(香港)", // name of language in native language "i18n.languageNameEnglish": "Trad. Chinese (Hong Kong)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@kyw504100 @maikirakiwi", // Authors, if you contribute to this file feel free to add your name seperated with a space - + // App info "app.name": "Cider", - + "date.format": "${y}年${m}月${d}日", - + // Dialogs "dialog.cancel": "取消", "dialog.ok": "確認", - + // Notification "notification.updatingLibrarySongs": "正在更新資料庫的歌曲...", "notification.updatingLibraryAlbums": "正在更新資料庫的專輯...", "notification.updatingLibraryArtists": "正在更新資料庫的藝人...", - + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", // Follows brand term @@ -134,15 +135,17 @@ "term.addedpreset": "已新增", "term.deletepreset.warn": "你確認要刪除這個範本?", "term.deletedpreset": "已刪除", + "term.requestError": "處理請求時發生錯誤", + "term.song.link.generate": "正在生成 song.link 分享連結...", "term.musicVideos": "MV", // Search page friendlyTypes "term.stations": "電台", - //"term.curators": "Curators", - //"term.appleCurators": "Apple Curators", + //"term.curators": "Curators", + //"term.appleCurators": "Apple Curators", "term.radioShows": "廣播單集", "term.recordLabels": "唱片公司", "term.videoExtras": "影片特輯", - //"term.top": "Top", - + //"term.top": "Top", + // Home "home.title": "主頁", "home.recentlyPlayed": "最近播放", @@ -152,13 +155,13 @@ "home.madeForYou": "為您推薦", "home.friendsListeningTo": "朋友正在聆聽", "home.followedArtists": "追蹤的藝人", - + // Errors "error.appleMusicSubRequired": "需要訂閱Apple Music以使用Cider", "error.connectionError": "無法連接到 Apple Music。", "error.noResults": "沒有結果", "error.noResults.description": "請嘗試新的搜尋內容。", - + // Podcasts "podcast.followOnCider": "在Cider上追蹤", "podcast.followedOnCider": "已在Cider上追蹤", @@ -168,7 +171,7 @@ "podcast.episodes": "單集", "podcast.playEpisode": "播放單集", "podcast.website": "Podcast 網頁", - + // Actions "action.addToLibrary": "加入資料庫", "action.addToLibrary.success": "成功加入資料庫", @@ -215,7 +218,7 @@ "action.tray.show": "顯示", "action.update": "更新", "action.copy": "複製", - "action.newpreset": "新增範本", //Equallizer preset + "action.newpreset": "新增範本", // Equallizer preset "action.deletepreset": "刪除範本", // Settings - General @@ -230,6 +233,10 @@ // Update Cider "settings.option.general.updateCider": "更新 Cider", // Button + "settings.option.general.updateCider.branch": "Cider 更新通道", // Dropdown + "settings.option.general.updateCider.branch.description": "選擇你想要接收來自哪個通道的更新", + "settings.option.general.updateCider.branch.main": "穩定", + "settings.option.general.updateCider.branch.develop": "測試", // Settings - Audio "settings.header.audio": "音訊", @@ -240,18 +247,25 @@ "settings.header.audio.quality.lossless": "無損壓縮", "settings.header.audio.quality.lossless.description": "(高達 24-bit/48 kHz)", "settings.header.audio.quality.high": "高素質", - "settings.header.audio.quality.low": "高效率", - "settings.header.audio.quality.auto": "自動", + //"settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "高效率", + //"settings.header.audio.quality.standard.description": "64 kbps", "settings.option.audio.seamlessTransition": "無縫播放", // Toggle "settings.option.audio.enableAdvancedFunctionality": "進階功能", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "啟用 AudioContext 將解鎖類似音量平衡和均衡器的進階功能。但是會在一些電腦造成音樂卡頓。", - "settings.option.audio.enableAdvancedFunctionality.decryptLLPW": "無損壓縮解碼", // Toggle - "settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description": "提供 Cider 解碼無損壓縮檔案的能力,但相應地會增加電腦的工作量。", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數碼音訊增強處理™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "能夠欺騙你的大腦讓你感受到近似無損壓縮的音質 | 由 Maikiwi 設計", + "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "音訊增強處理不兼容於空間音訊,請先停用空間音訊。", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "數碼音訊增強處理設定", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "將更改音訊處理的激進程度(激進型選項有可能會引起雜訊)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "標準型", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "激進型", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音量平衡", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "將平衡輕柔和響亮的歌曲,建立更統一的聆聽體驗。", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "空間音訊", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "將音訊進行空間化處理來製造一個更立體的聆聽體驗(注:此功能不是官方的杜比全景聲)", - + "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "空間音訊不兼容於音訊增強處理,請先停用音訊增強處理。", + // Settings - Visual "settings.header.visual": "外觀", "settings.header.visual.description": "調整Cider的外觀", @@ -275,10 +289,11 @@ "settings.header.visual.hardwareAcceleration.default": "預設", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "主題", - + // Settings - Visual - Theme name "settings.option.visual.theme.default": "預設", "settings.option.visual.theme.dark": "午夜暗", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle @@ -289,7 +304,7 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "啟用卡拉OK模式(僅限Musixmatch)", // Toggle "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌詞語言偏好", // Dropdown "settings.option.lyrics.enableYoutubeLyrics": "播放 MV 時使用 YouTube 歌詞", // Toggle - + // Settings - Connectivity "settings.header.connectivity": "外部連結", "settings.header.connectivity.description": "調整Cider與外部的連結", @@ -303,18 +318,18 @@ "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble 延遲 (%)", "settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 Last.fm 正在播放", "settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (Last.fm)", - //"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)", + //"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)", // Refer to term.connect for the connect button - + // Settings - Experimental "settings.header.experimental": "實驗性功能", "settings.header.experimental.description": "調整Cider的實驗性功能", "settings.option.experimental.compactUI": "緊凑型 UI", // Toggle "settings.option.experimental.close_button_hide": "以關閉按鈕來隱藏 Cider", "settings.option.experimental.copy_log": "複製運行記錄檔至剪貼簿", - //"settings.option.experimental.inline_playlists": "Inline Playlists and Albums", - + //"settings.option.experimental.inline_playlists": "Inline Playlists and Albums", // Refer to term.disabled & term.enabled + // Spatialization Menu "spatial.notTurnedOn": "請先在設定中啟用空間音訊。", "spatial.spatialProperties": "空間音訊屬性", @@ -335,14 +350,14 @@ "spatial.down": "下方", "spatial.listener": "觀眾", "spatial.audioSource": "音源", - + // Settings - Unfinished "settings.header.unfinished": "未完成", - + // Web Remote "remote.web.title": "遙距控制 Cider", "remote.web.description": "掃描以下的二維碼以控制 Cider", - - // About + + //About "about.thanks": "感謝 Cider Collective 以及所有貢獻者所作出的貢獻。" } \ No newline at end of file diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index c2190a45..aa238675 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -1,9 +1,10 @@ { + // i18n Info "i18n.languageName": "繁體中文(台灣)", // name of language in native language "i18n.languageNameEnglish": "Trad. Chinese (Taiwan)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@maikirakiwi @jay900604", // Authors, if you contribute to this file feel free to add your name seperated with a space + "i18n.authors": "@maikirakiwi @jay900604 @kyw504100", // Authors, if you contribute to this file feel free to add your name seperated with a space // App info "app.name": "Cider", @@ -194,6 +195,10 @@ "action.copy": "複製", "action.newpreset": "新增預設", // Equalizer Preset "action.deletepreset": "刪除預設", // Equalizer Preset + + // Settings - General + "settings.header.general": "一般", + "settings.header.general.description": "調整 Cider 的一般設定", // Language optgroups "settings.option.general.language.main": "語言", @@ -239,7 +244,7 @@ "settings.option.visual.windowBackgroundStyle": "視窗背景樣式", // Toggle "settings.header.visual.windowBackgroundStyle.none": "空白", "settings.header.visual.windowBackgroundStyle.artwork": "專輯封面", - "settings.header.visual.windowBackgroundStyle.image": "圖片", + "settings.header.visual.windowBackgroundStyle.image": "圖片", "settings.option.visual.animatedArtwork": "動態專輯封面", // Dropdown "settings.header.visual.animatedArtwork.always": "總是顯示", "settings.header.visual.animatedArtwork.limited": "只在藝人頁面和專輯封面顯示", @@ -256,16 +261,14 @@ "settings.header.visual.hardwareAcceleration.default": "預設", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "主題", + // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "暗黑模式", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle - // Settings - General (Reserved) - "settings.header.general": "一般", - "settings.header.general.description": "調整 Cider 的一般設定", - // Settings - Lyrics "settings.header.lyrics": "歌詞", "settings.header.lyrics.description": "調整 Cider 的歌詞設定", diff --git a/src/i18n/zh_yue.jsonc b/src/i18n/zh_yue.jsonc index 6fec3bfb..e7f296d9 100644 --- a/src/i18n/zh_yue.jsonc +++ b/src/i18n/zh_yue.jsonc @@ -1,4 +1,5 @@ { + // i18n Info "i18n.languageName": "廣東話(香港)", // name of language in native language "i18n.languageNameEnglish": "Cantonese (Hong Kong)", // name of language in English @@ -136,12 +137,12 @@ "term.deletedpreset": "刪除咗", "term.musicVideos": "MV", // Search page friendlyTypes "term.stations": "電台", - //"term.curators": "Curators", - //"term.appleCurators": "Apple Curators", + //"term.curators": "Curators", + //"term.appleCurators": "Apple Curators", "term.radioShows": "電台單集", "term.recordLabels": "唱片公司", "term.videoExtras": "相關嘅片", - //"term.top": "Top", + //"term.top": "Top", // Home "home.title": "主頁", @@ -273,6 +274,7 @@ // Settings - Visual - Theme name "settings.option.visual.theme.default": "預設", "settings.option.visual.theme.dark": "黑色", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle @@ -306,7 +308,7 @@ "settings.option.experimental.compactUI": "逼啲既 UI", // Toggle "settings.option.experimental.close_button_hide": "㩒交叉制嚟隱藏 Cider", "settings.option.experimental.copy_log": "將log複製喺剪貼簿", - //"settings.option.experimental.inline_playlists": "Inline Playlists and Albums", + //"settings.option.experimental.inline_playlists": "Inline Playlists and Albums", // Refer to term.disabled & term.enabled // Spatialization Menu diff --git a/src/renderer/index.js b/src/renderer/index.js index 5e58911c..5a052a96 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -272,7 +272,7 @@ const app = new Vue({ }, methods: { songLinkShare(amUrl) { - notyf.open({type: "info", message: "Getting song.link share URL..."}) + notyf.open({type: "info", message: app.getLz('term.song.link.generate')}) let self = this httpRequest = new XMLHttpRequest(); httpRequest.open('GET', `https://api.song.link/v1-alpha.1/links?url=${amUrl}&userCountry=US`, true); @@ -285,7 +285,7 @@ const app = new Vue({ self.copyToClipboard(response.pageUrl) } else { console.log('There was a problem with the request.'); - notyf.error("There was a problem with the request.") + notyf.error(app.getLz('term.requestError')) } } } @@ -2284,7 +2284,7 @@ const app = new Vue({ this.mk.addToLibrary(id).then((data) => { self.getLibrarySongsFull(true) }) - notyf.success('Added to library.'); + notyf.success(app.getLz('action.addToLibrary.success')); }, removeFromLibrary(kind, id) { let self = this @@ -2296,7 +2296,7 @@ const app = new Vue({ }).then((data) => { self.getLibrarySongsFull(true) }) - notyf.success('Removed from library.') + notyf.success(app.getLz('action.removeFromLibrary.success')) }, async losslessBadge() { diff --git a/src/renderer/views/pages/about.ejs b/src/renderer/views/pages/about.ejs index 69cf3a3d..f1fd1fb3 100644 --- a/src/renderer/views/pages/about.ejs +++ b/src/renderer/views/pages/about.ejs @@ -87,6 +87,12 @@ role: app.getLz('term.developer'), avatar: 'https://avatars.githubusercontent.com/u/27716185?v=4' }, + { + name: 'Maikiwi', + link: 'https://github.com/maikirakiwi', + role: app.getLz('term.developer'), + avatar: 'https://avatars.githubusercontent.com/u/74925636?v=4' + }, { name: 'Void', link: 'https://twitter.com/MoonyVoid', diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 0ed575bc..8c856a12 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -824,7 +824,7 @@ if (app.cfg.advanced.ciderPPE) { if (app.cfg.audio.spatial) { app.cfg.advanced.ciderPPE = false; - notyf.error("CAP is not compatible with Spatialization. Please disable Spatialization to continue.") + notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility')) } } }, @@ -836,7 +836,7 @@ else { CiderAudio.spatialOff() app.cfg.audio.spatial = false; - notyf.error("Spatialization is not compatible with CAP. Please disable CAP to continue.") + notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility')) } } else { CiderAudio.spatialOff() From 9eb9684abcfbdb7757f8c36ba76a1f157b9bd07e Mon Sep 17 00:00:00 2001 From: Keefe Eilish Date: Tue, 8 Feb 2022 21:16:12 +0530 Subject: [PATCH 49/54] Starting Hindi translation (#382) --- src/i18n/hi_IN.jsonc | 358 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 src/i18n/hi_IN.jsonc diff --git a/src/i18n/hi_IN.jsonc b/src/i18n/hi_IN.jsonc new file mode 100644 index 00000000..ddeef8b4 --- /dev/null +++ b/src/i18n/hi_IN.jsonc @@ -0,0 +1,358 @@ +{ + // Base File + // i18n Info + "i18n.languageName": "English (US)", // name of language in native language + "i18n.languageNameEnglish": "English (US)", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "@maikirakiwi @vringster", // Authors, if you contribute to this file feel free to add your name seperated with a space + + // App info + "app.name": "Cider", + + "date.format": "${m} ${d}, ${y}", + + // Dialogs + "dialog.cancel": "रोकें", + "dialog.ok": "ठीक है", + + // Notification + "notification.updatingLibrarySongs": "अपडेटिंग लाइब्रेरी के गाने...", + "notification.updatingLibraryAlbums": "अपडेटिंग लाइब्रेरी के एल्बम...", + "notification.updatingLibraryArtists": "अपडेटिंग लाइब्रेरी के कलाकार...", + + // Terms + "term.appleInc": "Apple Inc.", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", + "term.itunes": "iTunes", + "term.github": "GitHub", + "term.discord": "Discord", + "term.learnMore": "और जानिए", + "term.accountSettings": "खाता सेटिंग्स", + "term.logout": "लॉग आऊट", + "term.login": "लॉग इन", + "term.about": "के बारे में", + "term.privateSession": "गुप्त सैशन", + "term.queue": "कतार", + "term.history": "हिस्टरी", + "term.search": "खोज करें", + "term.library": "लाइब्रेरी", + "term.listenNow": "अभी सुनियें", + "term.browse": "ब्राउज़", + "term.radio": "रेडियो", + "term.recentlyAdded": "हाल ही में जोड़ें हुए", + "term.songs": "गाने", + "term.albums": "एल्बम", + "term.artists": "कलाकार", + "term.podcasts": "पॉडकास्टस", + "term.playlists": "प्लेलिस्ट्स", + "term.playlist": "प्लेलिस्ट", + "term.newPlaylist": "नई प्लेलिस्ट्स", + "term.newPlaylistFolder": "नई प्लेलिस्ट्स फ़ोल्डर", + "term.createNewPlaylist": "नई प्लेलिस्ट्स बनाएं", + "term.createNewPlaylistFolder": "नई प्लेलिस्ट्स फ़ोल्डर बनाएं", + "term.deletePlaylist": "क्या आप वाकई इस प्लेलिस्ट को हटाना चाहते हैं", + "term.play": "प्ले", + "term.pause": "ठहराव", + "term.previous": "पिछले", + "term.next": "अगले", + "term.shuffle": "शफल", + "term.repeat": "रिपीट", + "term.volume": "वॉल्यूम", + "term.mute": "म्यूट", + "term.unmute": "अनम्यूट", + "term.share": "शेयर", + "term.share.success": "क्लिपबोर्ड में कॉपीड", + "term.settings": "सेटिंग्स", + "term.seeAll": "सभी देखें", + "term.sortBy": "सॉर्ट बाये", + "term.sortBy.album": "एल्बम", + "term.sortBy.artist": "कलाकार", + "term.sortBy.name": "नाम", + "term.sortBy.genre": "शैली", + "term.sortBy.releaseDate": "रिलीज़ की तारीख", + "term.sortBy.duration": "लंबाई", + "term.sortOrder": "ए-ज़ी", + "term.sortOrder.ascending": "असेंडिंग", + "term.sortOrder.descending": "डिसेंडिंग", + "term.viewAs": "वियू ऐस", + "term.viewAs.coverArt": "कवर आर्ट", + "term.viewAs.list": "सूची", + "term.size": "साइज़", + "term.size.normal": "साधारण", + "term.size.compact": "पिचका हुआ", + "term.enable": "खोलें", + "term.disable": "बंद", + "term.enabled": "खोला हुआ", + "term.disabled": "बंद हुआ हुआ", + "term.connect": "कनेक्ट", + "term.connecting": "कनेक्टिंग", + "term.disconnect": "डिसकनेक्ट", + "term.authed": "प्रमाणित", + "term.confirm": "पक्का?", + "term.more": "ज़्यादा", + "term.less": "कम", + "term.showMore": "दिखाएं ज़्यादा", + "term.showLess": "दिखाएं कम", + "term.topSongs": "Top Songs", + "term.latestReleases": "Latest Releases", + "term.time.added": "Added", + "term.time.released": "Released", + "term.time.updated": "Updated", + "term.time.hours": "hours", + "term.time.hour": "hour", + "term.time.minutes": "minutes", + "term.time.minute": "minute", + "term.time.seconds": "seconds", + "term.time.second": "second", + "term.fullscreenView": "Fullscreen View", + "term.defaultView": "Default View", + "term.audioSettings": "Audio Settings", + "term.clearAll": "Clear All", + "term.recentStations": "Recent Stations", + "term.language": "Language", + "term.funLanguages": "Fun", + "term.noLyrics": "Loading... / Lyrics not found./ Instrumental.", + "term.copyright": "Copyright", + "term.rightsReserved": "All Rights Reserved.", + "term.sponsor": "Sponsor this project", + "term.ciderTeam": "Cider Team", + "term.developer": "Developer", + "term.socialTeam": "Social Team", + "term.socials": "Socials", + "term.contributors": "Contributors", + "term.equalizer": "Equalizer", + "term.reset": "Reset", + "term.tracks": "tracks", // Assume x amount of tracks. e.g. 50 tracks + "term.videos": "Videos", + "term.menu": "Menu", + "term.check": "Check", + "term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat' + "term.topResult": "Top Result", // Search Results + "term.sharedPlaylists": "Shared Playlists", // Search Results + "term.people": "People", // Search Results + "term.newpreset.name": "नई EQ Preset Name", // Equalizer Preset + "term.addedpreset": "Added Preset", + "term.deletepreset.warn": "Are you sure you want to delete this preset?", + "term.deletedpreset": "Removed preset", + "term.musicVideos": "Music Videos", // Search page friendlyTypes + "term.stations": "Stations", + "term.curators": "Curators", + "term.appleCurators": "Apple Curators", + "term.radioShows": "Radio Shows", + "term.recordLabels": "Record Labels", + "term.videoExtras": "Video Extras", + "term.top": "Top", + + // Home + "home.title": "Home", + "home.recentlyPlayed": "Recently Played", + "home.recentlyAdded": "Recently Added", + "home.artistsFeed": "Your Artists Feed", + "home.artistsFeed.noArtist": "Follow some artists first and their latest releases will be here", + "home.madeForYou": "Made For You", + "home.friendsListeningTo": "Friends Listening To", + "home.followedArtists": "Followed Artists", + + // Errors + "error.appleMusicSubRequired": "Apple Music requires a subscription.", + "error.connectionError": "There was a problem connecting to Apple Music.", + "error.noResults": "No Results.", + "error.noResults.description": "Try a नई search.", + + // Podcasts + "podcast.followOnCider": "Follow On Cider", + "podcast.followedOnCider": "Following On Cider", + "podcast.subscribeOnItunes": "Subscribe On iTunes", + "podcast.subscribedOnItunes": "Subscribed On iTunes", + "podcast.itunesStore": "iTunes Store", + "podcast.episodes": "Episodes", + "podcast.playEpisode": "Play Episode", + "podcast.website": "Podcast Website", + + // Actions + "action.addToLibrary": "Add to Library", + "action.addToLibrary.success": "Added to Library", + "action.addToLibrary.error": "Error Adding to Library", + "action.removeFromLibrary": "Remove from Library", + "action.removeFromLibrary.success": "Removed from Library", + "action.addToQueue": "Add to Queue", + "action.addToQueue.success": "Added to Queue", + "action.addToQueue.error": "Error Adding to Queue", + "action.removeFromQueue": "Remove from Queue", + "action.removeFromQueue.success": "Removed from Queue", + "action.removeFromQueue.error": "Error Removing from Queue", + "action.createPlaylist": "बनाएं a नई Playlist", + "action.addToPlaylist": "Add to Playlist", + "action.removeFromPlaylist": "Remove from Playlist", + "action.addToFavorites": "Add to Favorites", + "action.follow": "Follow", + "action.follow.success": "Followed", + "action.follow.error": "Error Following", + "action.unfollow": "Unfollow", + "action.unfollow.success": "Unfollowed", + "action.unfollow.error": "Error Unfollowing", + "action.playNext": "Play Next", + "action.playLater": "Play Later", + "action.startRadio": "Start Radio", + "action.goToArtist": "Go to Artist", + "action.goToAlbum": "Go to Album", + "action.moveToTop": "Move to top", + "action.share": "Share", + "action.rename": "Rename", + "action.love": "Love", + "action.unlove": "Unlove", + "action.dislike": "Dislike", + "action.undoDislike": "Undo dislike", + "action.showWebRemoteQR": "Web Remote", + "action.playTracksNext": "Play ${app.selectedMediaItems.length} tracks next", + "action.playTracksLater": "Play ${app.selectedMediaItems.length} tracks later", + "action.removeTracks": "Remove ${self.selectedItems.length} tracks from queue", + "action.import": "Import", + "action.export": "Export", + "action.showAlbum": "दिखाएं Complete Album", + "action.tray.minimize": "Minimize to Tray", + "action.tray.quit": "Quit", + "action.tray.show": "दिखाएं", + "action.update": "Update", + "action.copy": "Copy", + "action.newpreset": "नई Preset...", // Equalizer Preset + "action.deletepreset": "Delete Preset", + + // Settings - General + "settings.header.general": "General", + "settings.header.general.description": "Adjust the general settings for Cider.", + "settings.option.general.language": "Language", + + // Language optgroups + "settings.option.general.language.main": "Languages", + "settings.option.general.language.fun": "Fun Languages", + "settings.option.general.language.unsorted": "Unsorted", + + // Update Cider + "settings.option.general.updateCider": "Update Cider", // Button. Refer to term.check for the check button + "settings.option.general.updateCider.branch": "Cider Update Branch", // Dropdown + "settings.option.general.updateCider.branch.description": "Select the branch to update Cider to", + "settings.option.general.updateCider.branch.main": "Stable", + "settings.option.general.updateCider.branch.develop": "Development", + + // Settings - Audio + "settings.header.audio": "Audio", + "settings.header.audio.description": "Adjust the audio settings for Cider.", + "settings.option.audio.quality": "Audio Quality", // Dropdown + "settings.header.audio.quality.hireslossless": "Hi-Res Lossless", + "settings.header.audio.quality.hireslossless.description": "up to 24-bit/192 kHz", + "settings.header.audio.quality.lossless": "Lossless", + "settings.header.audio.quality.lossless.description": "up to 24-bit/48 kHz", + "settings.header.audio.quality.high": "High", + "settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "Standard", + "settings.header.audio.quality.standard.description": "64 kbps", + "settings.option.audio.seamlessTransition": "Seamless Audio Transition", // Toggle + "settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality", // Toggle + "settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization , Equalizers and Visualizers, however on some systems this may cause stuttering in audio tracks.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoacoustic Enhancements that makes everything sound both richer and more lively | Designed by Maikiwi.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggressive", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience.", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatialize audio and make audio more 3-dimensional (note: This is not Dolby Atmos)", + + // Settings - Visual + "settings.header.visual": "Visual", + "settings.header.visual.description": "Adjust the visual settings for Cider.", + "settings.option.visual.windowBackgroundStyle": "Window Background Style", // Toggle + "settings.header.visual.windowBackgroundStyle.none": "None", + "settings.header.visual.windowBackgroundStyle.artwork": "Artwork", + "settings.header.visual.windowBackgroundStyle.image": "Image", + "settings.option.visual.animatedArtwork": "Animated Artwork", // Dropdown + "settings.header.visual.animatedArtwork.always": "Always", + "settings.header.visual.animatedArtwork.limited": "Limited to pages and special entries", + "settings.header.visual.animatedArtwork.disable": "Disable everywhere", + "settings.option.visual.animatedArtworkQuality": "Animated Artwork Quality", // Dropdown + "settings.header.visual.animatedArtworkQuality.low": "Low", + "settings.header.visual.animatedArtworkQuality.medium": "Medium", + "settings.header.visual.animatedArtworkQuality.high": "High", + "settings.header.visual.animatedArtworkQuality.veryHigh": "Very High", + "settings.header.visual.animatedArtworkQuality.extreme": "Extreme", + "settings.option.visual.animatedWindowBackground": "Animated Window Background", // Toggle + "settings.option.visual.hardwareAcceleration": "Hardware Acceleration", // Dropdown + "settings.option.visual.hardwareAcceleration.description": "Requires relaunch", + "settings.header.visual.hardwareAcceleration.default": "Default", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.theme": "Theme", + + // Settings - Visual - Theme name + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Dark", + // Refer to term.disabled for the disabled option + "settings.option.visual.showPersonalInfo": "दिखाएं Personal Info", // Toggle + + // Settings - Lyrics + "settings.header.lyrics": "Lyrics", + "settings.header.lyrics.description": "Adjust the lyrics settings for Cider.", + "settings.option.lyrics.enableMusixmatch": "Enable Musixmatch Lyrics", // Toggle + "settings.option.lyrics.enableMusixmatchKaraoke": "Enable Karaoke Mode (Musixmatch only)", // Toggle + "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Translation Preferred Language", // Dropdown + "settings.option.lyrics.enableYoutubeLyrics": "Enable Youtube Lyrics for Music Videos", // Toggle + + // Settings - Connectivity + "settings.header.connectivity": "Connectivity", + "settings.header.connectivity.description": "Adjust the connectivity settings for Cider.", + "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown + "settings.option.connectivity.playbackNotifications": "Playback Notifications", // Toggle + // Refer to term.disabled for the disabled option + "settings.header.connectivity.discordRPC.cider": "Display as 'Cider'", + "settings.header.connectivity.discordRPC.appleMusic": "Display as 'Apple Music'", + "settings.option.connectivity.discordRPC.clearOnPause": "Clear Discord Rich Presence on Pause", // Toggle + "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", // Option to Connect + "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)", + // Refer to term.connect for the connect button + + // Settings - Experimental + "settings.header.experimental": "Experimental", + "settings.header.experimental.description": "Adjust the experimental settings for Cider.", + "settings.option.experimental.compactUI": "Compact UI", // Toggle + "settings.option.experimental.close_button_hide": "Close Button Should Hide the Application", + "settings.option.experimental.copy_log": "Copy logs to clipboard", + "settings.option.experimental.inline_playlists": "Inline Playlists and Albums", + + // Refer to term.disabled & term.enabled + // Spatialization Menu + "spatial.notTurnedOn": "Audio Spatialization is disabled. To use, please enable it first.", + "spatial.spatialProperties": "Spatial Properties", + "spatial.width": "Width", + "spatial.height": "Height", + "spatial.depth": "Depth", + "spatial.gain": "Gain", + "spatial.roomMaterials": "Room Materials", + "spatial.roomDimensions": "Room Dimensions", + "spatial.roomPositions": "Room Positions", + "spatial.setDimensions": "Set Dimensions", + "spatial.setPositions": "Set Positions", + "spatial.up": "Up", + "spatial.front": "Front", + "spatial.left": "Left", + "spatial.right": "Right", + "spatial.back": "Back", + "spatial.down": "Down", + "spatial.listener": "Listener", + "spatial.audioSource": "Audio Source", + + // Settings - Unfinished + "settings.header.unfinished": "Unfinished", + + // Web Remote + "remote.web.title": "Cider Remote", + "remote.web.description": "Scan the QR code to pair your phone up with this Cider instance", + + // About + "about.thanks": "Major thanks to the Cider Collective Team and all of our contributors." +} From 481c0be89757396ac0c0bab2b41bd01a9abeaa07 Mon Sep 17 00:00:00 2001 From: Jozen Blue Martinez Date: Tue, 8 Feb 2022 23:47:00 +0800 Subject: [PATCH 50/54] Fix loading external plugins. (#380) --- src/main/base/plugins.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/base/plugins.ts b/src/main/base/plugins.ts index 4ffb1042..f4f1d2ec 100644 --- a/src/main/base/plugins.ts +++ b/src/main/base/plugins.ts @@ -33,7 +33,7 @@ export class Plugins { if (fs.existsSync(this.userPluginsPath)) { fs.readdirSync(this.userPluginsPath).forEach(file => { if (file.endsWith('.ts') || file.endsWith('.js')) { - const plugin = require(path.join(this.userPluginsPath, file)).default; + const plugin = require(path.join(this.userPluginsPath, file)); file = file.replace('.ts', '').replace('.js', ''); if (plugins[file] || plugin in plugins) { console.log(`[${plugin.name}] Plugin already loaded / Duplicate Class Name`); From b182a90b8a4176f993d9115c357a72d4cdecaeba Mon Sep 17 00:00:00 2001 From: Juraj <75269827+jurosic@users.noreply.github.com> Date: Tue, 8 Feb 2022 17:17:29 +0000 Subject: [PATCH 51/54] FIxed things in slovak translation that i realized were wrong when i fell asleep, weird (#381) * Added slovak translation * fixed stuff * Update sk_SK.jsonc * added missing translations * slovak grammar is hard okay >:( * localhost:9000 and vibrant bass go to a bar and the bartender says, we dont serve bad memes here * mistake has been spotted * Update sk_SK.jsonc * Update sk_SK.jsonc Co-authored-by: Quacksire <19170969+quacksire@users.noreply.github.com> --- src/i18n/sk_SK.jsonc | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/i18n/sk_SK.jsonc b/src/i18n/sk_SK.jsonc index 95100010..bba5ed51 100644 --- a/src/i18n/sk_SK.jsonc +++ b/src/i18n/sk_SK.jsonc @@ -4,7 +4,7 @@ "i18n.languageName": "Slovenčina (SK)", // name of language in native language "i18n.languageNameEnglish": "Slovak (SK)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@jurosic", // Authors, if you contribute to this file feel free to add your name seperated with a space + "i18n.authors": "@jurosic-JurajJanosik", // Authors, if you contribute to this file feel free to add your name seperated with a space // App info "app.name": "Cider", @@ -31,7 +31,7 @@ "term.logout": "Odhlásiť", "term.login": "Prihlásiť", "term.about": "About", - "term.privateSession": "Osobný Session", + "term.privateSession": "Skuromn Počúvanie", "term.queue": "Poradie", "term.search": "Vyhládavať", "term.library": "Knižnica", @@ -76,8 +76,8 @@ "term.viewAs.coverArt": "Náhľadovka", "term.viewAs.list": "List", "term.size": "Velkosť", - "term.size.normal": "Normal", - "term.size.compact": "Compact", + "term.size.normal": "Normálny", + "term.size.compact": "Kompaktný", "term.enable": "Zapnúť", "term.disable": "Vypnúť", "term.enabled": "Zapnuté", @@ -199,7 +199,7 @@ "action.update": "Aktualizovať", // Settings - General - "settings.header.general": "všeobecné", + "settings.header.general": "Všeobecné", "settings.header.general.description": "Zmeniť všeobecné nastavenia pre Cider.", "settings.option.general.language": "Jazyk", @@ -218,6 +218,12 @@ "settings.option.audio.seamlessTransition": "Hladký Prevod Zvuku", // Toggle "settings.option.audio.enableAdvancedFunctionality": "Zapnút Pokročilé Nastavenia Zvuku", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "Zapnutie AudioContext funkcionality dovolí rozšírené funkcie zvuku ako Zvuková Normalizávia , Equalizéry a Visualízery, ale na niektorých systémoch to može spôsobiť problémy so zvukom.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Psychoakustické Vylepšenia ktoré urobia zvuk viac bohatý a živý | Urobil Maikiwi.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Sila", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Zmení silu CAP (Agresívná môže spôsobiť nežiadané výsledky)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Štandardná", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresívná", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalízacia Zvuku", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizuje silu zvuku v pesničkách pre hľadší počúvací zážitok", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Priestorový Zvuk", // Toggle @@ -244,6 +250,10 @@ "settings.option.visual.hardwareAcceleration.description": "Vyžaduje Reštart", "settings.header.visual.hardwareAcceleration.default": "Predvoľba", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.theme": "Theme", + // Settings - Visual - Theme name + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Dark", // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Zobraziť osobné informácie", // Toggle @@ -274,8 +284,8 @@ // Settings - Experimental "settings.header.experimental": "Experimentálne", "settings.header.experimental.description": "Zmeniť experimentálne nastavenia pre Cider.", - "settings.option.experimental.compactUI": "Compact UI", // Toggle - "settings.option.experimental.close_button_hide": "Zatvoriť by malo skriť aplikáciu", + "settings.option.experimental.compactUI": "Kompaktný UI", // Toggle + "settings.option.experimental.close_button_hide": "Zatvaranie aplikácie ju malo skriť", // Refer to term.disabled & term.enabled // Spatialization Menu From 9201b7091cfaf06a7e2da412f44a6120236001bc Mon Sep 17 00:00:00 2001 From: Amaru8 <52407090+Amaru8@users.noreply.github.com> Date: Tue, 8 Feb 2022 19:00:51 +0000 Subject: [PATCH 52/54] Updated icon files in Web Remote (#389) --- src/web-remote/icon-192x192.png | Bin 17166 -> 7313 bytes src/web-remote/icon-256x256.png | Bin 16442 -> 10085 bytes src/web-remote/icon-384x384.png | Bin 43738 -> 16360 bytes src/web-remote/icon-512x512.png | Bin 38363 -> 23392 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/web-remote/icon-192x192.png b/src/web-remote/icon-192x192.png index 05834da24a8b7a426d6f5b3359b3dbe4e71f4775..73f1a793a5518c09ec8fb2793514c2b517b27ae0 100644 GIT binary patch literal 7313 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 literal 17166 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 N002ovPDHLkV1nLt@(=(3 diff --git a/src/web-remote/icon-256x256.png b/src/web-remote/icon-256x256.png index cb75e71b666f0fe9e72e6d3dab70a576b3d621d6..6f39989360a3051460aa19a9f5e0e40e9fa035a9 100644 GIT binary patch literal 10085 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 OK;xdaN~N+**#7|i8T-os literal 16442 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 aIVEcSQYHjWnLu?uprc`+Ua4vq@xK5k2lfg8 literal 43738 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

3zQXJO!S%09#+j;K`l~YG+Q<+xp#A-u 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 diff --git a/src/web-remote/icon-512x512.png b/src/web-remote/icon-512x512.png index f4a96312fa1083f04c62446eedd61120c942f445..ae74febb2ed9617f7ea4685d66f3ce459474e4e1 100644 GIT binary patch literal 23392 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

MA!? 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 From 2b6246ddaa1405fe0774c55bb8cad390638e938c Mon Sep 17 00:00:00 2001 From: KaHim Chan Date: Wed, 9 Feb 2022 04:46:38 +0800 Subject: [PATCH 53/54] Irregular update 09/02 (#388) --- src/i18n/hi_IN.jsonc | 5 +- src/i18n/in_ID.jsonc | 712 ++++++++++--------- src/i18n/sk_SK.jsonc | 21 +- src/renderer/views/components/miniplayer.ejs | 14 +- 4 files changed, 384 insertions(+), 368 deletions(-) diff --git a/src/i18n/hi_IN.jsonc b/src/i18n/hi_IN.jsonc index ddeef8b4..ad96e8f3 100644 --- a/src/i18n/hi_IN.jsonc +++ b/src/i18n/hi_IN.jsonc @@ -1,5 +1,5 @@ { - // Base File + // i18n Info "i18n.languageName": "English (US)", // name of language in native language "i18n.languageNameEnglish": "English (US)", // name of language in English @@ -289,6 +289,7 @@ // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "Dark", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "दिखाएं Personal Info", // Toggle @@ -355,4 +356,4 @@ // About "about.thanks": "Major thanks to the Cider Collective Team and all of our contributors." -} +} \ No newline at end of file diff --git a/src/i18n/in_ID.jsonc b/src/i18n/in_ID.jsonc index d9d28529..8e4a445b 100644 --- a/src/i18n/in_ID.jsonc +++ b/src/i18n/in_ID.jsonc @@ -1,357 +1,359 @@ -{ // Base File - // i18n Info - "i18n.languageName": "Bahasa Indonesia", // name of language in native language - "i18n.languageNameEnglish": "Indonesian", // name of language in English - "i18n.category": "main", // main = real language, fun = fun community languages - "i18n.authors": "@crystalshower", // Authors, if you contribute to this file feel free to add your name seperated with a space - - // App info - "app.name": "Cider", - - "date.format": "${d} ${m}, ${y}", - - // Dialogs - "dialog.cancel": "Batal", - "dialog.ok": "OK", - - // Notification - "notification.updatingLibrarySongs": "Memperbarui Pustaka lagu...", - "notification.updatingLibraryAlbums": "Memperbarui Pustaka album...", - "notification.updatingLibraryArtists": "Memperbarui Pustaka artis...", - - // Terms - "term.appleInc": "Apple Inc.", - "term.appleMusic": "Apple Music", - "term.applePodcasts": "Apple Podcasts", - "term.itunes": "iTunes", - "term.github": "GitHub", - "term.discord": "Discord", - "term.learnMore": "Pelajari lebih lanjut", - "term.accountSettings": "Pengaturan Akun", - "term.logout": "Keluar", - "term.login": "Masuk", - "term.about": "Tentang", - "term.privateSession": "Sesi Pribadi", - "term.queue": "Antrian", - "term.history": "Riwayat", - "term.search": "Cari", - "term.library": "Pustaka", - "term.listenNow": "Dengarkan Sekarang", - "term.browse": "Telusuri", - "term.radio": "Radio", - "term.recentlyAdded": "Baru Ditambahkan", - "term.songs": "Lagu", - "term.albums": "Album", - "term.artists": "Artis", - "term.podcasts": "Podcasts", - "term.playlists": "Playlist", - "term.playlist": "Playlist", - "term.newPlaylist": "Playlist Baru", - "term.newPlaylistFolder": "Folder Playlist Baru", - "term.createNewPlaylist": "Buat Playlist Baru", - "term.createNewPlaylistFolder": "Buat Folder Playlist Baru", - "term.deletePlaylist": "Yakin ingin menghapus playlist ini?", - "term.play": "Mainkan", - "term.pause": "Jeda", - "term.previous": "Sebelumnya", - "term.next": "Selanjutnya", - "term.shuffle": "Acak", - "term.repeat": "Ulangi", - "term.volume": "Volume", - "term.mute": "Bisu", - "term.unmute": "Bunyikan", - "term.share": "Bagikan", - "term.share.success": "Disalin ke clipboard", - "term.settings": "Pengaturan", - "term.seeAll": "Lihat Semua", - "term.sortBy": "Urutkan Berdasarkan", - "term.sortBy.album": "Album", - "term.sortBy.artist": "Artis", - "term.sortBy.name": "Nama", - "term.sortBy.genre": "Genre", - "term.sortBy.releaseDate": "Tanggal Rilis", - "term.sortBy.duration": "Durasi", - "term.sortOrder": "A-Z", - "term.sortOrder.ascending": "Terkecil", - "term.sortOrder.descending": "Terbesar", - "term.viewAs": "Lihat Sebagai", - "term.viewAs.coverArt": "Cover Art", - "term.viewAs.list": "Daftar", - "term.size": "Ukuran", - "term.size.normal": "Normal", - "term.size.compact": "Kompak", - "term.enable": "Aktifkan", - "term.disable": "Nonaktifkan", - "term.enabled": "Diaktifkan", - "term.disabled": "Dinonaktikan", - "term.connect": "Sambungkan", - "term.connecting": "Menyambungkan", - "term.disconnect": "Terputus", - "term.authed": "Diotentikasi", - "term.confirm": "Konfirmasi?", - "term.more": "Selebihnya", - "term.less": "Lebih Sedikit", - "term.showMore": "Tampilkan lebih banyak", - "term.showLess": "Tampilkan lebih sedikit", - "term.topSongs": "Lagu Teratas", - "term.latestReleases": "Rilis Terbaru", - "term.time.added": "Ditambahkan", - "term.time.released": "Dirilis", - "term.time.updated": "Diperbarui", - "term.time.hours": "jam", - "term.time.hour": "jam", - "term.time.minutes": "menit", - "term.time.minute": "menit", - "term.time.seconds": "detik", - "term.time.second": "detik", - "term.fullscreenView": "Mode Layar Penuh", - "term.defaultView": "Mode Default", - "term.audioSettings": "Pengaturan Audio", - "term.clearAll": "Bersihkan Semua", - "term.recentStations": "Stasiun Terbaru", - "term.language": "Bahasa", - "term.funLanguages": "Senang-senang", - "term.noLyrics": "Memuat... / Lirik tidak ditermukan./ Instrumental.", - "term.copyright": "Hak cipta", - "term.rightsReserved": "Hak cipta dilindungi Undang-undang.", - "term.sponsor": "Sponsori proyek ini", - "term.ciderTeam": "Cider Team", - "term.developer": "Pengembang", - "term.socialTeam": "Social Team", - "term.socials": "Sosial", - "term.contributors": "Kontributor", - "term.equalizer": "Equalizer", - "term.reset": "Atur Ulang", - "term.tracks": "lagu", // Assume x amount of tracks. e.g. 50 tracks - "term.videos": "Video", - "term.menu": "Menu", - "term.check": "Cek", - "term.aboutArtist": "Tentang {{artistName}}", // e.g. 'About Doja Cat' - "term.topResult": "Hasil Teratas", // Search Results - "term.sharedPlaylists": "Playlist yang dibagikan", // Search Results - "term.people": "Orang", // Search Results - "term.newpreset.name": "Nama Preset EQ Baru", // Equalizer Preset - "term.addedpreset": "Preset Ditambahkan", - "term.deletepreset.warn": "Yakin ingin menghapus preset ini?", - "term.deletedpreset": "Preset dihapus", - "term.musicVideos": "Video Musik", // Search page friendlyTypes - "term.stations": "Stasiun", - "term.curators": "Kurator", - "term.appleCurators": "Kurator Apple", - "term.radioShows": "Acara Radio", - "term.recordLabels": "Label Rekaman", - "term.videoExtras": "Bonus Video", - "term.top": "Atas", - - // Home - "home.title": "Beranda", - "home.recentlyPlayed": "Baru Dimainkan", - "home.recentlyAdded": "Baru Ditambahkan", - "home.artistsFeed": "Feed Artis Anda", - "home.artistsFeed.noArtist": "Ikuti beberapa artis terlebih dahulu dan rilisan terbaru mereka akan ada di sini", - "home.madeForYou": "Dibuat Untuk Kamu", - "home.friendsListeningTo": "Teman Sedang Mendengarkan", - "home.followedArtists": "Artis Diikuti", - - // Errors - "error.appleMusicSubRequired": "Apple Music memerlukan langganan.", - "error.connectionError": "Terjadi masalah saat menyambungkan ke Apple Music.", - "error.noResults": "Tidak ada hasil.", - "error.noResults.description": "Coba pencarian baru.", - - // Podcasts - "podcast.followOnCider": "Ikuti Di Cider", - "podcast.followedOnCider": "Mengikuti Di Cider", - "podcast.subscribeOnItunes": "Langganan Di iTunes", - "podcast.subscribedOnItunes": "Berlangganan Di iTunes", - "podcast.itunesStore": "iTunes Store", - "podcast.episodes": "Episode", - "podcast.playEpisode": "Mainkan Episode", - "podcast.website": "Website Podcast", - - // Actions - "action.addToLibrary": "Tambahkan ke Pustaka", - "action.addToLibrary.success": "Ditambahkan ke Pustaka", - "action.addToLibrary.error": "Terjadi Kesalahan Saat Menambahkan Pustaka", - "action.removeFromLibrary": "Hapus dari Pustaka", - "action.removeFromLibrary.success": "Dihapus dari Pustaka", - "action.addToQueue": "Tambahkan ke Antrian", - "action.addToQueue.success": "Ditambahkan ke Antrian", - "action.addToQueue.error": "Terjadi Kesalahan Saat Menambahkan ke Antrean", - "action.removeFromQueue": "Hapus dari Antrian", - "action.removeFromQueue.success": "Dihapus dari Antrian", - "action.removeFromQueue.error": "Terjadi Kesalahan Saat Menghapus Antrian", - "action.createPlaylist": "Buat Playlist Baru", - "action.addToPlaylist": "Tambahkan ke Playlist", - "action.removeFromPlaylist": "Hapus dari Playlist", - "action.addToFavorites": "Tambahkan ke Favorit", - "action.follow": "Ikuti", - "action.follow.success": "Diikuti", - "action.follow.error": "Kesalahan Dalam Mengikuti", - "action.unfollow": "Berhenti Mengikuti", - "action.unfollow.success": "Sudah Tidak Mengikuti", - "action.unfollow.error": "Terjadi Kesalahan Saat Berhenti Mengikuti", - "action.playNext": "Mainkan Selanjutnya", - "action.playLater": "Mainkan Nanti", - "action.startRadio": "Mulai Radio", - "action.goToArtist": "Lihat Halaman Artis", - "action.goToAlbum": "Lihat Halaman Album", - "action.moveToTop": "Pindah ke Atas", - "action.share": "Bagikan", - "action.rename": "Ubah Nama", - "action.love": "Suka", - "action.unlove": "Batal Suka", - "action.dislike": "Tidak Suka", - "action.undoDislike": "Batalkan Tidak Suka", - "action.showWebRemoteQR": "Remot Web", - "action.playTracksNext": "Mainkan ${app.selectedMediaItems.length} lagu selanjutnya", - "action.playTracksLater": "Mainkan ${app.selectedMediaItems.length} lagu nanti", - "action.removeTracks": "Hapus ${self.selectedItems.length} lagu dari antrian", - "action.import": "Impor", - "action.export": "Ekspor", - "action.showAlbum": "Tampilkan Album Sepenuhnya", - "action.tray.minimize": "Sembunyikan ke Tray", - "action.tray.quit": "Keluar", - "action.tray.show": "Tampilkan", - "action.update": "Perbarui", - "action.copy": "Salin", - "action.newpreset": "Preset Baru...", // Equalizer Preset - "action.deletepreset": "Hapus Preset", - - // Settings - General - "settings.header.general": "Umum", - "settings.header.general.description": "Sesuaikan pengaturan umum untuk Cider.", - "settings.option.general.language": "Bahasa", - - // Language optgroups - "settings.option.general.language.main": "Bahasa", - "settings.option.general.language.fun": "Bahasa Candaan", - "settings.option.general.language.unsorted": "Tidak disortir", +{ + + // i18n Info + "i18n.languageName": "Bahasa Indonesia", // name of language in native language + "i18n.languageNameEnglish": "Indonesian", // name of language in English + "i18n.category": "main", // main = real language, fun = fun community languages + "i18n.authors": "@crystalshower", // Authors, if you contribute to this file feel free to add your name seperated with a space - // Update Cider - "settings.option.general.updateCider": "Perbarui Cider", // Button. Refer to term.check for the check button - "settings.option.general.updateCider.branch": "Branch Pembaruan Cider", // Dropdown - "settings.option.general.updateCider.branch.description": "Pilih branch untuk memperbarui Cider", - "settings.option.general.updateCider.branch.main": "Stable", - "settings.option.general.updateCider.branch.develop": "Development", - - // Settings - Audio - "settings.header.audio": "Audio", - "settings.header.audio.description": "Sesuaikan pengaturan audio untuk Cider.", - "settings.option.audio.quality": "Kualitas Audio", // Dropdown - "settings.header.audio.quality.hireslossless": "Hi-Res Lossless", - "settings.header.audio.quality.hireslossless.description": "sampai dari 24-bit/192 kHz", - "settings.header.audio.quality.lossless": "Lossless", - "settings.header.audio.quality.lossless.description": "sampai dari 24-bit/48 kHz", - "settings.header.audio.quality.high": "Tinggi", - "settings.header.audio.quality.high.description": "256 kbps", - "settings.header.audio.quality.standard": "Standar", - "settings.header.audio.quality.standard.description": "64 kbps", - "settings.option.audio.seamlessTransition": "Transisi Audio Mulus", // Toggle - "settings.option.audio.enableAdvancedFunctionality": "Aktifkan Fungsi Lanjutan", // Toggle - "settings.option.audio.enableAdvancedFunctionality.description": "Mengaktifkan fungsionalitas AudioContext memungkinkan fitur audio lanjutan seperti Normalisasi Audio, Equalizer dan Visualizer. Namun pada beberapa perangkat dapat menyebabkan tersendatnya audio.", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle - "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Peningkatan Psikoakustik yang membuat semuanya terdengar lebih jelas dan lebih hidup | Dirancang oleh Maikiwi.", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Kekuatan CAP", // Toggle - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Mengubah kekuatan pemrosesan yang dilakukan pada audio. (Agresif dapat menghasilkan hasil yang tidak diinginkan)", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standar", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisasi Audio", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Menormalkan puncak volume untuk masing-masing lagu demi menciptakan pengalaman mendengarkan yang lebih seragam.", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spasialisasi Audio", // Toggle - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Atur ruang audio dan buat audio lebih 3 dimensi (NB: Bukan Dolby Atmos)", - - // Settings - Visual - "settings.header.visual": "Visual", - "settings.header.visual.description": "Sesuaikan pengaturan visual untuk Cider.", - "settings.option.visual.windowBackgroundStyle": "Gaya Latar Belakang Jendela", // Toggle - "settings.header.visual.windowBackgroundStyle.none": "Tidak Ada", - "settings.header.visual.windowBackgroundStyle.artwork": "Artwork", - "settings.header.visual.windowBackgroundStyle.image": "Gambar", - "settings.option.visual.animatedArtwork": "Artwork Bergerak", // Dropdown - "settings.header.visual.animatedArtwork.always": "Selalu", - "settings.header.visual.animatedArtwork.limited": "Terbatas untuk halaman dan entri khusus", - "settings.header.visual.animatedArtwork.disable": "Matikan di semua tempat", - "settings.option.visual.animatedArtworkQuality": "Kualitas Artwork Bergerak", // Dropdown - "settings.header.visual.animatedArtworkQuality.low": "Rendah", - "settings.header.visual.animatedArtworkQuality.medium": "Medium", - "settings.header.visual.animatedArtworkQuality.high": "Tinggi", - "settings.header.visual.animatedArtworkQuality.veryHigh": "Sangat Tinggi", - "settings.header.visual.animatedArtworkQuality.extreme": "Paling Tinggi", - "settings.option.visual.animatedWindowBackground": "Jendela Latar Belakang Bergerak", // Toggle - "settings.option.visual.hardwareAcceleration": "Akselerasi Perangkat Keras (HW Acceleration)", // Dropdown - "settings.option.visual.hardwareAcceleration.description": "Membutuhkan dibuka ulang", - "settings.header.visual.hardwareAcceleration.default": "Default", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", - "settings.header.visual.theme": "Tema", - - // Settings - Visual - Theme name - "settings.option.visual.theme.default": "Cider", - "settings.option.visual.theme.dark": "Gelap", - // Refer to term.disabled for the disabled option - "settings.option.visual.showPersonalInfo": "Tampilkan Info Pribadi", // Toggle - - // Settings - Lyrics - "settings.header.lyrics": "Lyrics", - "settings.header.lyrics.description": "Sesuaikan pengaturan lirik untuk Cider.", - "settings.option.lyrics.enableMusixmatch": "Aktifkan Lirik Musixmatch", // Toggle - "settings.option.lyrics.enableMusixmatchKaraoke": "Aktifkan Mode Karaoke (khusus Musixmatch)", // Toggle - "settings.option.lyrics.musixmatchPreferredLanguage": "Bahasa Terjemahan Musixmatch", // Dropdown - "settings.option.lyrics.enableYoutubeLyrics": "Aktifkan Lirik Youtube untuk Video Musik", // Toggle - - // Settings - Connectivity - "settings.header.connectivity": "Konektivitas", - "settings.header.connectivity.description": "Sesuaikan pengaturan konektivitas untuk Cider.", - "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown - "settings.option.connectivity.playbackNotifications": "Pemberitahuan Pemutaran", // Toggle - // Refer to term.disabled for the disabled option - "settings.header.connectivity.discordRPC.cider": "Tampilkan sebagai 'Cider'", - "settings.header.connectivity.discordRPC.appleMusic": "Tampilkan sebagai 'Apple Music'", - "settings.option.connectivity.discordRPC.clearOnPause": "Sembunyikan Discord Rich Presence saat dijeda", // Toggle - "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", // Option to Connect - "settings.option.connectivity.lastfmScrobble.delay": "Delay Last.fm Scrobble (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "Aktifkan Last.fm Now Playing", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Hapus featuring artist dari judul lagu (Last.fm)", - "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter lagu yang diulang (Last.fm)", - // Refer to term.connect for the connect button - - // Settings - Experimental - "settings.header.experimental": "Eksperimental", - "settings.header.experimental.description": "Sesuaikan pengaturan eksperimental untuk Cider.", - "settings.option.experimental.compactUI": "UI Kompak", // Toggle - "settings.option.experimental.close_button_hide": "Tombol Tutup Menyembunyikan Aplikasi", - "settings.option.experimental.copy_log": "Salin log ke clipboard", - "settings.option.experimental.inline_playlists": "Playlist dan Album Sebaris", - - // Refer to term.disabled & term.enabled - // Spatialization Menu - "spatial.notTurnedOn": "Spasialisasi Audio dinonaktifkan. Untuk menggunakan, aktifkan terlebih dahulu.", - "spatial.spatialProperties": "Spatial Properties", - "spatial.width": "Lebar", - "spatial.height": "Tinggi", - "spatial.depth": "Kedalaman", - "spatial.gain": "Gain", - "spatial.roomMaterials": "Bahan Ruangan", - "spatial.roomDimensions": "Dimensi Ruangan", - "spatial.roomPositions": "Posisi Ruangan", - "spatial.setDimensions": "Atur Dimensi", - "spatial.setPositions": "Atur Posisi", - "spatial.up": "Atas", - "spatial.front": "Depan", - "spatial.left": "Kiri", - "spatial.right": "Kanan", - "spatial.back": "Belakang", - "spatial.down": "Bawah", - "spatial.listener": "Pendegar", - "spatial.audioSource": "Sumber Audio", - - // Settings - Unfinished - "settings.header.unfinished": "Belum Diselesaikan", - - // Web Remote - "remote.web.title": "Remote Cider", - "remote.web.description": "Pindai kode QR untuk memasangkan ponsel Anda dengan Cider.", - - // About - "about.thanks": "Terima kasih yang sebesar-besarnya kepada Cider Collective Team dan semua kontributor kami." + // App info + "app.name": "Cider", + + "date.format": "${d} ${m}, ${y}", + + // Dialogs + "dialog.cancel": "Batal", + "dialog.ok": "OK", + + // Notification + "notification.updatingLibrarySongs": "Memperbarui Pustaka lagu...", + "notification.updatingLibraryAlbums": "Memperbarui Pustaka album...", + "notification.updatingLibraryArtists": "Memperbarui Pustaka artis...", + + // Terms + "term.appleInc": "Apple Inc.", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", + "term.itunes": "iTunes", + "term.github": "GitHub", + "term.discord": "Discord", + "term.learnMore": "Pelajari lebih lanjut", + "term.accountSettings": "Pengaturan Akun", + "term.logout": "Keluar", + "term.login": "Masuk", + "term.about": "Tentang", + "term.privateSession": "Sesi Pribadi", + "term.queue": "Antrian", + "term.history": "Riwayat", + "term.search": "Cari", + "term.library": "Pustaka", + "term.listenNow": "Dengarkan Sekarang", + "term.browse": "Telusuri", + "term.radio": "Radio", + "term.recentlyAdded": "Baru Ditambahkan", + "term.songs": "Lagu", + "term.albums": "Album", + "term.artists": "Artis", + "term.podcasts": "Podcasts", + "term.playlists": "Playlist", + "term.playlist": "Playlist", + "term.newPlaylist": "Playlist Baru", + "term.newPlaylistFolder": "Folder Playlist Baru", + "term.createNewPlaylist": "Buat Playlist Baru", + "term.createNewPlaylistFolder": "Buat Folder Playlist Baru", + "term.deletePlaylist": "Yakin ingin menghapus playlist ini?", + "term.play": "Mainkan", + "term.pause": "Jeda", + "term.previous": "Sebelumnya", + "term.next": "Selanjutnya", + "term.shuffle": "Acak", + "term.repeat": "Ulangi", + "term.volume": "Volume", + "term.mute": "Bisu", + "term.unmute": "Bunyikan", + "term.share": "Bagikan", + "term.share.success": "Disalin ke clipboard", + "term.settings": "Pengaturan", + "term.seeAll": "Lihat Semua", + "term.sortBy": "Urutkan Berdasarkan", + "term.sortBy.album": "Album", + "term.sortBy.artist": "Artis", + "term.sortBy.name": "Nama", + "term.sortBy.genre": "Genre", + "term.sortBy.releaseDate": "Tanggal Rilis", + "term.sortBy.duration": "Durasi", + "term.sortOrder": "A-Z", + "term.sortOrder.ascending": "Terkecil", + "term.sortOrder.descending": "Terbesar", + "term.viewAs": "Lihat Sebagai", + "term.viewAs.coverArt": "Cover Art", + "term.viewAs.list": "Daftar", + "term.size": "Ukuran", + "term.size.normal": "Normal", + "term.size.compact": "Kompak", + "term.enable": "Aktifkan", + "term.disable": "Nonaktifkan", + "term.enabled": "Diaktifkan", + "term.disabled": "Dinonaktikan", + "term.connect": "Sambungkan", + "term.connecting": "Menyambungkan", + "term.disconnect": "Terputus", + "term.authed": "Diotentikasi", + "term.confirm": "Konfirmasi?", + "term.more": "Selebihnya", + "term.less": "Lebih Sedikit", + "term.showMore": "Tampilkan lebih banyak", + "term.showLess": "Tampilkan lebih sedikit", + "term.topSongs": "Lagu Teratas", + "term.latestReleases": "Rilis Terbaru", + "term.time.added": "Ditambahkan", + "term.time.released": "Dirilis", + "term.time.updated": "Diperbarui", + "term.time.hours": "jam", + "term.time.hour": "jam", + "term.time.minutes": "menit", + "term.time.minute": "menit", + "term.time.seconds": "detik", + "term.time.second": "detik", + "term.fullscreenView": "Mode Layar Penuh", + "term.defaultView": "Mode Default", + "term.audioSettings": "Pengaturan Audio", + "term.clearAll": "Bersihkan Semua", + "term.recentStations": "Stasiun Terbaru", + "term.language": "Bahasa", + "term.funLanguages": "Senang-senang", + "term.noLyrics": "Memuat... / Lirik tidak ditermukan./ Instrumental.", + "term.copyright": "Hak cipta", + "term.rightsReserved": "Hak cipta dilindungi Undang-undang.", + "term.sponsor": "Sponsori proyek ini", + "term.ciderTeam": "Cider Team", + "term.developer": "Pengembang", + "term.socialTeam": "Social Team", + "term.socials": "Sosial", + "term.contributors": "Kontributor", + "term.equalizer": "Equalizer", + "term.reset": "Atur Ulang", + "term.tracks": "lagu", // Assume x amount of tracks. e.g. 50 tracks + "term.videos": "Video", + "term.menu": "Menu", + "term.check": "Cek", + "term.aboutArtist": "Tentang {{artistName}}", // e.g. 'About Doja Cat' + "term.topResult": "Hasil Teratas", // Search Results + "term.sharedPlaylists": "Playlist yang dibagikan", // Search Results + "term.people": "Orang", // Search Results + "term.newpreset.name": "Nama Preset EQ Baru", // Equalizer Preset + "term.addedpreset": "Preset Ditambahkan", + "term.deletepreset.warn": "Yakin ingin menghapus preset ini?", + "term.deletedpreset": "Preset dihapus", + "term.musicVideos": "Video Musik", // Search page friendlyTypes + "term.stations": "Stasiun", + "term.curators": "Kurator", + "term.appleCurators": "Kurator Apple", + "term.radioShows": "Acara Radio", + "term.recordLabels": "Label Rekaman", + "term.videoExtras": "Bonus Video", + "term.top": "Atas", + + // Home + "home.title": "Beranda", + "home.recentlyPlayed": "Baru Dimainkan", + "home.recentlyAdded": "Baru Ditambahkan", + "home.artistsFeed": "Feed Artis Anda", + "home.artistsFeed.noArtist": "Ikuti beberapa artis terlebih dahulu dan rilisan terbaru mereka akan ada di sini", + "home.madeForYou": "Dibuat Untuk Kamu", + "home.friendsListeningTo": "Teman Sedang Mendengarkan", + "home.followedArtists": "Artis Diikuti", + + // Errors + "error.appleMusicSubRequired": "Apple Music memerlukan langganan.", + "error.connectionError": "Terjadi masalah saat menyambungkan ke Apple Music.", + "error.noResults": "Tidak ada hasil.", + "error.noResults.description": "Coba pencarian baru.", + + // Podcasts + "podcast.followOnCider": "Ikuti Di Cider", + "podcast.followedOnCider": "Mengikuti Di Cider", + "podcast.subscribeOnItunes": "Langganan Di iTunes", + "podcast.subscribedOnItunes": "Berlangganan Di iTunes", + "podcast.itunesStore": "iTunes Store", + "podcast.episodes": "Episode", + "podcast.playEpisode": "Mainkan Episode", + "podcast.website": "Website Podcast", + + // Actions + "action.addToLibrary": "Tambahkan ke Pustaka", + "action.addToLibrary.success": "Ditambahkan ke Pustaka", + "action.addToLibrary.error": "Terjadi Kesalahan Saat Menambahkan Pustaka", + "action.removeFromLibrary": "Hapus dari Pustaka", + "action.removeFromLibrary.success": "Dihapus dari Pustaka", + "action.addToQueue": "Tambahkan ke Antrian", + "action.addToQueue.success": "Ditambahkan ke Antrian", + "action.addToQueue.error": "Terjadi Kesalahan Saat Menambahkan ke Antrean", + "action.removeFromQueue": "Hapus dari Antrian", + "action.removeFromQueue.success": "Dihapus dari Antrian", + "action.removeFromQueue.error": "Terjadi Kesalahan Saat Menghapus Antrian", + "action.createPlaylist": "Buat Playlist Baru", + "action.addToPlaylist": "Tambahkan ke Playlist", + "action.removeFromPlaylist": "Hapus dari Playlist", + "action.addToFavorites": "Tambahkan ke Favorit", + "action.follow": "Ikuti", + "action.follow.success": "Diikuti", + "action.follow.error": "Kesalahan Dalam Mengikuti", + "action.unfollow": "Berhenti Mengikuti", + "action.unfollow.success": "Sudah Tidak Mengikuti", + "action.unfollow.error": "Terjadi Kesalahan Saat Berhenti Mengikuti", + "action.playNext": "Mainkan Selanjutnya", + "action.playLater": "Mainkan Nanti", + "action.startRadio": "Mulai Radio", + "action.goToArtist": "Lihat Halaman Artis", + "action.goToAlbum": "Lihat Halaman Album", + "action.moveToTop": "Pindah ke Atas", + "action.share": "Bagikan", + "action.rename": "Ubah Nama", + "action.love": "Suka", + "action.unlove": "Batal Suka", + "action.dislike": "Tidak Suka", + "action.undoDislike": "Batalkan Tidak Suka", + "action.showWebRemoteQR": "Remot Web", + "action.playTracksNext": "Mainkan ${app.selectedMediaItems.length} lagu selanjutnya", + "action.playTracksLater": "Mainkan ${app.selectedMediaItems.length} lagu nanti", + "action.removeTracks": "Hapus ${self.selectedItems.length} lagu dari antrian", + "action.import": "Impor", + "action.export": "Ekspor", + "action.showAlbum": "Tampilkan Album Sepenuhnya", + "action.tray.minimize": "Sembunyikan ke Tray", + "action.tray.quit": "Keluar", + "action.tray.show": "Tampilkan", + "action.update": "Perbarui", + "action.copy": "Salin", + "action.newpreset": "Preset Baru...", // Equalizer Preset + "action.deletepreset": "Hapus Preset", + + // Settings - General + "settings.header.general": "Umum", + "settings.header.general.description": "Sesuaikan pengaturan umum untuk Cider.", + "settings.option.general.language": "Bahasa", + + // Language optgroups + "settings.option.general.language.main": "Bahasa", + "settings.option.general.language.fun": "Bahasa Candaan", + "settings.option.general.language.unsorted": "Tidak disortir", + + // Update Cider + "settings.option.general.updateCider": "Perbarui Cider", // Button. Refer to term.check for the check button + "settings.option.general.updateCider.branch": "Branch Pembaruan Cider", // Dropdown + "settings.option.general.updateCider.branch.description": "Pilih branch untuk memperbarui Cider", + "settings.option.general.updateCider.branch.main": "Stable", + "settings.option.general.updateCider.branch.develop": "Development", + + // Settings - Audio + "settings.header.audio": "Audio", + "settings.header.audio.description": "Sesuaikan pengaturan audio untuk Cider.", + "settings.option.audio.quality": "Kualitas Audio", // Dropdown + "settings.header.audio.quality.hireslossless": "Hi-Res Lossless", + "settings.header.audio.quality.hireslossless.description": "sampai dari 24-bit/192 kHz", + "settings.header.audio.quality.lossless": "Lossless", + "settings.header.audio.quality.lossless.description": "sampai dari 24-bit/48 kHz", + "settings.header.audio.quality.high": "Tinggi", + "settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "Standar", + "settings.header.audio.quality.standard.description": "64 kbps", + "settings.option.audio.seamlessTransition": "Transisi Audio Mulus", // Toggle + "settings.option.audio.enableAdvancedFunctionality": "Aktifkan Fungsi Lanjutan", // Toggle + "settings.option.audio.enableAdvancedFunctionality.description": "Mengaktifkan fungsionalitas AudioContext memungkinkan fitur audio lanjutan seperti Normalisasi Audio, Equalizer dan Visualizer. Namun pada beberapa perangkat dapat menyebabkan tersendatnya audio.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Peningkatan Psikoakustik yang membuat semuanya terdengar lebih jelas dan lebih hidup | Dirancang oleh Maikiwi.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Kekuatan CAP", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Mengubah kekuatan pemrosesan yang dilakukan pada audio. (Agresif dapat menghasilkan hasil yang tidak diinginkan)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standar", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisasi Audio", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Menormalkan puncak volume untuk masing-masing lagu demi menciptakan pengalaman mendengarkan yang lebih seragam.", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Spasialisasi Audio", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Atur ruang audio dan buat audio lebih 3 dimensi (NB: Bukan Dolby Atmos)", + + // Settings - Visual + "settings.header.visual": "Visual", + "settings.header.visual.description": "Sesuaikan pengaturan visual untuk Cider.", + "settings.option.visual.windowBackgroundStyle": "Gaya Latar Belakang Jendela", // Toggle + "settings.header.visual.windowBackgroundStyle.none": "Tidak Ada", + "settings.header.visual.windowBackgroundStyle.artwork": "Artwork", + "settings.header.visual.windowBackgroundStyle.image": "Gambar", + "settings.option.visual.animatedArtwork": "Artwork Bergerak", // Dropdown + "settings.header.visual.animatedArtwork.always": "Selalu", + "settings.header.visual.animatedArtwork.limited": "Terbatas untuk halaman dan entri khusus", + "settings.header.visual.animatedArtwork.disable": "Matikan di semua tempat", + "settings.option.visual.animatedArtworkQuality": "Kualitas Artwork Bergerak", // Dropdown + "settings.header.visual.animatedArtworkQuality.low": "Rendah", + "settings.header.visual.animatedArtworkQuality.medium": "Medium", + "settings.header.visual.animatedArtworkQuality.high": "Tinggi", + "settings.header.visual.animatedArtworkQuality.veryHigh": "Sangat Tinggi", + "settings.header.visual.animatedArtworkQuality.extreme": "Paling Tinggi", + "settings.option.visual.animatedWindowBackground": "Jendela Latar Belakang Bergerak", // Toggle + "settings.option.visual.hardwareAcceleration": "Akselerasi Perangkat Keras (HW Acceleration)", // Dropdown + "settings.option.visual.hardwareAcceleration.description": "Membutuhkan dibuka ulang", + "settings.header.visual.hardwareAcceleration.default": "Default", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.theme": "Tema", + + // Settings - Visual - Theme name + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Gelap", + + // Refer to term.disabled for the disabled option + "settings.option.visual.showPersonalInfo": "Tampilkan Info Pribadi", // Toggle + + // Settings - Lyrics + "settings.header.lyrics": "Lyrics", + "settings.header.lyrics.description": "Sesuaikan pengaturan lirik untuk Cider.", + "settings.option.lyrics.enableMusixmatch": "Aktifkan Lirik Musixmatch", // Toggle + "settings.option.lyrics.enableMusixmatchKaraoke": "Aktifkan Mode Karaoke (khusus Musixmatch)", // Toggle + "settings.option.lyrics.musixmatchPreferredLanguage": "Bahasa Terjemahan Musixmatch", // Dropdown + "settings.option.lyrics.enableYoutubeLyrics": "Aktifkan Lirik Youtube untuk Video Musik", // Toggle + + // Settings - Connectivity + "settings.header.connectivity": "Konektivitas", + "settings.header.connectivity.description": "Sesuaikan pengaturan konektivitas untuk Cider.", + "settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown + "settings.option.connectivity.playbackNotifications": "Pemberitahuan Pemutaran", // Toggle + // Refer to term.disabled for the disabled option + "settings.header.connectivity.discordRPC.cider": "Tampilkan sebagai 'Cider'", + "settings.header.connectivity.discordRPC.appleMusic": "Tampilkan sebagai 'Apple Music'", + "settings.option.connectivity.discordRPC.clearOnPause": "Sembunyikan Discord Rich Presence saat dijeda", // Toggle + "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", // Option to Connect + "settings.option.connectivity.lastfmScrobble.delay": "Delay Last.fm Scrobble (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Aktifkan Last.fm Now Playing", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Hapus featuring artist dari judul lagu (Last.fm)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter lagu yang diulang (Last.fm)", + // Refer to term.connect for the connect button + + // Settings - Experimental + "settings.header.experimental": "Eksperimental", + "settings.header.experimental.description": "Sesuaikan pengaturan eksperimental untuk Cider.", + "settings.option.experimental.compactUI": "UI Kompak", // Toggle + "settings.option.experimental.close_button_hide": "Tombol Tutup Menyembunyikan Aplikasi", + "settings.option.experimental.copy_log": "Salin log ke clipboard", + "settings.option.experimental.inline_playlists": "Playlist dan Album Sebaris", + + // Refer to term.disabled & term.enabled + // Spatialization Menu + "spatial.notTurnedOn": "Spasialisasi Audio dinonaktifkan. Untuk menggunakan, aktifkan terlebih dahulu.", + "spatial.spatialProperties": "Spatial Properties", + "spatial.width": "Lebar", + "spatial.height": "Tinggi", + "spatial.depth": "Kedalaman", + "spatial.gain": "Gain", + "spatial.roomMaterials": "Bahan Ruangan", + "spatial.roomDimensions": "Dimensi Ruangan", + "spatial.roomPositions": "Posisi Ruangan", + "spatial.setDimensions": "Atur Dimensi", + "spatial.setPositions": "Atur Posisi", + "spatial.up": "Atas", + "spatial.front": "Depan", + "spatial.left": "Kiri", + "spatial.right": "Kanan", + "spatial.back": "Belakang", + "spatial.down": "Bawah", + "spatial.listener": "Pendegar", + "spatial.audioSource": "Sumber Audio", + + // Settings - Unfinished + "settings.header.unfinished": "Belum Diselesaikan", + + // Web Remote + "remote.web.title": "Remote Cider", + "remote.web.description": "Pindai kode QR untuk memasangkan ponsel Anda dengan Cider.", + + // About + "about.thanks": "Terima kasih yang sebesar-besarnya kepada Cider Collective Team dan semua kontributor kami." } \ No newline at end of file diff --git a/src/i18n/sk_SK.jsonc b/src/i18n/sk_SK.jsonc index bba5ed51..6d77106c 100644 --- a/src/i18n/sk_SK.jsonc +++ b/src/i18n/sk_SK.jsonc @@ -1,7 +1,7 @@ -{ // Base File +{ // i18n Info - "i18n.languageName": "Slovenčina (SK)", // name of language in native language + "i18n.languageName": "Slovenčina (SK)", // name of language in native language "i18n.languageNameEnglish": "Slovak (SK)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "@jurosic-JurajJanosik", // Authors, if you contribute to this file feel free to add your name seperated with a space @@ -19,6 +19,7 @@ "notification.updatingLibrarySongs": "Aktualizujem pesničky v knižnici...", "notification.updatingLibraryAlbums": "Aktualizujem albumy v knižnici...", "notification.updatingLibraryArtists": "Aktualizujem tvorcov v knižnici...", + // Terms "term.appleInc": "Apple Inc.", "term.appleMusic": "Apple Music", @@ -125,7 +126,6 @@ "term.menu": "Menu", "term.check": "Skontrolovať", "term.aboutArtist": "Viac o {{artistName}}", // e.g. 'About Doja Cat' - "term.updateCider": "Aktualizovať Cider", // Home "home.title": "Domov", @@ -136,13 +136,14 @@ "home.madeForYou": "Robené Pre Teba", "home.friendsListeningTo": "Kamaráti počúvajú", "home.followedArtists": "Sledovaný Tvorcovia", + // Errors "error.appleMusicSubRequired": "Apple Music potrebuje subscription.", "error.connectionError": "Pri pripojovaní ku Apple Music sa vyskytol problém", "error.noResults": "Žiadne výsledky", "error.noResults.description": "Skús nové vyhľádavanie", - //Podcasts + // Podcasts "podcast.followOnCider": "Sleduj na Cider", "podcast.followedOnCider": "Sledované na Cider", "podcast.subscribeOnItunes": "Odoberaj na iTunes", @@ -208,6 +209,9 @@ "settings.option.general.language.fun": "Zábanve Jazyky", "settings.option.general.language.unsorted": "Nepotriedené", + // Update Cider + "settings.option.general.updateCider": "Aktualizovať Cider", + // Settings - Audio "settings.header.audio": "Zvuk", "settings.header.audio.description": "Zmeniť nastavenia zvuku pre Cider.", @@ -228,6 +232,7 @@ "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizuje silu zvuku v pesničkách pre hľadší počúvací zážitok", "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Priestorový Zvuk", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Priestorový zvuk urobí zvuk 3-dimenzionálny (poznámka: Toto nie je Dolby Atmos)", + // Settings - Visual "settings.header.visual": "Visuálne", "settings.header.visual.description": "Zmenit Visuálne nastavenia pre Cider.", @@ -251,9 +256,11 @@ "settings.header.visual.hardwareAcceleration.default": "Predvoľba", "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "Theme", + // Settings - Visual - Theme name "settings.option.visual.theme.default": "Cider", "settings.option.visual.theme.dark": "Dark", + // Refer to term.disabled for the disabled option "settings.option.visual.showPersonalInfo": "Zobraziť osobné informácie", // Toggle @@ -284,10 +291,12 @@ // Settings - Experimental "settings.header.experimental": "Experimentálne", "settings.header.experimental.description": "Zmeniť experimentálne nastavenia pre Cider.", + "settings.option.experimental.compactUI": "Compact UI", // Toggle + "settings.option.experimental.close_button_hide": "Zatvoriť by malo skriť aplikáciu", "settings.option.experimental.compactUI": "Kompaktný UI", // Toggle "settings.option.experimental.close_button_hide": "Zatvaranie aplikácie ju malo skriť", - // Refer to term.disabled & term.enabled + // Refer to term.disabled & term.enabled // Spatialization Menu "spatial.notTurnedOn": "Priestorový Zvuk je vypnutý. Prosím najprv ho zapnite.", "spatial.spatialProperties": "Špeciálne Nastavenia", @@ -318,4 +327,4 @@ // About "about.thanks": "Ďakujeme Cider Tímu, Komunite a Kontribútorom, bez vás by to nebolo možné." -} +} \ No newline at end of file diff --git a/src/renderer/views/components/miniplayer.ejs b/src/renderer/views/components/miniplayer.ejs index 8c268588..11ef521d 100644 --- a/src/renderer/views/components/miniplayer.ejs +++ b/src/renderer/views/components/miniplayer.ejs @@ -6,11 +6,15 @@ 📌

- - + + + + + + + +
From b7fb674d68c5b5185495e38d4b7231dcf07f9d7f Mon Sep 17 00:00:00 2001 From: Jozen Blue Martinez Date: Wed, 9 Feb 2022 05:40:57 +0800 Subject: [PATCH 54/54] Create WebNowPlaying plugin (#393) --- src/main/plugins/webNowPlaying.ts | 227 ++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 src/main/plugins/webNowPlaying.ts diff --git a/src/main/plugins/webNowPlaying.ts b/src/main/plugins/webNowPlaying.ts new file mode 100644 index 00000000..25673133 --- /dev/null +++ b/src/main/plugins/webNowPlaying.ts @@ -0,0 +1,227 @@ +import * as WebSocket from 'ws'; + +/** + * 0-pad a number. + * @param {Number} number + * @param {Number} length + * @returns String + */ +const pad = (number: number, length: number) => String(number).padStart(length, '0'); + +/** + * Convert seconds to a time string acceptable to Rainmeter + * https://github.com/tjhrulz/WebNowPlaying-BrowserExtension/blob/master/WebNowPlaying.js#L50-L59 + * @param {Number} timeInSeconds + * @returns String + */ +const convertTimeToString = (timeInSeconds: number) => { + const timeInMinutes = timeInSeconds / 60; + if (timeInMinutes < 60) { + return timeInMinutes + ":" + pad(timeInSeconds % 60, 2); + } + return timeInMinutes / 60 + ":" + pad(timeInMinutes % 60, 2) + ":" + pad(timeInSeconds % 60, 2); +} + +export default class WebNowPlaying { + /** + * Base Plugin Details (Eventually implemented into a GUI in settings) + */ + public name: string = 'WebNowPlaying'; + public description: string = 'Song info and playback control for the Rainmeter WebNowPlaying plugin.'; + public version: string = '1.0.0'; + public author: string = 'Zennn '; + + private _win: any; + private ws: any = null; + private wsapiConn: any = null; + private playerName: string = 'Cider'/* Apple Music */; + + constructor() { + console.debug(`[Plugin][${this.name}] Loading Complete.`); + } + + sendSongInfo(attributes: any) { + if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return; + + const fields = ['STATE', 'TITLE', 'ARTIST', 'ALBUM', 'COVER', 'DURATION', 'POSITION', 'VOLUME', 'REPEAT', 'SHUFFLE']; + fields.forEach((field) => { + try { + let value: any = ''; + switch (field) { + case 'STATE': + value = attributes.status ? 1 : 2; + break; + case 'TITLE': + value = attributes.name; + break; + case 'ARTIST': + value = attributes.artistName; + break; + case 'ALBUM': + value = attributes.albumName; + break; + case 'COVER': + value = attributes.artwork.url.replace('{w}', attributes.artwork.width).replace('{h}', attributes.artwork.height); + break; + case 'DURATION': + value = convertTimeToString(attributes.durationInMillis / 1000); + break; + case 'POSITION': + value = convertTimeToString((attributes.durationInMillis - attributes.remainingTime) / 1000); + break; + case 'VOLUME': + value = attributes.volume * 100; + break; + case 'REPEAT': + value = attributes.repeatMode; + break; + case 'SHUFFLE': + value = attributes.shuffleMode; + break; + } + this.ws.send(`${field}:${value}`); + } catch (error) { + if (this.ws.readyState === WebSocket.OPEN) { + this.ws.send(`Error:Error updating ${field} for ${this.playerName}`); + this.ws.send(`ErrorD:${error}`); + } + } + }); + } + + fireEvent(evt: any) { + if (!evt.data) return; + let value = ''; + if (evt.data.split(/ (.+)/).length > 1) { + value = evt.data.split(/ (.+)/)[1]; + } + const eventName = evt.data.split(' ')[0].toLowerCase(); + + try { + switch (eventName) { + case 'playpause': + this._win.webContents.executeJavaScript('MusicKitInterop.playPause()').catch(console.error); + break; + case 'next': + this._win.webContents.executeJavaScript('MusicKitInterop.next()').catch(console.error); + break; + case 'previous': + this._win.webContents.executeJavaScript('MusicKitInterop.previous()').catch(console.error); + break; + case 'setposition': + this._win.webContents.executeJavaScript(`MusicKit.getInstance().seekToTime(${parseFloat(value)})`); + break; + case 'setvolume': + this._win.webContents.executeJavaScript(`MusicKit.getInstance().volume = ${parseFloat(value) / 100}`); + break; + case 'repeat': + this._win.webContents.executeJavaScript('wsapi.toggleRepeat()').catch(console.error); + break; + case 'shuffle': + this._win.webContents.executeJavaScript('wsapi.toggleShuffle()').catch(console.error); + break; + case 'togglethumbsup': + // not implemented + break; + case 'togglethumbsdown': + // not implemented + break; + case 'rating': + // not implemented + break; + } + } catch (error) { + console.debug(error); + if (this.ws.readyState === WebSocket.OPEN) { + this.ws.send(`Error:Error sending event to ${this.playerName}`); + this.ws.send(`ErrorD:${error}`); + } + } + } + + /** + * Runs on app ready + */ + onReady(win: any) { + this._win = win; + + // Connect to Rainmeter plugin and retry on disconnect. + const init = () => { + try { + this.ws = new WebSocket('ws://127.0.0.1:8974/'); + let retry: NodeJS.Timeout; + this.ws.onopen = (() => { + console.info('[WebNowPlaying] Connected to Rainmeter'); + this.ws.send(`PLAYER:${this.playerName}`); + }).bind(this); + + this.ws.onclose = () => { + clearTimeout(retry); + retry = setTimeout(init, 2000); + }; + + this.ws.onerror = () => { + clearTimeout(retry); + this.ws.close(); + }; + + this.ws.onmessage = this.fireEvent?.bind(this); + } catch (error) { + console.error(error); + } + }; + + init(); + + // Connect to wsapi. Only used to update progress. + try { + this.wsapiConn = new WebSocket('ws://127.0.0.1:26369/'); + + this.wsapiConn.onopen = () => { + console.info('[WebNowPlaying] Connected to wsapi'); + }; + + this.wsapiConn.onmessage = (evt: { data: string; }) => { + const response = JSON.parse(evt.data); + if (response.type === 'playbackStateUpdate') { + this.sendSongInfo(response.data); + } + }; + } catch (error) { + console.error(error); + } + + console.debug(`[Plugin][${this.name}] Ready.`); + } + + /** + * Runs on app stop + */ + onBeforeQuit() { + if (this.ws) { + this.ws.send('STATE:0'); + this.ws.onclose = null; // disable onclose handler first to stop it from retrying + this.ws.close(); + } + if (this.wsapiConn) { + this.wsapiConn.close(); + } + console.debug(`[Plugin][${this.name}] Stopped.`); + } + + /** + * Runs on playback State Change + * @param attributes Music Attributes (attributes.status = current state) + */ + onPlaybackStateDidChange(attributes: any) { + this.sendSongInfo(attributes); + } + + /** + * Runs on song change + * @param attributes Music Attributes + */ + onNowPlayingItemDidChange(attributes: any) { + this.sendSongInfo(attributes); + } +}