Compare commits

...

3 Commits

Author SHA1 Message Date
Hosted Weblate 42d9c8cfcf chore(web): update translations
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Co-authored-by: Nagy Krisztián <nkgy17@gmail.com>
Co-authored-by: User 123456789 <user123456789@users.noreply.hosted.weblate.org>
Co-authored-by: waclaw66 <waclaw66@seznam.cz>
Translate-URL: https://hosted.weblate.org/projects/immich/immich/cs/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/hu/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/pl/
Translate-URL: https://hosted.weblate.org/projects/immich/immich/sk/
Translation: Immich/immich
2026-06-12 18:01:21 +00:00
Jason Rasmussen e31d4aa909 fix: prerelease draft (#29034) 2026-06-12 12:43:19 -04:00
Daniel Dietzler 43b2d04e2c fix: version tests (#29032) 2026-06-12 15:54:42 +00:00
7 changed files with 31 additions and 30 deletions
+9 -1
View File
@@ -50,6 +50,7 @@ jobs:
outputs:
ref: ${{ steps.push-tag.outputs.commit_long_sha }}
version: ${{ steps.output.outputs.version }}
rc: ${{ steps.output.outputs.rc }}
permissions: {} # No job-level permissions are needed because it uses the app-token
steps:
- id: token
@@ -81,7 +82,13 @@ jobs:
run: pnpm --silent release -s "${SERVER_BUMP}" -m "${MOBILE_BUMP}"
- id: output
run: echo "version=$IMMICH_VERSION" >> $GITHUB_OUTPUT
run: |
echo "version=$IMMICH_VERSION" >> $GITHUB_OUTPUT
if [[ "$IMMICH_VERSION" =~ -rc\.[0-9]+$ ]]; then
echo "rc=true" >> $GITHUB_OUTPUT
else
echo "rc=false" >> $GITHUB_OUTPUT
fi
- name: Commit and tag
id: push-tag
@@ -145,6 +152,7 @@ jobs:
uses: softprops/action-gh-release@b4309332981a82ec1c5618f44dd2e27cc8bfbfda # v3.0.0
with:
draft: true
prerelease: ${{ needs.bump_version.outputs.rc }}
tag_name: ${{ needs.bump_version.outputs.version }}
token: ${{ steps.generate-token.outputs.token }}
generate_release_notes: true
+1 -1
View File
@@ -95,7 +95,7 @@ describe('/server', () => {
major: expect.any(Number),
minor: expect.any(Number),
patch: expect.any(Number),
prerelease: null,
prerelease: expect.anything(),
});
});
});
+2 -2
View File
@@ -2390,12 +2390,12 @@
"trashed_items_will_be_permanently_deleted_after": "Smazané položky budou trvale odstraněny po {days, plural, one {# dni} other {# dnech}}.",
"trigger": "Spouštěč",
"trigger_asset_metadata_extraction": "Extrakce metadat položek",
"trigger_asset_metadata_extraction_description": "Spustí se při extrakci EXIF údajů z mediálního souboru",
"trigger_asset_metadata_extraction_description": "Spustí se při extrakci EXIF metadat z mediálního souboru",
"trigger_asset_uploaded": "Nahrání položky",
"trigger_asset_uploaded_description": "Spustí se při nahrání nového souboru",
"trigger_description": "Událost, která spustí pracovní postup",
"trigger_person_recognized": "Osoba rozpoznána",
"trigger_person_recognized_description": "Spustí se, když je objevena osoba",
"trigger_person_recognized_description": "Spustí se, když je rozpoznána osoba",
"trigger_type": "Typ spouštěče",
"troubleshoot": "Diagnostika",
"type": "Typ",
+3 -3
View File
@@ -2020,13 +2020,13 @@
"search_albums": "Albumok keresése",
"search_by_context": "Keresés tartalom alapján",
"search_by_description": "Keresés leírás alapján",
"search_by_description_example": "Túrázós nap Szapában",
"search_by_description_example": "Például: túrázós nap a hegyekben",
"search_by_filename": "Keresés fájlnév vagy kiterjesztés alapján",
"search_by_filename_example": "például IMG_1234.JPG vagy PNG",
"search_by_full_path": "Keresés teljes elérési út vagy mappa alapján",
"search_by_full_path_example": "/Jancsi/Projektek/3D_nyomtatás/2026-07-01 kereshetsz a Projektek, 3D, Nyomtatás, 2026 stb. kifejezésekre.",
"search_by_ocr": "Keresés szövegfelismeréssel (OCR)",
"search_by_ocr_example": "Latte",
"search_by_ocr_example": "Például: számla",
"search_camera_lens_model": "Keresés objektívmodell alapján...",
"search_camera_make": "Kameragyártó keresése...",
"search_camera_model": "Kameramodell keresése...",
@@ -2308,7 +2308,7 @@
"submit": "Beküldés",
"success": "Siker",
"suggestions": "Javaslatok",
"sunrise_on_the_beach": "Napkelte a tengerparton",
"sunrise_on_the_beach": "Például: napfelkelte a tengerparton",
"support": "Támogatás",
"support_and_feedback": "Támogatás és visszajelzés",
"support_third_party_description": "Az Immich telepítésedet egy harmadik fél csomagolta. Mivel elképzelhető, hogy az esetlegesen felmerülő problémákat ez a csomag okozza, ezért kérjük, először velük közöld a problémákat az alábbi linkek segítségével.",
+4 -4
View File
@@ -2165,8 +2165,8 @@
"share_assets_selected": "Wybrano {count}",
"share_dialog_preparing": "Przygotowywanie…",
"share_link": "Udostępnij link",
"share_original": "Użyj orginału (dużej)",
"share_preview": "Użyj miniatury (małej)",
"share_original": "Użyj orginału (duży)",
"share_preview": "Użyj miniatury (mała)",
"shared": "Udostępnione",
"shared_album_activities_input_disable": "Komentarz jest wyłączony",
"shared_album_activity_remove_content": "Czy chcesz usunąć tę aktywność?",
@@ -2390,12 +2390,12 @@
"trashed_items_will_be_permanently_deleted_after": "Wyrzucone zasoby zostaną trwale usunięte po {days, plural, one {jednym dniu} other {# dniach}}.",
"trigger": "Wyzwalacz",
"trigger_asset_metadata_extraction": "Ekstrakcja metadanych zasobów",
"trigger_asset_metadata_extraction_description": "Wyzwalane, gdy wyodrębniony zostanie plik EXIF zasobu",
"trigger_asset_metadata_extraction_description": "Wyzwalane po wyodrębnieniu metadanych EXIF z zasobu",
"trigger_asset_uploaded": "Przesyłanie zasobu",
"trigger_asset_uploaded_description": "Wyzwalane gdy przesłany zostanie nowy zasób",
"trigger_description": "Wydarzenie, które uruchamia przepływ pracy",
"trigger_person_recognized": "Osoba rozpoznana",
"trigger_person_recognized_description": "Wyzwalane gdy zostanie wykryta osoba",
"trigger_person_recognized_description": "Wyzwalane gdy osoba zostanie rozpoznana",
"trigger_type": "Rodzaj wyzwalacza",
"troubleshoot": "Rozwiąż problemy",
"type": "Typ",
+3 -3
View File
@@ -114,7 +114,7 @@
"image_thumbnail_quality_description": "Kvalita miniatúry v stupnici od 1 do 100. Vyššia hodnota znamená lepšiu kvalitu, ale produkuje väčšie súbory a môže znížiť odozvu aplikácie.",
"image_thumbnail_title": "Miniatúry",
"import_config_from_json_description": "Importovať konfiguráciu systému nahraním konfiguračného súboru JSON",
"job_concurrency": "Súbežnosť úlohy - {job}",
"job_concurrency": "Súbežné úlohy - {job}",
"job_created": "Úloha bola vytvorená",
"job_not_concurrency_safe": "Táto úloha nie je bezpečná pre súbežné spracovanie.",
"job_settings": "Úlohy",
@@ -2390,12 +2390,12 @@
"trashed_items_will_be_permanently_deleted_after": "Položky v koši sa natrvalo vymažú po {days, plural, one {# dni} other {# dňoch}}.",
"trigger": "Spúšťač",
"trigger_asset_metadata_extraction": "Extrakcia metadát položky",
"trigger_asset_metadata_extraction_description": "Spustí sa pri extrakcii údajov EXIF z mediálneho súboru",
"trigger_asset_metadata_extraction_description": "Spustí sa pri extrakcii EXIF metadát z mediálneho súboru",
"trigger_asset_uploaded": "Nahranie položiek",
"trigger_asset_uploaded_description": "Spustí sa pri nahratí novej položky",
"trigger_description": "Udalosť, ktorá spustí pracovný postup",
"trigger_person_recognized": "Osoba bola rozpoznaná",
"trigger_person_recognized_description": "Spustí sa, keď bude objavená osoba",
"trigger_person_recognized_description": "Spustí sa, keď sa rozpozná osoba",
"trigger_type": "Typ spúšťača",
"troubleshoot": "Riešenie problémov",
"type": "Typ",
+9 -16
View File
@@ -1,7 +1,6 @@
import { DateTime } from 'luxon';
import { SemVer } from 'semver';
import { defaults } from 'src/config';
import { serverVersion } from 'src/constants';
import { ReleaseChannel } from 'src/dtos/system-config.dto';
import { CronJob, JobName, JobStatus, SystemMetadataKey } from 'src/enum';
import { VersionService } from 'src/services/version.service';
@@ -23,16 +22,10 @@ describe(VersionService.name, () => {
mocks.cron.update.mockResolvedValue();
});
beforeAll(() => {
vitest.mock(import('src/constants.js'), async () => ({
...(await vitest.importActual<typeof import('src/constants.js')>('src/constants.js')),
serverVersion: new SemVer('v3.0.0'),
}));
});
afterAll(() => {
vitest.unmock(import('src/constants.js'));
});
vitest.mock(import('src/constants.js'), async (importOriginal) => ({
...(await importOriginal()),
serverVersion: new SemVer('v3.0.0'),
}));
it('should work', () => {
expect(sut).toBeDefined();
@@ -53,7 +46,7 @@ describe(VersionService.name, () => {
mocks.versionHistory.getLatest.mockResolvedValue({
id: 'version-1',
createdAt: new Date(),
version: serverVersion.toString(),
version: '3.0.0',
});
await expect(sut.onBootstrap()).resolves.toBeUndefined();
expect(mocks.versionHistory.create).not.toHaveBeenCalled();
@@ -64,7 +57,7 @@ describe(VersionService.name, () => {
mocks.versionHistory.getLatest.mockResolvedValue({
id: 'version-1',
createdAt: new Date(),
version: serverVersion.toString(),
version: '3.0.0',
});
await sut.onBootstrap();
expect(mocks.cron.create).toHaveBeenCalledWith(
@@ -121,7 +114,7 @@ describe(VersionService.name, () => {
checkedAt: DateTime.utc().minus({ seconds: 60 }).toISO(),
releaseVersion: '1.0.0',
});
mocks.serverInfo.getLatestRelease.mockResolvedValue(mockVersionResponse(serverVersion.toString()));
mocks.serverInfo.getLatestRelease.mockResolvedValue(mockVersionResponse('v3.0.0'));
await expect(sut.handleVersionCheck()).resolves.toEqual(JobStatus.Success);
expect(mocks.serverInfo.getLatestRelease).toHaveBeenCalled();
});
@@ -135,11 +128,11 @@ describe(VersionService.name, () => {
});
it('should not notify if the version is equal', async () => {
mocks.serverInfo.getLatestRelease.mockResolvedValue(mockVersionResponse(serverVersion.toString()));
mocks.serverInfo.getLatestRelease.mockResolvedValue(mockVersionResponse('v3.0.0'));
await expect(sut.handleVersionCheck()).resolves.toEqual(JobStatus.Success);
expect(mocks.systemMetadata.set).toHaveBeenCalledWith(SystemMetadataKey.VersionCheckState, {
checkedAt: expect.any(String),
releaseVersion: serverVersion.toString(),
releaseVersion: 'v3.0.0',
});
expect(mocks.websocket.clientBroadcast).not.toHaveBeenCalled();
});