Compare commits

...

5 Commits

Author SHA1 Message Date
Philip Goto
bc4d8ce2fa Translated using Weblate (Dutch)
Currently translated at 99.3% (972 of 978 strings)

Co-authored-by: Philip Goto <philip.goto@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/nl/
Translation: FreeTube/Translations
2025-10-31 16:02:52 +01:00
TheAssassin
adbc650df0 Add support for AppImageUpdate (#8153) 2025-10-31 06:43:31 +08:00
Devenor
faaf92a967 Added New Window option to Tray (#7995)
* Added new window option to the tray

* Added special case for Linux

* Added special case for Linux

* Fix

* New window set as main window only if main window is in tray

* mainWindow gets updated when moving windows in and out of the tray

---------

Co-authored-by: Devenor <@>
2025-10-30 19:07:08 +01:00
Kyotaro Iijima
76ceac9efa Translated using Weblate (Japanese)
Currently translated at 100.0% (978 of 978 strings)

Co-authored-by: Kyotaro Iijima <kyotaro.eyes@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/ja/
Translation: FreeTube/Translations
2025-10-30 13:02:49 +01:00
Milo Ivir
8ad9964fed Translated using Weblate (Croatian)
Currently translated at 100.0% (978 of 978 strings)

Co-authored-by: Milo Ivir <mail@milotype.de>
Translate-URL: https://hosted.weblate.org/projects/free-tube/translations/hr/
Translation: FreeTube/Translations
2025-10-30 05:24:49 +01:00
5 changed files with 141 additions and 55 deletions

View File

@@ -87,7 +87,7 @@ jobs:
if: contains(matrix.runtime, 'arm64')
run: yarn run build:arm64
- name: Convert X64 AppImage to static runtime
- name: Convert X64 AppImage to static runtime and add update information
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64')
run: |
sudo apt install desktop-file-utils
@@ -95,11 +95,42 @@ jobs:
appimage="FreeTube-${{ steps.getPackageInfo.outputs.version }}.AppImage"
wget "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" -O ./appimagetool.AppImage
chmod +x ./"$appimage" ./appimagetool.AppImage
update_information="gh-releases-zsync|FreeTubeApp|FreeTube|latest-all|freetube-*-amd64.AppImage.zsync"
./"$appimage" --appimage-extract && rm -f ./"$appimage"
./appimagetool.AppImage --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 20 \
-n ./squashfs-root ./"$appimage"
-u "$update_information" -n ./squashfs-root ./"$appimage"
rm -rf ./squashfs-root ./appimagetool.AppImage
- name: Convert ARMv7l AppImage to static runtime and add update information
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l')
run: |
sudo apt install desktop-file-utils
cd build
appimage="FreeTube-${{ steps.getPackageInfo.outputs.version }}.AppImage"
wget "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" -O ./appimagetool.AppImage
wget "https://github.com/AppImage/type2-runtime/releases/download/continuous/runtime-x86_64" -O runtime
chmod +x ./"$appimage" ./appimagetool.AppImage ./runtime
update_information="gh-releases-zsync|FreeTubeApp|FreeTube|latest-all|freetube-*-armv7l.AppImage.zsync"
TARGET_APPIMAGE=$appimage" ./runtime --appimage-extract && rm -f ./"$appimage"
ARCH=armhf ./appimagetool.AppImage --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 20 \
-u "$update_information" -n ./squashfs-root ./"$appimage"
rm -rf ./squashfs-root ./appimagetool.AppImage ./runtime
- name: Convert ARM64 AppImage to static runtime and add update information
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64')
run: |
sudo apt install desktop-file-utils
cd build
appimage="FreeTube-${{ steps.getPackageInfo.outputs.version }}.AppImage"
wget "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage" -O ./appimagetool.AppImage
wget "https://github.com/AppImage/type2-runtime/releases/download/continuous/runtime-x86_64" -O runtime
chmod +x ./"$appimage" ./appimagetool.AppImage ./runtime
update_information="gh-releases-zsync|FreeTubeApp|FreeTube|latest-all|freetube-*-arm64.AppImage.zsync"
TARGET_APPIMAGE=$appimage" ./runtime --appimage-extract && rm -f ./"$appimage"
ARCH=aarch64 ./appimagetool.AppImage --comp zstd --mksquashfs-opt -Xcompression-level --mksquashfs-opt 20 \
-u "$update_information" -n ./squashfs-root ./"$appimage"
rm -rf ./squashfs-root ./appimagetool.AppImage ./runtime
- name: Upload Linux .zip x64 Release
uses: actions/upload-release-asset@v1
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64')
@@ -210,6 +241,17 @@ jobs:
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}.AppImage
asset_content_type: application/vnd.appimage
- name: Upload AppImage .zsync x64 Release
uses: actions/upload-release-asset@v1
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label}
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-amd64.AppImage.zsync
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}.AppImage.zsync
asset_content_type: application/x-zsync
- name: Upload AppImage ARMv7l Release
uses: actions/upload-release-asset@v1
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l')
@@ -221,6 +263,17 @@ jobs:
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}-armv7l.AppImage
asset_content_type: application/vnd.appimage
- name: Upload AppImage .zsync ARMv7l Release
uses: actions/upload-release-asset@v1
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-armv7l')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label}
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-armv7l.AppImage.zsync
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}-armv7l.AppImage.zsync
asset_content_type: application/x-zsync
- name: Upload AppImage ARM64 Release
uses: actions/upload-release-asset@v1
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64')
@@ -232,6 +285,17 @@ jobs:
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}-arm64.AppImage
asset_content_type: application/vnd.appimage
- name: Upload AppImage .zsync ARM64 Release
uses: actions/upload-release-asset@v1
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-arm64')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: https://uploads.github.com/repos/FreeTubeApp/FreeTube/releases/${{ inputs.releaseId }}/assets{?name,label}
asset_name: freetube-${{ steps.getPackageInfo.outputs.version }}-beta-arm64.AppImage.zsync
asset_path: build/FreeTube-${{ steps.getPackageInfo.outputs.version }}-arm64.AppImage.zsync
asset_content_type: application/x-zsync
- name: Upload Linux .rpm x64 Release
uses: actions/upload-release-asset@v1
if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.runtime, 'linux-x64')

View File

@@ -746,6 +746,8 @@ function runApp() {
window.show()
}
}
if (trayWindows.length === BrowserWindow.getAllWindows().length) { mainWindow = window }
} else if (trayWindows.length > 0) {
window.close()
}
@@ -781,16 +783,29 @@ function runApp() {
{
type: 'separator'
},
{
label: 'Quit',
click: handleQuit
}
...defaultTrayMenu()
)
const menu = Menu.buildFromTemplate(menuItems)
tray.setContextMenu(menu)
}
function defaultTrayMenu() {
return [
{
label: 'New Window',
click: () => createWindow({
showWindowNow: true,
replaceMainWindow: trayWindows.some(item => item.id === mainWindow.id)
})
},
{
label: 'Quit',
click: handleQuit
}
]
}
function destroyTray() {
if (!tray) return
@@ -798,11 +813,7 @@ function runApp() {
tray.destroy()
tray = null
} else {
const quitItem = [{
label: 'Quit',
click: handleQuit
}]
const menu = Menu.buildFromTemplate(quitItem)
const menu = Menu.buildFromTemplate(defaultTrayMenu())
tray.setContextMenu(menu)
}
}
@@ -1028,6 +1039,14 @@ function runApp() {
if (trayOnMinimize) {
newWindow.hide()
manageTray(newWindow)
if (newWindow === mainWindow) {
// A timer is needed because getFocusedWindow doesn't update until the minimize event ends
setTimeout(() => {
const newMainWindow = BrowserWindow.getFocusedWindow() || BrowserWindow.getAllWindows().find(window => window.isVisible())
if (newMainWindow) { mainWindow = newMainWindow }
}, 100)
}
}
})

View File

@@ -134,12 +134,12 @@ User Playlists:
Sort By:
NameAscending: A-Z
NameDescending: Z-A
LatestCreatedFirst: Nedavno stvoreno
EarliestCreatedFirst: Najranije stvoreno
LatestUpdatedFirst: Nedavno aktualizirano
EarliestUpdatedFirst: Najranije aktualizirano
LatestPlayedFirst: Nedavno reproducirano
EarliestPlayedFirst: Najranije reproducirano
LatestCreatedFirst: Datum stvaranja (najnoviji)
EarliestCreatedFirst: Datum stvaranja (najstariji)
LatestUpdatedFirst: Datum aktualiziranja (najnoviji)
EarliestUpdatedFirst: Datum aktualiziranja (najstariji)
LatestPlayedFirst: Datum reproduciranja (najnoviji)
EarliestPlayedFirst: Datum reproduciranja (najstariji)
Remove Watched Videos: Ukloni gledana videa
Save Changes: Spremi promjene
You have no playlists. Click on the create new playlist button to create a new one.: Nemaš zbirke. Za stvaranje nove zbirke pritisni gumb za stvaranje nove zbirke.
@@ -197,6 +197,7 @@ User Playlists:
Export Playlist: Izvezi ovu zbirku
The playlist has been successfully exported: Zbirka je uspješno izvezena
TotalTimePlaylist: 'Ukupno vrijeme: {duration}'
Export list of URLs: Izvezi popisa URL-ova
History:
# On History Page
History: 'Povijest'
@@ -205,8 +206,8 @@ History:
Search bar placeholder: Pretraži povijest
Empty Search Message: U ovoj zbirci nema videa u tvojoj povijesti koji odgovaraju tvojem pretraživanju
Case Sensitive Search: Razlikuj velika i mala slova tijekom pretraživanja
DateOldestHistory: Najprije najranije gledano
DateNewestHistory: Najprije nedavno gledano
DateOldestHistory: Datum gledanja (najstariji)
DateNewestHistory: Datum gledanja (najnoviji)
Settings:
# On Settings Page
Settings: 'Postavke'
@@ -248,7 +249,7 @@ Settings:
No Action: Bez radnje
Ask Before Opening Link: Pitaj prije otvaranja poveznice
Open Link: Otvori poveznicu
External Link Handling: Rukovanje vanjskim poveznicama
External Link Handling: Rukovanje eksternim poveznicama
Auto Load Next Page:
Label: Automatski učitaj sljedeću stranicu
Tooltip: Automatski učitaj dodatne stranice i komentare.
@@ -425,7 +426,7 @@ Settings:
Default Viewing Mode: Standardni modus gledanja
Full Screen: Cijeli ekran
Picture in Picture: Slika u slici
External Player: Eksterni Player ({externalPlayerName})
External Player: Eksterni player ({externalPlayerName})
Privacy Settings:
Privacy Settings: 'Privatnost'
Remember History: 'Zapamti povijest gledanja'
@@ -559,7 +560,9 @@ Settings:
Proxy Protocol: Protokol posrednika
Enable Tor / Proxy: Aktiviraj Tor/Posrednik
Proxy Settings: Posrednik
Proxy Warning: FreeTube nema ugrađeni proxy, ali se može povezati s vanjskim proxyjem, poput onog koji radi na tvom računalu poput Tor-a ili eksternog proxyja, poput SOCKS5 proxyja koji pružaju neki VPN-ovi. Ako je aktiviran, provjeri je li tvoj proxy/Tor pravilno konfiguriran, inače FreeTube neće moći dohvatiti nikoje podatke.
Proxy Warning: FreeTube nema ugrađeni proxy, ali se može povezati s eksternim proxyjem, poput onog koji radi na tvom računalu poput Tor-a ili eksternog proxyja, poput SOCKS5 proxyja koji pružaju neki VPN-ovi. Ako je aktiviran, provjeri je li tvoj proxy/Tor pravilno konfiguriran, inače FreeTube neće moći dohvatiti nikoje podatke.
Proxy Username: Korisničko ime za proxy
Proxy Password: Lozinka za proxy
SponsorBlock Settings:
Notify when sponsor segment is skipped: Obavijesti kad se preskoči segment sponzora
'SponsorBlock API Url (Default is https://sponsor.ajay.app)': URL API-a za blokiranja sponzora (standardno je https://sponsor.ajay.app)
@@ -576,10 +579,10 @@ Settings:
'DeArrow Thumbnail Generator API Url (Default is https://dearrow-thumb.ajay.app)': 'URL za API DeArrow generatora minijatura (Standardna adresa je: https://dearrow-thumb.ajay.app)'
UseDeArrowThumbnails: Koristi DeArrow za minijature
External Player Settings:
Custom External Player Arguments: Argumenti prilagođenog vanjskog playera
Custom External Player Arguments: Argumenti prilagođenog eksternog playera
Custom External Player Executable: Izvršna datoteka prilagođenog eksternog playera
Ignore Unsupported Action Warnings: Zanemari upozorenja o nepodržanim radnjama
External Player: Vanjski player
External Player: Eksterni player
External Player Settings: Eksterni player
Players:
None:
@@ -590,7 +593,7 @@ Settings:
Download Settings: Preuzimanje
Ask Download Path: Zatraži stazu za preuzimanja
Download in app: Preuzmi u programu
Open in web browser: Otvori u web-pregledniku
Open in web browser: Otvori u web pregledniku
Download Behavior: Ponašanje preuzimanja
Parental Control Settings:
Parental Control Settings: Roditeljski nadzor
@@ -869,17 +872,17 @@ Playlist:
#& Views
Playlist: Zbirka
Sort By:
DateAddedNewest: Najprije najnovije dodane
DateAddedOldest: Najprije najranije dodane
DateAddedNewest: Datum dodavanja (najnoviji)
DateAddedOldest: Datum dodavanja (najstariji)
AuthorAscending: Autor (A-Z)
AuthorDescending: Autor (Z-A)
VideoTitleAscending: Naslov (A-Z)
VideoTitleDescending: Naslov (Z-A)
Custom: Prilagođeno
VideoDurationDescending: Trajanje (najprije najduže)
VideoDurationAscending: Trajanje (najprije najkraće)
PublishedNewest: Najprije najnovije izdane
PublishedOldest: Najprije najranije izdane
VideoDurationDescending: Trajanje (najduže)
VideoDurationAscending: Trajanje (najkraće)
PublishedNewest: Datum objavljivanja (najnoviji)
PublishedOldest: Datum objavljivanja (najstariji)
Change Format:
Change Media Formats: 'Promijeni videoformate'
Use Dash Formats: 'Koristi DASH formate'
@@ -970,10 +973,10 @@ Tooltips:
Fetch Feeds from RSS: Kada je aktivirano, FreeTube će koristiti RSS umjesto vlastite standardne metode za dohvaćanje podataka tvoje pretplate. RSS je brži i sprečava blokiranje IP adresa, ali ne pruža određene podatke kao što su trajanje videa, stanje „uživo” ili postovi
Fetch Automatically: Kada je aktivirano, FreeTube će automatski dohvatiti feed tvoje pretplate pri pokretanju programa i kada se otvori novi prozor.
External Player Settings:
External Player: Biranjem vanjskog playera prikazat će se ikona, za otvaranje videa (zbirka, ako je podržana) u vanjskom playeru, na minijaturi. Upozorenje, Invidious postavke ne utječu na vanjske playere.
Custom External Player Arguments: Svi prilagođeni argumenti naredbenog retka, koje želiš da se proslijede vanjskom playeru.
Ignore Warnings: Nemoj prikazati upozorenja kad trenutačni vanjski player ne podržava trenutačnu radnju (npr. preokretanje redoslijeda zbirke itd.).
Custom External Player Executable: Prema standardnim postavkama, FreeTube će pretpostaviti da se odabrani vanjski player može pronaći putem varijable okruženja PATH (putanja). Ako je potrebno, ovdje se može postaviti prilagođena putanja.
External Player: Biranjem eksternog playera prikazat će se ikona, za otvaranje videa (zbirka, ako je podržana) u vanjskom playeru, na minijaturi. Upozorenje, Invidious postavke ne utječu na eksterne playere.
Custom External Player Arguments: Svi prilagođeni argumenti naredbenog retka, koje želiš da se proslijede eksternom playeru.
Ignore Warnings: Nemoj prikazati upozorenja kad trenutačni eksterni player ne podržava trenutačnu radnju (npr. preokretanje redoslijeda zbirke itd.).
Custom External Player Executable: Prema standardnim postavkama, FreeTube će pretpostaviti da se odabrani eksterni player može pronaći putem varijable okruženja PATH (putanja). Ako je potrebno, ovdje se može postaviti prilagođena putanja.
DefaultCustomArgumentsTemplate: '(Standardno: „{defaultCustomArguments}”)'
Ignore Default Arguments: Ne šalji bilo koje standardne argumente eksternom playeru osim URL-a videa (npr. brzina reprodukcije, URL zbirke itd.). Prilagođeni argumenti će se i dalje prosljediti.
Experimental Settings:

View File

@@ -119,12 +119,12 @@ User Playlists:
Create New Playlist: 新しい再生リストの作成
Sort By:
NameAscending: A-Z
EarliestCreatedFirst: 最も古い作成日
LatestUpdatedFirst: 最も新しい更新
EarliestUpdatedFirst: 最も古い更新
EarliestPlayedFirst: 最も古い再生
LatestPlayedFirst: 最も新しい再生
LatestCreatedFirst: 最も新しい作成日
EarliestCreatedFirst: 作成日(古い順)
LatestUpdatedFirst: 更新日(新しい順)
EarliestUpdatedFirst: 更新日(古い順)
EarliestPlayedFirst: 再生日(古い順)
LatestPlayedFirst: 再生日(新しい順)
LatestCreatedFirst: 作成日(新しい順)
NameDescending: Z-A
Remove from Favorites: '{playlistName} から削除'
Move Video Down: 動画を下へ移動
@@ -203,8 +203,8 @@ History:
Search bar placeholder: 履歴の検索
Empty Search Message: 検索条件に一致する動画は履歴にありません
Case Sensitive Search: 大文字小文字を区別した検索
DateOldestHistory: 最初に視聴した順
DateNewestHistory: 最後に視聴した順
DateOldestHistory: 視聴日(古い順)
DateNewestHistory: 視聴日(新しい順)
Settings:
# On Settings Page
Settings: '設定'
@@ -829,15 +829,15 @@ Playlist:
Sort By:
Custom: カスタム
VideoTitleDescending: タイトルZ-A
DateAddedOldest: 最初に追加された順
DateAddedNewest: 最近の追加された順
DateAddedOldest: 追加日(古い順)
DateAddedNewest: 追加日(新しい順)
AuthorAscending: 著者名A-Z
AuthorDescending: 著者名Z-A
VideoTitleAscending: タイトルA-Z
VideoDurationAscending: 再生時間(短い順)
VideoDurationDescending: 再生時間(長い順)
PublishedNewest: 新しい公開動画順
PublishedOldest: 古い公開動画順
PublishedNewest: 公開日(新しい順)
PublishedOldest: 公開日(古い順)
Change Format:
Change Media Formats: '動画形式の変更'
Use Dash Formats: 'DASH 形式の使用'

View File

@@ -123,14 +123,14 @@ User Playlists:
Playlist Description: Afspeellijst omschrijving
Delete Playlist: Afspeellijst verwijderen
Sort By:
LatestCreatedFirst: Recent toegevoegd
LatestCreatedFirst: Datum aangemaakt (nieuwste)
NameDescending: Z - A
NameAscending: A - Z
EarliestPlayedFirst: Eerst gespeeld
EarliestCreatedFirst: Oudste
LatestUpdatedFirst: Recent bijgewerkt
EarliestUpdatedFirst: Oudste
LatestPlayedFirst: Recent afgespeeld
EarliestPlayedFirst: Datum afgespeeld (oudste)
EarliestCreatedFirst: Datum aangemaakt (oudste)
LatestUpdatedFirst: Datum bijgewerkt (nieuwste)
EarliestUpdatedFirst: Datum bijgewerkt (oudste)
LatestPlayedFirst: Datum afgespeeld (nieuwste)
CreatePlaylistPrompt:
Create: Aanmaken
New Playlist Name: Naam voor nieuwe afspeellijst
@@ -206,8 +206,8 @@ History:
Search bar placeholder: In geschiedenis zoeken
Empty Search Message: Geschiedenis bevat geen video's die overeenkomen met de zoekopdracht
Case Sensitive Search: Hoofdlettergevoelige zoekopdracht
DateOldestHistory: Eerst­bekeken eerst
DateNewestHistory: Laatst­bekeken eerst
DateOldestHistory: Datum bekeken (oudste)
DateNewestHistory: Datum bekeken (nieuwste)
Settings:
# On Settings Page
Settings: 'Instellingen'