diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e64a6ea3..f5fab9dc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,10 +62,10 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Node.js and NPM - uses: actions/setup-node@master + uses: actions/setup-node@v4 with: node-version: 20 @@ -77,9 +77,9 @@ jobs: - name: Install FPM run: | - sudo apt-get update - sudo apt-get install ruby ruby-dev build-essential - sudo gem install --no-document fpm + sudo apt-get update + sudo apt-get install ruby ruby-dev build-essential + sudo gem install --no-document fpm # wait because this will only publish if the draft exists - name: Sleep for 30 seconds @@ -92,7 +92,6 @@ jobs: USE_SYSTEM_FPM: true run: npm run release:arm64 - publish_mac: name: "Publish MacOS" runs-on: macos-latest diff --git a/package-lock.json b/package-lock.json index 8e926027..36096fa2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "freeshow", - "version": "1.3.6", + "version": "1.3.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "freeshow", - "version": "1.3.6", + "version": "1.3.7", "hasInstallScript": true, "license": "GPL-3.0", "dependencies": { @@ -63,7 +63,7 @@ "@types/sqlite3": "^3.1.8", "@types/tmp": "^0.2.6", "@types/vimeo__player": "^2.16.2", - "electron": "^32.2.6", + "electron": "^32.1.2", "electron-builder": "^24.13.3", "playwright": "^1.49.0", "prettier": "^3.4.1", @@ -3070,9 +3070,9 @@ } }, "node_modules/electron": { - "version": "32.2.6", - "resolved": "https://registry.npmjs.org/electron/-/electron-32.2.6.tgz", - "integrity": "sha512-aGG1MLvWCf+ECUFBCmaCF52F8312OPAJfph2D0FSsFmlbfnJuNevZCbty2lFzsiIMtU7/QRo6d0ksbgR4s7y3w==", + "version": "32.1.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-32.1.2.tgz", + "integrity": "sha512-CXe6doFzhmh1U7daOvUzmF6Cj8hssdYWMeEPRnRO6rB9/bbwMlWctcQ7P8NJXhLQ88/vYUJQrJvlJPh8qM0BRQ==", "dev": true, "hasInstallScript": true, "license": "MIT", diff --git a/package.json b/package.json index ac335660..792d5ca3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "freeshow", - "version": "1.3.6", + "version": "1.3.7", "private": true, "main": "build/electron/index.js", "description": "Show song lyrics and more for free!", @@ -149,7 +149,7 @@ "@types/sqlite3": "^3.1.8", "@types/tmp": "^0.2.6", "@types/vimeo__player": "^2.16.2", - "electron": "^32.2.6", + "electron": "^32.1.2", "electron-builder": "^24.13.3", "playwright": "^1.49.0", "prettier": "^3.4.1", diff --git a/public/lang/cs_CZ.json b/public/lang/cs_CZ.json index 763ad9fe..6914b420 100644 --- a/public/lang/cs_CZ.json +++ b/public/lang/cs_CZ.json @@ -104,7 +104,7 @@ "web": "Vyhledávání webu", "search_web": "Hledej píseň na webu", "search_results": "Výsledky vyhledávání", - "block": "Block", + "block": "Blok", "more_options": "Další nastavení", "auto_groups": "Automaticky přiřadit skupiny", "format_new_show": "Formátovat text", @@ -149,7 +149,7 @@ "overlays": "Vypnout vrstvy", "audio": "Vypnout audio", "nextTimer": "Vynulovat časovač dalšího snímku", - "timer": "Clear timer", + "timer": "Vypnout časovač", "drawing": "Odstranit nákres" }, "remove": { @@ -402,7 +402,7 @@ "trigger": "Spouštěč", "audio_stream": "Stream audia", "transition": "Přechod", - "media_fit": "Change media fit", + "media_fit": "Změnit vmístění média", "delete_show": "Smazat prezentaci", "delete_show_confirmation": "Určitě to chceš smazat?", "delete_duplicated_shows": "Odstranit duplikátní prezentace", @@ -416,7 +416,7 @@ "animate": "Animovat", "translate": "Lokalizace", "next_timer": "Časovač dalšího snímku", - "display_duration": "Display duration", + "display_duration": "Doba zobrazení", "import": "Import", "songbeamer_import": "Import Songbeameru", "export": "Export", @@ -426,7 +426,7 @@ "edit_event": "Upravit událost", "about": "Popis", "history": "Historie", - "manage_emitters": "Manage emitters", + "manage_emitters": "Spravovat emitery", "action": "Akce", "category_action": "Akce kategorie", "user_data_overwrite": "Existující data nalezeny", @@ -583,7 +583,7 @@ "unmute": "Zrušit ztlumení", "increase_volume": "Zesílit", "decrease_volume": "Zeslabit", - "manage_subtitles": "Manage subtitles", + "manage_subtitles": "Spravovat titulky", "toggle_time_marker": "Přepnout časové značky", "add_time_marker": "Přidat časovou značku", "bind_to": "Specifické výstupy", @@ -687,10 +687,10 @@ "start_trigger": "Spustit spouštěč", "run_action": "Spustit akci", "toggle_action": "Přepnout akc", - "emit_data": "Emit data", + "emit_data": "Emitovat data", "send_rest_command": "Poslat HTTP-Žádost", "custom_activation": "Vlastní aktivace", - "any": "Any", + "any": "Jakékoliv", "activate_on_startup": "Aktivovat na spuštění", "activate_save": "Aktivovat na uložení", "activate_slide_clicked": "Aktivovat na stisknutí snímku", @@ -759,7 +759,7 @@ "all_projects": "Všechny projekty", "project": "Projekt", "option_type": "Co si přejete exportovat?", - "option_format": "What format would you like?", + "option_format": "Jaký formát si přejete?", "include_media": "Zahrnout soubory médií", "preview": "Náhled", "title": "Název", @@ -982,7 +982,7 @@ "analog": "Analogový", "seconds": "Sekundy", "custom": "Vlastní", - "show_time": "Display time" + "show_time": "Zobrazit čas" }, "captions": { "info": "Prosím, klikni na URL odkaz, abys jej otevřel ve svém prohlížeči, pokud jsi tak ještě neučinil, nebo jej otevři na jiném zařízení! Ujisti se, že povolíš přístup k mikrofonu, a použiješ Google Chrome pro nejlepší výkon.", @@ -1016,11 +1016,11 @@ "tip_index_by_velocity": "Rejstřík je určen obrženou velocitou začínající na 0." }, "emitters": { - "emitter": "Emitter", - "tip": "Create emit templates to easily send specific messages.", + "emitter": "Emiter", + "tip": "Vytvořit šablony emitoru pro zasílání určitých zpráv.", "signal": "Signál ", - "message_template": "Message template", - "message_templates": "Message templates", + "message_template": "Šablona zprávy", + "message_templates": "Šablony zpráv", "inputs": "Vstupy" }, "draw": { @@ -1111,7 +1111,7 @@ "lines": "Řádky", "override_with_template": "Přepsat snímek šablonou", "override_scripture_with_template": "Přepsat Bibli šablonou", - "overrided_value": "A template might override this value", + "overrided_value": "Šablona může přepsat tuto hodnotu", "active_layers": "Aktivní vrstvy", "window": "Okno", "active_style": "Použít styl", @@ -1119,7 +1119,7 @@ "auto_updates": "Automatické aktualizace", "disable_labels": "Vypnout štítky", "group_numbers": "Skupinová čísla", - "transparent_slides": "Transparent slide preview", + "transparent_slides": "Průhledný náhled snímku", "full_colors": "Vysoký kontrast skupinových barev", "slide_number_keys": "Přehrát snímky s klávesami čísel", "auto_shortcut_first_letter": "Automatická zkratka k prvnímu písmenu v textu", diff --git a/public/lang/en.json b/public/lang/en.json index ab68f7a1..2c4ef103 100644 --- a/public/lang/en.json +++ b/public/lang/en.json @@ -188,6 +188,7 @@ "fit": "Fit", "contain": "Contain", "fill": "Fill", + "blur_fill": "Blur fill", "cover": "Cover", "online": "Online", "recommended": "Recommended", @@ -852,6 +853,7 @@ "line_height": "Line height", "letter_spacing": "Letter spacing", "word_spacing": "Word spacing", + "position": "Position", "transform": "Transform", "text_transform": "Text transform", "uppercase": "Uppercase", @@ -1089,8 +1091,10 @@ "minutes": "minutes", "use24hClock": "Use 24-hour clock", "styles_hint": "Create different styles that can be applied to the output to change the look.", + "outputs_hint": "Create multiple output windows, position them on external screens, or send a screen capture.", "hide_output_hint": "Double click on the output window to hide it. Hold CTRL to enable dragging.", "hide_menubar_hint": "To hide the menu bar, enable kiosk mode, or enable \"Automatically hide or show the menu bar\" in the general MacOS settings.", + "output_locked": "The output position has been locked!", "show_output_hint": "Hold ctrl/cmd while clicking the display button to force it to show over this monitor.", "move_output_hint": "Don't find your display? Change the position until the window shows up on the second screen.", "select_display": "Click on the screen where you want to display the output window.", diff --git a/public/lang/fi.json b/public/lang/fi.json new file mode 100644 index 00000000..27f2d234 --- /dev/null +++ b/public/lang/fi.json @@ -0,0 +1,1403 @@ +{ + "main": { + "welcome": "Tervetuloa", + "quit": "Poistu", + "docs": "Ohje", + "about": "Tietoja", + "unnamed": "Nimetön", + "drop": "Pudota tähän", + "search": "Hae", + "quick_search": "Pikahaku", + "none": "Ei mitään", + "finished": "Valmis", + "open": "Avaa", + "system_open": "Avaa järjestelmässä" + }, + "formats": { + "show": "Esitys", + "project": "Projekti", + "template": "Malli", + "theme": "Teema", + "clipboard": "Leikepöytä", + "text": "Tekstitiedosto" + }, + "guide": { + "start": "Pikaopas", + "skip": "Ohita" + }, + "titlebar": { + "file": "Tiedosto", + "edit": "Muokkaa", + "view": "Näytä", + "help": "Ohje" + }, + "screen": { + "width": "Leveys", + "height": "Korkeus", + "pixels": "pikseliä", + "top": "Yläreuna", + "right": "Oikea", + "bottom": "Alareuna", + "left": "Vasen", + "centered": "Keskitetty", + "edge_blending_tip": "Yhdistä useita ulostuloja tai projektoreita saumattomaan siirtymään.", + "cropping_tip": "Hienosäädä ikkunan sisällön sijaintia leikkaamalla reunoilta" + }, + "about": { + "check_updates": "Tarkista päivitykset", + "made": "Tehnyt Norjassa ", + "more": "Näet lisää sovelluksiamme osoitteessa", + "report": "Ilmoita ongelmasta tai pyydä ominaisuutta osoitteessa ", + "translate": "Haluatko auttaa kääntämisessä? Mene ", + "mail": "Ota yhteyttä sähköpostilla", + "support": "Jos pidät projektista, harkitse sen tukemista", + "assets": "Käytetyt resurssit", + "libraries": "Käytetyt kirjastot", + "thanks": "Kiitos ", + "new_update": "Päivitys saatavilla", + "download": "Käynnistä sovellus uudestaan päivittääksesi tai lata päivitys osoitteesta freeshow.app", + "changes": "Uutta" + }, + "tooltip": { + "project": "Luo uusi projekti, jonne voit lisätä esityksiä ja järjestellä niitä.", + "show": "Luo uusi esitys, jonne voit lisätä laulun sanoja, esityksiä, ääntä ja videoita.", + "groups": "Kaikki nykyisen esityksen ryhmät ja kaikki yleiset ryhmät. Napsauta tai raahaa niitä lisätäksesi nykyiseen asetteluun.", + "layout": "Lisää siirtymiä ja ajastimia dioille nykyisessä asettelussa.", + "media": "Kaikki mediasisältö esityksessä. Näytä tai raahaa ne osaksi asettelua.", + "metadata": "Muokkaa esityksen metadataa.", + "notes": "Kirjoita muistiinpano.", + "text": "Muokkaa kaikkien valittujen kohteiden sisältöä.", + "item": "Muokkaa kaikkia valittuja kohteita.", + "items": "Lisää ja järjestä kohteita.", + "slide": "Muokkaa diaa.", + "filters": "Muuta valitun kohteen ulkoasua.", + "options": "Lisäasetukset.", + "scripture": "Paina Ctrl/Cmd tai Vaihto valitaksesi useita jakeita." + }, + "tips": { + "trigger": "Laukaisimia käytetään lähettämään HTTP-pyyntö kameran esiasetusten muuttamiseen." + }, + "setup": { + "good_luck": "Toivon, että pidät sovelluksesta. Hyvää esitystä! :)", + "tips": "Löydä vinkkejä ja ohjeita nettisivulta.", + "change_later": "Voit muokata asetuksia myöhemmin", + "get_started": "Aloitetaan!" + }, + "example": { + "welcome": "Tervetuloa", + "meetings": "Kokoukset", + "example": "Esimerkki", + "example_note": "Kirjoita muistiinpanot tähän", + "watermark": "Vesileima", + "recording": "Tallennus", + "clock": "Kello", + "rounded": "Pyöristetty", + "call": "Videopuhelu", + "header": "Otsikko", + "text": "Teksti", + "big": "Iso", + "default": "Oletus", + "small": "Pieni", + "bold": "Lihavoitu" + }, + "create_show": { + "web": "Nettihaku", + "search_web": "Etsi laulua netistä", + "search_results": "Haun tulokset", + "block": "Lohko", + "more_options": "Lisäasetukset", + "auto_groups": "Lisää ryhmiin automaattisesti", + "format_new_show": "Muotoile tekstiä", + "format_new_show_tip": "Muotoile tekstiä automaattisilla isoilla kirjaimilla, tekstin pätkimisellä ja muulla.", + "split_lines": "Maksimimäärä rivejä dialla", + "split_lines_tip": "Suurin sallittu rivien lukumäärä ennen automaattista katkaisua", + "quick_lyrics": "Pikasanat", + "quick_lyrics_tip": "Liitä teksti tai kirjoita", + "quick_lyrics_example_tip": "Kirjoita laulun sanat tai mitä tahansa tekstiä tähän", + "quick_lyrics_example_text": "Rivi", + "empty": "Tyhjä esitys", + "exists": "Samanniminen esitys on olemassa" + }, + "preview": { + "_previous_show": "Edellinen esitys", + "_previous_slide": "Edellinen dia", + "_lock": "Lukitse ulostulo", + "_unlock": "Vapauta ulostulon lukitus", + "_start": "Aloita esitys", + "_update": "Päivitä ulostulo", + "_next_slide": "Seuraava dia", + "_next_show": "Seuraava esitys", + "_hide_preview": "Piilota esikatselu", + "show_preview": "Näytä esikatselu", + "restore_output": "Palauta ulostulo", + "enable_controls": "Näytä mediasisällön esikatselun hallinta", + "background": "Tausta", + "foreground": "Edusta", + "slide": "Dia", + "overlays": "Peittokuvat", + "audio": "Ääni", + "to_start": "Siirry alkuun", + "nextTimer": "Seuraavan dian ajastin", + "lock": "Lukitse", + "unlock": "Vapauta", + "test_pattern": "Testaa kuvio" + }, + "clear": { + "all": "Tyhjennä kaikki", + "background": "Tyhjennä tausta", + "slide": "Tyhjennä dia", + "overlays": "Tyhjennä peittokuvat", + "audio": "Tyhjennä audio", + "nextTimer": "Tyhjennä seuraavan dian ajastin", + "timer": "Tyhjennä ajastin", + "drawing": "Tyhjennä piirros" + }, + "remove": { + "background": "Poista tausta", + "overlays": "Poista peittokuvat", + "audio": "Poista audio", + "nextTimer": "Poista seuraavan dian ajastin", + "to_start": "Poista alkuun siirtyminen", + "timer": "Poista ajastin", + "transition": "Poista siirtymä" + }, + "media": { + "_loop": "Looppi", + "play": "Toista", + "play_multiple": "Toista useita", + "toggle_shuffle": "Sekoita tai järjestä", + "next": "Seuraava", + "previous": "Edellinen", + "play_no_audio": "Toista ilman ääntä", + "play_no_filters": "Toista filttereittä", + "favourite": "Suosikki", + "pause": "Tauko", + "stop": "Pysäytä", + "back10": "Taaksepäin 10 sekuntia", + "forward10": "Eteenpäin 10 sekuntia", + "volume": "Äänenvoimakkuus", + "gain": "Äänen vahvistus", + "speed": "Nopeus", + "flip": "Käännä", + "flip_horizontally": "Käännä vaakasuunnassa", + "flip_vertically": "Käännä pystysuunnassa", + "all": "Kansiot, kuvat ja videot", + "folder": "Vain kansiot", + "image": "Vain kuvat", + "video": "Vain videot", + "fit": "Sovita", + "contain": "Sisällytä", + "fill": "Täytä", + "cover": "Peitä", + "online": "Netissä", + "recommended": "Suositeltu", + "bundle_media_files": "Kokoa kaikki mediasisältö", + "bundle_media_files_tip": "Kopioi kaikki mediatiedostot kaikista esityksistä yhteen kansioon" + }, + "audio": { + "settings": "Audioasetukset", + "playlist_settings": "Soittolistan asetukset", + "custom_output": "Mukautettu äänilähtö", + "mute_when_video_plays": "Hiljennä, kun video on käynnissä", + "allow_gaining": "Salli äänen vahvistus", + "allow_gaining_tip": "Salli suurempi kuin 100 % äänenvoimakkuus (saattaa aiheuttaa säröä)", + "pre_fader_volume_meter": "Äänenvoimakkuus ennen liukusäätimiä", + "mixer": "Mikseri", + "metronome": "Metronomi", + "toggle_metronome": "Metronomi päälle tai pois", + "tempo": "Tempo", + "bpm": "BPM", + "beats": "Iskua" + }, + "menu": { + "show": "Esitys", + "_title_show": "Esitetään", + "edit": "Muokkaa", + "_title_edit": "Muokataan", + "stage": "Lava", + "_title_stage": "Lavanäkymä", + "draw": "Piirrä", + "_title_draw": "Piirretään", + "calendar": "Kalenteri", + "_title_calendar": "Tapahtumat", + "settings": "Asetukset", + "_title_settings": "Asetukset", + "_title_display": "Esitä", + "_title_display_stop": "Lopeta esittäminen", + "again_confirm": "Napsauta uudestaan vahvistaaksesi" + }, + "empty": { + "general": "Täällä ei ole mitään", + "project_select": "Valitse projekti", + "show": "Ei projektia valittuna", + "shows": "Ei esityksiä", + "slides": "Ei dioja", + "slide": "Ei diaa valittuna", + "items": "Ei kohteita valittuna", + "search": "Ei osumia", + "media": "Esityksessä ei ole mediasisältöä", + "stage_show": "Ei lavaesitystä", + "stage_shows": "Ei lavaesityksiä", + "player": "Ei videoita", + "groups": "Ei ryhmiä", + "events": "Ei tapahtumia", + "text": "Kirjoita jotain", + "timers": "Ei ajastimia", + "input": "Syötteestä puuttuu arvo", + "recording": "Klikkaa oikealla painikkeella näyttöä tai ikkunaa aloittaaksesi tallennuksen." + }, + "remote": { + "projects": "Projektit", + "project": "Projekti", + "shows": "Esitykset", + "show": "Esitys", + "slide": "Dia", + "lyrics": "Sanat", + "end": "Loppu", + "no_output": "Ei ulostuloa", + "remember": "Muista minut", + "loading": "Ladataan...", + "submit": "Lähetä", + "password": "Salasana", + "wrong_password": "Väärä salasana", + "quick_play": "Pikatoisto" + }, + "error": { + "no_show": "Esitystä ei löytynyt", + "no_layouts": "Yhtään asettelua ei löytynyt", + "load": "Ei voitu ladata", + "bible": "Paikallista tekstiä ei löytynyt", + "bible_api": "Tekstin lataaminen API.Biblestä ei onnistunut. Onko nettiyhteys toiminnassa?", + "not_found": "Ei löytynyt", + "display": "Ulostulon ikkunaa ei voitu näyttää nykyisessä näytössä", + "keep_one_layout": "Vähintään yksi asettelu tarvitaan", + "video_unavailable": "Eikö video näy? Tekijä on estänyt videon upottamisen.", + "folder_exists": "Kansio on jo olemassa", + "uri": "Ei pystynyt hakemaan audion nimeä. Anna uusi nimi tiedostolle.", + "ip": "Laitteen IP-osoite ei selivinnyt. Etsi tietokoneesi WiFi-asetuksista IPv4-osoite." + }, + "meta": { + "number": "Numero", + "title": "Otsikko", + "artist": "Artisti", + "author": "Tekijä", + "composer": "Säveltäjä", + "publisher": "Julkaisija", + "copyright": "Tekijänoikeus", + "CCLI": "Laulun tunnus (CCLI)", + "year": "Vuosi", + "key": "Avain", + "autofill": "Automaattinen täyttö", + "message": "Viesti", + "message_tip": "Näytä kaikilla dioilla", + "auto_media": "Hae metatiedot median sisällöstä", + "override_output": "Ohita ulostulon tyyli", + "display_metadata": "Näytä metadata", + "meta_template": "Metadatan malli", + "text_divider": "Tekstin erotin", + "message_template": "Viestimalli", + "tags": "Tunnisteet", + "new_tag": "Uusi tunniste", + "clear_tag_filter": "Tyhjennä tunnistesuodattimet" + }, + "show_at": { + "never": "Ei dioja", + "always": "Kaikki diat", + "first": "Ensimmäinen dia", + "last": "Viimeinen dia", + "first_last": "Ensimmäinen ja viimeinen dia" + }, + "themes": { + "default": "Oletus", + "dark": "Tumma", + "light": "Vaalea", + "white": "Valkoinen", + "black": "Musta" + }, + "theme": { + "primary": "Ensisijainen", + "primary-lighter": "Ensisijainen vaaleampi", + "primary-darker": "Ensisijainen tummempi", + "primary-darkest": "Ensisijainen tummin", + "text": "Teksti", + "textInvert": "Käännetty teksti", + "secondary-text": "Valinnat", + "secondary": "Toissijainen", + "secondary-opacity": "Toissijainen", + "hover": "Vie päälle", + "focus": "Kohdistus" + }, + "inputs": { + "name": "Nimi", + "url": "URL", + "method": "Metodi", + "contentType": "Sisältötyyppi", + "payload": "Hyötykuorma", + "video_id": "Videon tunnista tai URL", + "close_ad": "Sulje mainos ulostulon näytöllä", + "start": "Alku", + "end": "Loppu", + "change_folder": "Valitse toinen sijainti" + }, + "tabs": { + "shows": "Esitykset", + "media": "Mediasisältö", + "overlays": "Peittokuvat", + "audio": "Audio", + "effects": "Efektit", + "scripture": "Raamattu", + "calendar": "Kalenteri", + "functions": "Funktiot", + "actions": "Toiminnot", + "player": "Soitin", + "live": "Live", + "timers": "Ajastimet", + "variables": "Muuttujat", + "triggers": "Käynnistimet", + "templates": "Mallit", + "web": "Netti", + "search_tip": "Haku alavalikosta" + }, + "category": { + "all": "Kaikki", + "unlabeled": "Nimeämättömät", + "favourites": "Suosikit", + "song": "Laulut", + "presentation": "Esitykset", + "info": "Info", + "scripture": "Raamattu", + "events": "Tapahtumat", + "pictures": "Kuvat", + "videos": "Videot", + "music": "Musiikki", + "offers": "Tarjoukset", + "notice": "Ilmoitus", + "visuals": "Visuaaliset elementit", + "action_tip": "Toiminto, joka käynnistetään aina, kun tämän kategorian esitys näytetään." + }, + "groups": { + "current": "Nykyinen", + "global": "Yleinen", + "toggle_global_group": "Ota yleiset ryhmät käyttöön ja pois", + "group_shortcut": "Ryhmän oikopolku", + "group_template": "Ryhmän malli", + "intro": "Intro", + "verse": "Säkeistö", + "pre_chorus": "Ennen kertosäettä", + "chorus": "Kertosäe", + "break": "Tauko", + "tag": "Loppuosa", + "bridge": "Silta", + "outro": "Outro" + }, + "popup": { + "show": "Uusi esitys", + "select_show": "Valitse esitys", + "rename": "Nimeä uudelleen", + "color": "Väri", + "find_replace": "Etsi ja korvaa", + "edit_list": "Muokkaa listaa", + "timer": "Ajastin", + "variable": "Muuttuja", + "trigger": "Laukaisin", + "audio_stream": "Audiovirta", + "transition": "Siirtymä", + "media_fit": "Sovita mediasisältö uudelleen", + "delete_show": "Poista esitys", + "delete_show_confirmation": "Haluatko varmasti poistaa", + "delete_duplicated_shows": "Poista esitysten tuplaesiintymät", + "change_name": "Vaihda nimi ", + "choose_screen": "Valitse näyttö", + "choose_output": "Valitse ulostulon tyyppi", + "change_output_values": "Muuta ulostulon arvoja", + "choose_chord": "Valitse sointu", + "set_time": "Aseta aika", + "slide_shortcut": "Dian pikanäppäin", + "animate": "Animoi", + "translate": "Lokalisointi", + "next_timer": "Seuraavan dian ajastin", + "display_duration": "Näytä kesto", + "import": "Tuo", + "songbeamer_import": "Songbeamer-tuonti", + "export": "Vie", + "importing": "Viedään...", + "import_scripture": "Tuo Raamattu", + "player": "Soitin", + "edit_event": "Muokkaa tapahtumaa", + "about": "Tietoja", + "history": "Historia", + "manage_emitters": "Hallitse lähettimiä", + "action": "Tominto", + "category_action": "Kategorian toiminto", + "user_data_overwrite": "Löytyi dataa", + "connect": "Yhdistä", + "cloud_update": "Synkronoidaan pilveen", + "cloud_method": "Datasijainti", + "shortcuts": "Oikopolut", + "icon": "Kuvakkeet", + "manage_icons": "Hallitse kuvakkeita", + "manage_colors": "Hallitse värejä", + "choose_camera": "Valitse kamera", + "manage_tags": "Hallitse tunnisteita", + "initialize": "Tervetuloa", + "unsaved": "Haluatko varmasti lopettaa?", + "cancel": "Peru", + "continue": "Jatka", + "reset_all": "Palauta kaikki", + "reset_all_confirm": "Haluatko varmasti palauttaa kaikki?", + "reset_all_action": "Tämä palauttaa sovelluksen, muttei poista .show-tiedostoja \"Shows\"-kansiossa.", + "quit": "Poistu tallentamatta", + "save_quit": "Tallenna ja poistu" + }, + "toast": { + "saving": "Tallentaa...", + "saved": "Tallennettu", + "error_media": "Mediasisältöä ei saatu", + "empty_styles": "Ei tyylejä", + "chapter_undefined": "Lukua {} ei löydy tästä kirjasta.", + "verse_undefined": "Jaetta {} ei löydy tästä luvusta.", + "recording_started": "Tallennus aloitettu!", + "recording_stopped": "Tallennus lopetettu!", + "starting_action": "Aloitetaan toiminto", + "less_than_minute": "minuutissa", + "less_than_seconds": "nopeammin kuin {} sekuntia.", + "now": "nyt!", + "unsupported_video": "Videota ei tueta!", + "no_video_id": "Ei videon tunnistetta", + "no_name": "Ei nimeä", + "reverting_setting": "Palautetaan muutos {} sekunnissa. Ota käyttöön uudestaan.", + "reverted": "Palautetaan. Ota käyttöön uudestaan vain, jos sinulla ei ollut ongelmia.", + "media_replaced": "Puuttunut mediatiedosto korvattiin osumalla.", + "lyrics_undefined": "Sanoja ei löytynyt!", + "lyrics_copied": "Sanat kopioitiin lähteestä ", + "one_output": "Yksi aktiivinen ulostulo tarvitaan!", + "empty_cache": "Välimuisti on tyhjä.", + "deleted_cache": "Mediasisällön kuvien välimuisti poistettiin", + "no_songswords_easyworship": "Puuttuva SongsWords.db-tiedosto.", + "delete_shows_empty": "Ei esityksiä poistettavaksi.", + "output_capture_enabled": "Ulostulon näytön kaappaus. Tämä voi vaikuttaa suorituskykyyn. Käytä vain, jos on tarvetta!", + "midi_no_project": "Vastaanotettiin laukaisin projektin muuttamiseksi. Mutta projektia ei löytynyt indeksissä:", + "midi_no_show": "Vastaanotettiin laukaisin dian käynnistämiseksi, mutta aktiivista esitystä ei ole.", + "midi_no_slide": "Vastaanotettiin laukaisin dian käynnistämiseksi, mutta diaa ei löydy indeksissä:", + "midi_no_velocity": "Vastaanotettiin MIDI-signaali, mutta ei nopeutta. Oletuksena käytetään ensimmäistä indeksiä." + }, + "new": { + "create": "Uusi", + "show": "Uusi esitys", + "empty_show": "Uusi tyhjä esitys", + "project": "Uusi projekti", + "section": "Uusi jakso", + "timer": "Uusi ajastin", + "variable": "Uusi muuttuja", + "trigger": "Uusi laukaisin", + "audio_stream": "Uusi audiovirta", + "playlist": "Uusi soittolista", + "category": "Uusi kategoria", + "private": "Uusi yksityinen esitys", + "folder": "Uusi kansio", + "slide": "Uusi dia", + "overlay": "Uuusi peittokuva", + "template": "Uusi malli", + "scripture": "Uusi Raamattu", + "collection": "Uusi kokoelma", + "action": "Uusi toiminto", + "event": "Uusi tapahtuma" + }, + "show": { + "name": "Nimi", + "category": "Kategoria", + "new_layout": "Uusi asettelu", + "grid": "Ruutunäkymä", + "simple": "Yksinkertainen näkymä", + "list": "Listanäkymä", + "lyrics": "Laulunäkymä", + "text": "Tekstin muokkaus", + "update": "Päivitä esitys", + "locked": "Esitys on lukittu!", + "locked_info": "Esitys on lukittu. Vapauta lukitus esitysvalikossa.", + "slide_template": "Diamalli", + "source": "Lähde", + "artist": "Artisti", + "song": "Laulu", + "delete_manual": "Manuaalinen tarkastus", + "delete_match": "Poista täysin vastaavat", + "delete_keep_last_modified": "Poista kaikki paitsi viimeksi muokattu", + "delete_keep_first_created": "Poista kaikki paitsi ensimmäiseksi tehty" + }, + "actions": { + "rename": "Nimeä uudelleen", + "recolor": "Vaihda väri", + "remove": "Poista", + "remove_group": "Poista ryhmä", + "choose_group": "Valitse ryhmä", + "goto_group": "Siirry ryhmään", + "active_outputs": "Aktiiviset ulostulot", + "all_outputs": "Kaikki ulostulot", + "specific_outputs": "Jotkin ulostulot", + "toggle_private": "Yksityinen", + "view_private": "Näytä yksityinen", + "import": "Tuo", + "export": "Vie", + "imported": "Tuotu!", + "duplicate": "Kopioi", + "delete": "Poista", + "delete_slide": "Poista dia", + "delete_group": "Poista ryhmä", + "delete_all": "Poista kaikki", + "close": "Sulje", + "save": "Tallenne", + "done": "Tehty", + "disable": "Poista käytöstä", + "enable": "Ota käyttöön", + "undo": "Kumoa", + "redo": "Tee uudelleen", + "cut": "Leikkaa", + "copy": "Kopioi", + "paste": "Liitä", + "pasteAndMatchStyle": "Liitä ja sovita tyyli", + "selectAll": "Valitse kaikki", + "remove_selection": "Poista valinta", + "speech": "Puhe", + "startSpeaking": "Aloita puhuminen", + "stopSpeaking": "Lopeta puhuminen", + "focus_mode": "Tarkkuustila päälle tai pois", + "fullscreen": "Siirry koko näyttön tilaan tai pois", + "resetZoom": "Nollaa zoomi", + "zoom": "Zoomaa", + "zoomIn": "Lähennä", + "zoomOut": "Loitonna", + "reset": "Nollaa", + "create_template": "Luo malli", + "project_template_tip": "Luo mallista projekti", + "pdf_single_page": "Näytä yhtenä dokumenttina", + "convert_to_images": "Muuta kuviksi", + "converting": "Muutetaan...", + "closing": "Suljetaan sovellusta...", + "remove_template_from_show": "Poista malli esityksestä", + "reset_defaults": "Palauta oletusarvot", + "to_all": "Käytä kaikkiin", + "to_following": "Käytä seuraaviin", + "back": "Siirry takaisin", + "home": "Koti", + "mute": "Hiljennä", + "unmute": "Poista hiljennys", + "increase_volume": "Lisää äänenvoimakkuutta", + "decrease_volume": "Vähennä äänenvoimakkuutta", + "manage_subtitles": "Hallitse tekstityksiä", + "toggle_time_marker": "Laita aikamerkinnät päälle tai pois", + "add_time_marker": "Lisää aikamerkintä", + "bind_to": "Jotkin ulostulot", + "remove_binding": "Poista jotkin ulostulot", + "dynamic_values": "Muuttuvat arvot", + "rearrange": "Järjestä uudelleen", + "to_front": "Tuo eteen", + "forward": "Tuo eteenpäin", + "backward": "Vie taaksepäin", + "to_back": "Vie taakse", + "show_timer": "Aika esitykseen", + "hide_timer": "Aika piilotukseen", + "choose_custom": "Valitse oma", + "add_color": "Lisää väri", + "format": "Muoto", + "find_replace": "Etsi ja korvaa tekstiä", + "cut_in_half": "Jaa kahteen", + "merge": "Yhdistä", + "find": "Etsi", + "replace": "Korvaa", + "case_sensitive": "Huomioi koko", + "uppercase": "Isot kirjaimet", + "lowercase": "Pienet kirjaimet", + "capitalize": "Kirjoita isoilla", + "trim": "Trimmaa", + "click_disable": "Napsauta mitä tahansa poistaaksesi", + "svg_clipboard": "Tuo SVG leikepöydältä", + "fullscreen_preview": "Vaihda koko näytön esikatseluun tai pois", + "toggle_output": "Vaihda ulostulon näyttöä", + "toggle_panels": "Ota paneelit käyttöön tai pois", + "change_tab": "Vaihda välilehteä", + "change_drawer_tab": "Vaihda valikon välilehteä", + "change_slide": "Vaihda diaa", + "change_project_item": "Vaihda projektin kohdetta", + "change_drawer_item": "Vaihda valikon kohdetta", + "change_drawer_category": "Vaihda valikon kategoriaa", + "toggle_drawer": "Näytä tai piilota alavalikko", + "slide_actions": "Dian toiminnot", + "item_actions": "Kohteen toiminnot", + "clear_history": "Poista historia", + "chord_info": "Napsauta kirjainta lisätäksesi soinnun.", + "chord_key": "Avain", + "chord_type": "Tyyppi", + "chord_tension": "Jännitys", + "chord_bass": "Basso", + "roman_keys": "Roomalaiset avaimet", + "set_key": "Aseta avain", + "custom_key": "Anna oma arvo", + "select_chord": "Valitse tämä sointu", + "play_with_shortcut": "Ota käyttöön pikanäppäimellä", + "press_to_assign": "Paina näppäintä asettaaksesi", + "play_on_midi": "Käynnistä MIDI-signaalilla", + "play_on_midi_tip": "Käynnistä tietty dia, kun valittu MIDI-signaali saapuu", + "send_midi": "Lähetä MIDI-signaali", + "delete_shows_not_indexed": "Poista ineksoimattomat esitykset 'Shows'-kansiosta.", + "delete_empty_shows": "Poista tyhjät esitykset", + "delete_thumbnail_cache": "Poista esikatselukuvien välimuisti", + "export_usage_log": "Vie käyttöloki", + "reset_usage_log": "Nollaa käyttöloki", + "open_log_file": "Avaa lokitiedosto", + "open_cache_folder": "Avaa välimuistin kansio", + "refresh_all_shows": "Hae kaikki esitykset 'Shows'-kansiosta", + "start_timer": "Aloita ajastin", + "stop_timers": "Pysäytä käynnissä olevat ajastimet", + "next_after_media": "Seuraavana vuorossa ollut media valmistui", + "remove_media": "Poista mediasisältö", + "remove_layers": "Poista tasot", + "toggle_checkbox_tip": "Toiminto kytketään, jos valintaruutu on muuttumaton", + "start_recording": "Aloita tallennus", + "stop_recording": "Lopeta tallennus", + "export_recording": "Lopeta tallennus ja vie", + "index_select_project": "Valitse projekti indeksillä", + "next_project_item": "Seuraava projektin kohde", + "previous_project_item": "Edellinen projektin kohde", + "index_select_project_item": "Valitse projektin kohde indeksillä", + "name_select_show": "Valitse esitys nimellä", + "set_template_active": "Käytä mallia aktiivsessa esityksessä", + "random_slide": "Toista satunnainen dia", + "index_select_slide": "Valitse dia indeksillä", + "name_select_slide": "Valitse dia nimellä", + "toggle_output_lock": "Lukitse tai vapauta ulostulo", + "toggle_output_windows": "Vaihda ulostulon ikkunaa", + "id_select_group": "Valitse ryhmä tunnisteella", + "id_change_stage_layout": "Valitse lava-asettelu tunnisteella", + "start_camera": "Käynnistä kamera", + "index_select_overlay": "Valitse peittokuva indeksillä", + "name_select_overlay": "Valitse peittokuva nimellä", + "change_volume": "Muuta äänenvoimakkuutta", + "start_audio_stream": "Käynnistä audiovirta", + "start_playlist": "Käynnistä soittolista", + "playlist_next": "Seuraava soittolistalla", + "start_metronome": "Käynnistä metronomi", + "name_start_timer": "Käynnistä ajastin nimellä", + "id_start_timer": "Käynnistä ajastin tunnisteella", + "start_slide_timers": "Käynnistä aktiivisen dian ajastimet", + "id_select_output_style": "Valitse ulostulon tyyli tunnisteen mukaan", + "change_output_style": "Vaihda ulostulon tyyliä", + "change_stage_output_layout": "Vaihda lavaulostulon asettelua", + "change_transition": "Vaihda siirtymää", + "change_variable": "Vaihda muuttujaa", + "start_trigger": "Käynnistä laukaisin", + "run_action": "Aja toiminto", + "toggle_action": "Käynnistä tai pysäytä toiminto", + "emit_data": "Lähetä dataa", + "send_rest_command": "Lähetä HTTP-pyyntö", + "custom_activation": "Muokattu aktivointi", + "any": "Mikä tahansa", + "activate_on_startup": "Käynnistä käynnistettäessä", + "activate_save": "Käynnistä tallennettaessa", + "activate_slide_clicked": "Käynnistä napsautettaessa diaa", + "activate_video_starting": "Käynnistä, kun video alkaa", + "activate_video_ending": "Käynnistä, kun video loppuu", + "activate_audio_starting": "Käynnistä, kun audio alkaa", + "activate_audio_ending": "Käynnistä, kun audio loppuu", + "activate_timer_ending": "Käynnistä, kun ajastin loppuu", + "activate_scripture_start": "Käynnistä, kun Raamattu näytetään", + "activate_slide_cleared": "Käynnistä, kun dia tyhjennetään", + "activate_background_cleared": "Käynnistä, kun tausta tyhjennetään", + "activate_show_created": "Käynnistä, kun esitys luodaan", + "activate_show_opened": "Käynnistä, kun esitys avataan", + "activate_audio_playlist_ended": "Käynnistä, kun soittolista loppuu" + }, + "recording": { + "remove": "Poista tallenne", + "tip": "Tallenna ja käytä diojen ajoituksia. Synkronoi ensimmäisen dian audiosisällön kanssa.", + "layout_changed": "Asettelu on muuttunut viimeisen tallennuksen jälkeen!", + "audio_synced": "Synkronoitu audion kanssa!", + "start": "Aloita dian tallennus", + "use_duration": "Käytä kestoa", + "use_duration_tip": "Käytä kestoa aikaleiman sijaan" + }, + "animate": { + "change": "Muuta", + "set": "Aseta", + "wait": "Odota", + "background": "tausta", + "text": "teksti", + "item": "kohde", + "to": "minne", + "for": "minkä vuoksi", + "seconds": "sekuntia" + }, + "cloud": { + "info": "Varmuuskopioi tiedostot Google Driveen tai työskennelläksesi usealla tietokoneella.", + "tip_api": "Anna ilmainen Google API -avain, että tiedostot voi automaattisesti lähettää Google Driveen.", + "tip_how": "Etkö tiedä, miten saat sen?", + "tip_guide": "Saat ohjeen napsauttamalla tässä.", + "enable": "Synkronoi automaattisesti käynnistksen ja sulkemisen yhteydessä", + "disable_upload": "Älä lähetä dataa", + "media_id": "Median polun tunniste", + "google_drive_api": "Google API service account -avain", + "select_key": "Tuo avaintiedosto", + "update_key": "Päivitä avaintiedosto", + "enable_custom_folder_id": "Käytä omaa kansion tunnistetta", + "main_folder": "Aseta pääkansio manuaalisesti", + "media_folder": "Pilvimedian kansio", + "reconnect": "Yhdistä uudelleen", + "sync": "Synkronoi nyt", + "choose_method_tip": "Pilvestä löytyy dataa. Valitse paikallinen sijainti tai pilvi latausta varten. Toinen sijainti ylikirjoitetaan.", + "local": "Paikallinen", + "syncing": "Synkronoidaan pilveen", + "sync_complete": "Synkronointi valmis" + }, + "export": { + "export": "Vie", + "export_as": "Vie {} ", + "exporting": "Viedään...", + "exported": "Viety!", + "oneFile": "Yksi tiedosto", + "selected_shows": "Valitut esitykset", + "current_project": "Nykyinen projekti", + "all_shows": "Kaikki esitykset", + "all_projects": "Kaikki projektit", + "project": "Projekti", + "option_type": "Mitä viedään?", + "option_format": "Minkä tallennusmuodon valitset?", + "include_media": "Sisällytä mediatiedostot", + "preview": "Esikatselu", + "title": "Otsikko", + "metadata": "Metadata", + "page_numbers": "Sivunumerot", + "groups": "Ryhmät", + "numbers": "Numeroidut diat", + "invert": "Käännä diat", + "original_text_size": "Alkuperäinen tekstikoko", + "text": "Pelkkä teksti", + "slides": "Diat", + "rows": "Rivit", + "columns": "Sarakkeet" + }, + "context": { + "enabledTabs": "Vaihda välilehtien välillä", + "setTag": "Aseta tunniste", + "filterByTags": "Suodata tunnisteella", + "addToProject": "Lisää projektit", + "add_to_show": "Lisää esitykseen", + "lockForChanges": "Lukitse muokkausta varten", + "use_as_archive": "Merkitse arkistoksi", + "newCategory": "Uusi kategoria", + "changeIcon": "Vaihda kuvake", + "changeGroup": "Vaihda ryhmä", + "createNew": "Luo uusi", + "selectAll": "Valitse kaikki", + "force_outputs": "Pakota ulostulot", + "align_with_screen": "Tasaa näyttöön", + "toggle_output": "Vaihda ulostuloa", + "move_to_front": "Tuo eteen", + "hide_from_preview": "Piilota esikatselussa", + "enable_preview": "Ota esikatselu käyttöön", + "lock_to_output": "Lukitse ulostuloon", + "place_under_slide": "Aseta dian alle", + "toggle_clock": "Näytä tai piilota kello", + "move_connections": "Siirrä kaikki yhteydet tähän" + }, + "tools": { + "notes": "Muistiinpanot", + "--schedule": "Aikataulu", + "--actions": "Toiminnot", + "groups": "Ryhmät", + "metadata": "Metadata", + "media": "Mediasisältö", + "audio": "Audio", + "layout": "Asettelu", + "item": "Kohde", + "items": "Kohteet", + "slide": "Dia" + }, + "edit": { + "text": "Teksti", + "font": "Kirjasin", + "family": "Kirjasinperhe", + "font_size": "Kirjasimen koko", + "text_fit": "Sovita teksti", + "shrink_to_fit": "Pienennä tarvittaessa", + "grow_to_fit": "Suurenna tarvittaessa", + "text_color": "Tekstin väri", + "style": "Tyyli", + "lines": "Rivit", + "options": "Muotoilu", + "_title_bold": "Lihavoitu", + "_title_italic": "Kursiivi", + "_title_underline": "Alleviivaus", + "_title_strikethrough": "Yliviivaus", + "color": "Väri", + "accent_color": "Korostusväri", + "background_color": "Taustaväri", + "background_opacity": "Taustavärin peitto", + "background_image": "Taustakuva", + "background_media": "Mediasisältö taustalla", + "overlay_content": "Lisää peittokuva", + "different_first_template": "Muokattu malli ensimmäisellä dialla", + "max_lines_per_slide": "Maksimimäärä rivejä dialla", + "media_fit": "Sovita media", + "one_letter": "Yhden kirjaimen tila", + "sub_indexes": "Alaindeksit", + "size": "Koko", + "max_lines": "Maksimimäärä rivejä", + "invert_items": "Käännä kohteet", + "list": "Lista", + "chords": "Soinnut", + "transpose": "Transponoi", + "auto_size": "Automaattinen koko", + "no_wrap": "Teksti yhdellä rivillä", + "line_spacing": "Riviväli", + "line_height": "Rivikorkeus", + "letter_spacing": "Välistys", + "word_spacing": "Sanaväli", + "transform": "Muotoile", + "text_transform": "Muotoile teksti", + "uppercase": "Isot kirjaimet", + "lowercase": "Pienet kirjaimet", + "capitalize": "Isot alkukirjaimet", + "align": "Tasaa", + "_title_left": "Tasaa vasemmalle", + "_title_center": "Tasaa keskelle", + "_title_right": "Tasaa oikealle", + "_title_justify": "Tasaa molemmat reunat", + "_title_top": "Tasaa yläreunat", + "_title_bottom": "Tasaa alareunat", + "outline": "Ääriviiva", + "shadow": "Varjo", + "shadow_inset": "Varjon sisennys", + "offset": "Siirtymä", + "offsetX": "X-siirtymä", + "offsetY": "Y-siirtymä", + "blur": "Sumennus", + "item": "Kohde", + "width": "Leveys", + "height": "Korkeus", + "rotation": "Kierto", + "tilt": "Kallistus", + "perspective": "Perspektiivi", + "opacity": "Peitto", + "corner_radius": "Kulman säde", + "border": "Reuna", + "length": "Pituus", + "x": "X", + "y": "Y", + "add_items": "Lisää kohteet", + "add_icons": "Lisää kuvakkeet", + "arrange_items": "Järjestä kohteet", + "filters": "Suodattimet", + "backdrop_filters": "Taustan suodattimet", + "interval": "Väli", + "video": "Video", + "choose_media": "Valitse media", + "recent": "Viimeksi muokatut", + "enable_stage": "Ota lava käyttöön", + "select_stage": "Valitse lava", + "next_slide": "Näytä seuraava dia", + "use_slide_index": "Käytä aktiivista indeksiä", + "slide_index": "Dian indeksi", + "padding": "Täyte", + "special": "Erityinen", + "scrolling": "Vieritys", + "scrolling_speed": "Vieritysnopeus", + "top_bottom": "Ylhäältä alas", + "bottom_top": "Alhaalta ylös", + "left_right": "Vasemmalta oikealle", + "right_left": "Oikealta vasemmalle", + "max_events": "Maksimäärä tapahtumia", + "start_days_from_today": "Päivää tästä päivästä laskien", + "just_one_day": "Vain yksi päivä", + "enable_start_date": "Ota aloituspäivä käyttöön", + "disable_navigation": "Ota selauskontrollit pois käytöstä", + "progress_bar": "Edistymispalkki" + }, + "items": { + "text": "Tekstikehys", + "media": "Mediasisältö", + "image": "Kuva", + "camera": "Kamera", + "video": "Video", + "mirror": "Peili", + "clock": "Kello", + "events": "Tapahtumat", + "live": "Live", + "audio": "Audio", + "timer": "Ajastin", + "variable": "Muuttuja", + "web": "Nettisivu", + "slide_tracker": "Edistyminen", + "visualizer": "Visualisoija", + "captions": "Tekstitykset", + "icon": "Kuvake" + }, + "borders": { + "solid": "Kiinteä", + "dashed": "Katkoviiva", + "dotted": "Pisteviiva", + "double": "Tuplaviiva", + "inset": "Sisennys", + "outset": "Aloitus", + "groove": "Ura", + "ridge": "Harjanne" + }, + "list": { + "disc": "Levy", + "circle": "Ympyrä", + "square": "Neliö", + "disclosure-closed": "Nuoli", + "disclosure-open": "Kolmio", + "decimal": "Numero", + "decimal-leading-zero": "Numero nollan kanssa", + "lower-alpha": "Kirjain", + "upper-alpha": "Iso kirjain", + "lower-roman": "Roomalainen", + "upper-roman": "Iso roomalainen", + "lower-greek": "Kreikkalainen" + }, + "timer": { + "from_to": "Alusta loppuun", + "to_time": "Kohti aikaa", + "to_event": "Aikaa tapahtumaan", + "counter": "Ajanlasku", + "time": "Aika", + "hours": "Tunteja", + "minutes": "Minuutteja", + "seconds": "Sekunteja", + "from": "Mistä", + "to": "Mihin", + "overflow": "Ylitä, kun tullaan loppuun", + "overflow_color": "Ylittävän osan väri", + "preview": "Esikatselu", + "clock": "Kello", + "event": "Tapahtuma", + "no_events": "Ei tulevia tapahtumia", + "edit": "Muokkaa", + "create": "Luo", + "line": "Viiva", + "mask": "Maski" + }, + "clock": { + "type": "Tyyppi", + "digital": "Digitaalinen", + "analog": "Analoginen", + "seconds": "Sekunteja", + "custom": "Oma", + "show_time": "Näytä aika" + }, + "captions": { + "info": "Napsauta URL:ia avataksesi seliamessa tai avaa millä tahansa toisella laitteella! Salli mikrofoni ja käytä Google Chromea parhaan suorituskyvyn saamiseksi.", + "language": "Transkription kieli", + "translate": "Käännä ", + "showtime": "Näytä kesto", + "powered_by": "Apuna on " + }, + "localization": { + "translate": "Käännä", + "add": "Lisää käännös", + "update": "Päivitä käännös", + "remove": "Poista käännetyt kohteet" + }, + "midi": { + "midi": "MIDI", + "activate": "Käynnistä MIDI-signaalilla", + "activate_keypress": "Käynnistä näppäimellä", + "name": "Nimi", + "input": "Sisääntulo", + "output": "Ulostulo", + "type": "Tyyppi", + "note": "Muistiinpano", + "velocity": "Nopeus", + "channel": "Kanava", + "start_action": "Aloita toiminto", + "use_default_values": "Käytä oletusarvoja", + "auto_values": "Päivitä arvot, kun MIDI-signaali saapuu", + "tip_velocity": "Aseta nopeudeksi -1 poistaaksesi sen käytöstä", + "tip_action": "Aktivoi haluttu dia oikealla painikkeella ja valitsemalla MIDI-toiminto.", + "tip_index_by_velocity": "Indeksi johdetaan vastaanotetusta nopeudesta aloittaen 0:sta." + }, + "emitters": { + "emitter": "Lähetin", + "tip": "Luo malleja lähetyksille.", + "signal": "Signaali", + "message_template": "Viestimalli", + "message_templates": "Viestimallit", + "inputs": "Sisääntulot" + }, + "draw": { + "focus": "Korostus", + "pointer": "Osoitin", + "zoom": "Zoomi", + "fill": "Täyttö", + "paint": "Maalaa", + "particles": "Hiukkaset", + "color": "Väri", + "opacity": "Peitto", + "size": "Koko", + "radius": "Säde", + "glow": "Hehku", + "hollow": "Tyhjä", + "hold": "Painettaessa", + "rainbow": "Sateenkaari", + "threed": "3D", + "dots": "Pisteet" + }, + "stage": { + "slide": "Dia", + "stage_layout": "Lava-asettelu", + "current_slide_text": "Nykyisen dian teksti", + "current_slide": "Nykyinen dia", + "current_slide_notes": "Nykyisen dian muistiinpanot", + "next_slide_text": "Seuraavan dian teksti", + "next_slide": "Seuraava dia", + "next_slide_notes": "Seuraavan dian muistiinpanot", + "output": "Ulostulo", + "current_output": "Nykyinen ulostulo", + "slide_tracker": "Edistyminen", + "time": "Aika", + "system_clock": "Järjestelmän kello", + "video_time": "Videon aika", + "video_countdown": "Videon ajanlasku", + "first_active_timer": "Ensimmäinen aktiivinen ajastin", + "other": "Muu", + "message": "Viesti", + "color": "Väri", + "font-size": "Fonttikoko", + "zeros": "Nollia", + "overrun": "Korvaa väri", + "source_output": "Lähdeulostulo", + "auto_stretch": "Levitä sisältö automaattisesti", + "labels": "Näytä merkinnät", + "label_color": "Merkinnän väri" + }, + "settings": { + "general": "Yleinen", + "theme": "Teema", + "groups": "Ryhmät", + "styles": "Tyylit", + "display_settings": "Ulostulot", + "display": "Näyttö", + "connection": "Yhteys", + "cloud": "Pilvi", + "calendar": "Kalenteri", + "text_import": "Teksti", + "media_import": "Mediasisältö", + "other": "Muu", + "language": "Kieli", + "autosave": "Tallenna automaattisesti", + "never": "Ei koskaan", + "minutes": "minuutin välein", + "use24hClock": "Käytä 24 tunnin kelloa", + "styles_hint": "Luo erilaisia tyylejä, joita voidaan käyttää ulostulon ulkonäön muuttamiseksi.", + "hide_output_hint": "Piilota ulostuloikkuna tuplanapsauttamalla. Pidä CTRL painettuna raahausta varten.", + "hide_menubar_hint": "Kioskitilalla voit piilotta valikkorivin tai ottaa käyttöön automaattisen valikkorivin piilottamisen ja näyttämisen MacOS:n järjestelmäasetuksissa.", + "show_output_hint": "Pidä ctrl/cmd painettuna, kun napsautat näytön painiketta pakottaaksesi sen näkyvillä tässä monitorissa.", + "move_output_hint": "Etkö löydä näyttöäsi? Muuta sijaintia kunnes ikkuna näkyy toisella näytöllä.", + "select_display": "Napsauta näyttöä, jossa haluat näyttää ulostuloikkunan.", + "manual_input_hint": "Etkö löydä näyttöäsi? Napsauta tässä muuttaaksesi manuaalisesti sijaintia.", + "manual_drag_hint": "Voit myös pitää ctrl/cmd-painikkeen painettuna aktiivisessa ulostuloikkunassa raahataksesi sitä.", + "allow_main_screen": "Salli muokatut ulostulon sijainnit ja koot", + "edge_blending": "Reunojen yhdistäminen", + "identify_screens": "Tunnista näytöt", + "new_output": "Uusi ulostulo", + "normal": "Normaali", + "enable_key_output": "Salli alfakanava ulostulossa", + "always_on_top": "Aina päällimmäisenä", + "kiosk_mode": "Kioskitila", + "change_key_output_position": "Muuta kanavan ulospulon sijaintia", + "position": "Sijainti", + "enabled": "Päällä", + "color_when_active": "Väri, kun aktiivinen", + "fixed": "Kiinteä", + "lines": "Rivit", + "override_with_template": "Ohita dia mallilla", + "override_scripture_with_template": "Ohita Raamattu mallilla", + "overrided_value": "Malli saattaa ohittaa tämän arvon", + "active_layers": "Aktiiviset tasot", + "window": "Ikkuna", + "active_style": "Käytä tyyliä", + "alert_updates": "Kerro, kun päivitys on saatavilla", + "auto_updates": "Automaattiset päivitykset", + "disable_labels": "Poista merkinnät käytöstä", + "group_numbers": "Ryhmän numerot", + "transparent_slides": "Läpinäkyvän dian esikatselu", + "full_colors": "Suuren kontrastin värit ryhmille", + "slide_number_keys": "Näytä dioja numeropainikkeilla", + "auto_shortcut_first_letter": "Automaattinen oikopolku tekstin ensimmäisen kirjaimen mukaan", + "auto_output": "Aktivoi ulostulonäyttö käynnistyksessä", + "hide_cursor_in_output": "Piilota osoitin ulostulossa", + "clear_media_when_finished": "Tyhjennä media lopuksi", + "disable_presenter_controller_keys": "Poista käytöstä esittäjän hallintapainikkeet", + "default_project_name": "Oletusnimi projektille", + "audio_fade_duration": "Audion häivytyksen kesto", + "audio_crossfade": "Audion ristiinhäivytys", + "clear_style_background_on_text": "Tyhjennä tyylin tausta, kun dia on aktiivinen", + "resolution": "Resoluutio", + "cropping": "Leikkaus", + "frame_rate": "Kuvanopeus", + "device": "Laita", + "display_mode": "Näyttötila", + "pixel_format": "Pikselin muoto", + "alpha_key": "Alfakanava", + "transparent": "Läpinäkyvä", + "invisible_window": "Näkymätön ikkuna", + "video_extensions": "Videolaajennukset", + "image_extensions": "Kuvalaajennukset", + "add": "Lisää", + "remove": "Poista", + "change_name": "Nimeä uudelleen", + "show_location": "Näytä sijainti", + "data_location": "Datan sijainti", + "user_data_location": "Tallenna käyttäjäasetukset datan sijaintiin", + "user_data_exists": "Valitusta sijainnista löytyi olemassaolevaa dataa. Kirjoitetaanko sen päälle?", + "user_data_yes": "Kyllä, säilytä nykyinen data", + "user_data_no": "Ei, tuo olemassa oleva data", + "popup_before_close": "Ota sulkemisen valintaikkuna käyttöön", + "disable_hardware_acceleration": "Poista laitteistokiihdytys käytöstä", + "restart_for_change": "Sovellus täytyy käynnistää uudestaan, jotta muutokset voidaan ottaa käyttöön!", + "font": "Kirjasin", + "font_family": "Kirjasinperhe", + "font_style": "Kirjasintyyli", + "font_size": "Kirjasimen koko", + "border_radius": "Reunan säde", + "colors": "Värit", + "add_group": "Lisää ryhmä", + "group_shortcut": "Pikanäppäin ryhmän aktivoimiseksi", + "output_screen": "Ulostulonäyttö", + "device_name": "Laitteen nimi", + "password": "salasana", + "port": "Portti", + "connections": "Yhteydet", + "max_connections": "Maksimimäärä yhteyksiä", + "allowed_connections": "Sallitut yhteydet", + "connect": "Yhdistä kirjoittama tämä nettiselaimessa", + "connect_qr": "tai lue tämä QR-koodi", + "restart": "Käynnistä palvelimet uudestaan", + "reset_all": "Palauta kaikki", + "reset_theme": "Palauta teema", + "reset_themes": "Palauta teemat", + "capitalize_words": "Kirjoita sanat isoilla alkukirjaimilla", + "comma_seperated": "Erota pilkulla", + "backup_all": "Varmuuskopioi kaikki", + "restore": "Palauta", + "backup_started": "Varmuuskopioidaan...", + "restore_started": "Palautetaan...", + "backup_finished": "Varmuuskopio valmis!", + "restore_finished": "Palautus valmis!", + "auto_backup": "Varmuuskopioi automaattisesti", + "preview_frame_rate": "Esikatselun kuvataajuus", + "auto": "Automaattinen", + "optimized": "Optimoitu", + "reduced": "Vähennetty", + "full": "Täysi", + "section_trigger_action": "Laukaisee toiminnon, kun navigoidaan esityksessä osaan" + }, + "sort": { + "sort_by": "Lajittele", + "name": "Nimi", + "name_des": "Nimi laskeva", + "date": "Päivämäärä", + "size": "Koko", + "type": "Tyyppi", + "custom": "Oma" + }, + "calendar": { + "type": "Tyyppi", + "event": "Tapahtuma", + "schedule_action": "Ajasta toiminto", + "name": "Nimi", + "color": "Väri", + "time": "Aika", + "from_date": "Päivämäärästä", + "to_date": "Päivämäärään", + "from_time": "Ajasta", + "to_time": "Aikaan", + "location": "Sijainti", + "notes": "Muistiinpanot", + "today": "Tänään", + "tomorrow": "Huomenna", + "repeat": "Toista", + "repeat_every": "Toista joka", + "repeat_until": "kunnes", + "day": "päivä", + "week": "viikko", + "month": "kuukausi", + "year": "vuosi", + "ending_the": "määrätty ", + "ending_repeated": "toistettu", + "ending_times": "kertaa", + "save_all": "Tallenna ja päivitä kaikki", + "add_slides_from_show": "Sisällytä diat esityksestä" + }, + "scripture": { + "bibles": "Raamatut API.Biblestä", + "local": "Tuo paikallinen tiedosto", + "max_verses": "Maksimimäärä jakeita dialla", + "verse_numbers": "Jaenumerot", + "verses_on_individual_lines": "Jakeet omilla riveillä", + "version": "Näytä versio", + "reference": "Näytä viittaukset", + "split_reference": "Jaa viittaus", + "combine_with_text": "Yhdistä tekstiin", + "first_slide_reference": "Viittaus ensimmäisellä dialla", + "reference_at_bottom": "Siirrä alareunaan", + "red_jesus": "Jeesuksen sanat punaisella", + "search": "Etsi Raamatussa" + }, + "filter": { + "blur": "Sumennus", + "brightness": "Kirkkaus", + "contrast": "Kontrasti", + "grayscale": "Harmaasävy", + "hue-rotate": "Sävykierto", + "invert": "Käänteinen", + "opacity": "Peitto", + "saturate": "Kylläisyys", + "sepia": "Sepia" + }, + "live": { + "screens": "Näytöt", + "windows": "Ikkunat", + "cameras": "Kamerat", + "microphones": "Mikrofonit", + "audio_streams": "Audiovirrat" + }, + "presentation_control": { + "unsupported": "Esityksen ohjaus ei ole tuettu ", + "unsupported_tip": "Voit muuntaa ne kuviksi ja luoda esityksen tai ottaa pois käytöstä 'Aina päällimmäisenä' esittääksesi toisesta sovelluksesta", + "opening": "Avataan! Odota...", + "retry": "Yritä avata manuaalisesti tai", + "try_again": "Yritä uudestaan", + "restart": "Käynnistä uudelleen", + "start": "Aloita", + "choose_window": "Valitse ikkuna" + }, + "transition": { + "current_slide": "nykyistä diaa varten", + "text": "Tekstin siirtymä", + "media": "Median siirtymä", + "slide_transition": "Dian siirtymä", + "background_transition": "Taustan siirtymä", + "specific": "Ota käyttöön tarkemmat siirtymät", + "between": "Välillä", + "in": "Sisään", + "out": "Ulos", + "duration": "Kesto", + "easing": "Pehmennetään", + "direction": "Suunta", + "type": "Tyyppi", + "none": "Ei mitään", + "fade": "Häivytä", + "blur": "Sumenna", + "scale": "Skaalaa", + "spin": "Pyöritä", + "slide": "Liu'uta" + }, + "easings": { + "linear": "Suora", + "ease": "Pehmennys", + "ease-in": "Pehmennä alku", + "ease-out": "Pehmennä loppu", + "ease-in-out": "Pehmennä alku ja loppu", + "elastic": "Elastinen", + "bounce": "Pomppu", + "back": "Hyppy", + "circ": "Ympyrä", + "cubic": "Kulmikas", + "sine": "Virta" + }, + "variables": { + "number": "Numero", + "text": "Teksti", + "step": "Askel", + "value": "Arvo" + }, + "month": { + "1": "Tammikuu", + "2": "Helmikuu", + "3": "Maaliskuu", + "4": "Huhtikuu", + "5": "Toukokuu", + "6": "Kesäkuu", + "7": "Heinäkuu", + "8": "Elokuu", + "9": "Syyskuu", + "10": "Lokakuu", + "11": "Marraskuu", + "12": "Joulukuu" + }, + "weekday": { + "1": "Maanantai", + "2": "Tiistai", + "3": "Keskiviikko", + "4": "Torstai", + "5": "Perjantai", + "6": "Lauantai", + "7": "Sunnuntai" + }, + "interval": { + "daily": "Päivittäin", + "weekly": "Viikoittain", + "mothly": "Kuukausittain" + }, + "info": { + "created": "Luotu", + "modified": "Muokattu", + "used": "Käytetty", + "changed": "Muutettu", + "recently_used": "Viimeksi käytetty", + "extension": "Tiedostopääte", + "size": "Koko", + "slides": "Diat", + "words": "Sanat", + "template": "Malli", + "category": "Kategoria", + "codecs": "Koodekit", + "mimeType": "MIME-tyyppi", + "photoUrl": "Kuvan URL", + "likes": "Kuten", + "artist": "Artisti", + "artistUrl": "Artistin sivu" + }, + "guide_title": { + "projects": "Projektit", + "project": "Projekti", + "drawer": "Alavalikko", + "categories": "Kategoriat", + "show_create": "Luodaan esitys", + "show": "Esitys", + "output": "Ulostulo", + "editing": "Muokataan", + "end": "Siinä perusteet!" + }, + "guide_description": { + "start": "Muutaman perusasian läpikäynti. Voit ohittaa sen oikeasta alakulmasta.", + "project_manage": "Hallitse kaikkia projektejasi yhdessä paikassa.", + "project_create": "Luo kansioita ja luo uusia projekteja.", + "project_list": "Projektin avaamisen jälkeen saat listan kohteista täällä vasemmalla puolella. Raahaa ja pudota lisää alavalikosta.", + "drawer": "Löydät kaikki esityksesi, mediasisällön, peittokuvat, jne. yhdestä paikasta.", + "drawer_search": "Etsi sisältöä aktiivisesta alavalikon välilehdestä (laulut, jne.). Käytä pikanäppäimiä CTRL/CMD + F.", + "drawer_shows": "Hallitse esityksiä järjestämällä ne kategorioihin. Raahaa ja pudota valittu esitys siirtääksesi.", + "create_show_button": "Napsauta tässä luodaksesi uuden esityksen (laulun...)", + "create_show_popup": "Lisää esityksen tärkeimmät yksityiskohdat, voit myös etsiä laulun sanoja netistä tai lisätä ne manuaalisesti liittämällä.", + "show": "Esitys on näytetään kohteissa. Napsauta missä tahansa diassa näyttääksesi sen ja käytä nuolipainikkeita navigointiin. Voit myös raahata ja pudottaa mediatiedostoja taustaksi dialle.", + "show_slide": "Kun diaa napsautetaan, se näytetään ulostulossa ja näet esikatselun oikealla, jossa on myös joitain lisätomintoja kuten videon pysäytys.", + "output_clear": "Tyhjennä yksittäisiä ulostulon tasoja tai tyhjennä kaikki ulostulon tasot.", + "edit": "Avaa dian muokkaus yhdellä napsautuksella ylhäällä.", + "end": "Voit aina etsiä apua muihin ominaisuuksiin netistä." + }, + "songbeamer_import": { + "options": "Asetukset", + "encoding": "Koodaus", + "older_versions": "Vanhemmille Songbeamerin versioille kuin 6.02a", + "category": "Kategoria", + "utf8": "UTF-8", + "latin1": "Latin 1", + "translations": "Käännökset", + "translation_multiline": "Monirivinen", + "translation_textboxes": "Tekstikehykset", + "translation_layouts": "Asettelut", + "translation_description_multiline": "Lisää kieliä yhteen tekstikehykseen vuororivein, kuten Songbeamerissa.", + "translation_description_textboxes": "Lisää jokaisen kielen omaan tekstikehykseen dialla.", + "translation_description_layouts": "Luo oman kokoelman dioja sekä asettelun jokaiselle kielelle." + } +} diff --git a/public/lang/pt_BR.json b/public/lang/pt_BR.json index db77afa5..035d24ee 100644 --- a/public/lang/pt_BR.json +++ b/public/lang/pt_BR.json @@ -104,6 +104,7 @@ "web": "Pesquisa na Web", "search_web": "Pesquisa a letra na web", "search_results": "Resultados da pesquisa", + "block": "Bloquear", "more_options": "Mais opções", "auto_groups": "Organizar grupos automaticamente", "format_new_show": "Formatar texto", @@ -148,6 +149,7 @@ "overlays": "Limpar sobreposições", "audio": "Limpar áudio", "nextTimer": "Limpar temporizador do próximo slide", + "timer": "Limpar temporizador", "drawing": "Limpar anotações" }, "remove": { @@ -400,6 +402,7 @@ "trigger": "Trigger", "audio_stream": "Transmissão de áudio", "transition": "Transição", + "media_fit": "Mudar encaixe de mídia", "delete_show": "Excluir apresentação", "delete_show_confirmation": "Tem certeza de que deseja excluir", "delete_duplicated_shows": "Excluir Shows duplicados", @@ -413,6 +416,7 @@ "animate": "Animar", "translate": "Traduzir", "next_timer": "Temporizador do próximo slide", + "display_duration": "Exibir duração", "import": "Importar", "songbeamer_import": "Importar de Songbeamer", "export": "Exportar", @@ -422,6 +426,7 @@ "edit_event": "Editar evento", "about": "Sobre", "history": "Histórico", + "manage_emitters": "Manage emitters", "action": "Ação", "category_action": "Ação de categoria", "user_data_overwrite": "Dados existentes encontrados", @@ -578,6 +583,7 @@ "unmute": "Parar de silenciar", "increase_volume": "Aumentar volume", "decrease_volume": "Diminuir volume", + "manage_subtitles": "Gerenciar legendas", "toggle_time_marker": "Marcadores de tempo", "add_time_marker": "Adicionar marcador de tempo", "bind_to": "Saída específica", @@ -681,8 +687,10 @@ "start_trigger": "Iniciar trigger", "run_action": "Executar ação", "toggle_action": "Ação", + "emit_data": "Emit data", "send_rest_command": "Enviar HTTP-Request", "custom_activation": "Ativação personalizada", + "any": "Qualquer um", "activate_on_startup": "Ativar ao iniciar", "activate_save": "Ativar ao salvar", "activate_slide_clicked": "Ativar ao clicar no slide", @@ -750,6 +758,8 @@ "all_shows": "Todas as apresentações", "all_projects": "Todos os projetos", "project": "Projeto", + "option_type": "O que gostaria de exportar?", + "option_format": "Que formato prefere?", "include_media": "Incluir arquivos de mídia", "preview": "Pré-visualização", "title": "Título", @@ -826,7 +836,7 @@ "overlay_content": "Adicionar conteúdo de sobreposição", "different_first_template": "Usar outro modelo no primeiro slide", "max_lines_per_slide": "Número de linhas por slide", - "media_fit": "Fazer mídia caber", + "media_fit": "Encaixe de mídia", "one_letter": "Modo de letra única", "sub_indexes": "Sub índices ", "size": "Tamanho", @@ -950,6 +960,7 @@ "to_event": "Tempo até o evento", "counter": "Contagem regressiva", "time": "Tempo", + "hours": "Horas", "minutes": "Minutos", "seconds": "Segundos", "from": "A partir de", @@ -969,7 +980,9 @@ "type": "Tipo", "digital": "Digital", "analog": "Analógico", - "seconds": "Segundos" + "seconds": "Segundos", + "custom": "Personalizado", + "show_time": "Exibir tempo" }, "captions": { "info": "Por favor, clique no URL para abrir no seu navegador, caso ainda não tenha feito isso, ou abra-o em qualquer outro dispositivo! Certifique-se de dar acesso ao seu microfone e use o Google Chrome para melhor desempenho.", @@ -1002,6 +1015,14 @@ "tip_action": "Para ativar slides específicos, clique com o botão direito em qualquer slide e selecione o MIDI atuante.", "tip_index_by_velocity": "O índice é determinado pela velocidade recebida, começando em 0." }, + "emitters": { + "emitter": "Emitter", + "tip": "Create emit templates to easily send specific messages.", + "signal": "Sinal", + "message_template": "Modelo de mensagem", + "message_templates": "Modelos de mensagem", + "inputs": "Entradas" + }, "draw": { "focus": "Foco", "pointer": "Ponteiro", @@ -1090,6 +1111,7 @@ "lines": "Linhas", "override_with_template": "Substituir slide com modelo", "override_scripture_with_template": "Substituir versículo com modelo", + "overrided_value": "Um modelo pode sobrescrever este valor", "active_layers": "Camadas ativas", "window": "Janela", "active_style": "Usar estilo", @@ -1097,6 +1119,7 @@ "auto_updates": "Atualização automática", "disable_labels": "Desativar etiquetas", "group_numbers": "Números do grupo", + "transparent_slides": "Slide transparente no preview", "full_colors": "Ativar alto contraste entre grupos", "slide_number_keys": "Usar teclas de números para controlar slides", "auto_shortcut_first_letter": "Usar a primeira letra como atalho", @@ -1207,7 +1230,7 @@ }, "scripture": { "bibles": "Bíblias da API.Bible", - "custom": "Ou importe a sua", + "local": "Importar arquivo local", "max_verses": "Máximo de versículos por slide", "verse_numbers": "Números de versículos", "verses_on_individual_lines": "Versículos em linhas individuais", diff --git a/src/electron/cloud/drive.ts b/src/electron/cloud/drive.ts index b4be91db..2a94dd39 100644 --- a/src/electron/cloud/drive.ts +++ b/src/electron/cloud/drive.ts @@ -220,9 +220,9 @@ export async function syncDataDrive(data: any) { // combine if (data.method !== "upload" && data.method !== "download" && driveFile && storeContent && combineLocations.includes(id)) { const project = () => ({ - projects: combineFiles(driveContent.projects, store.store.projects, newest) || {}, - folders: combineFiles(driveContent.folders, store.store.folders, newest) || {}, - projectTemplates: combineFiles(driveContent.projectTemplates, store.store.projectTemplates, newest) || {}, + projects: combineFiles(driveContent.projects, store.store.projects, newest), + folders: combineFiles(driveContent.folders, store.store.folders, newest), + projectTemplates: combineFiles(driveContent.projectTemplates, store.store.projectTemplates, newest), }) const combined = id === "PROJECTS" ? project() : combineFiles(driveContent, store.store, newest) @@ -515,8 +515,8 @@ async function getNewest({ driveFile, localPath }: any) { // combine local & cloud based on modified function combineFiles(cloudContent: any, localContent: any, newest: string) { - let content = newest === "cloud" ? cloudContent : localContent - const olderContent = newest === "cloud" ? localContent : cloudContent + let content = (newest === "cloud" ? cloudContent : localContent) || {} + const olderContent = (newest === "cloud" ? localContent : cloudContent) || {} Object.keys(olderContent).forEach((id) => { const olderIsNewer = (content[id]?.modified || 0) < (olderContent[id]?.modified || 0) diff --git a/src/electron/data/backup.ts b/src/electron/data/backup.ts index 1bba1b27..bc07ec10 100644 --- a/src/electron/data/backup.ts +++ b/src/electron/data/backup.ts @@ -59,7 +59,7 @@ export async function startBackup({ showsPath, dataPath, scripturePath, customTr let localShowPath = path.join(showsPath, name) let localContent = readFile(localShowPath) - if (localContent) allShows[id] = JSON.parse(localContent)[1] + if (localContent && isValidJSON(localContent)) allShows[id] = JSON.parse(localContent)[1] } let content: string = JSON.stringify(allShows) diff --git a/src/electron/data/defaults.ts b/src/electron/data/defaults.ts index 712f1e39..47013dbd 100644 --- a/src/electron/data/defaults.ts +++ b/src/electron/data/defaults.ts @@ -135,6 +135,7 @@ export const defaultSyncedSettings: { [key in SaveListSyncedSettings]: any } = { }, videoMarkers: {}, mediaTags: {}, + actionTags: {}, customizedIcons: { disabled: [], svg: [] }, companion: {}, globalTags: {}, diff --git a/src/electron/output/Output.ts b/src/electron/output/Output.ts index 4baed47d..086a6e0f 100644 --- a/src/electron/output/Output.ts +++ b/src/electron/output/Output.ts @@ -4,6 +4,7 @@ import type { CaptureOptions } from "../capture/CaptureOptions" export class Output { window: BrowserWindow invisible?: boolean + boundsLocked?: boolean //previewWindow: BrowserWindow captureOptions?: CaptureOptions /* diff --git a/src/electron/output/helpers/OutputBounds.ts b/src/electron/output/helpers/OutputBounds.ts index bc08b5cf..171072cc 100644 --- a/src/electron/output/helpers/OutputBounds.ts +++ b/src/electron/output/helpers/OutputBounds.ts @@ -44,6 +44,7 @@ export class OutputBounds { static alignWithScreens() { OutputHelper.getKeys().forEach((outputId) => { let output = OutputHelper.getOutput(outputId) + if (output.boundsLocked) return let wBounds = output.window.getBounds() let centerLeft = wBounds.x + wBounds.width / 2 diff --git a/src/electron/output/helpers/OutputLifecycle.ts b/src/electron/output/helpers/OutputLifecycle.ts index 429848ac..87a82459 100644 --- a/src/electron/output/helpers/OutputLifecycle.ts +++ b/src/electron/output/helpers/OutputLifecycle.ts @@ -19,10 +19,10 @@ export class OutputLifecycle { return } - const outputWindow = this.createOutputWindow({ ...output.bounds, alwaysOnTop: output.alwaysOnTop !== false, kiosk: output.kioskMode === true, backgroundColor: output.transparent ? "#00000000" : "#000000" }, id, output.name) + const outputWindow = this.createOutputWindow({ ...output.bounds, alwaysOnTop: output.alwaysOnTop !== false, kiosk: output.kioskMode === true, backgroundColor: output.transparent ? "#00000000" : "#000000" }, id, output.name, output) //const previewWindow = this.createPreviewWindow({ ...output.bounds, backgroundColor: "#000000" }) - OutputHelper.setOutput(id, { window: outputWindow, invisible: output.invisible }) + OutputHelper.setOutput(id, { window: outputWindow, invisible: output.invisible, boundsLocked: output.boundsLocked }) //OutputHelper.setOutput(id, { window: outputWindow, previewWindow: previewWindow }) OutputHelper.Bounds.updateBounds(output) @@ -66,12 +66,12 @@ export class OutputLifecycle { return window }*/ - private static createOutputWindow(options: any, id: string, name: string) { + private static createOutputWindow(options: any, id: string, name: string, extra: any) { options = { ...outputOptions, ...options } if (options.alwaysOnTop === false) { options.skipTaskbar = false - options.resizable = true + if (!extra.boundsLocked) options.resizable = true } if (OUTPUT_CONSOLE) options.webPreferences.devTools = true @@ -140,7 +140,7 @@ export class OutputLifecycle { // Argument of type '"move"' is not assignable to parameter of type '"will-resize"'. // @ts-ignore window.on("move", (e: any) => { - if (!OutputHelper.Bounds.moveEnabled || OutputHelper.Bounds.updatingBounds) return e.preventDefault() + if (!OutputHelper.Bounds.moveEnabled || OutputHelper.Bounds.updatingBounds || OutputHelper.getOutput(id).boundsLocked) return e.preventDefault() let bounds = window.getBounds() toApp(OUTPUT, { channel: "MOVE", data: { id, bounds } }) @@ -148,7 +148,7 @@ export class OutputLifecycle { // @ts-ignore window.on("resize", (e: any) => { - if (OutputHelper.Bounds.moveEnabled || OutputHelper.Bounds.updatingBounds) return e.preventDefault() + if (OutputHelper.Bounds.moveEnabled || OutputHelper.Bounds.updatingBounds || OutputHelper.getOutput(id).boundsLocked) return e.preventDefault() let bounds = window.getBounds() toApp(OUTPUT, { channel: "MOVE", data: { id, bounds } }) diff --git a/src/electron/output/helpers/OutputValues.ts b/src/electron/output/helpers/OutputValues.ts index 21b36965..91bcf192 100644 --- a/src/electron/output/helpers/OutputValues.ts +++ b/src/electron/output/helpers/OutputValues.ts @@ -2,6 +2,7 @@ import type { BrowserWindow } from "electron" import { CaptureHelper } from "../../capture/CaptureHelper" import { NdiSender } from "../../ndi/NdiSender" import { OutputHelper } from "../OutputHelper" +import type { Output } from "../Output" export class OutputValues { private static setValues: any = { @@ -18,10 +19,10 @@ export class OutputValues { transparent: (value: boolean, window: BrowserWindow) => { window.setBackgroundColor(value ? "#00000000" : "#000000") }, - alwaysOnTop: (value: boolean, window: BrowserWindow) => { + alwaysOnTop: (value: boolean, window: BrowserWindow, _id: string, output: Output) => { window.setAlwaysOnTop(value, "pop-up-menu", 1) - window.setResizable(!value) window.setSkipTaskbar(value) + if (output.boundsLocked !== true) window.setResizable(!value) }, kioskMode: (value: boolean, window: BrowserWindow) => { window.setKiosk(value) @@ -33,6 +34,6 @@ export class OutputValues { if (!this.setValues[key]) return if (!output?.window || output.window.isDestroyed()) return - this.setValues[key](value, output.window, id) + this.setValues[key](value, output.window, id, output) } } diff --git a/src/electron/servers.ts b/src/electron/servers.ts index 80a6e905..db98fe9f 100644 --- a/src/electron/servers.ts +++ b/src/electron/servers.ts @@ -105,7 +105,8 @@ function initialize(id: ServerName, socket: any) { // SEND DATA FROM CLIENT TO APP socket.on(id, async (msg: any) => { if (msg.channel === "OUTPUT_FRAME") { - const window = OutputHelper.getOutput(msg.data.outputId).window + const window = OutputHelper.getOutput(msg.data.outputId)?.window + if (!window || window.isDestroyed()) return const frame = await CaptureHelper.captureBase64Frame(window) toServer(id, { channel: "OUTPUT_FRAME", data: { frame } }) } else if (msg) { diff --git a/src/electron/utils/LyricSearch.ts b/src/electron/utils/LyricSearch.ts index 6bfe4f57..8eb85c8c 100644 --- a/src/electron/utils/LyricSearch.ts +++ b/src/electron/utils/LyricSearch.ts @@ -145,6 +145,7 @@ export class LyricSearch { result = result.replaceAll("

", "\n\n") result = result.replaceAll("\n\n\n", "\n\n").replaceAll("\n\r\n\n", "\n\n") result = result.replace(/<[^>]*>?/gm, "") + result = result.replaceAll("'", "'") const lines = result.split("\n") const newLines: any[] = [] diff --git a/src/electron/utils/files.ts b/src/electron/utils/files.ts index 085e851d..af1740fc 100644 --- a/src/electron/utils/files.ts +++ b/src/electron/utils/files.ts @@ -276,7 +276,7 @@ export function getFolderContent(data: any) { let fileList: string[] = readFolder(folderPath) if (!fileList.length) { - toApp(READ_FOLDER, { path: folderPath, files: [], filesInFolders: [] }) + toApp(READ_FOLDER, { path: folderPath, files: [], filesInFolders: [], folderFiles: {} }) return } @@ -293,12 +293,13 @@ export function getFolderContent(data: any) { } if (!files.length) { - toApp(READ_FOLDER, { path: folderPath, files: [], filesInFolders: [] }) + toApp(READ_FOLDER, { path: folderPath, files: [], filesInFolders: [], folderFiles: {} }) return } // get first "layer" of files inside folder for searching let filesInFolders: string[] = [] + let folderFiles: any = {} if (data.listFilesInFolders) { let folders: any[] = files.filter((a) => a.folder) folders.forEach(getFilesInFolder) @@ -306,16 +307,20 @@ export function getFolderContent(data: any) { function getFilesInFolder(folder: any) { let fileList: string[] = readFolder(folder.path) + folderFiles[folder.path] = [] if (!fileList.length) return for (const name of fileList) { let p: string = path.join(folder.path, name) let stats: any = getFileStats(p) - if (stats && !stats.folder) filesInFolders.push({ ...stats, name }) + if (!stats) return + + if (!stats.folder) filesInFolders.push({ ...stats, name }) + folderFiles[folder.path].push({ ...stats, name }) } } - toApp(READ_FOLDER, { path: folderPath, files, filesInFolders }) + toApp(READ_FOLDER, { path: folderPath, files, filesInFolders, folderFiles }) } export function getSimularPaths(data: any) { diff --git a/src/electron/utils/responses.ts b/src/electron/utils/responses.ts index d7a257c7..74631f6e 100644 --- a/src/electron/utils/responses.ts +++ b/src/electron/utils/responses.ts @@ -289,7 +289,7 @@ export function saveRecording(_: any, msg: any) { // ERROR LOGGER const maxLogLength = 250 export function logError(log: any, electron: boolean = false) { - if (!isProd) return + if (!isProd) log.dev = true let storedLog: any = error_log.store let key = electron ? "main" : "renderer" diff --git a/src/frontend/MainOutput.svelte b/src/frontend/MainOutput.svelte index 17a5b1ae..ab89e0c0 100644 --- a/src/frontend/MainOutput.svelte +++ b/src/frontend/MainOutput.svelte @@ -21,6 +21,7 @@ // enable output window dragging let enableOutputMove: boolean = false function mousemoveOutput(e: any) { + if ($outputs[outputId]?.boundsLocked || $special.hideCursor) return if (e.ctrlKey || e.metaKey || e.target.closest(".dragger")) enableOutputMove = true else enableOutputMove = false } diff --git a/src/frontend/components/actions/api.ts b/src/frontend/components/actions/api.ts index c79330ed..093e7c07 100644 --- a/src/frontend/components/actions/api.ts +++ b/src/frontend/components/actions/api.ts @@ -69,6 +69,7 @@ type API_boolval = { value?: boolean } type API_strval = { value: string } type API_volume = { volume?: number; gain?: number } // no values will mute/unmute export type API_slide = { showId?: string | "active"; slideId?: string } +export type API_slide_index = { showId?: string; layoutId?: string; index: number } export type API_id_value = { id: string; value: string } export type API_rearrange = { showId: string; from: number; to: number } export type API_group = { showId: string; groupId: string } @@ -143,7 +144,7 @@ export const API_ACTIONS = { next_slide: () => nextSlideIndividual({ key: "ArrowRight" }), // BC previous_slide: () => previousSlideIndividual({ key: "ArrowLeft" }), // BC random_slide: () => randomSlide(), // BC - index_select_slide: (data: API_index) => selectSlideByIndex(data.index), // BC + index_select_slide: (data: API_slide_index) => selectSlideByIndex(data), // BC name_select_slide: (data: API_strval) => selectSlideByName(data.value), // BC id_select_group: (data: API_id) => gotoGroup(data.id), // BC lock_output: (data: API_boolval) => toggleLock(data.value), // BC diff --git a/src/frontend/components/actions/apiHelper.ts b/src/frontend/components/actions/apiHelper.ts index 1714592a..c3b176ac 100644 --- a/src/frontend/components/actions/apiHelper.ts +++ b/src/frontend/components/actions/apiHelper.ts @@ -40,7 +40,7 @@ import { _show } from "../helpers/shows" import { getPlainEditorText } from "../show/getTextEditor" import { getSlideGroups } from "../show/tools/groups" import { activeShow } from "./../../stores" -import type { API_group, API_id_value, API_layout, API_media, API_rearrange, API_scripture, API_variable } from "./api" +import type { API_group, API_id_value, API_layout, API_media, API_rearrange, API_scripture, API_slide_index, API_variable } from "./api" // WIP combine with click() in ShowButton.svelte export function selectShowByName(name: string) { @@ -94,14 +94,18 @@ export function selectProjectByIndex(index: number) { activeProject.set(selectedProject.id) } -export function selectSlideByIndex(index: number) { - let showRef = _show().layouts("active").ref()[0] +export async function selectSlideByIndex(data: API_slide_index) { + if (data.showId) await loadShows([data.showId]) + + let showRef = _show(data.showId || "active") + .layouts(data.layoutId ? [data.layoutId] : "active") + .ref()[0] if (!showRef) return newToast("$toast.midi_no_show") - let slideRef = showRef[index] - if (!slideRef) return newToast(get(dictionary).toast?.midi_no_slide + " " + index) + let slideRef = showRef[data.index] + if (!slideRef) return newToast(get(dictionary).toast?.midi_no_slide + " " + data.index) - outputSlide(showRef, index) + outputSlide(showRef, data) } export function selectSlideByName(name: string) { let slides = _show().slides().get() @@ -129,16 +133,16 @@ export function selectSlideByName(name: string) { let slideRef = showRef[index] if (!slideRef) return - outputSlide(showRef, index) + outputSlide(showRef, { index }) } // WIP duplicate of Slides.svelte:57 (slideClick) -function outputSlide(showRef, index) { +function outputSlide(showRef, data: API_slide_index) { if (get(outLocked)) return - updateOut("active", index, showRef) - let showId = get(activeShow)!.id - let activeLayout = _show().get("settings.activeLayout") - setOutput("slide", { id: showId, layout: activeLayout, index, line: 0 }) + updateOut("active", data.index, showRef) + let showId = data.showId || get(activeShow)!.id + let activeLayout = _show(showId).get("settings.activeLayout") + setOutput("slide", { id: showId, layout: data.layoutId || activeLayout, index: data.index, line: 0 }) } function getSortedOverlays() { diff --git a/src/frontend/components/drawer/Card.svelte b/src/frontend/components/drawer/Card.svelte index 5a77f511..af27194f 100644 --- a/src/frontend/components/drawer/Card.svelte +++ b/src/frontend/components/drawer/Card.svelte @@ -11,6 +11,7 @@ export let active: boolean = false export let outlineColor: string | null = null export let label: string + export let count: number = 0 export let renameId: string = "" export let title: string = "" export let mediaData: string = "" @@ -46,7 +47,7 @@ {/if} -