From 496961006c55258635707caf4d40106ae6596584 Mon Sep 17 00:00:00 2001 From: Dion Date: Wed, 28 Feb 2024 16:32:47 +0100 Subject: [PATCH] add german / move to localization.json --- .../docs/developer-guide/api/readme.md | 6 +- .../atoms/form-control/form-control.tsx | 8 +- .../menu-option-modal.spec.tsx | 9 +- .../menu-option-modal/menu-option-modal.tsx | 3 +- .../atoms/menu-option/menu-option.spec.tsx | 13 +- .../atoms/menu-option/menu-option.tsx | 3 +- .../components/atoms/more-menu/more-menu.tsx | 3 +- .../archive-pagination/archive-pagination.tsx | 5 +- ...chive-sidebar-label-edit-add-overwrite.tsx | 31 +- ...hive-sidebar-label-edit-search-replace.tsx | 31 +- .../archive-sidebar-label-edit.tsx | 7 +- .../archive-sidebar-selection-list.tsx | 5 +- .../color-class-select-keyboard.tsx | 6 +- .../color-class-select/color-class-select.tsx | 19 +- .../color-class-update-single.ts | 12 +- .../force-sync-wait-button.tsx | 8 +- .../health-check-for-updates.tsx | 20 +- .../health-status-error.tsx | 10 +- .../item-text-list-view.tsx | 3 +- .../modal-drop-area-files-added.tsx | 6 +- .../search-pagination/search-pagination.tsx | 5 +- .../application-exception.tsx | 11 +- .../archive-sidebar/archive-sidebar.tsx | 10 +- .../detail-view-sidebar.tsx | 29 +- .../detailview-info-datetime.tsx | 10 +- .../detailview-info-location.tsx | 8 +- .../organisms/menu-search/menu-search.tsx | 2 +- .../organisms/menu-trash/menu-trash.tsx | 8 +- .../modal-archive-mkdir.tsx | 22 +- .../modal-archive-rename.tsx | 13 +- .../modal-archive-synchronize-manually.tsx | 34 +- .../modal-detailview-rename-file.tsx | 20 +- .../modal-display-options.tsx | 39 +- .../modal-download/modal-download.tsx | 27 +- .../modal-edit-datetime.tsx | 16 +- .../modal-force-delete/modal-force-delete.tsx | 11 +- .../organisms/modal-publish/modal-publish.tsx | 41 +- .../src/containers/account-register.tsx | 38 +- .../clientapp/src/containers/login.tsx | 50 +- .../src/containers/media-content.tsx | 9 +- .../containers/preferences/preferences.tsx | 3 +- .../clientapp/src/containers/search.tsx | 12 +- .../clientapp/src/containers/trash.tsx | 11 +- .../src/interfaces/ILanguageLocalization.ts | 11 + .../src/localization/localization.json | 521 +++++++++++++++++- .../clientapp/src/pages/not-found-page.tsx | 5 +- .../clientapp/src/shared/language.spec.ts | 42 +- .../starsky/clientapp/src/shared/language.ts | 22 +- starsky/starsky/clientapp/vite.config.ts | 2 +- 49 files changed, 836 insertions(+), 404 deletions(-) create mode 100644 starsky/starsky/clientapp/src/interfaces/ILanguageLocalization.ts diff --git a/documentation/docs/developer-guide/api/readme.md b/documentation/docs/developer-guide/api/readme.md index 8192afde44..7825f2d3f9 100644 --- a/documentation/docs/developer-guide/api/readme.md +++ b/documentation/docs/developer-guide/api/readme.md @@ -30,6 +30,9 @@ This document is auto generated | __/api/delete__ | DELETE| Remove files from the disk, but the file must contain the !delete! (TrashKeyw...| | _Parameters: f (subPaths, separated by dot comma), collections (true is to update files with the same name before _ | | _ the extenstion) _ | +| __/api/desktop-editor/open__ | GET | Open a file in the default editor or a specific editor on the desktop | +| _Parameters: f (single or multiple subPaths), collections (to combine files with the same name before the extension) _ | +| __/api/desktop-editor/amount-confirmation__ | GET | Check the amount of files to open before | | __/api/disk/mkdir__ | POST | Make a directory (-p) | | __/api/disk/rename__ | POST | Rename file/folder and update it in the database | | _Parameters: f (from subPath), to (to subPath), collections (is collections bool), currentStatus (default is to not _ | @@ -103,7 +106,6 @@ This document is auto generated | _ json (text as output), extraLarge (give preference to extraLarge over large image) _ | | __/api/thumbnail/zoom/\{f\}@\{z\}__ | GET | Get zoomed in image by fileHash.At the moment this is the source image | | __/api/thumbnail-generation__ | POST | Create thumbnails for a folder in the background | -| __/api/trash/detect-to-use-system-trash__ | GET | Is the system trash supported | -| __/api/trash/move-to-trash__ | POST | (beta) Move a file to the trash | +| __/api/trash/move-to-trash__ | POST | Move a file to the trash | | __/api/upload__ | POST | Upload to specific folder (does not check if already has been imported)Use th...| | __/api/upload-sidecar__ | POST | Upload sidecar file to specific folder (does not check if already has been im...| diff --git a/starsky/starsky/clientapp/src/components/atoms/form-control/form-control.tsx b/starsky/starsky/clientapp/src/components/atoms/form-control/form-control.tsx index 7c9722f343..247facd03d 100644 --- a/starsky/starsky/clientapp/src/components/atoms/form-control/form-control.tsx +++ b/starsky/starsky/clientapp/src/components/atoms/form-control/form-control.tsx @@ -1,5 +1,6 @@ import React, { useState } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import { LimitLength } from "./limit-length"; @@ -27,11 +28,8 @@ const FormControl: React.FunctionComponent = ({ onBlur, ...pr // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageFieldMaxLength = language.token( - language.text( - "Het onderstaande veld mag maximaal {maxlength} tekens hebben", - "The field below can have a maximum of {maxlength} characters" - ), + const MessageFieldMaxLength = language.key( + localization.MessageFieldMaxLength, ["{maxlength}"], [maxlength.toString()] ); diff --git a/starsky/starsky/clientapp/src/components/atoms/menu-option-modal/menu-option-modal.spec.tsx b/starsky/starsky/clientapp/src/components/atoms/menu-option-modal/menu-option-modal.spec.tsx index b6609b511d..a6aebc150c 100644 --- a/starsky/starsky/clientapp/src/components/atoms/menu-option-modal/menu-option-modal.spec.tsx +++ b/starsky/starsky/clientapp/src/components/atoms/menu-option-modal/menu-option-modal.spec.tsx @@ -1,4 +1,5 @@ import { fireEvent, render, screen } from "@testing-library/react"; +import { LanguageLocalizationExample } from "../../../interfaces/ILanguageLocalization.ts"; import MenuOptionModal from "./menu-option-modal.tsx"; describe("MenuOption component", () => { @@ -7,7 +8,7 @@ describe("MenuOption component", () => { const setEnableMoreMenuMock = jest.fn(); render( { ); expect(screen.getByTestId("test")).toBeTruthy(); - expect(screen.getByTestId("test").innerHTML).toBe("Content"); + expect(screen.getByTestId("test").innerHTML).toBe(LanguageLocalizationExample.en); }); it("expect child no localisation field", () => { @@ -44,7 +45,7 @@ describe("MenuOption component", () => { const setEnableMoreMenuMock = jest.fn(); render( { const setEnableMoreMenuMock = jest.fn(); render( >; - localization?: { nl: string; en: string }; + localization?: ILanguageLocalization; setEnableMoreMenu?: React.Dispatch>; children?: React.ReactNode; } diff --git a/starsky/starsky/clientapp/src/components/atoms/menu-option/menu-option.spec.tsx b/starsky/starsky/clientapp/src/components/atoms/menu-option/menu-option.spec.tsx index b4a5872ac6..e41bffc886 100644 --- a/starsky/starsky/clientapp/src/components/atoms/menu-option/menu-option.spec.tsx +++ b/starsky/starsky/clientapp/src/components/atoms/menu-option/menu-option.spec.tsx @@ -1,11 +1,12 @@ import { fireEvent, render, screen } from "@testing-library/react"; +import { LanguageLocalizationExample } from "../../../interfaces/ILanguageLocalization"; import MenuOption from "./menu-option"; describe("MenuOption component", () => { it("expect content", () => { render( {}} testName="test" isReadOnly={false} @@ -13,7 +14,7 @@ describe("MenuOption component", () => { ); expect(screen.getByTestId("test")).toBeTruthy(); - expect(screen.getByTestId("test").innerHTML).toBe("Content"); + expect(screen.getByTestId("test").innerHTML).toBe(LanguageLocalizationExample.en); }); it("expect child no localisation field", () => { @@ -30,7 +31,7 @@ describe("MenuOption component", () => { it("renders correctly with default props", () => { render( {}} testName="test-menu-option" isReadOnly={false} @@ -44,7 +45,7 @@ describe("MenuOption component", () => { it("renders correctly with custom props", () => { render( {}} testName="test-menu-option1" isReadOnly={false} @@ -59,7 +60,7 @@ describe("MenuOption component", () => { render( @@ -74,7 +75,7 @@ describe("MenuOption component", () => { render( diff --git a/starsky/starsky/clientapp/src/components/atoms/menu-option/menu-option.tsx b/starsky/starsky/clientapp/src/components/atoms/menu-option/menu-option.tsx index d7621712c2..bd180bd4b7 100644 --- a/starsky/starsky/clientapp/src/components/atoms/menu-option/menu-option.tsx +++ b/starsky/starsky/clientapp/src/components/atoms/menu-option/menu-option.tsx @@ -1,12 +1,13 @@ import React, { memo } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; +import { ILanguageLocalization } from "../../../interfaces/ILanguageLocalization"; import { Language } from "../../../shared/language"; interface IMenuOptionProps { isReadOnly: boolean; testName: string; onClickKeydown: () => void; - localization?: { nl: string; en: string }; + localization?: ILanguageLocalization; children?: React.ReactNode; } diff --git a/starsky/starsky/clientapp/src/components/atoms/more-menu/more-menu.tsx b/starsky/starsky/clientapp/src/components/atoms/more-menu/more-menu.tsx index 65b8b8ccc1..bd115587d0 100644 --- a/starsky/starsky/clientapp/src/components/atoms/more-menu/more-menu.tsx +++ b/starsky/starsky/clientapp/src/components/atoms/more-menu/more-menu.tsx @@ -1,5 +1,6 @@ import React, { useEffect } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; type MoreMenuPropTypes = { @@ -17,7 +18,7 @@ const MoreMenu: React.FunctionComponent = ({ }) => { const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageMore = language.text("Meer", "More"); + const MessageMore = language.key(localization.MessageMore); const offMoreMenu = () => setEnableMoreMenu(false); diff --git a/starsky/starsky/clientapp/src/components/molecules/archive-pagination/archive-pagination.tsx b/starsky/starsky/clientapp/src/components/molecules/archive-pagination/archive-pagination.tsx index e310646146..bb4aec9542 100644 --- a/starsky/starsky/clientapp/src/components/molecules/archive-pagination/archive-pagination.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/archive-pagination/archive-pagination.tsx @@ -2,6 +2,7 @@ import React, { memo } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; import useLocation from "../../../hooks/use-location/use-location"; import { IRelativeObjects } from "../../../interfaces/IDetailView"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import { UrlQuery } from "../../../shared/url-query"; import Link from "../../atoms/link/link"; @@ -17,8 +18,8 @@ const ArchivePagination: React.FunctionComponent = memo((props) = // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessagePrevious = language.text("Vorige", "Previous"); - const MessageNext = language.text("Volgende", "Next"); + const MessagePrevious = language.key(localization.MessagePrevious); + const MessageNext = language.key(localization.MessageNext); // used for reading current location const history = useLocation(); diff --git a/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit-add-overwrite.tsx b/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit-add-overwrite.tsx index 2251879c1f..59bb977abe 100644 --- a/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit-add-overwrite.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit-add-overwrite.tsx @@ -6,6 +6,7 @@ import useLocation from "../../../hooks/use-location/use-location"; import { PageType } from "../../../interfaces/IDetailView"; import { IExifStatus } from "../../../interfaces/IExifStatus"; import { ISidebarUpdate } from "../../../interfaces/ISidebarUpdate"; +import localization from "../../../localization/localization.json"; import { CastToInterface } from "../../../shared/cast-to-interface"; import FetchPost from "../../../shared/fetch/fetch-post"; import { Keyboard } from "../../../shared/keyboard"; @@ -20,24 +21,14 @@ import Preloader from "../../atoms/preloader/preloader"; const ArchiveSidebarLabelEditAddOverwrite: React.FunctionComponent = () => { const settings = useGlobalSettings(); - const MessageAddName = new Language(settings.language).text("Toevoegen", "Add to"); - const MessageOverwriteName = new Language(settings.language).text("Overschrijven", "Overwrite"); - const MessageTitleName = new Language(settings.language).text("Titel", "Title"); - const MessageErrorReadOnly = new Language(settings.language).text( - "Eén of meerdere bestanden zijn alleen lezen. " + - "Alleen de bestanden met schrijfrechten zijn geupdate.", - "One or more files are read only. " + "Only the files with write permissions have been updated." - ); - const MessageErrorGenericFail = new Language(settings.language).text( - "Er is iets misgegaan met het updaten. Probeer het opnieuw", - "Something went wrong with the update. Please try again" - ); - - const MessageErrorNotFoundSourceMissing = new Language(settings.language).text( - "Eén of meerdere bestanden zijn al verdwenen. " + - "Alleen de bestanden die wel aanwezig zijn geupdate. Draai een handmatige sync", - "One or more files are already gone. " + - "Only the files that are present are updated. Run a manual sync" + const language = new Language(settings.language); + const MessageAddName = language.key(localization.MessageAddName); + const MessageOverwriteName = language.key(localization.MessageOverwriteName); + const MessageTitleName = language.key(localization.MessageTitleName); + const MessageWriteErrorReadOnly = language.key(localization.MessageWriteErrorReadOnly); + const MessageErrorGenericFail = language.key(localization.MessageErrorGenericFail); + const MessageErrorNotFoundSourceMissingRunSync = language.key( + localization.MessageErrorNotFoundSourceMissingRunSync ); const history = useLocation(); @@ -107,9 +98,9 @@ const ArchiveSidebarLabelEditAddOverwrite: React.FunctionComponent = () => { .then((anyData) => { const result = new CastToInterface().InfoFileIndexArray(anyData.data); result.forEach((element) => { - if (element.status === IExifStatus.ReadOnly) setIsError(MessageErrorReadOnly); + if (element.status === IExifStatus.ReadOnly) setIsError(MessageWriteErrorReadOnly); if (element.status === IExifStatus.NotFoundSourceMissing) - setIsError(MessageErrorNotFoundSourceMissing); + setIsError(MessageErrorNotFoundSourceMissingRunSync); if (element.status === IExifStatus.Ok || element.status === IExifStatus.Deleted) { dispatch({ type: "update", diff --git a/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit-search-replace.tsx b/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit-search-replace.tsx index 161ce16fb9..18708c71c7 100644 --- a/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit-search-replace.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit-search-replace.tsx @@ -5,6 +5,7 @@ import useLocation from "../../../hooks/use-location/use-location"; import { PageType } from "../../../interfaces/IDetailView"; import { IExifStatus } from "../../../interfaces/IExifStatus"; import { ISidebarUpdate } from "../../../interfaces/ISidebarUpdate"; +import localization from "../../../localization/localization.json"; import { CastToInterface } from "../../../shared/cast-to-interface"; import FetchPost from "../../../shared/fetch/fetch-post"; import { Language } from "../../../shared/language"; @@ -19,22 +20,14 @@ import Preloader from "../../atoms/preloader/preloader"; const ArchiveSidebarLabelEditSearchReplace: React.FunctionComponent = () => { const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageSearchAndReplaceName = language.text("Zoeken en vervangen", "Search and replace"); - const MessageTitleName = language.text("Titel", "Title"); - const MessageErrorReadOnly = new Language(settings.language).text( - "Eén of meerdere bestanden zijn alleen lezen. " + - "Alleen de bestanden met schrijfrechten zijn geupdate.", - "One or more files are read only. " + "Only the files with write permissions have been updated." + const MessageSearchAndReplaceNameLong = language.key( + localization.MessageSearchAndReplaceNameLong ); - const MessageErrorNotFoundSourceMissing = new Language(settings.language).text( - "Eén of meerdere bestanden zijn al verdwenen. " + - "Alleen de bestanden die wel aanwezig zijn geupdate. Draai een handmatige sync", - "One or more files are already gone. " + - "Only the files that are present are updated. Run a manual sync" - ); - const MessageErrorGenericFail = new Language(settings.language).text( - "Er is iets misgegaan met het updaten. Probeer het opnieuw", - "Something went wrong with the update. Please try again" + const MessageTitleName = language.key(localization.MessageTitleName); + const MessageWriteErrorReadOnly = language.key(localization.MessageWriteErrorReadOnly); + const MessageErrorGenericFail = language.key(localization.MessageErrorGenericFail); + const MessageErrorNotFoundSourceMissingRunSync = language.key( + localization.MessageErrorNotFoundSourceMissingRunSync ); const history = useLocation(); @@ -94,9 +87,9 @@ const ArchiveSidebarLabelEditSearchReplace: React.FunctionComponent = () => { function handleFetchPostResponse(anyData: any) { const result = new CastToInterface().InfoFileIndexArray(anyData.data); result.forEach((element) => { - if (element.status === IExifStatus.ReadOnly) setIsError(MessageErrorReadOnly); + if (element.status === IExifStatus.ReadOnly) setIsError(MessageWriteErrorReadOnly); if (element.status === IExifStatus.NotFoundSourceMissing) - setIsError(MessageErrorNotFoundSourceMissing); + setIsError(MessageErrorNotFoundSourceMissingRunSync); if (element.status === IExifStatus.Ok || element.status === IExifStatus.Deleted) { dispatch({ type: "update", @@ -238,11 +231,11 @@ const ArchiveSidebarLabelEditSearchReplace: React.FunctionComponent = () => { data-test="replace-button" onClick={() => pushSearchAndReplace()} > - {MessageSearchAndReplaceName} + {MessageSearchAndReplaceNameLong} ) : ( )} diff --git a/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit.tsx b/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit.tsx index c24f5032f3..177532dea4 100644 --- a/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-label-edit.tsx @@ -1,6 +1,7 @@ import { useContext, useState } from "react"; import { ArchiveContext } from "../../../contexts/archive-context"; import useGlobalSettings from "../../../hooks/use-global-settings"; +import localization from "../../../localization/localization.json"; import { CastToInterface } from "../../../shared/cast-to-interface"; import { Language } from "../../../shared/language"; import SwitchButton from "../../atoms/switch-button/switch-button"; @@ -10,8 +11,10 @@ import ArchiveSidebarLabelEditSearchReplace from "./archive-sidebar-label-edit-s const ArchiveSidebarLabelEdit: React.FunctionComponent = () => { // Content const settings = useGlobalSettings(); - const MessageModifyName = new Language(settings.language).text("Wijzigen", "Modify"); - const MessageSearchAndReplaceName = new Language(settings.language).text("Vervangen", "Replace"); + const MessageModifyName = new Language(settings.language).key(localization.MessageModifyName); + const MessageSearchAndReplaceName = new Language(settings.language).key( + localization.MessageSearchAndReplaceNameShort + ); // Toggle const [replaceMode, setReplaceMode] = useState(false); diff --git a/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-selection-list.tsx b/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-selection-list.tsx index 5ba0e6219a..297af8a6d7 100644 --- a/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-selection-list.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/archive-sidebar/archive-sidebar-selection-list.tsx @@ -3,6 +3,7 @@ import useGlobalSettings from "../../../hooks/use-global-settings"; import useLocation from "../../../hooks/use-location/use-location"; import { IArchiveProps } from "../../../interfaces/IArchiveProps"; import { IFileIndexItem } from "../../../interfaces/IFileIndexItem"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import { Select } from "../../../shared/select"; import { URLPath } from "../../../shared/url-path"; @@ -16,8 +17,8 @@ const ArchiveSidebarSelectionList: React.FunctionComponent setIsDone(""); }, [props.filePath]); - const MessageColorClassIsUpdated = new Language(settings.language).text( - "Colorclass is bijgewerkt", - "Colorclass is updated" + const MessageColorClassIsUpdated = new Language(settings.language).key( + localization.MessageColorClassIsUpdated ); useKeyboardEvent(/[0-8]/, (event: KeyboardEvent) => { diff --git a/starsky/starsky/clientapp/src/components/molecules/color-class-select/color-class-select.tsx b/starsky/starsky/clientapp/src/components/molecules/color-class-select/color-class-select.tsx index 3f1cb65539..a35d65da5a 100644 --- a/starsky/starsky/clientapp/src/components/molecules/color-class-select/color-class-select.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/color-class-select/color-class-select.tsx @@ -1,6 +1,7 @@ import "core-js/modules/es.array.find"; import React, { useEffect, useState } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import Notification, { NotificationType } from "../../atoms/notification/notification"; import Portal from "../../atoms/portal/portal"; @@ -25,15 +26,15 @@ const ColorClassSelect: React.FunctionComponent = (props const language = new Language(settings.language); const colorContent: Array = [ - language.text("Kleurloos", "Colorless"), - language.text("Roze", "Pink"), - language.text("Rood", "Red"), - language.text("Oranje", "Orange"), - language.text("Geel", "Yellow"), - language.text("Groen", "Green"), - language.text("Azuur", "Azure"), - language.text("Blauw", "Blue"), - language.text("Grijs", "Grey") + language.key(localization.ColorClassColour0), + language.key(localization.ColorClassColour1), + language.key(localization.ColorClassColour2), + language.key(localization.ColorClassColour3), + language.key(localization.ColorClassColour4), + language.key(localization.ColorClassColour5), + language.key(localization.ColorClassColour6), + language.key(localization.ColorClassColour7), + language.key(localization.ColorClassColour8) ]; const [currentColorClass, setCurrentColorClass] = React.useState(props.currentColorClass); diff --git a/starsky/starsky/clientapp/src/components/molecules/color-class-select/color-class-update-single.ts b/starsky/starsky/clientapp/src/components/molecules/color-class-select/color-class-update-single.ts index 0881cc4b3b..deea83a8bb 100644 --- a/starsky/starsky/clientapp/src/components/molecules/color-class-select/color-class-update-single.ts +++ b/starsky/starsky/clientapp/src/components/molecules/color-class-select/color-class-update-single.ts @@ -1,5 +1,6 @@ import { IGlobalSettings } from "../../../hooks/use-global-settings"; import { IExifStatus } from "../../../interfaces/IExifStatus"; +import localization from "../../../localization/localization.json"; import { CastToInterface } from "../../../shared/cast-to-interface"; import FetchPost from "../../../shared/fetch/fetch-post"; import { Language, SupportedLanguages } from "../../../shared/language"; @@ -38,13 +39,8 @@ export class ColorClassUpdateSingle { this.clearAfter = clearAfter; } - private getMessageErrorReadOnly() { - return new Language(this.language).text( - "Eén of meerdere bestanden zijn alleen lezen. " + - "Alleen de bestanden met schrijfrechten zijn geupdate.", - "One or more files are read only. " + - "Only the files with write permissions have been updated." - ); + private getMessageWriteErrorReadOnly() { + return new Language(this.language).key(localization.MessageWriteErrorReadOnly); } public Update(colorClass: number) { @@ -67,7 +63,7 @@ export class ColorClassUpdateSingle { return item.status === IExifStatus.ReadOnly; }) ) { - this.setIsError(this.getMessageErrorReadOnly()); + this.setIsError(this.getMessageWriteErrorReadOnly()); return; } this.setCurrentColorClass(colorClass); diff --git a/starsky/starsky/clientapp/src/components/molecules/force-sync-wait-button/force-sync-wait-button.tsx b/starsky/starsky/clientapp/src/components/molecules/force-sync-wait-button/force-sync-wait-button.tsx index e03eba18f6..cb360e0a1b 100644 --- a/starsky/starsky/clientapp/src/components/molecules/force-sync-wait-button/force-sync-wait-button.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/force-sync-wait-button/force-sync-wait-button.tsx @@ -3,6 +3,7 @@ import { ArchiveAction } from "../../../contexts/archive-context"; import useGlobalSettings from "../../../hooks/use-global-settings"; import { IArchiveProps } from "../../../interfaces/IArchiveProps"; import { IConnectionDefault } from "../../../interfaces/IConnectionDefault"; +import localization from "../../../localization/localization.json"; import { CastToInterface } from "../../../shared/cast-to-interface"; import FetchGet from "../../../shared/fetch/fetch-get"; import FetchPost from "../../../shared/fetch/fetch-post"; @@ -64,10 +65,7 @@ const ForceSyncWaitButton: React.FunctionComponent const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageForceSync = language.text( - "Handmatig synchroniseren van huidige map", - "Synchronize current directory manually" - ); + const MessageForceSyncCurrentFolder = language.key(localization.MessageForceSyncCurrentFolder); const [startCounter, setStartCounter] = useState(0); // preloading icon @@ -101,7 +99,7 @@ const ForceSyncWaitButton: React.FunctionComponent <> {isLoading ? : ""} ); diff --git a/starsky/starsky/clientapp/src/components/molecules/health-check-for-updates/health-check-for-updates.tsx b/starsky/starsky/clientapp/src/components/molecules/health-check-for-updates/health-check-for-updates.tsx index ae333a17c6..d3f7218264 100644 --- a/starsky/starsky/clientapp/src/components/molecules/health-check-for-updates/health-check-for-updates.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/health-check-for-updates/health-check-for-updates.tsx @@ -1,5 +1,6 @@ import useFetch from "../../../hooks/use-fetch"; import useGlobalSettings from "../../../hooks/use-global-settings"; +import localization from "../../../localization/localization.json"; import { BrowserDetect } from "../../../shared/browser-detect"; import { DifferenceInDate } from "../../../shared/date"; import { Language } from "../../../shared/language"; @@ -35,24 +36,15 @@ const HealthCheckForUpdates: React.FunctionComponent = () => { const language = new Language(settings.language); - const ReleasesUrlToken = - " {releasesToken}"; - let WhereToFindRelease = language.token( - ReleasesUrlToken, + let WhereToFindRelease = language.key( + localization.MessageWhereToFindReleaseReleasesUrlTokenHtml, ["{releasesToken}"], - [language.text("Ga naar het release overzicht", "Go to the release overview")] + [language.key(localization.MessageWhereToFindReleaseReleasesUrlTokenContent)] ); if (new BrowserDetect().IsElectronApp()) - WhereToFindRelease = language.text( - "Ga naar het Help menu en dan release overzicht", - "Go to the release overview" - ); + WhereToFindRelease = language.key(localization.WhereToFindReleaseElectronApp); - const MessageNewVersionUpdateToken = language.text( - "Er is een nieuwe versie beschikbaar {WhereToFindRelease}", - "A new version is available {WhereToFindRelease}" - ); + const MessageNewVersionUpdateToken = language.key(localization.MessageNewVersionUpdateToken); const MessageNewVersionUpdateHtml = language.token( MessageNewVersionUpdateToken, diff --git a/starsky/starsky/clientapp/src/components/molecules/health-status-error/health-status-error.tsx b/starsky/starsky/clientapp/src/components/molecules/health-status-error/health-status-error.tsx index 7449cea9bf..bb2e197cda 100644 --- a/starsky/starsky/clientapp/src/components/molecules/health-status-error/health-status-error.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/health-status-error/health-status-error.tsx @@ -1,6 +1,7 @@ import useFetch from "../../../hooks/use-fetch"; import useGlobalSettings from "../../../hooks/use-global-settings"; import { IHealthEntry } from "../../../interfaces/IHealthEntry"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import { UrlQuery } from "../../../shared/url-query"; import Notification, { NotificationType } from "../../atoms/notification/notification"; @@ -9,9 +10,8 @@ const HealthStatusError: React.FunctionComponent = () => { const healthCheck = useFetch(new UrlQuery().UrlHealthDetails(), "get"); const settings = useGlobalSettings(); - const MessageCriticalErrors = new Language(settings.language).text( - "Er zijn kritieke fouten in de volgende onderdelen:", - "There are critical errors in the following components:" + const MessageHealthStatusCriticalErrors = new Language(settings.language).key( + localization.MessageHealthStatusCriticalErrorsWithTheFollowingComponents ); if ( @@ -21,7 +21,9 @@ const HealthStatusError: React.FunctionComponent = () => { ) return null; - const content: React.JSX.Element[] = [{MessageCriticalErrors}]; + const content: React.JSX.Element[] = [ + {MessageHealthStatusCriticalErrors} + ]; if (!healthCheck.data?.entries) { content.push( diff --git a/starsky/starsky/clientapp/src/components/molecules/item-text-list-view/item-text-list-view.tsx b/starsky/starsky/clientapp/src/components/molecules/item-text-list-view/item-text-list-view.tsx index 9f6d50b93c..442b209c1e 100644 --- a/starsky/starsky/clientapp/src/components/molecules/item-text-list-view/item-text-list-view.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/item-text-list-view/item-text-list-view.tsx @@ -1,6 +1,7 @@ import useGlobalSettings from "../../../hooks/use-global-settings"; import { IExifStatus } from "../../../interfaces/IExifStatus"; import { IFileIndexItem } from "../../../interfaces/IFileIndexItem"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; interface ItemListProps { @@ -27,7 +28,7 @@ const ItemTextListView: React.FunctionComponent = (props) => { // Content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageNoPhotos = language.text("Er zijn geen foto's", "There are no pictures"); + const MessageNoPhotos = language.key(localization.MessageNoPhotos); if (!props.fileIndexItems) return ( diff --git a/starsky/starsky/clientapp/src/components/molecules/modal-drop-area-files-added/modal-drop-area-files-added.tsx b/starsky/starsky/clientapp/src/components/molecules/modal-drop-area-files-added/modal-drop-area-files-added.tsx index 173edb3a7a..686122d828 100644 --- a/starsky/starsky/clientapp/src/components/molecules/modal-drop-area-files-added/modal-drop-area-files-added.tsx +++ b/starsky/starsky/clientapp/src/components/molecules/modal-drop-area-files-added/modal-drop-area-files-added.tsx @@ -1,5 +1,6 @@ import useGlobalSettings from "../../../hooks/use-global-settings"; import { IFileIndexItem } from "../../../interfaces/IFileIndexItem"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import Modal from "../../atoms/modal/modal"; import ItemTextListView from "../../molecules/item-text-list-view/item-text-list-view"; @@ -12,10 +13,7 @@ interface IModalDropAreaFilesAddedProps { const ModalDropAreaFilesAdded: React.FunctionComponent = (props) => { const settings = useGlobalSettings(); - const MessageFilesAdded = new Language(settings.language).text( - "Deze bestanden zijn toegevoegd", - "These files have been added" - ); + const MessageFilesAdded = new Language(settings.language).key(localization.MessageFilesAdded); return ( = memo((props) => // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessagePrevious = language.text("Vorige", "Previous"); - const MessageNext = language.text("Volgende", "Next"); + const MessagePrevious = language.key(localization.MessagePrevious); + const MessageNext = language.key(localization.MessageNext); // used for reading current location const history = useLocation(); diff --git a/starsky/starsky/clientapp/src/components/organisms/application-exception/application-exception.tsx b/starsky/starsky/clientapp/src/components/organisms/application-exception/application-exception.tsx index e44fa5c8cc..9163df282a 100644 --- a/starsky/starsky/clientapp/src/components/organisms/application-exception/application-exception.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/application-exception/application-exception.tsx @@ -1,19 +1,14 @@ import { FunctionComponent } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import MenuDefault from "../menu-default/menu-default"; const ApplicationException: FunctionComponent = () => { const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageApplicationException = language.text( - "We hebben een op dit moment een verstoring op de applicatie", - "We have a disruption on the application right now" - ); - const MessageRefreshPageTryAgain = language.text( - "Herlaad de applicatie om het opnieuw te proberen", - "Please reload the application to try again" - ); + const MessageApplicationException = language.key(localization.MessageApplicationException); + const MessageRefreshPageTryAgain = language.key(localization.MessageRefreshPageTryAgain); return ( <> diff --git a/starsky/starsky/clientapp/src/components/organisms/archive-sidebar/archive-sidebar.tsx b/starsky/starsky/clientapp/src/components/organisms/archive-sidebar/archive-sidebar.tsx index 5d8cd3d7d8..866bec7b0e 100644 --- a/starsky/starsky/clientapp/src/components/organisms/archive-sidebar/archive-sidebar.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/archive-sidebar/archive-sidebar.tsx @@ -2,6 +2,7 @@ import React, { memo, useEffect, useLayoutEffect } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; import useLocation from "../../../hooks/use-location/use-location"; import { PageType } from "../../../interfaces/IDetailView"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import { URLPath } from "../../../shared/url-path"; import ArchiveSidebarColorClass from "../../molecules/archive-sidebar/archive-sidebar-color-class"; @@ -13,10 +14,11 @@ const ArchiveSidebar: React.FunctionComponent = memo((arch // Content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageSelectionName = language.text("Selectie", "Selection"); - const MessageReadOnlyFolder = language.text("Alleen lezen map", "Read only folder"); - const MessageUpdateLabels = language.text("Labels wijzigingen", "Update labels"); - const MessageColorClassification = language.text("Kleur-Classificatie", "Color Classification"); + + const MessageSelectionName = language.key(localization.MessageSelectionName); + const MessageReadOnlyFolder = language.key(localization.MessageReadOnlyFolder); + const MessageUpdateLabels = language.key(localization.MessageUpdateLabels); + const MessageColorClassification = language.key(localization.MessageColorClassification); // Update view based on url parameters const history = useLocation(); diff --git a/starsky/starsky/clientapp/src/components/organisms/detail-view-sidebar/detail-view-sidebar.tsx b/starsky/starsky/clientapp/src/components/organisms/detail-view-sidebar/detail-view-sidebar.tsx index 80f54bda58..026a40aaa2 100644 --- a/starsky/starsky/clientapp/src/components/organisms/detail-view-sidebar/detail-view-sidebar.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/detail-view-sidebar/detail-view-sidebar.tsx @@ -7,6 +7,7 @@ import useLocation from "../../../hooks/use-location/use-location"; import { IDetailView } from "../../../interfaces/IDetailView"; import { IExifStatus } from "../../../interfaces/IExifStatus"; import { IFileIndexItem } from "../../../interfaces/IFileIndexItem"; +import localization from "../../../localization/localization.json"; import { AsciiNull } from "../../../shared/ascii-null"; import AspectRatio from "../../../shared/aspect-ratio"; import BytesFormat from "../../../shared/bytes-format"; @@ -41,25 +42,15 @@ const DetailViewSidebar: React.FunctionComponent = memo // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageTitleName = language.text("Titel", "Title"); - const MessageInfoName = "Info"; - const MessageColorClassification = language.text("Kleur-Classificatie", "Color Classification"); - const MessageDateTimeAgoEdited = language.text("geleden bewerkt", "ago edited"); - const MessageDateLessThan1Minute = language.text( - "minder dan één minuut", - "less than one minute" - ); - const MessageDateMinutes = language.text("minuten", "minutes"); - const MessageDateHour = language.text("uur", "hour"); - - const MessageCopiedLabels = language.text( - "De labels zijn gekopieerd", - "The labels have been copied" - ); - const MessagePasteLabels = language.text( - "De labels zijn overschreven", - "The labels have been overwritten" - ); + const MessageTitleName = language.key(localization.MessageTitleName); + const MessageInfoName = language.key(localization.MessageInfoName); + const MessageColorClassification = language.key(localization.MessageColorClassification); + const MessageDateTimeAgoEdited = language.key(localization.MessageDateTimeAgoEdited); + const MessageDateLessThan1Minute = language.key(localization.MessageDateLessThan1Minute); + const MessageDateMinutes = language.key(localization.MessageDateMinutes); + const MessageDateHour = language.key(localization.MessageDateHour); + const MessageCopiedLabels = language.key(localization.MessageCopiedLabels); + const MessagePasteLabels = language.key(localization.MessagePasteLabels); const history = useLocation(); diff --git a/starsky/starsky/clientapp/src/components/organisms/detailview-info-datetime/detailview-info-datetime.tsx b/starsky/starsky/clientapp/src/components/organisms/detailview-info-datetime/detailview-info-datetime.tsx index 6ff8b355d4..4add557d31 100644 --- a/starsky/starsky/clientapp/src/components/organisms/detailview-info-datetime/detailview-info-datetime.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/detailview-info-datetime/detailview-info-datetime.tsx @@ -2,6 +2,7 @@ import React, { memo } from "react"; import { DetailViewAction } from "../../../contexts/detailview-context"; import useGlobalSettings from "../../../hooks/use-global-settings"; import { IFileIndexItem } from "../../../interfaces/IFileIndexItem"; +import localization from "../../../localization/localization.json"; import { isValidDate, parseDate, parseTime } from "../../../shared/date"; import { Language } from "../../../shared/language"; import ModalDatetime from "../modal-edit-date-time/modal-edit-datetime"; @@ -17,10 +18,9 @@ const DetailViewInfoDateTime: React.FunctionComponent { const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageCreationDate = language.text("Aanmaakdatum", "Creation date"); - const MessageCreationDateUnknownTime = language.text( - "is op een onbekend moment", - "is at an unknown time" + const MessageCreationDate = language.key(localization.MessageCreationDate); + const MessageCreationDateIsAtUnknownTime = language.key( + localization.MessageCreationDateIsAtUnknownTime ); const [modalDatetimeOpen, setModalDatetimeOpen] = React.useState(false); @@ -70,7 +70,7 @@ const DetailViewInfoDateTime: React.FunctionComponent {MessageCreationDate} -

{MessageCreationDateUnknownTime}

+

{MessageCreationDateIsAtUnknownTime}

) : null} diff --git a/starsky/starsky/clientapp/src/components/organisms/detailview-info-location/detailview-info-location.tsx b/starsky/starsky/clientapp/src/components/organisms/detailview-info-location/detailview-info-location.tsx index b865dc7e15..763e1aefd9 100644 --- a/starsky/starsky/clientapp/src/components/organisms/detailview-info-location/detailview-info-location.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/detailview-info-location/detailview-info-location.tsx @@ -4,6 +4,7 @@ import useGlobalSettings from "../../../hooks/use-global-settings"; import useLocation from "../../../hooks/use-location/use-location"; import { IFileIndexItem } from "../../../interfaces/IFileIndexItem"; import { IGeoLocationModel } from "../../../interfaces/IGeoLocationModel"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import ModalGeo from "../modal-geo/modal-geo"; @@ -33,10 +34,9 @@ const DetailViewInfoLocation: React.FunctionComponent = ({ state, dispatch const language = new Language(settings.language); // Content - const MessageSelectAction = language.text("Selecteer", "Select"); + const MessageSelectAction = language.key(localization.MessageSelectAction); // Selection const history = useLocation(); diff --git a/starsky/starsky/clientapp/src/components/organisms/menu-trash/menu-trash.tsx b/starsky/starsky/clientapp/src/components/organisms/menu-trash/menu-trash.tsx index 74ecea8109..2f0911f477 100644 --- a/starsky/starsky/clientapp/src/components/organisms/menu-trash/menu-trash.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/menu-trash/menu-trash.tsx @@ -4,6 +4,7 @@ import useGlobalSettings from "../../../hooks/use-global-settings"; import useHotKeys from "../../../hooks/use-keyboard/use-hotkeys"; import useLocation from "../../../hooks/use-location/use-location"; import { IArchiveProps } from "../../../interfaces/IArchiveProps"; +import localization from "../../../localization/localization.json"; import FetchPost from "../../../shared/fetch/fetch-post"; import { FileListCache } from "../../../shared/filelist-cache"; import { Language } from "../../../shared/language"; @@ -12,6 +13,8 @@ import { Select } from "../../../shared/select"; import { URLPath } from "../../../shared/url-path"; import { UrlQuery } from "../../../shared/url-query"; import HamburgerMenuToggle from "../../atoms/hamburger-menu-toggle/hamburger-menu-toggle"; +import MenuOptionModal from "../../atoms/menu-option-modal/menu-option-modal.tsx"; +import MenuOption from "../../atoms/menu-option/menu-option.tsx"; import MoreMenu from "../../atoms/more-menu/more-menu"; import Preloader from "../../atoms/preloader/preloader"; import MenuSearchBar from "../../molecules/menu-inline-search/menu-inline-search"; @@ -20,9 +23,6 @@ import { MenuOptionSelectionUndo } from "../../molecules/menu-option-selection-u import { MenuSelectCount } from "../../molecules/menu-select-count/menu-select-count"; import ModalForceDelete from "../modal-force-delete/modal-force-delete"; import NavContainer from "../nav-container/nav-container"; -import MenuOption from "../../atoms/menu-option/menu-option.tsx"; -import localization from "../../../localization/localization.json"; -import MenuOptionModal from "../../atoms/menu-option-modal/menu-option-modal.tsx"; interface IMenuTrashProps { state: IArchiveProps; @@ -34,7 +34,7 @@ const MenuTrash: React.FunctionComponent = ({ state, dispatch } const language = new Language(settings.language); // Content - const MessageSelectAction = language.text("Selecteer", "Select"); + const MessageSelectAction = language.key(localization.MessageSelectAction); const [hamburgerMenu, setHamburgerMenu] = React.useState(false); const [isLoading, setIsLoading] = React.useState(false); diff --git a/starsky/starsky/clientapp/src/components/organisms/modal-archive-mkdir/modal-archive-mkdir.tsx b/starsky/starsky/clientapp/src/components/organisms/modal-archive-mkdir/modal-archive-mkdir.tsx index 8a012dbab7..708ca5f1ba 100644 --- a/starsky/starsky/clientapp/src/components/organisms/modal-archive-mkdir/modal-archive-mkdir.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/modal-archive-mkdir/modal-archive-mkdir.tsx @@ -2,6 +2,7 @@ import { useState } from "react"; import { ArchiveAction } from "../../../contexts/archive-context"; import useGlobalSettings from "../../../hooks/use-global-settings"; import { IArchiveProps } from "../../../interfaces/IArchiveProps"; +import localization from "../../../localization/localization.json"; import { CastToInterface } from "../../../shared/cast-to-interface"; import FetchGet from "../../../shared/fetch/fetch-get"; import FetchPost from "../../../shared/fetch/fetch-post"; @@ -27,19 +28,10 @@ const ModalArchiveMkdir: React.FunctionComponent = ({ // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageFeatureName = language.text("Nieuwe map aanmaken", "Create new folder"); - const MessageNonValidDirectoryName = language.text( - "Controleer de naam, deze map kan niet zo worden aangemaakt", - "Check the name, this folder cannot be created in this way" - ); - const MessageGeneralMkdirCreateError = language.text( - "Er is misgegaan met het aanmaken van deze map", - "An error occurred while creating this folder" - ); - const MessageDirectoryExistError = language.text( - "De map bestaat al, probeer een andere naam", - "The folder already exists, try a different name" - ); + const MessageCreateNewFolderFeature = language.key(localization.MessageCreateNewFolderFeature); + const MessageNonValidDirectoryName = language.key(localization.MessageNonValidDirectoryName); + const MessageGeneralMkdirCreateError = language.key(localization.MessageGeneralMkdirCreateError); + const MessageDirectoryExistError = language.key(localization.MessageDirectoryExistError); // to show errors const useErrorHandler = (initialState: string | null) => { @@ -124,7 +116,7 @@ const ModalArchiveMkdir: React.FunctionComponent = ({ }} >
-
{MessageFeatureName}
+
{MessageCreateNewFolderFeature}
= ({ data-test="modal-archive-mkdir-btn-default" onClick={pushRenameChange} > - {isLoading ? "Loading..." : MessageFeatureName} + {isLoading ? "Loading..." : MessageCreateNewFolderFeature}
diff --git a/starsky/starsky/clientapp/src/components/organisms/modal-archive-rename/modal-archive-rename.tsx b/starsky/starsky/clientapp/src/components/organisms/modal-archive-rename/modal-archive-rename.tsx index 8122916938..5478f36579 100644 --- a/starsky/starsky/clientapp/src/components/organisms/modal-archive-rename/modal-archive-rename.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/modal-archive-rename/modal-archive-rename.tsx @@ -2,6 +2,7 @@ import { useState } from "react"; import { ArchiveAction } from "../../../contexts/archive-context"; import useGlobalSettings from "../../../hooks/use-global-settings"; import useLocation from "../../../hooks/use-location/use-location"; +import localization from "../../../localization/localization.json"; import FetchPost from "../../../shared/fetch/fetch-post"; import { FileExtensions } from "../../../shared/file-extensions"; import { FileListCache } from "../../../shared/filelist-cache"; @@ -21,15 +22,11 @@ const ModalArchiveRename: React.FunctionComponent = (pr // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageRenameFolder = language.text("Huidige mapnaam wijzigen", "Rename current folder"); - const MessageNonValidDirectoryName: string = language.text( - "Deze mapnaam is niet valide", - "Directory name is not valid" - ); - const MessageGeneralError: string = language.text( - "Er is iets misgegaan met de aanvraag, probeer het later opnieuw", - "Something went wrong with the request, please try again later" + const MessageRenameFolder = language.key(localization.MessageRenameCurrentFolder); + const MessageNonValidDirectoryName: string = language.key( + localization.MessageNonValidDirectoryName ); + const MessageGeneralError: string = language.key(localization.MessageErrorGenericFail); // to show errors const useErrorHandler = (initialState: string | null) => { diff --git a/starsky/starsky/clientapp/src/components/organisms/modal-archive-synchronize-manually/modal-archive-synchronize-manually.tsx b/starsky/starsky/clientapp/src/components/organisms/modal-archive-synchronize-manually/modal-archive-synchronize-manually.tsx index 7af03621bc..6cc1a0d4ac 100644 --- a/starsky/starsky/clientapp/src/components/organisms/modal-archive-synchronize-manually/modal-archive-synchronize-manually.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/modal-archive-synchronize-manually/modal-archive-synchronize-manually.tsx @@ -4,6 +4,7 @@ import useGlobalSettings from "../../../hooks/use-global-settings"; import useInterval from "../../../hooks/use-interval"; import useLocation from "../../../hooks/use-location/use-location"; import { IArchiveProps } from "../../../interfaces/IArchiveProps"; +import localization from "../../../localization/localization.json"; import { CastToInterface } from "../../../shared/cast-to-interface"; import FetchGet from "../../../shared/fetch/fetch-get"; import FetchPost from "../../../shared/fetch/fetch-post"; @@ -27,32 +28,13 @@ const ModalArchiveSynchronizeManually: React.FunctionComponent // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageNonValidExtension: string = language.text( - "Dit bestand kan zo niet worden weggeschreven", - "This file cannot be saved" + const MessageNonValidExtension = language.key(localization.MessageNonValidExtension); + const MessageChangeToDifferentExtension = language.key( + localization.MessageChangeToDifferentExtension ); - const MessageChangeToDifferentExtension = language.text( - "Let op! Je veranderd de extensie van het bestand, " + "deze kan hierdoor onleesbaar worden", - "Pay attention! You change the file extension, which can make it unreadable" - ); - const MessageGeneralError: string = language.text( - "Er is iets misgegaan met de aanvraag, probeer het later opnieuw", - "Something went wrong with the request, please try again later" - ); - const MessageRenameFileName = language.text("Bestandsnaam wijzigen", "Rename file name"); + const MessageRenameServerError = language.key(localization.MessageRenameServerError); + const MessageRenameFileName = language.key(localization.MessageRenameFileName); // Fallback for no context if (!state) { @@ -130,7 +124,7 @@ const ModalDetailviewRenameFile: React.FunctionComponent const result = await FetchPost(new UrlQuery().UrlDiskRename(), bodyParams.toString()); if (result.statusCode !== 200) { - setError(MessageGeneralError); + setError(MessageRenameServerError); // and renewable setIsLoading(false); setIsFormEnabled(true); diff --git a/starsky/starsky/clientapp/src/components/organisms/modal-display-options/modal-display-options.tsx b/starsky/starsky/clientapp/src/components/organisms/modal-display-options/modal-display-options.tsx index 7f8fccda4f..91e73c301d 100644 --- a/starsky/starsky/clientapp/src/components/organisms/modal-display-options/modal-display-options.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/modal-display-options/modal-display-options.tsx @@ -2,6 +2,7 @@ import React, { useEffect } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; import useLocation from "../../../hooks/use-location/use-location"; import { SortType } from "../../../interfaces/IArchive"; +import localization from "../../../localization/localization.json"; import { Language } from "../../../shared/language"; import { URLPath } from "../../../shared/url-path"; import Modal from "../../atoms/modal/modal"; @@ -17,13 +18,25 @@ const ModalDisplayOptions: React.FunctionComponent = // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageDisplayOptions = language.text("Weergave opties", "Display options"); - const MessageSwitchButtonCollectionsOff = language.text("Toon raw bestanden", "Show raw files"); - const MessageSwitchButtonCollectionsOn = language.text("Verberg raw bestanden", "Hide Raw files"); - const MessageSwitchButtonIsSingleItemOff = language.text("Alles inladen", "Load everything"); - const MessageSwitchButtonIsSingleItemOn = language.text("Klein inladen", "Small loading"); - const MessageSwitchButtonIsSocketOn = language.text("Realtime updates", "Realtime updates"); - const MessageSwitchButtonIsSocketOff = language.text("Ververs zelf", "Refresh yourself"); + const MessageDisplayOptions = language.key(localization.MessageDisplayOptions); + const MessageDisplayOptionsSwitchButtonCollectionsOff = language.key( + localization.MessageDisplayOptionsSwitchButtonCollectionsOff + ); + const MessageDisplayOptionsSwitchButtonCollectionsOn = language.key( + localization.MessageDisplayOptionsSwitchButtonCollectionsOn + ); + const MessageDisplayOptionsSwitchButtonIsSingleItemOff = language.key( + localization.MessageDisplayOptionsSwitchButtonIsSingleItemOff + ); + const MessageDisplayOptionsSwitchButtonIsSingleItemOn = language.key( + localization.MessageDisplayOptionsSwitchButtonIsSingleItemOn + ); + const MessageDisplayOptionsSwitchButtonIsSocketOn = language.key( + localization.MessageDisplayOptionsSwitchButtonIsSocketOn + ); + const MessageDisplayOptionsSwitchButtonIsSocketOff = language.key( + localization.MessageDisplayOptionsSwitchButtonIsSocketOff + ); const history = useLocation(); @@ -98,9 +111,9 @@ const ModalDisplayOptions: React.FunctionComponent = isOn={!collections} data-test="toggle-collections" isEnabled={true} - leftLabel={MessageSwitchButtonCollectionsOn} + leftLabel={MessageDisplayOptionsSwitchButtonCollectionsOn} onToggle={() => toggleCollections()} - rightLabel={MessageSwitchButtonCollectionsOff} + rightLabel={MessageDisplayOptionsSwitchButtonCollectionsOff} />
@@ -108,8 +121,8 @@ const ModalDisplayOptions: React.FunctionComponent = data-test="toggle-slow-files" isOn={isAlwaysLoadImage} isEnabled={true} - leftLabel={MessageSwitchButtonIsSingleItemOn} - rightLabel={MessageSwitchButtonIsSingleItemOff} + leftLabel={MessageDisplayOptionsSwitchButtonIsSingleItemOn} + rightLabel={MessageDisplayOptionsSwitchButtonIsSingleItemOff} onToggle={() => toggleSlowFiles()} />
@@ -118,9 +131,9 @@ const ModalDisplayOptions: React.FunctionComponent = isOn={isUseSockets} data-test="toggle-sockets" isEnabled={true} - leftLabel={MessageSwitchButtonIsSocketOn} + leftLabel={MessageDisplayOptionsSwitchButtonIsSocketOn} onToggle={() => toggleSockets()} - rightLabel={MessageSwitchButtonIsSocketOff} + rightLabel={MessageDisplayOptionsSwitchButtonIsSocketOff} />
diff --git a/starsky/starsky/clientapp/src/components/organisms/modal-download/modal-download.tsx b/starsky/starsky/clientapp/src/components/organisms/modal-download/modal-download.tsx index 5f6e908b2a..f55fb74f2d 100644 --- a/starsky/starsky/clientapp/src/components/organisms/modal-download/modal-download.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/modal-download/modal-download.tsx @@ -2,6 +2,7 @@ import React, { useEffect } from "react"; import useFetch from "../../../hooks/use-fetch"; import useGlobalSettings from "../../../hooks/use-global-settings"; import useInterval from "../../../hooks/use-interval"; +import localization from "../../../localization/localization.json"; import { ExportIntervalUpdate } from "../../../shared/export/export-interval-update"; import FetchPost from "../../../shared/fetch/fetch-post"; import { FileExtensions } from "../../../shared/file-extensions"; @@ -32,25 +33,13 @@ const ModalDownload: React.FunctionComponent = (props) => { // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageDownloadSelection = language.text("Download selectie", "Download selection"); - const MessageOriginalFile = language.text("Origineel bestand", "Original file"); - const MessageThumbnailFile = "Thumbnail"; - const MessageGenericExportFail = language.text( - "Er is iets misgegaan met exporteren", - "Something went wrong with exporting" - ); - const MessageExportReady = language.text( - "Het bestand {createZipKey} is klaar met exporteren.", - "The file {createZipKey} has finished exporting." - ); - const MessageDownloadAsZipArchive = language.text( - "Download als zip-archief", - "Download as a zip archive" - ); - const MessageOneMomentPlease = language.text( - "Een moment geduld alstublieft", - "One moment please" - ); + const MessageDownloadSelection = language.key(localization.MessageDownloadSelection); + const MessageOriginalFile = language.key(localization.MessageOriginalFile); + const MessageThumbnailFile = language.key(localization.MessageThumbnailFile); + const MessageGenericExportFail = language.key(localization.MessageGenericExportFail); + const MessageExportReady = language.key(localization.MessageExportReady); + const MessageDownloadAsZipArchive = language.key(localization.MessageDownloadAsZipArchive); + const MessageOneMomentPlease = language.key(localization.MessageOneMomentPlease); const [isProcessing, setIsProcessing] = React.useState(ProcessingState.default); const [createZipKey, setCreateZipKey] = React.useState(""); diff --git a/starsky/starsky/clientapp/src/components/organisms/modal-edit-date-time/modal-edit-datetime.tsx b/starsky/starsky/clientapp/src/components/organisms/modal-edit-date-time/modal-edit-datetime.tsx index 932b654468..6effd32c61 100644 --- a/starsky/starsky/clientapp/src/components/organisms/modal-edit-date-time/modal-edit-datetime.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/modal-edit-date-time/modal-edit-datetime.tsx @@ -1,6 +1,7 @@ import React, { useState } from "react"; import useGlobalSettings from "../../../hooks/use-global-settings"; import { IFileIndexItem } from "../../../interfaces/IFileIndexItem"; +import localization from "../../../localization/localization.json"; import { isValidDate, leftPad, @@ -28,15 +29,12 @@ const ModalEditDatetime: React.FunctionComponent = (props) // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageModalDatetime = language.text("Datum en tijd bewerken", "Edit date and time"); - const MessageYear = language.text("Jaar", "Year"); - const MessageMonth = language.text("Maand", "Month"); - const MessageDate = language.text("Dag", "Day"); - const MessageTime = language.text("Tijd", "Time"); - const MessageErrorDatetime = language.text( - "De datum en tijd zijn incorrect ingegeven", - "The date and time were entered incorrectly" - ); + const MessageModalDatetime = language.key(localization.MessageModalDatetime); + const MessageYear = language.key(localization.MessageYear); + const MessageMonth = language.key(localization.MessageMonth); + const MessageDate = language.key(localization.MessageDate); + const MessageTime = language.key(localization.MessageTime); + const MessageErrorDatetime = language.key(localization.MessageErrorDatetime); const isFormEnabled = true; diff --git a/starsky/starsky/clientapp/src/components/organisms/modal-force-delete/modal-force-delete.tsx b/starsky/starsky/clientapp/src/components/organisms/modal-force-delete/modal-force-delete.tsx index a7d05f92ad..a26f03ff1e 100644 --- a/starsky/starsky/clientapp/src/components/organisms/modal-force-delete/modal-force-delete.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/modal-force-delete/modal-force-delete.tsx @@ -2,6 +2,7 @@ import { ArchiveAction } from "../../../contexts/archive-context"; import useGlobalSettings from "../../../hooks/use-global-settings"; import useLocation from "../../../hooks/use-location/use-location"; import { IArchiveProps } from "../../../interfaces/IArchiveProps"; +import localization from "../../../localization/localization.json"; import FetchPost from "../../../shared/fetch/fetch-post"; import { Language } from "../../../shared/language"; import { ClearSearchCache } from "../../../shared/search/clear-search-cache"; @@ -32,12 +33,10 @@ const ModalForceDelete: React.FunctionComponent = ({ // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageDeleteIntroText = language.text( - "Weet je zeker dat je dit bestand wilt verwijderen van alle devices?", - "Are you sure you want to delete this file from all devices?" - ); - const MessageCancel = language.text("Annuleren", "Cancel"); - const MessageDeleteImmediately = language.text("Verwijder onmiddellijk", "Delete immediately"); + const MessageDeleteIntroText = language.key(localization.MessageDeleteIntroText); + const MessageCancel = language.key(localization.MessageCancel); + const MessageDeleteImmediately = language.key(localization.MessageDeleteImmediately); + const history = useLocation(); const undoSelection = () => new Select(select, setSelect, state, history).undoSelection(); diff --git a/starsky/starsky/clientapp/src/components/organisms/modal-publish/modal-publish.tsx b/starsky/starsky/clientapp/src/components/organisms/modal-publish/modal-publish.tsx index 8a754e8f9c..a5a248e5bf 100644 --- a/starsky/starsky/clientapp/src/components/organisms/modal-publish/modal-publish.tsx +++ b/starsky/starsky/clientapp/src/components/organisms/modal-publish/modal-publish.tsx @@ -2,6 +2,7 @@ import React, { useEffect } from "react"; import useFetch from "../../../hooks/use-fetch"; import useGlobalSettings from "../../../hooks/use-global-settings"; import useInterval from "../../../hooks/use-interval"; +import localization from "../../../localization/localization.json"; import { ExportIntervalUpdate } from "../../../shared/export/export-interval-update"; import { ProcessingState } from "../../../shared/export/processing-state"; import FetchGet from "../../../shared/fetch/fetch-get"; @@ -27,35 +28,17 @@ const ModalPublish: React.FunctionComponent = (props) => { // content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessagePublishSelection = language.text("Publiceer selectie", "Publish selection"); - const MessageGenericExportFail = language.text( - "Er is iets misgegaan met exporteren", - "Something went wrong with exporting" - ); - const MessageRetryExportFail = language.text("Probeer het opnieuw", "Retry this"); - - const MessageExportReady = language.text( - "Het bestand {createZipKey} is klaar met exporteren.", - "The file {createZipKey} has finished exporting." - ); - const MessageDownloadAsZipArchive = language.text( - "Download als zip-archief", - "Download as a zip archive" - ); - const MessageOneMomentPlease = language.text( - "Een moment geduld alstublieft", - "One moment please" - ); - const MessageItemName = language.text("Waar gaat het item over?", "What is the item about?"); - const MessageItemNameInUse = language.text( - "Deze naam is al in gebruik, kies een andere naam", - "This name is already in use, please choose another name" - ); - const MessagePublishProfileName = language.text("Profiel instelling", "Profile setting"); - - const MessagePublishProfileNamesErrored = language.text( - "Profiel instelling: {publishProfileNames} bevat bestand locatie fouten", - "Profile setting: {publishProfileNames} contains filepath errors" + const MessagePublishSelection = language.key(localization.MessagePublishSelection); + const MessageGenericExportFail = language.key(localization.MessageGenericExportFail); + const MessageRetryExportFail = language.key(localization.MessageRetryExportFail); + const MessageExportReady = language.key(localization.MessageExportReady); + const MessageDownloadAsZipArchive = language.key(localization.MessageDownloadAsZipArchive); + const MessageOneMomentPlease = language.key(localization.MessageOneMomentPlease); + const MessageItemName = language.key(localization.MessageItemName); + const MessageItemNameInUse = language.key(localization.MessageItemNameInUse); + const MessagePublishProfileName = language.key(localization.MessagePublishProfileName); + const MessagePublishProfileNamesErrored = language.key( + localization.MessagePublishProfileNamesErrored ); const [isProcessing, setIsProcessing] = React.useState(ProcessingState.default); diff --git a/starsky/starsky/clientapp/src/containers/account-register.tsx b/starsky/starsky/clientapp/src/containers/account-register.tsx index 453ec9fafd..a63462235b 100644 --- a/starsky/starsky/clientapp/src/containers/account-register.tsx +++ b/starsky/starsky/clientapp/src/containers/account-register.tsx @@ -23,37 +23,13 @@ const AccountRegister: FunctionComponent = () => { const MessageConfirmPassword = language.key(localization.MessageConfirmPassword); const MessageNoUsernamePassword = language.key(localization.MessageNoUsernamePassword); const MessageWrongFormatEmailAddress = language.key(localization.MessageWrongFormatEmailAddress); - const MessagePasswordToShort = language.text( - "Gebruik minimaal 8 tekens voor je wachtwoord", - "Use at least 8 characters for your password" - ); - const MessagePasswordNoMatch = language.text( - "Deze wachtwoorden komen niet overeen. Probeer het opnieuw", - "These passwords do not match. Please try again" - ); - const MessageConnection = language.text( - "Er is geen verbinding mogelijk, probeer het later opnieuw", - "No connection is possible, please try again later" - ); - const MessageRejectedBadRequest = language.text( - "Dit verzoek is afgewezen aangezien er niet voldaan is aan de beveiligingseisen (Error 400)", - "This request was rejected because the security requirements were not met (Error 400)" - ); - const MessageRegistrationTurnedOff = language.text( - "Registratie is uitgezet", - "Registration is turned off" - ); - const MessageSignInInstead = language.text("In plaats daarvan inloggen", "Sign in instead"); - - const MessageLegalCreateAccountHtml = language.text( - `Door het creëren van een account gaat u akkoord met de - Algemene Voorwaarden van Starsky. Raadpleeg en bekijk hier onze - Privacykennisgeving en onze - Cookieverklaring.`, - `By creating an account you agree to Starsky's Conditions of Use. - Please see our Privacy Notice and our - Cookies Notice ` - ); + const MessagePasswordToShort = language.key(localization.MessagePasswordToShort); + const MessagePasswordNoMatch = language.key(localization.MessagePasswordNoMatch); + const MessageConnection = language.key(localization.MessageConnection); + const MessageRejectedBadRequest = language.key(localization.MessageRejectedBadRequest); + const MessageRegistrationTurnedOff = language.key(localization.MessageRegistrationTurnedOff); + const MessageSignInInstead = language.key(localization.MessageSignInInstead); + const MessageLegalCreateAccountHtml = language.key(localization.MessageLegalCreateAccountHtml); const history = useLocation(); diff --git a/starsky/starsky/clientapp/src/containers/login.tsx b/starsky/starsky/clientapp/src/containers/login.tsx index 2c55d7775e..7c9e517887 100755 --- a/starsky/starsky/clientapp/src/containers/login.tsx +++ b/starsky/starsky/clientapp/src/containers/login.tsx @@ -4,6 +4,7 @@ import Preloader from "../components/atoms/preloader/preloader"; import useFetch from "../hooks/use-fetch"; import useGlobalSettings from "../hooks/use-global-settings"; import useLocation from "../hooks/use-location/use-location"; +import localization from "../localization/localization.json"; import { BrowserDetect } from "../shared/browser-detect"; import { DocumentTitle } from "../shared/document-title"; import FetchPost from "../shared/fetch/fetch-post"; @@ -30,40 +31,21 @@ export const Login: React.FC = () => { const language = new Language(settings.language); const MessageApplicationName = "Starsky"; - const MessageWrongUsernamePassword = language.text( - "Je gebruikersnaam of wachtwoord is niet juist. Probeer het opnieuw", - "Your username or password is incorrect. Try again" - ); - const MessageLockedOut = language.text( - "Je hebt te vaak geprobeerd in te loggen, probeer het over een uur nog een keer", - "You've tried to login too many times, please try again in an hour " - ); - - const MessageNoUsernamePassword = language.text( - "Voer een emailadres en een wachtwoord in", - "Enter an email address and password" - ); - const MessageWrongFormatEmailAddress = language.text( - "Controleer je email adres", - "Check your email address" - ); - const MessageUsername = language.text("E-mailadres", "E-mail address"); - const MessageConnection = language.text( - "Er is geen verbinding mogelijk, probeer het later opnieuw", - "No connection is possible, please try again later" - ); - const MessageDatabaseConnection = language.text( - "Er zijn problemen met de verbinding met de database. Controleer en pas de appsettings aan", - "There are database connection issues. Check and edit the appsettings" - ); - const LogoutWarning = language.text("Wil je uitloggen?", "Do you want to log out?"); - const MessageStayLoggedIn = language.text("Blijf ingelogd", "Stay logged in"); - const MessagePassword = language.text("Geef je wachtwoord op", "Enter your password"); - const MessageExamplePassword = language.text("superveilig", "supersafe"); - const MessageExampleUsername = "dont@mail.me"; - const MessageLogin = language.text("Inloggen", "Login"); - const MessageLogout = language.text("Uitloggen", "Logout"); - const MessageCreateAccount = language.text("Account maken", "Create account"); + const MessageWrongUsernamePassword = language.key(localization.MessageWrongUsernamePassword); + const MessageLockedOut = language.key(localization.MessageLockedOut); + const MessageNoUsernamePassword = language.key(localization.MessageNoUsernamePassword); + const MessageWrongFormatEmailAddress = language.key(localization.MessageWrongFormatEmailAddress); + const MessageUsername = language.key(localization.MessageUsername); + const MessageConnection = language.key(localization.MessageConnection); + const MessageDatabaseConnection = language.key(localization.MessageDatabaseConnection); + const LogoutWarning = language.key(localization.LogoutWarning); + const MessageStayLoggedIn = language.key(localization.MessageStayLoggedIn); + const MessagePassword = language.key(localization.MessagePassword); + const MessageExamplePassword = language.key(localization.MessageExamplePassword); + const MessageExampleUsername = language.key(localization.MessageExampleUsername); + const MessageLogin = language.key(localization.MessageLogin); + const MessageLogout = language.key(localization.MessageLogout); + const MessageCreateAccount = language.key(localization.MessageCreateAccount); // We don't want to login twice const [isLogin, setIsLogin] = React.useState(true); diff --git a/starsky/starsky/clientapp/src/containers/media-content.tsx b/starsky/starsky/clientapp/src/containers/media-content.tsx index 65d38b993f..6103fe9f3b 100644 --- a/starsky/starsky/clientapp/src/containers/media-content.tsx +++ b/starsky/starsky/clientapp/src/containers/media-content.tsx @@ -10,6 +10,7 @@ import useGlobalSettings from "../hooks/use-global-settings"; import useLocation from "../hooks/use-location/use-location"; import { IArchive } from "../interfaces/IArchive"; import { IDetailView, PageType } from "../interfaces/IDetailView"; +import localization from "../localization/localization.json"; import { NotFoundPage } from "../pages/not-found-page"; import { Language } from "../shared/language"; import { Login } from "./login"; @@ -27,10 +28,8 @@ const MediaContent: React.FC = () => { const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageConnectionRealtimeError = language.text( - "De verbinding is niet helemaal oké. We proberen het te herstellen", - "The connection is not quite right. We are trying to fix it" - ); + const MessageConnectionRealtimeError = language.key(localization.MessageConnectionRealtimeError); + const MessageApplicationFailed = language.key(localization.MessageApplicationFailed); console.log(`-----------------MediaContent ${pageType} (rendered again)-------------------`); @@ -38,7 +37,7 @@ const MediaContent: React.FC = () => { return ( <>
- The application has failed. Please reload it to try it again + {MessageApplicationFailed} ); } diff --git a/starsky/starsky/clientapp/src/containers/preferences/preferences.tsx b/starsky/starsky/clientapp/src/containers/preferences/preferences.tsx index f7b0dde01e..b5f9a2610a 100644 --- a/starsky/starsky/clientapp/src/containers/preferences/preferences.tsx +++ b/starsky/starsky/clientapp/src/containers/preferences/preferences.tsx @@ -3,12 +3,13 @@ import PreferencesAppSettings from "../../components/organisms/preferences-app-s import PreferencesPassword from "../../components/organisms/preferences-password/preferences-password"; import PreferencesUsername from "../../components/organisms/preferences-username/preferences-username"; import useGlobalSettings from "../../hooks/use-global-settings"; +import localization from "../../localization/localization.json"; import { Language } from "../../shared/language"; export const Preferences: React.FunctionComponent = () => { const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessagePreferences = language.text("Voorkeuren", "Preferences"); + const MessagePreferences = language.key(localization.MessagePreferences); return ( <> diff --git a/starsky/starsky/clientapp/src/containers/search.tsx b/starsky/starsky/clientapp/src/containers/search.tsx index 73edfe22ec..e6d706e84d 100644 --- a/starsky/starsky/clientapp/src/containers/search.tsx +++ b/starsky/starsky/clientapp/src/containers/search.tsx @@ -6,6 +6,7 @@ import ArchiveSidebar from "../components/organisms/archive-sidebar/archive-side import useGlobalSettings from "../hooks/use-global-settings"; import useLocation from "../hooks/use-location/use-location"; import { IArchiveProps } from "../interfaces/IArchiveProps"; +import localization from "../localization/localization.json"; import { Language } from "../shared/language"; import { URLPath } from "../shared/url-path"; import MenuMenuSearchContainer from "./menu-search-container/menu-search-container"; @@ -14,13 +15,10 @@ function Search(archive: Readonly) { // Content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageNumberOfResults = language.text("resultaten", "results"); - const MessageNoResult = language.text("Geen resultaat", "No result"); - const MessageTryOtherQuery = language.text( - "Probeer een andere zoekopdracht", - "Try another search query" - ); - const MessagePageNumberToken = language.text("Pagina {pageNumber} van ", "Page {pageNumber} of "); // space at end + const MessageNumberOfResults = language.key(localization.MessageNumberOfResults); + const MessageNoResult = language.key(localization.MessageNoResult); + const MessageTryOtherQuery = language.key(localization.MessageTryOtherQuery); + const MessagePageNumberToken = language.key(localization.MessagePageNumberToken); // space at end const history = useLocation(); diff --git a/starsky/starsky/clientapp/src/containers/trash.tsx b/starsky/starsky/clientapp/src/containers/trash.tsx index 332d07e878..9b9eee0e9c 100644 --- a/starsky/starsky/clientapp/src/containers/trash.tsx +++ b/starsky/starsky/clientapp/src/containers/trash.tsx @@ -7,6 +7,7 @@ import { ArchiveContext, defaultStateFallback } from "../contexts/archive-contex import useGlobalSettings from "../hooks/use-global-settings"; import useLocation from "../hooks/use-location/use-location"; import { IArchiveProps } from "../interfaces/IArchiveProps"; +import localization from "../localization/localization.json"; import { Language } from "../shared/language"; import { URLPath } from "../shared/url-path"; @@ -14,12 +15,10 @@ function Trash(archive: Readonly) { // Content const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageEmptyTrash = language.text( - "Er staat niets in de prullenmand", - "There is nothing in the trash" - ); - const MessageNumberOfResults = language.text("resultaten", "results"); - const MessageNoResult = language.text("Geen resultaat", "No result"); + + const MessageNumberOfResults = language.key(localization.MessageNumberOfResults); + const MessageNoResult = language.key(localization.MessageNoResult); + const MessageEmptyTrash = language.key(localization.MessageEmptyTrash); const history = useLocation(); diff --git a/starsky/starsky/clientapp/src/interfaces/ILanguageLocalization.ts b/starsky/starsky/clientapp/src/interfaces/ILanguageLocalization.ts new file mode 100644 index 0000000000..aa1c1418c1 --- /dev/null +++ b/starsky/starsky/clientapp/src/interfaces/ILanguageLocalization.ts @@ -0,0 +1,11 @@ +export interface ILanguageLocalization { + nl: string; + en: string; + de: string; +} + +export const LanguageLocalizationExample: ILanguageLocalization = { + nl: "Nederlands", + en: "English", + de: "Deutsch" +}; diff --git a/starsky/starsky/clientapp/src/localization/localization.json b/starsky/starsky/clientapp/src/localization/localization.json index 9e33b83c4f..58155973a0 100644 --- a/starsky/starsky/clientapp/src/localization/localization.json +++ b/starsky/starsky/clientapp/src/localization/localization.json @@ -189,6 +189,11 @@ "nl": "Alles selecteren", "de": "Alles auswählen" }, + "MessageAllName": { + "en": "All", + "nl": "Alles", + "de": "Alles" + }, "MessageSelectFurther": { "en": "Select further", "nl": "Verder selecteren", @@ -204,11 +209,6 @@ "nl": "Map maken", "de": "Ordner erstellen" }, - "MessageDisplayOptions": { - "en": "Display options", - "nl": "Weergave opties", - "de": "Anzeigeoptionen" - }, "MessageRenameDir": { "en": "Rename", "nl": "Naam wijzigen", @@ -244,6 +244,11 @@ "nl": "Deze video is niet gevonden", "de": "Dieses Video wurde nicht gefunden" }, + "MessageColorClassIsUpdated": { + "en": "Colorclass is updated", + "nl": "Colorclass is bijgewerkt", + "de": "Farbklasse wurde aktualisiert" + }, "ColorClassColour0": { "en": "Colorless", "nl": "Kleurloos", @@ -489,9 +494,509 @@ "nl": "Controleer je email adres", "de": "Überprüfen Sie Ihre E-Mail-Adresse" }, + "MessagePasswordToShort": { + "en": "Use at least 8 characters for your password", + "nl": "Gebruik minimaal 8 tekens voor je wachtwoord", + "de": "Verwenden Sie mindestens 8 Zeichen für Ihr Passwort" + }, + "MessageRejectedBadRequest": { + "en": "This request was rejected because the security requirements were not met (Error 400)", + "nl": "Dit verzoek is afgewezen aangezien er niet voldaan is aan de beveiligingseisen (Error 400)", + "de": "Dieses Anfrage wurde abgelehnt, weil die Sicherheitsanforderungen nicht erfüllt wurden (Fehler 400)" + }, + "MessageRegistrationTurnedOff": { + "en": "Registration is turned off", + "nl": "Registratie is uitgezet", + "de": "Die Registrierung ist deaktiviert" + }, + "MessageSignInInstead": { + "en": "Sign in instead", + "nl": "In plaats daarvan inloggen", + "de": "Stattdessen anmelden" + }, + "MessageLegalCreateAccountHtml": { + "en": "By creating an account you agree to Starsky's Conditions of Use. Please see our Privacy Notice and our Cookies Notice", + "nl": "Door het creëren van een account gaat u akkoord met de Algemene Voorwaarden van Starsky. Raadpleeg en bekijk hier onze Privacykennisgeving en onze Cookieverklaring.", + "de": "Durch das Erstellen eines Kontos stimmen Sie den Allgemeinen Geschäftsbedingungen von Starsky zu. Bitte beachten Sie unsere Datenschutzerklärung und unsere Cookie-Richtlinie." + }, + "MessageFieldMaxLength": { + "en": "The field below can have a maximum of {maxlength} characters", + "nl": "Het onderstaande veld mag maximaal {maxlength} tekens hebben", + "de": "Das Feld unten kann maximal {maxlength} Zeichen enthalten" + }, + "MessageWrongUsernamePassword": { + "en": "Your username or password is incorrect. Try again", + "nl": "Je gebruikersnaam of wachtwoord is niet juist. Probeer het opnieuw", + "de": "Ihr Benutzername oder Ihr Passwort ist falsch. Bitte versuchen Sie es erneut." + }, + "MessageLockedOut": { + "en": "You've tried to login too many times, please try again in an hour", + "nl": "Je hebt te vaak geprobeerd in te loggen, probeer het over een uur nog een keer", + "de": "Sie haben zu oft versucht, sich anzumelden. Bitte versuchen Sie es in einer Stunde erneut." + }, + "MessageConnection": { + "en": "No connection is possible, please try again later", + "nl": "Er is geen verbinding mogelijk, probeer het later opnieuw", + "de": "Es ist keine Verbindung möglich, bitte versuchen Sie es später erneut." + }, + "MessageDatabaseConnection": { + "en": "There are database connection issues. Check and edit the appsettings", + "nl": "Er zijn problemen met de verbinding met de database. Controleer en pas de appsettings aan", + "de": "Es gibt Probleme mit der Verbindung zur Datenbank. Überprüfen und bearbeiten Sie die App-Einstellungen." + }, + "LogoutWarning": { + "en": "Do you want to log out?", + "nl": "Wil je uitloggen?", + "de": "Möchten Sie sich abmelden?" + }, + "MessageStayLoggedIn": { + "en": "Stay logged in", + "nl": "Blijf ingelogd", + "de": "Angemeldet bleiben" + }, + "MessageLogin": { + "en": "Login", + "nl": "Inloggen", + "de": "Anmelden" + }, + "MessageCreateAccount": { + "en": "Create account", + "nl": "Account maken", + "de": "Konto erstellen" + }, + "MessageMore": { + "en": "More", + "nl": "Meer", + "de": "Mehr" + }, + "MessagePrevious": { + "en": "Previous", + "nl": "Vorige", + "de": "Vorherige" + }, + "MessageNext": { + "en": "Next", + "nl": "Volgende", + "de": "Nächste" + }, + "MessageAddName": { + "en": "Hinzufügen zu", + "nl": "Toevoegen", + "de": "Mehr" + }, + "MessageOverwriteName": { + "en": "Overwrite", + "nl": "Overschrijven", + "de": "Überschreiben" + }, + "MessageTitleName": { + "en": "Title", + "nl": "Titel", + "de": "Titel" + }, + "MessageInfoName": { + "en": "Info", + "nl": "Info", + "de": "Info" + }, + "MessageWriteErrorReadOnly": { + "en": "One or more files are read only. Only the files with write permissions have been updated.", + "nl": "Eén of meerdere bestanden zijn alleen lezen. Alleen de bestanden met schrijfrechten zijn geupdate.", + "de": "Eine oder mehrere Dateien sind schreibgeschützt. Es wurden nur die Dateien mit Schreibrechten aktualisiert." + }, + "MessageErrorNotFoundSourceMissingRunSync": { + "en": "One or more files are already gone. Only the files that are present are updated. Run a manual sync", + "nl": "Eén of meerdere bestanden zijn al verdwenen. Alleen de bestanden die wel aanwezig zijn geupdate. Draai een handmatige sync", + "de": "Eine oder mehrere Dateien sind bereits verschwunden. Es werden nur die vorhandenen Dateien aktualisiert. Führen Sie eine manuelle Synchronisierung durch" + }, + "MessageSearchAndReplaceNameLong": { + "en": "Search and replace", + "nl": "Zoeken en vervangen", + "de": "Suchen und ersetzen" + }, + "MessageSearchAndReplaceNameShort": { + "en": "Replace", + "nl": "Vervangen", + "de": "Ersetzen" + }, + "MessageModifyName": { + "en": "Modify", + "nl": "Wijzigen", + "de": "Ändern" + }, + "MessageForceSyncCurrentFolder": { + "en": "Synchronize current directory manually", + "nl": "Handmatig synchroniseren van huidige map", + "de": "Aktuelles Verzeichnis manuell synchronisieren" + }, + "MessageWhereToFindReleaseReleasesUrlTokenHtml": { + "en": " {releasesToken}", + "nl": " {releasesToken}", + "de": " {releasesToken}" + }, + "MessageWhereToFindReleaseReleasesUrlTokenContent": { + "en": "Go to the release overview", + "nl": "Ga naar het release overzicht", + "de": "Gehen Sie zur Release-Übersicht" + }, + "WhereToFindReleaseElectronApp": { + "en": "Go to the Help menu and then release overview", + "nl": "Ga naar het Help menu en dan release overzicht", + "de": "Gehen Sie zum Hilfemenü und dann zur Release-Übersicht" + }, + "MessageNewVersionUpdateToken": { + "en": "A new version is available {WhereToFindRelease}", + "nl": "Er is een nieuwe versie beschikbaar {WhereToFindRelease}", + "de": "Eine neue Version ist verfügbar {WhereToFindRelease}" + }, + "MessageHealthStatusCriticalErrorsWithTheFollowingComponents": { + "en": "There are critical errors in the following components:", + "nl": "Er zijn kritieke fouten in de volgende onderdelen:", + "de": "In den folgenden Komponenten liegen kritische Fehler vor:" + }, + "MessageNoPhotos": { + "en": "There are no pictures", + "nl": "Er zijn geen foto's", + "de": "Es gibt keine Bilder" + }, + "MessageFilesAdded": { + "en": "These files have been added", + "nl": "Deze bestanden zijn toegevoegd", + "de": "Diese Dateien wurden hinzugefügt" + }, + "MessageApplicationException": { + "en": "We have a disruption on the application right now", + "nl": "We hebben een op dit moment een verstoring op de applicatie", + "de": "Wir haben derzeit eine Störung bei der Anwendung" + }, + "MessageRefreshPageTryAgain": { + "en": "Please reload the application to try again", + "nl": "Herlaad de applicatie om het opnieuw te proberen", + "de": "Laden Sie die Anwendung herunter, um die Option zu testen" + }, + "MessagePublishSelection": { + "en": "Publish selection", + "nl": "Publiceer selectie", + "de": "Auswahl veröffentlichen" + }, + "MessageGenericExportFail": { + "en": "Something went wrong with exporting", + "nl": "Er is iets misgegaan met exporteren", + "de": "Beim Exportieren ist ein Fehler aufgetreten" + }, + "MessageRetryExportFail": { + "en": "Retry this", + "nl": "Probeer het opnieuw", + "de": "Dies erneut versuchen" + }, + "MessageExportReady": { + "en": "The file {createZipKey} has finished exporting.", + "nl": "Het bestand {createZipKey} is klaar met exporteren.", + "de": "Die Datei {createZipKey} wurde erfolgreich exportiert." + }, + "MessageDownloadAsZipArchive": { + "en": "Download as a zip archive", + "nl": "Download als zip-archief", + "de": "Als ZIP-Archiv herunterladen" + }, + "MessageOneMomentPlease": { + "en": "One moment please", + "nl": "Een moment geduld alstublieft", + "de": "Einen Moment bitte" + }, + "MessageItemName": { + "en": "What is the item about?", + "nl": "Waar gaat het item over?", + "de": "Worum geht es bei dem Element?" + }, + "MessageItemNameInUse": { + "en": "This name is already in use, please choose another name", + "nl": "Deze naam is al in gebruik, kies een andere naam", + "de": "Dieser Name wird bereits verwendet. Bitte wählen Sie einen anderen Namen" + }, + "MessagePublishProfileName": { + "en": "Profile setting", + "nl": "Profiel instelling", + "de": "Profil-Einstellung" + }, + "MessagePublishProfileNamesErrored": { + "en": "Profile setting: {publishProfileNames} contains filepath errors", + "nl": "Profiel instelling: {publishProfileNames} bevat bestand locatie fouten", + "de": "Profil-Einstellung: {publishProfileNames} enthält Dateipfadfehler" + }, + "MessageSelectionName": { + "en": "Selection", + "nl": "Selectie", + "de": "Auswahl" + }, + "MessageReadOnlyFolder": { + "en": "Read only folder", + "nl": "Alleen lezen map", + "de": "Nur-Lese-Ordner" + }, + "MessageUpdateLabels": { + "en": "Update labels", + "nl": "Labels wijzigingen", + "de": "Etiketten aktualisieren" + }, + "MessageColorClassification": { + "en": "Color Classification", + "nl": "Kleur-Classificatie", + "de": "Farbklassifizierung" + }, + "MessageDateTimeAgoEdited": { + "en": "ago edited", + "nl": "geleden bewerkt", + "de": "vorher bearbeitet" + }, + "MessageDateLessThan1Minute": { + "en": "less than one minute", + "nl": "minder dan één minuut", + "de": "weniger als eine Minute" + }, + "MessageDateMinutes": { + "en": "minutes", + "nl": "minuten", + "de": "Minuten" + }, + "MessageDateHour": { + "en": "hour", + "nl": "uur", + "de": "Stunde" + }, + "MessageCopiedLabels": { + "en": "The labels have been copied", + "nl": "De labels zijn gekopieerd", + "de": "Die Labels wurden kopiert" + }, + "MessagePasteLabels": { + "en": "The labels have been overwritten", + "nl": "De labels zijn overschreven", + "de": "Die Labels wurden überschrieben" + }, + "MessageCreationDate": { + "en": "Creation date", + "nl": "Aanmaakdatum", + "de": "Erstellungsdatum" + }, + "MessageCreationDateIsAtUnknownTime": { + "en": "is at an unknown time", + "nl": "is op een onbekend moment", + "de": "ist zu einem unbekannten Zeitpunkt" + }, + "MessageNounNameless": { + "en": "Unnamed", + "nl": "Naamloze", + "de": "Unbenannt" + }, + "MessageNounNone": { + "en": "Not any", + "nl": "Geen enkele", + "de": "Nicht eine" + }, + "MessageLocation": { + "en": "location", + "nl": "locatie", + "de": "Lokalisierung" + }, + "MessageCreateNewFolderFeature": { + "en": "Create new folder", + "nl": "Nieuwe map aanmaken", + "de": "Neuen Ordner erstellen" + }, + "MessageNonValidDirectoryName": { + "en": "Check the name, this folder cannot be created in this way", + "nl": "Controleer de naam, deze map kan niet zo worden aangemaakt", + "de": "Überprüfen Sie den Namen, dieser Ordner kann nicht auf diese Weise erstellt werden" + }, + "MessageGeneralMkdirCreateError": { + "en": "An error occurred while creating this folder", + "nl": "Er is misgegaan met het aanmaken van deze map", + "de": "Beim Erstellen dieses Ordners ist ein Fehler aufgetreten" + }, + "MessageDirectoryExistError": { + "en": "The folder already exists, try a different name", + "nl": "De map bestaat al, probeer een andere naam", + "de": "Der Ordner existiert bereits. Versuchen Sie einen anderen Namen" + }, + "MessageRenameCurrentFolder": { + "en": "Rename current folder", + "nl": "Huidige mapnaam wijzigen", + "de": "Aktuellen Ordner umbenennen" + }, + "MessageRemoveCache": { + "en": "Refresh cache of current directory", + "nl": "Verwijder cache van huidige map", + "de": "Aktualisieren Sie den Cache des aktuellen Verzeichnisses" + }, + "MessageGeoSync": { + "en": "Automatically add geolocation", + "nl": "Voeg geolocatie automatisch toe", + "de": "Geolocation automatisch hinzufügen" + }, + "MessageGeoSyncExplainer": { + "en": "The location is derived from a gpx file located in the current folder and based on the location place names are appended to the images", + "nl": "De locatie wordt afgeleid van een gpx bestand die zich in de huidige map bevind en op basis van de locatie worden er plaatsnamen bij de afbeeldingen gevoegd", + "de": "Der Ort wird aus einer in dem aktuellen Ordner befindlichen gpx-Datei abgeleitet und basierend auf dem Ort werden Ortsnamen den Bildern hinzugefügt" + }, + "MessageManualThumbnailSync": { + "en": "Generate thumbnail images", + "nl": "Thumbnail afbeeldingen generen", + "de": "Miniaturbilder generieren" + }, + "MessageManualThumbnailSyncExplainer": { + "en": "This action generate on the background lots of thumbnail images, this does impact the performance", + "nl": "Deze actie genereert op de achtergrond veel miniatuurafbeeldingen, dit heeft invloed op de prestaties", + "de": "Diese Aktion generiert im Hintergrund viele Miniaturbilder, was sich auf die Leistung auswirkt" + }, + "MessageNonValidExtension": { + "en": "This file cannot be saved", + "nl": "Dit bestand kan zo niet worden weggeschreven", + "de": "Diese Datei kann nicht gespeichert werden" + }, + "MessageChangeToDifferentExtension": { + "en": "Pay attention! You change the file extension, which can make it unreadable", + "nl": "Let op! Je veranderd de extensie van het bestand, deze kan hierdoor onleesbaar worden", + "de": "Achtung! Sie ändern die Dateierweiterung, was dazu führen kann, dass sie nicht lesbar wird" + }, + "MessageRenameServerError": { + "en": "Something went wrong with the request, please try again later", + "nl": "Er is iets misgegaan met de aanvraag, probeer het later opnieuw", + "de": "Bei der Anfrage ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut" + }, + "MessageDisplayOptions": { + "en": "Display options", + "nl": "Weergave opties", + "de": "Anzeigeoptionen" + }, + "MessageDisplayOptionsSwitchButtonCollectionsOff": { + "en": "Show raw files", + "nl": "Toon raw bestanden", + "de": "Rohdateien anzeigen" + }, + "MessageDisplayOptionsSwitchButtonCollectionsOn": { + "en": "Hide Raw files", + "nl": "Verberg raw bestanden", + "de": "Rohdateien ausblenden" + }, + "MessageDisplayOptionsSwitchButtonIsSingleItemOff": { + "en": "Load everything", + "nl": "Alles inladen", + "de": "Alles laden" + }, + "MessageDisplayOptionsSwitchButtonIsSingleItemOn": { + "en": "Small loading", + "nl": "Klein inladen", + "de": "Kleine Ladung" + }, + "MessageDisplayOptionsSwitchButtonIsSocketOn": { + "en": "Realtime updates", + "nl": "Realtime updates", + "de": "Echtzeitupdates" + }, + "MessageDisplayOptionsSwitchButtonIsSocketOff": { + "en": "Refresh yourself", + "nl": "Ververs zelf", + "de": "Selbst aktualisieren" + }, + "MessageDownloadSelection": { + "en": "Download selection", + "nl": "Download selectie", + "de": "Auswahl herunterladen" + }, + "MessageOriginalFile": { + "en": "Original file", + "nl": "Origineel bestand", + "de": "Originaldatei" + }, + "MessageThumbnailFile": { + "en": "Thumbnail", + "nl": "Thumbnail", + "de": "Vorschaubild" + }, + "MessageModalDatetime": { + "en": "Edit date and time", + "nl": "Datum en tijd bewerken", + "de": "Datum und Uhrzeit bearbeiten" + }, + "MessageYear": { + "en": "Year", + "nl": "Jaar", + "de": "Jahr" + }, + "MessageMonth": { + "en": "Month", + "nl": "Maand", + "de": "Monat" + }, + "MessageDate": { + "en": "Day", + "nl": "Dag", + "de": "Tag" + }, + "MessageTime": { + "en": "Time", + "nl": "Tijd", + "de": "Zeit" + }, + "MessageErrorDatetime": { + "en": "The date and time were entered incorrectly", + "nl": "De datum en tijd zijn incorrect ingegeven", + "de": "Das Datum und die Uhrzeit wurden falsch eingegeben" + }, + "MessageDeleteIntroText": { + "en": "Are you sure you want to delete this file from all devices?", + "nl": "Weet je zeker dat je dit bestand wilt verwijderen van alle devices?", + "de": "Möchten Sie diese Datei wirklich von allen Geräten löschen?" + }, + "MessageConnectionRealtimeError": { + "en": "The connection is not quite right. We are trying to fix it", + "nl": "De verbinding is niet helemaal oké. We proberen het te herstellen", + "de": "Die Verbindung stimmt nicht ganz. Wir versuchen es zu beheben" + }, + "MessageApplicationFailed": { + "en": "The application has failed. Please reload it to try it again", + "nl": "De verbinding is niet helemaal oké. Probeer te herladen", + "de": "Die Verbindung stimmt nicht ganz. Wir versuchen es zu beheben" + }, + "MessageNumberOfResults": { + "en": "results", + "nl": "resultaten", + "de": "Ergebnisse" + }, + "MessageNoResult": { + "en": "No result", + "nl": "Geen resultaat", + "de": "Kein Ergebnis" + }, + "MessageTryOtherQuery": { + "en": "Try another search query", + "nl": "Probeer een andere zoekopdracht", + "de": "Versuchen Sie eine andere Suchanfrage" + }, + "MessagePageNumberToken": { + "en": "Page {pageNumber} of ", + "nl": "Pagina {pageNumber} van ", + "de": "Seite {pageNumber} von " + }, + "MessageEmptyTrash": { + "en": "There is nothing in the trash", + "nl": "Er staat niets in de prullenmand", + "de": "Es befindet sich nichts im Papierkorb" + }, + "MessageNotFound": { + "en": "Not Found", + "nl": "Oeps niet gevonden", + "de": "Nicht gefunden" + }, + "MessageGoToHome": { + "en": "Go to the homepage", + "nl": "Ga naar de homepagina", + "de": "Gehe zur Startseite" + }, "temp1": { - "en": "", - "nl": "", - "de": "" + "en": "More", + "nl": "Meer", + "de": "Mehr" } } diff --git a/starsky/starsky/clientapp/src/pages/not-found-page.tsx b/starsky/starsky/clientapp/src/pages/not-found-page.tsx index cb1acab0f4..575e5b0b45 100644 --- a/starsky/starsky/clientapp/src/pages/not-found-page.tsx +++ b/starsky/starsky/clientapp/src/pages/not-found-page.tsx @@ -2,6 +2,7 @@ import { FunctionComponent } from "react"; import Link from "../components/atoms/link/link"; import MenuDefault from "../components/organisms/menu-default/menu-default"; import useGlobalSettings from "../hooks/use-global-settings"; +import localization from "../localization/localization.json"; import { Language } from "../shared/language"; import { UrlQuery } from "../shared/url-query"; @@ -10,8 +11,8 @@ export const NotFoundPage: FunctionComponent = () => { const settings = useGlobalSettings(); const language = new Language(settings.language); - const MessageNotFound = language.text("Oeps niet gevonden", "Not Found"); - const MessageGoToHome = language.text("Ga naar de homepagina", "Go to the homepage"); + const MessageNotFound = language.key(localization.MessageNotFound); + const MessageGoToHome = language.key(localization.MessageGoToHome); return (
diff --git a/starsky/starsky/clientapp/src/shared/language.spec.ts b/starsky/starsky/clientapp/src/shared/language.spec.ts index 4e2870037a..baeafb7b7b 100644 --- a/starsky/starsky/clientapp/src/shared/language.spec.ts +++ b/starsky/starsky/clientapp/src/shared/language.spec.ts @@ -5,11 +5,11 @@ describe("keyboard", () => { describe("text", () => { it("get different content (dutch)", () => { - const result = language.text("dutch", "english"); + const result = language.text("dutch", "english", "deutsch"); expect(result).toBe("dutch"); }); it("get different content (english)", () => { - const result = new Language(SupportedLanguages.en).text("dutch", "english"); + const result = new Language(SupportedLanguages.en).text("dutch", "english", "deutsch"); expect(result).toBe("english"); }); }); @@ -18,17 +18,51 @@ describe("keyboard", () => { it("get different content (dutch)", () => { const result = language.key({ nl: "dutch", - en: "english" + en: "english", + de: "deutsch" }); expect(result).toBe("dutch"); }); it("get different content (english)", () => { const result = new Language(SupportedLanguages.en).key({ nl: "dutch", - en: "english" + en: "english", + de: "deutsch" }); expect(result).toBe("english"); }); + + it("replace keys - english", () => { + const data = { + nl: "Het onderstaande veld mag maximaal {maxlength} tekens hebben", + en: "The field below can have a maximum of {maxlength} characters", + de: "Das Feld unten kann maximal {maxlength} Zeichen enthalten" + }; + const maxlength = 14; + + const result = new Language(SupportedLanguages.en).key( + data, + ["{maxlength}"], + [maxlength.toString()] + ); + expect(result).toBe("The field below can have a maximum of 14 characters"); + }); + + it("replace keys - german", () => { + const data = { + nl: "Het onderstaande veld mag maximaal {maxlength} tekens hebben", + en: "The field below can have a maximum of {maxlength} characters", + de: "Das Feld unten kann maximal {maxlength} Zeichen enthalten" + }; + const maxlength = 14; + + const result = new Language(SupportedLanguages.de).key( + data, + ["{maxlength}"], + [maxlength.toString()] + ); + expect(result).toBe("Das Feld unten kann maximal 14 Zeichen enthalten"); + }); }); describe("token", () => { diff --git a/starsky/starsky/clientapp/src/shared/language.ts b/starsky/starsky/clientapp/src/shared/language.ts index ccbbb54b07..d1dc2f6d0e 100644 --- a/starsky/starsky/clientapp/src/shared/language.ts +++ b/starsky/starsky/clientapp/src/shared/language.ts @@ -1,6 +1,9 @@ +import { ILanguageLocalization } from "../interfaces/ILanguageLocalization"; + export enum SupportedLanguages { nl = "nl", - en = "en" + en = "en", + de = "de" } export class Language { @@ -11,25 +14,30 @@ export class Language { this.selectedLanguage = selectedLanguage; } - private selectedLanguage: SupportedLanguages; + private readonly selectedLanguage: SupportedLanguages; /** * WIP - * @param key * @returns + * @param content */ - public key(content: { en: string; nl: string }): string { - return this.text(content.nl, content.en); + public key(content: ILanguageLocalization, token?: string[], dynamicValue?: string[]): string { + const text = this.text(content.nl, content.en, content.de); + if (!token || !dynamicValue) { + return text; + } + return this.token(text, token, dynamicValue); } /** * Get the right content based on the language * Map used to be Map and nl = "nl" as any */ - public text(nl: string, en: string): string { + public text(nl: string, en: string, de: string): string { const selectedLanguageMap = new Map([ [SupportedLanguages.nl, nl], - [SupportedLanguages.en, en] + [SupportedLanguages.en, en], + [SupportedLanguages.de, de] ]); const content = selectedLanguageMap.get(this.selectedLanguage); diff --git a/starsky/starsky/clientapp/vite.config.ts b/starsky/starsky/clientapp/vite.config.ts index 6233d54087..6f5e3cebf5 100644 --- a/starsky/starsky/clientapp/vite.config.ts +++ b/starsky/starsky/clientapp/vite.config.ts @@ -9,7 +9,7 @@ export default defineConfig({ outDir: "build", assetsDir: "assets", assetsInlineLimit: 0, - chunkSizeWarningLimit: 600 + chunkSizeWarningLimit: 650 }, optimizeDeps: { include: ["leaflet", "core-js", "react", "react-dom", "react-router-dom"]