diff --git a/docker/docker-compose/Dockerfile b/docker/docker-compose/Dockerfile index 0da7d1979..3aac40cf9 100644 --- a/docker/docker-compose/Dockerfile +++ b/docker/docker-compose/Dockerfile @@ -11,6 +11,7 @@ RUN apk update \ iputils \ net-tools \ mc \ + nano \ wget CMD tail -f /dev/null \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 770115765..8e6d0e2a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "date-fns": "^4.1.0", "deepl-node": "^1.15.0", "diff": "^7.0.0", - "dompurify": "^3.2.1", + "dompurify": "^3.2.4", "easyqrcodejs": "^4.4.13", "file-saver": "^2.0.5", "i18n-iso-countries": "^7.13.0", @@ -6393,9 +6393,10 @@ } }, "node_modules/dompurify": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.1.tgz", - "integrity": "sha512-NBHEsc0/kzRYQd+AY6HR6B/IgsqzBABrqJbpCDQII/OK6h7B7LXzweZTDsqSW2LkTRpoxf18YUP+YjGySk6B3w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", + "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" } @@ -6450,10 +6451,11 @@ "integrity": "sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==" }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", diff --git a/package.json b/package.json index 828f6209b..28b02ab3b 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "date-fns": "^4.1.0", "deepl-node": "^1.15.0", "diff": "^7.0.0", - "dompurify": "^3.2.1", + "dompurify": "^3.2.4", "easyqrcodejs": "^4.4.13", "file-saver": "^2.0.5", "i18n-iso-countries": "^7.13.0", diff --git a/react/assets/forus-webshop/scss/_common/sections/blocks/block-lang-control.scss b/react/assets/forus-webshop/scss/_common/sections/blocks/block-lang-control.scss index fa9c48bda..5782ec536 100644 --- a/react/assets/forus-webshop/scss/_common/sections/blocks/block-lang-control.scss +++ b/react/assets/forus-webshop/scss/_common/sections/blocks/block-lang-control.scss @@ -35,6 +35,7 @@ background: #fff; border: 1px solid var(--border-color); border-radius: var(--border-radius); + box-shadow: var(--box-shadow); z-index: 2; width: 230px; max-width: 90vw; diff --git a/react/assets/forus-webshop/scss/_common/sections/blocks/block-mobile-menu.scss b/react/assets/forus-webshop/scss/_common/sections/blocks/block-mobile-menu.scss index d5e13c06d..b5acde663 100644 --- a/react/assets/forus-webshop/scss/_common/sections/blocks/block-mobile-menu.scss +++ b/react/assets/forus-webshop/scss/_common/sections/blocks/block-mobile-menu.scss @@ -4,13 +4,13 @@ $footer_base_font: 'Open Sans', arial, sans-serif; --item-height: 44px; --item-line-height: 18px; position: fixed; - top: 50px; + top: 68px; bottom: 0; z-index: 10; width: 100%; transition: transform 0.2s; background: #fff; - box-shadow: 0px -1px 0px 0px #E5E5E5 inset; + box-shadow: 0px -1px 0px 0px #e5e5e5 inset; border-top: 1px solid var(--border-color); overflow: auto; @@ -20,7 +20,7 @@ $footer_base_font: 'Open Sans', arial, sans-serif; .mobile-menu-group-header { display: flex; padding: 16px 20px 16px 15px; - background: #FBFBFB; + background: #fbfbfb; border-top: 1px solid transparent; border-bottom: 1px solid var(--border-color); color: #222222; @@ -33,17 +33,117 @@ $footer_base_font: 'Open Sans', arial, sans-serif; } } + .mobile-menu-languages { + .mobile-menu-languages-header { + display: flex; + padding: 16px 10px 16px 15px; + background: #fbfbfb; + border-top: 1px solid transparent; + border-bottom: 1px solid var(--border-color); + color: #282b39; + font: 600 14px/20px var(--base-font); + outline-offset: -2px !important; + gap: 5px; + + .mobile-menu-languages-header-icon { + display: flex; + flex: 0 0 auto; + margin-left: -2px; + + .mdi { + font-size: 18px; + color: #848484; + } + } + + .mobile-menu-languages-header-name { + flex: 1 1 auto; + display: flex; + gap: 3px; + + .mobile-menu-languages-header-name-prefix { + color: #282b39; + transition: 0.4s color; + } + } + + .mobile-menu-languages-header-toggle { + display: flex; + justify-content: center; + flex: 0 0 30px; + align-items: center; + + .mdi { + height: 20px; + line-height: 20px; + display: block; + width: 30px; + font-size: 28px; + color: #9e9e9e; + } + } + + &.mobile-menu-languages-header-active { + .mobile-menu-languages-header-toggle { + .mdi { + color: #282b39; + } + } + + .mobile-menu-languages-header-name { + .mobile-menu-languages-header-name-prefix { + color: #646464; + } + } + } + } + + .mobile-menu-item-language { + display: flex; + flex-direction: row; + gap: 8px; + color: #282b39; + align-items: center; + justify-content: flex-start; + font: 600 14px / var(--item-line-height) var(--base-font); + border-bottom: 1px solid var(--border-color); + padding: calc((var(--item-height) - var(--item-line-height)) / 2) 15px; + outline-offset: -2px !important; + + .mobile-menu-item-language-separator { + width: 1px; + height: 8px; + background: var(--border-color); + } + + .mobile-menu-item-language-name { + flex: 1 1 auto; + } + + .mobile-menu-item-language-check { + flex: 0 0 20px; + font-size: 18px; + line-height: var(--item-line-height); + height: var(--item-line-height); + } + + &.mobile-menu-item-language-active { + color: #000; + } + } + } + .mobile-menu-items { width: 100%; overflow: scroll; - + .mobile-menu-item { - font: 600 14px/var(--item-line-height) var(--base-font); + font: 600 14px / var(--item-line-height) var(--base-font); border-bottom: 1px solid var(--border-color); padding: calc(calc(var(--item-height) - var(--item-line-height)) / 2) 15px; display: flex; outline-offset: -2px !important; - + .mobile-menu-item-icon { font-size: 22px; line-height: var(--item-line-height); @@ -71,21 +171,21 @@ $footer_base_font: 'Open Sans', arial, sans-serif; background-color: var(--btn-auth-bg); border: solid 1px var(--btn-auth-border); color: var(--tc-auth-btn); - + .mdi { color: var(--tc-auth-btn); } - + &:hover { border: solid 1px var(--btn-auth-border); - + .mdi { color: var(--tc-auth-btn); } } } } - + &.active { color: var(--color-primary); @@ -95,14 +195,15 @@ $footer_base_font: 'Open Sans', arial, sans-serif; &:after { position: absolute; - right: 20px; - content: "\F012C"; - font: normal normal normal 24px/1 "Material Design Icons"; + right: 15px; + content: '\F012C'; + font: normal normal normal 24px/1 'Material Design Icons'; font-size: 18px; - color: #282B39; + color: #282b39; + width: 20px; } } - + &:hover { color: var(--color-primary); } @@ -117,10 +218,10 @@ $footer_base_font: 'Open Sans', arial, sans-serif; .mobile-menu-items { .mobile-menu-item:not(.active) { .mobile-menu-item-icon { - color: #CDCED2; + color: #cdced2; } } } } } -} \ No newline at end of file +} diff --git a/react/assets/forus-webshop/scss/_common/sections/blocks/block-navbar-mobile.scss b/react/assets/forus-webshop/scss/_common/sections/blocks/block-navbar-mobile.scss index 65f6b121b..6698a0c73 100644 --- a/react/assets/forus-webshop/scss/_common/sections/blocks/block-navbar-mobile.scss +++ b/react/assets/forus-webshop/scss/_common/sections/blocks/block-navbar-mobile.scss @@ -10,33 +10,42 @@ align-items: center; & > .navbar-mobile-auth-buttons { - padding-top: 5px; + padding: 10px; } } .navbar-mobile-button { flex: 0 0 60px; - height: 50px; + height: 68px; display: flex; flex-direction: column; justify-content: center; align-items: center; - font: 600 9px / 14px var(--base-font); + font: 500 12px / 14px var(--base-font); outline-offset: -2px !important; border-radius: 6px; gap: 2px; .navbar-mobile-button-icon { - font-size: 16px; + font-size: 26px; + line-height: 26px; + } + + &.active { + font-weight: 700; } } .navbar-mobile-logo { display: flex; - height: 30px; flex: 1 1 auto; flex-direction: row; justify-content: center; + + img { + max-width: 140px; + max-height: 36px; + } } .navbar-mobile-lang { @@ -60,8 +69,8 @@ gap: 10px; .navbar-mobile-auth-button { - padding-top: 7px; - padding-bottom: 7px; + padding-top: 9px; + padding-bottom: 9px; margin: 0 0; flex: 0 0 calc(50% - 5px); box-shadow: none; diff --git a/react/src/dashboard/components/pages/fund-provider/FundProvider.tsx b/react/src/dashboard/components/pages/fund-provider/FundProvider.tsx index 2eb7bf791..b1f63f2b1 100644 --- a/react/src/dashboard/components/pages/fund-provider/FundProvider.tsx +++ b/react/src/dashboard/components/pages/fund-provider/FundProvider.tsx @@ -130,7 +130,7 @@ export default function FundProvider() {
- Per transactie betaalt u 0,29 cent (excl. btw) + Per transactie betaalt u 0,32 cent (excl. btw)
@@ -164,7 +164,7 @@ export default function FundProvider() {
- Wij gebruiken uitsluitend Ideal. Per transactie betaalt u 0,29 cent (excl. btw). + Wij gebruiken uitsluitend Ideal. Per transactie betaalt u 0,32 cent (excl. btw).
diff --git a/react/src/dashboard/components/pages/identities/Identities.tsx b/react/src/dashboard/components/pages/identities/Identities.tsx index f5ee7a126..849daa74d 100644 --- a/react/src/dashboard/components/pages/identities/Identities.tsx +++ b/react/src/dashboard/components/pages/identities/Identities.tsx @@ -25,6 +25,7 @@ import { NumberParam, StringParam } from 'use-query-params'; import TableDateTime from '../../elements/tables/elements/TableDateTime'; import TableEmptyValue from '../../elements/table-empty-value/TableEmptyValue'; import TableDateOnly from '../../elements/tables/elements/TableDateOnly'; +import useIdentityExportService from '../../../services/exports/useIdentityExportService'; export default function Identities() { const translate = useTranslate(); @@ -34,6 +35,7 @@ export default function Identities() { const activeOrganization = useActiveOrganization(); const fundService = useFundService(); + const identityExportService = useIdentityExportService(); const sponsorIdentitiesService = useSponsorIdentitiesService(); const [loading, setLoading] = useState(false); @@ -75,11 +77,21 @@ export default function Identities() { }, ); - const { headElement, configsElement } = useConfigurableTable(sponsorIdentitiesService.getColumns(), { - filter: filter, - sortable: false, - hasTooltips: true, - }); + const { headElement, configsElement } = useConfigurableTable( + sponsorIdentitiesService.getColumns(activeOrganization), + { filter: filter, sortable: false, hasTooltips: true }, + ); + + const { resetFilters: resetFilters, setShow } = filter; + + const exportIdentities = useCallback(() => { + setShow(false); + + identityExportService.exportData(activeOrganization.id, { + ...filter.activeValues, + per_page: null, + }); + }, [activeOrganization.id, filter.activeValues, setShow, identityExportService]); const fetchFunds = useCallback(() => { setProgress(0); @@ -108,8 +120,6 @@ export default function Identities() { [activeOrganization.id, setProgress, sponsorIdentitiesService, pushApiError], ); - const { resetFilters: resetFilters } = filter; - useEffect(() => { fetchIdentities(filterValuesActive); }, [fetchIdentities, filterValuesActive]); @@ -175,6 +185,16 @@ export default function Identities() { placeholder={translate('payouts.labels.search')} /> + +
+ +
@@ -201,29 +221,65 @@ export default function Identities() { className={'tr-clickable'} customElement={'tr'}> {identity.id} - {identity?.records?.given_name?.[0]?.value || } - {identity?.records?.family_name?.[0]?.value || } + + {identity?.records?.given_name?.[0]?.value_locale || ( + + )} + + + {identity?.records?.family_name?.[0]?.value_locale || ( + + )} + {identity.email || } - {identity.bsn || } + {activeOrganization.bsn_enabled && ( + {identity.bsn || } + )} + + {identity?.records?.client_number?.[0]?.value_locale || ( + + )} + + + + - {identity?.records?.city?.[0]?.value || } - {identity?.records?.street?.[0]?.value || } + {identity?.records?.city?.[0]?.value_locale || } + + {identity?.records?.street?.[0]?.value_locale || } + + + {identity?.records?.house_number?.[0]?.value_locale || ( + + )} + + + {identity?.records?.house_number_addition?.[0]?.value_locale || ( + + )} + - {identity?.records?.house_number?.[0]?.value || } + {identity?.records?.postal_code?.[0]?.value_locale || ( + + )} + + + {identity?.records?.municipality_name?.[0]?.value_locale || ( + + )} - {identity?.records?.house_number_addition?.[0]?.value || ( + {identity?.records?.neighborhood_name?.[0]?.value_locale || ( )} - {identity?.records?.postal_code?.[0]?.value || } { + return identity?.records?.birth_date?.[0]?.value + ? Math.max(differenceInYears(new Date(), dateParse(identity?.records?.birth_date?.[0]?.value)), 0) + : null; + }, [identity?.records?.birth_date]); + const fetchIdentity = useCallback(() => { setProgress(0); @@ -86,7 +94,7 @@ export default function IdentitiesShow() { disabledFields={disabledFields} onDone={fetchIdentity} identity={identity} - recordTypes={recordTypes?.filter((item) => recordTypeKyes.includes(item.key))} + recordTypes={recordTypeKyes?.map((filter) => recordTypes?.find((item) => filter === item.key))} values={recordsByKey} organization={activeOrganization} bodyOverflowVisible={bodyOverflowVisible} @@ -129,12 +137,14 @@ export default function IdentitiesShow() { text: 'Bewerken', icon: 'pencil-outline', onClick: () => - editProfileRecords( - 'Wijzig persoonsgegevens', - ['given_name', 'family_name', 'birth_date'], - [], - true, - ), + editProfileRecords('Wijzig persoonsgegevens', [ + 'given_name', + 'family_name', + 'birth_date', + 'gender', + 'marital_status', + 'client_number', + ]), }, ]}> , }, - { label: 'BSN', value: identity?.bsn }, + { + label: 'Leeftijd', + value: identityCalculatedAge, + }, + { + label: recordTypesByKey?.gender?.name, + value: , + }, + { + label: recordTypesByKey?.marital_status?.name, + value: , + }, + ...(activeOrganization.bsn_enabled ? [{ label: 'BSN', value: identity?.bsn }] : []), + { + label: recordTypesByKey?.client_number?.name, + value: , + }, + ]} + /> + + + + editProfileRecords( + 'Wijzig huishouden', + ['house_composition', 'living_arrangement'], + [], + true, + ), + }, + ]}> + , + }, + { + label: recordTypesByKey?.living_arrangement?.name, + value: , + }, ]} /> @@ -163,7 +219,8 @@ export default function IdentitiesShow() { items={[ { label: 'Accountnummer', value: identity?.id }, { label: 'Actief sinds', value: identity?.created_at_locale }, - { label: 'Laatste inlog', value: identity?.last_activity_at_locale }, + { label: 'Laatste inlog', value: identity?.last_login_at_locale }, + { label: 'Laatste handeling', value: identity?.last_activity_at_locale }, ]} /> @@ -177,15 +234,7 @@ export default function IdentitiesShow() { onClick: () => { editProfileRecords( 'Wijzig contactgegevens', - [ - 'telephone', - 'mobile', - 'city', - 'street', - 'house_number', - 'house_number_addition', - 'postal_code', - ], + ['telephone', 'mobile'], [ { label: 'Hoofd e-mailadres', value: identity.email, key: 'email' }, ...otherEmails.map((email, index) => ({ @@ -214,6 +263,32 @@ export default function IdentitiesShow() { label: recordTypesByKey?.mobile?.name, value: , }, + ]} + /> + + + { + editProfileRecords('Wijzig adresgegevens', [ + 'city', + 'street', + 'house_number', + 'house_number_addition', + 'postal_code', + 'neighborhood_name', + 'municipality_name', + ]); + }, + }, + ]}> + , @@ -236,6 +311,14 @@ export default function IdentitiesShow() { label: recordTypesByKey?.postal_code?.name, value: , }, + { + label: recordTypesByKey?.neighborhood_name?.name, + value: , + }, + { + label: recordTypesByKey?.municipality_name?.name, + value: , + }, ]} /> diff --git a/react/src/dashboard/components/pages/identitities-show/cards/IdentityBankAccountsCard.tsx b/react/src/dashboard/components/pages/identitities-show/cards/IdentityBankAccountsCard.tsx index a326eb07e..ba2cc4e25 100644 --- a/react/src/dashboard/components/pages/identitities-show/cards/IdentityBankAccountsCard.tsx +++ b/react/src/dashboard/components/pages/identitities-show/cards/IdentityBankAccountsCard.tsx @@ -106,7 +106,7 @@ export default function IdentityBankAccountsCard({ }, ]}> {identity?.bank_accounts.length === 0 ? ( - + ) : ( {identity?.bank_accounts?.map((bank_account, index) => ( diff --git a/react/src/dashboard/components/pages/identitities-show/elements/IdentityRecordKeyValueWithHistory.tsx b/react/src/dashboard/components/pages/identitities-show/elements/IdentityRecordKeyValueWithHistory.tsx index 590b14f52..fa0d03279 100644 --- a/react/src/dashboard/components/pages/identitities-show/elements/IdentityRecordKeyValueWithHistory.tsx +++ b/react/src/dashboard/components/pages/identitities-show/elements/IdentityRecordKeyValueWithHistory.tsx @@ -9,7 +9,7 @@ export default function IdentityRecordKeyValueWithHistory({ records }: { records return (
- {records?.[0]?.value || } + {records?.[0]?.value_locale || } {records?.length > 1 && ( setShow(!show)}> {`${records?.length} keer bewerkt`} @@ -27,9 +27,9 @@ export default function IdentityRecordKeyValueWithHistory({ records }: { records {item.employee ? item.employee?.email || `Medewerker[${item.employee?.id}]` : 'User'} {' '} {`${item.created_at_locale} • van `} - {`'${records[index + 1]?.value || ''}'`} + {`'${records[index + 1]?.value_locale || ''}'`} {' naar '} - {`'${item.value || ''}'`} + {`'${item.value_locale || ''}'`}
))}
diff --git a/react/src/dashboard/components/pages/identitities-show/modals/ModalEditProfileBankAccount.tsx b/react/src/dashboard/components/pages/identitities-show/modals/ModalEditProfileBankAccount.tsx index badb7dbcc..ce6c5978f 100644 --- a/react/src/dashboard/components/pages/identitities-show/modals/ModalEditProfileBankAccount.tsx +++ b/react/src/dashboard/components/pages/identitities-show/modals/ModalEditProfileBankAccount.tsx @@ -10,6 +10,7 @@ import SponsorIdentity from '../../../../props/models/Sponsor/SponsorIdentity'; import Modal from '../../../modals/elements/Modal'; import FormGroupInfo from '../../../elements/forms/elements/FormGroupInfo'; import FormGroup from '../../../elements/forms/controls/FormGroup'; +import useTranslate from '../../../../hooks/useTranslate'; export default function ModalEditProfileBankAccount({ id, @@ -24,6 +25,7 @@ export default function ModalEditProfileBankAccount({ identity: SponsorIdentity; organization: Organization; }) { + const translate = useTranslate(); const setProgress = useSetProgress(); const sponsorIdentitiesService = useSponsorIdentitiesService(); @@ -78,16 +80,16 @@ export default function ModalEditProfileBankAccount({ ( - + form.update({ name: e.target.value })} /> @@ -97,16 +99,16 @@ export default function ModalEditProfileBankAccount({ ( - + form.update({ iban: e.target.value })} /> diff --git a/react/src/dashboard/components/pages/identitities-show/modals/ModalEditProfileRecords.tsx b/react/src/dashboard/components/pages/identitities-show/modals/ModalEditProfileRecords.tsx index 6a0df3baf..2aecc8992 100644 --- a/react/src/dashboard/components/pages/identitities-show/modals/ModalEditProfileRecords.tsx +++ b/react/src/dashboard/components/pages/identitities-show/modals/ModalEditProfileRecords.tsx @@ -1,4 +1,4 @@ -import React, { Fragment } from 'react'; +import React, { Fragment, useCallback } from 'react'; import { ModalState } from '../../../../modules/modals/context/ModalContext'; import useFormBuilder from '../../../../hooks/useFormBuilder'; import Organization from '../../../../props/models/Organization'; @@ -14,6 +14,8 @@ import RecordType from '../../../../props/models/RecordType'; import DatePickerControl from '../../../elements/forms/controls/DatePickerControl'; import { dateFormat, dateParse } from '../../../../helpers/dates'; import useTranslate from '../../../../hooks/useTranslate'; +import SelectControl from '../../../elements/select-control/SelectControl'; +import { differenceInYears } from 'date-fns'; export default function ModalEditProfileRecords({ modal, @@ -39,11 +41,18 @@ export default function ModalEditProfileRecords({ const translate = useTranslate(); const setProgress = useSetProgress(); const sponsorIdentitiesService = useSponsorIdentitiesService(); + const types = recordTypes.map((type) => type.key.toString()); const pushApiError = usePushApiError(); const form = useFormBuilder<{ [key in ProfileRecordTypes]: string }>( - Object.keys(values).reduce((list, key) => ({ ...list, [key]: values[key] }), {}) as { + Object.keys(values).reduce((list, key) => { + if (types.includes(key)) { + return { ...list, [key]: values[key] }; + } + + return list; + }, {}) as { [key in ProfileRecordTypes]: string; }, (values) => { @@ -64,6 +73,10 @@ export default function ModalEditProfileRecords({ }, ); + const calculatedAge = useCallback((value: string) => { + return value ? Math.max(differenceInYears(new Date(), dateParse(value)), 0) : null; + }, []); + const { submit: formSubmit } = form; return ( @@ -105,33 +118,74 @@ export default function ModalEditProfileRecords({ })} {recordTypes?.map((recordType) => { return ( - ( - - {recordType.key === 'birth_date' ? ( - form.update({ [recordType.key]: dateFormat(date) })} - /> - ) : ( - form.update({ [recordType.key]: e.target.value })} - /> + + ( + + {recordType.key === 'birth_date' ? ( + form.update({ [recordType.key]: dateFormat(date) })} + /> + ) : ( + + {recordType?.type === 'select' ? ( + + form.update({ [recordType.key]: value }) + } + /> + ) : ( + form.update({ [recordType.key]: e.target.value })} + /> + )} + + )} + + )} + /> + + {recordType?.key === 'birth_date' && ( + ( + + form.update({ [recordType.key]: e.target.value })} + /> + )} - + /> )} - /> + ); })} diff --git a/react/src/dashboard/components/pages/identity-security/SecuritySessions.tsx b/react/src/dashboard/components/pages/identity-security/SecuritySessions.tsx index 636b5efe6..af40e562c 100644 --- a/react/src/dashboard/components/pages/identity-security/SecuritySessions.tsx +++ b/react/src/dashboard/components/pages/identity-security/SecuritySessions.tsx @@ -191,7 +191,7 @@ export default function SecuritySessions() {
Sessie gestart:
-
{session.started_at_locale}
+
{session.created_at_locale}
diff --git a/react/src/dashboard/components/pages/implementations-cms/ImplementationsCms.tsx b/react/src/dashboard/components/pages/implementations-cms/ImplementationsCms.tsx index 7612ad2e5..e1582d42c 100644 --- a/react/src/dashboard/components/pages/implementations-cms/ImplementationsCms.tsx +++ b/react/src/dashboard/components/pages/implementations-cms/ImplementationsCms.tsx @@ -207,7 +207,7 @@ export default function ImplementationsCms() { const { update: formUpdate } = form; const selectBanner = useCallback( - (mediaFile) => { + (mediaFile: File | Blob) => { setBannerMeta((meta) => ({ ...meta, mediaLoading: true })); mediaService @@ -318,45 +318,45 @@ export default function ImplementationsCms() {
-
-
-
{translate('implementation_edit.header.title')}
-
-
- - Open webshop - - - - - - Instellingen - - - - - Instellingen social - - - +
+
{translate('implementation_edit.header.title')}
+
+
+ + Open webshop + + + + + + Instellingen + + + + + Instellingen social + + + +
diff --git a/react/src/dashboard/components/pages/organizations-funds/OrganizationFunds.tsx b/react/src/dashboard/components/pages/organizations-funds/OrganizationFunds.tsx index 2ccfde791..6e02a9b6e 100644 --- a/react/src/dashboard/components/pages/organizations-funds/OrganizationFunds.tsx +++ b/react/src/dashboard/components/pages/organizations-funds/OrganizationFunds.tsx @@ -437,7 +437,6 @@ export default function OrganizationFunds() { )} {hasPermission(activeOrganization, 'view_finances') && - fund.balance_provider == 'top_ups' && fund.key && fund.state != 'closed' && (
-
-

Vandaag

-
    -
  • Gebruikte tekens: {numberFormat(parseInt(stats?.day?.total?.symbols))}
  • -
  • - Berekening:{' '} - {currencyFormat(parseInt(stats?.day?.total?.symbols)) + - ' / ' + - currencyFormat(activeOrganization?.translations_daily_limit)} -
      - {Object.keys(stats?.day?.count_per_type).map((key) => { - const type = stats?.day?.count_per_type[key]; - return ( -
    • - {key}:{' '} - {type.symbols.toLocaleString()} or ~ {type.cost} -
    • - ); - })} -
    -
  • -
  • - Schatting van de kosten: {stats?.day?.total?.cost} -
  • -
-
-
-

Deze week

-
    -
  • - Gebruikte tekens: {numberFormat(parseInt(stats?.week?.total?.symbols))} -
  • -
  • - Berekening:{' '} - {currencyFormat(parseInt(stats?.week?.total?.symbols)) + - ' / ' + - currencyFormat(activeOrganization?.translations_weekly_limit)} -
      - {Object.keys(stats?.week?.count_per_type).map((key) => { - const type = stats?.week?.count_per_type[key]; - return ( -
    • - {key}:{' '} - {type.symbols.toLocaleString()} or ~ {type.cost} -
    • - ); - })} -
    -
  • -
  • - Schatting van de kosten: {stats?.week?.total?.cost} -
  • -
-
-
-

Deze maand

-
    -
  • - Gebruikte tekens: {numberFormat(parseInt(stats?.month?.total?.symbols))} -
  • -
  • - Berekening:{' '} - {currencyFormat(parseInt(stats?.month?.total?.symbols)) + - ' / ' + - currencyFormat(activeOrganization?.translations_monthly_limit)} -
      - {Object.keys(stats?.month?.count_per_type).map((key) => { - const type = stats?.month?.count_per_type[key]; - return ( -
    • - {key}:{' '} - {type.symbols.toLocaleString()} or ~ {type.cost} -
    • - ); - })} -
    -
  • -
  • - Schatting van de kosten: {stats?.month?.total?.cost} -
  • -
-
+ + +
diff --git a/react/src/dashboard/components/pages/organizations-translations/elements/OrganizationsTranslationsStatsColumn.tsx b/react/src/dashboard/components/pages/organizations-translations/elements/OrganizationsTranslationsStatsColumn.tsx new file mode 100644 index 000000000..8ae56a3bf --- /dev/null +++ b/react/src/dashboard/components/pages/organizations-translations/elements/OrganizationsTranslationsStatsColumn.tsx @@ -0,0 +1,40 @@ +import React from 'react'; +import Organization, { TranslationStats } from '../../../../props/models/Organization'; +import { numberFormat } from '../../../../helpers/string'; + +export default function OrganizationsTranslationsStatsColumn({ + title, + stats, + organization, +}: { + title: string; + stats: TranslationStats; + organization: Organization; +}) { + return ( +
+

{title}

+
    +
  • Gebruikte tekens: {numberFormat(parseInt(stats?.total?.symbols))}
  • +
  • + Berekening:{' '} + {numberFormat(parseInt(stats?.total?.symbols)) + + ' / ' + + numberFormat(organization?.translations_monthly_limit)} +
      + {Object.keys(stats?.count_per_type).map((key) => { + const type = stats?.count_per_type[key]; + return ( +
    • + {key}: {type.symbols.toLocaleString()} or ~{' '} + {type.cost} +
    • + ); + })} +
    +
  • +
  • Schatting van de kosten: {stats?.total?.cost}
  • +
+
+ ); +} diff --git a/react/src/dashboard/i18n/nl/pages/identities.js b/react/src/dashboard/i18n/nl/pages/identities.js index 82c3ab1a7..70a712ec9 100644 --- a/react/src/dashboard/i18n/nl/pages/identities.js +++ b/react/src/dashboard/i18n/nl/pages/identities.js @@ -8,14 +8,18 @@ export default { family_name: 'Achternaam', email: 'E-mail adres', bsn: 'BSN', + client_number: 'Klantnummer', birth_date: 'Geboorte datum', - last_activity: 'Laatste inlog', + last_login: 'Laatste inlog', + last_activity: 'Laatste handeling', postal_code: 'Postcode', vouchers_count: 'Aantal tegoeden', mobile: 'Mobiele telefoonnummer', city: 'Woonplaats', house_number: 'Huisnummer', house_number_addition: 'Huisnummer toevoeging', + municipality_name: 'Gemeentenaam', + neighborhood_name: 'Woonwijk', street: 'Straatnaam', created_at: 'Gemaakt op', actions: 'Acties', @@ -28,10 +32,14 @@ export default { 'Dit veld bevat de achternaam van de persoon. Samen met de voornaam zorgt dit voor een volledige naamweergave.', email: 'Dit veld bevat het e-mailadres van de persoon. Het wordt gebruikt voor communicatie en meldingen binnen het platform en dient tevens als inlogmethode.', bsn: 'Dit staat voor "Burger Service Nummer". Het is een uniek identificatienummer dat wordt gebruikt door de overheid om personen te identificeren in verschillende administratieve processen.', + client_number: + 'Uniek nummer toegekend door het systeem van de organisatie, zodat een relatie kan worden geïdentificeerd. Ook wel Persoon-organisatierelatie ID (UID) genoemd.', birth_date: 'Dit veld bevat de geboortedatum van de persoon. Het is belangrijk voor persoonlijke identificatie, ondersteuning bij het gebruik, en om per regio inzicht te krijgen in de aanvraag en het gebruik van regelingen.', + last_login: + 'Dit veld toont de datum en tijd waarop de persoon voor het laatst een sessie is gestart op het platform. Dit helpt om inzicht te krijgen in de recente activiteit en betrokkenheid van de persoon.', last_activity: - 'Dit veld toont de datum en tijd waarop de persoon voor het laatst heeft ingelogd op het platform. Dit helpt om de activiteit van de persoon te monitoren.', + 'Dit veld toont de datum en tijd van de meest recente actie die de persoon op het platform heeft uitgevoerd. Dit biedt inzicht in de actuele interactie van de persoon binnen het systeem.', postal_code: 'Dit veld bevat de postcode van de persoon. Dit helpt bij persoonlijke identificatie, ondersteuning bij het gebruik, en om per regio inzicht te krijgen in de aanvraag en het gebruik van regelingen.', vouchers_count: @@ -41,6 +49,9 @@ export default { house_number: 'Een numerieke aanduiding die door de gemeente aan een object is toegekend (volgens NEN 5825:2002).', house_number_addition: 'Extra toevoegingen aan het huisnummer, zoals toegekend door de gemeente.', + municipality_name: 'De naam van de wijk, zoals die door het CBS wordt gebruikt.', + neighborhood_name: + 'De samenstelling van het huishouden, inclusief het aantal en de relaties van personen die samenwonen.', street: 'De officiële, door de gemeente vastgestelde naam van een straat.', created_at: 'Gemaakt op', }, @@ -59,6 +70,8 @@ export default { }, }, record_info: { + client_number: + 'Uniek nummer toegekend door het systeem van de organisatie, zodat een relatie kan worden geïdentificeerd. Ook wel Persoon-organisatierelatie ID (UID) genoemd.', given_name: 'De samenvoeging van alle exemplaren van voornaam van de persoon.', family_name: 'De familienaam of geslachtsnaam die aangeeft dat de persoon tot een specifieke familie behoort.', email: 'Het adres waaronder de persoon per elektronische post bereikbaar is. Dit is het hoofd e-mailadres van de persoon en wordt gebruikt om in te loggen op de website en systeemberichten te ontvangen.', @@ -71,7 +84,6 @@ export default { emails_verified_3: 'Het tweede extra adres waaronder de persoon per elektronische post bereikbaar is. Dit is het eerste extra e-mailadres. De persoon kan het e-mailadres als hoofdadres instellen in het persoonlijke account op de website.', birth_date: 'De datum van geboorte van de persoon.', - last_activity: 'Lorem Ipsum - dolor sit amet!', postal_code: 'De officiële codering van TNT Post voor een Nederlands postadres, bestaande uit een numeriek deel en een alfabetisch deel.', telephone: 'Het telefoonnummer waaronder de persoon bereikbaar is.', @@ -80,6 +92,25 @@ export default { house_number: 'De numerieke aanduiding zoals deze door de gemeente aan het object is toegekend.', house_number_addition: 'De huisnummertoevoeging zoals deze door de gemeente aan het object is toegekend.', street: 'De officiële door de gemeente vastgestelde naam van een straat waar de persoon woonachtig is.', + house_composition: + 'De samenstelling van het huishouden, inclusief het aantal en de relaties van personen die samenwonen.', + gender: 'Een aanduiding die aangeeft of de ingeschrevene een man of vrouw is, of dat het geslacht onbekend is.', + age: 'De leeftijd van de persoon in jaren.', + municipality_name: 'De officiële door de gemeente vastgestelde Gemeentenaam.', + neighborhood_name: 'De naam van de wijk, zoals die door het CBS wordt gebruikt.', + living_arrangement: + 'De manier waarop de persoon samenleeft binnen een huishouden, zoals alleenstaanden, gezinnen, of woongroepen.', + marital_status: 'De rechtstoestand van een persoon ten aanzien van huwelijk of geregistreerd partnerschap.', + }, + bank_account: { + iban: { + label: 'IBAN-nummer', + tooltip: 'Bankrekeningnummer (IBAN)', + }, + iban_name: { + label: 'Te naam stelling', + tooltip: 'Tenaamstelling', + }, }, buttons: { clear_filter: 'Wis filter', diff --git a/react/src/dashboard/i18n/nl/pages/mollie-connection.js b/react/src/dashboard/i18n/nl/pages/mollie-connection.js index 575b3f32d..e83cb9a03 100644 --- a/react/src/dashboard/i18n/nl/pages/mollie-connection.js +++ b/react/src/dashboard/i18n/nl/pages/mollie-connection.js @@ -2,7 +2,7 @@ export default { header: { title: 'Instellingen voor bijbetaalmethoden ', unknown_competed_at: 'Onbekend', - warning: 'Wij gebruiken uitsluitend Ideal. Per transactie betaalt u 0,29 cent (excl. btw).', + warning: 'Wij gebruiken uitsluitend Ideal. Per transactie betaalt u 0,32 cent (excl. btw).', }, header_create: { title: 'Organisatiegegevens indienen', diff --git a/react/src/dashboard/props/models/Fund.tsx b/react/src/dashboard/props/models/Fund.tsx index b7b0ac06d..e652748a1 100644 --- a/react/src/dashboard/props/models/Fund.tsx +++ b/react/src/dashboard/props/models/Fund.tsx @@ -92,7 +92,6 @@ export default interface Fund { auth_2fa_restrict_reimbursements?: boolean; auth_2fa_restrict_bi_connections?: boolean; }; - balance_provider: string; allow_fund_requests?: boolean; allow_prevalidations?: boolean; tags: Array; diff --git a/react/src/dashboard/props/models/Profile.tsx b/react/src/dashboard/props/models/Profile.tsx index f51671a3e..32153c55e 100644 --- a/react/src/dashboard/props/models/Profile.tsx +++ b/react/src/dashboard/props/models/Profile.tsx @@ -9,6 +9,8 @@ export default interface Profile { bank_accounts?: Array; created_at?: string; created_at_locale?: string; + last_login_at?: string; + last_login_at_locale?: string; last_activity_at?: string; last_activity_at_locale?: string; } diff --git a/react/src/dashboard/props/models/Session.tsx b/react/src/dashboard/props/models/Session.tsx index ea4ba843b..2a5970098 100644 --- a/react/src/dashboard/props/models/Session.tsx +++ b/react/src/dashboard/props/models/Session.tsx @@ -46,8 +46,8 @@ export default interface Session { identity_address: string; active: boolean; current: boolean; - started_at: string; - started_at_locale: string; + created_at: string; + created_at_locale: string; client_type?: string; client_version?: string; locations: Array; diff --git a/react/src/dashboard/props/models/Sponsor/SponsorIdentity.tsx b/react/src/dashboard/props/models/Sponsor/SponsorIdentity.tsx index 823c6b7b0..e0ead9dec 100644 --- a/react/src/dashboard/props/models/Sponsor/SponsorIdentity.tsx +++ b/react/src/dashboard/props/models/Sponsor/SponsorIdentity.tsx @@ -45,7 +45,14 @@ export type ProfileRecordTypes = | 'street' | 'house_number' | 'house_number_addition' - | 'postal_code'; + | 'client_number' + | 'postal_code' + | 'house_composition' + | 'gender' + | 'neighborhood_name' + | 'living_arrangement' + | 'marital_status' + | 'municipality_name'; export type ProfileRecords = { [key in ProfileRecordTypes]: RecordType }; export type ProfileRecordValues = { [key in ProfileRecordTypes]: string }; @@ -63,6 +70,8 @@ export default interface SponsorIdentity { count_vouchers_active_with_balance: number; created_at?: string; created_at_locale?: string; + last_login_at?: string; + last_login_at_locale?: string; last_activity_at?: string; last_activity_at_locale?: string; } diff --git a/react/src/dashboard/services/SponsorIdentitesService.ts b/react/src/dashboard/services/SponsorIdentitesService.ts index db79eea4c..949bf0dec 100644 --- a/react/src/dashboard/services/SponsorIdentitesService.ts +++ b/react/src/dashboard/services/SponsorIdentitesService.ts @@ -1,8 +1,10 @@ -import ApiResponse, { ApiResponseSingle } from '../props/ApiResponses'; +import ApiResponse, { ApiResponseSingle, ResponseSimple } from '../props/ApiResponses'; import { useState } from 'react'; import ApiRequestService from './ApiRequestService'; import { ConfigurableTableColumn } from '../components/pages/vouchers/hooks/useConfigurableTable'; import SponsorIdentity, { ProfileBankAccount } from '../props/models/Sponsor/SponsorIdentity'; +import { ExportFieldProp } from '../components/modals/ModalExportDataSelect'; +import Organization from '../props/models/Organization'; export class SponsorIdentitiesService { /** @@ -71,20 +73,34 @@ export class SponsorIdentitiesService { + public export(organization_id: number, filters = {}): Promise> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/sponsor/identities/export`, filters, { + responseType: 'arraybuffer', + }); + } + + public exportFields(organization_id: number): Promise>> { + return this.apiRequest.get(`${this.prefix}/${organization_id}/sponsor/identities/export-fields`); + } + + public getColumns(organization: Organization): Array { const list = [ 'id', 'given_name', 'family_name', 'email', - 'bsn', + organization.bsn_enabled ? 'bsn' : null, + 'client_number', 'birth_date', + 'last_login', 'last_activity', 'city', 'street', 'house_number', 'house_number_addition', 'postal_code', + 'municipality_name', + 'neighborhood_name', ].filter((item) => item); return list.map((key) => ({ diff --git a/react/src/dashboard/services/exports/useIdentityExportService.tsx b/react/src/dashboard/services/exports/useIdentityExportService.tsx new file mode 100644 index 000000000..8c11ff8c3 --- /dev/null +++ b/react/src/dashboard/services/exports/useIdentityExportService.tsx @@ -0,0 +1,43 @@ +import React, { useCallback } from 'react'; +import usePushDanger from '../../hooks/usePushDanger'; +import useSetProgress from '../../hooks/useSetProgress'; +import useOpenModal from '../../hooks/useOpenModal'; +import ModalExportDataSelect from '../../components/modals/ModalExportDataSelect'; +import useMakeExporterService from './useMakeExporterService'; +import useSponsorIdentitiesService from '../SponsorIdentitesService'; + +export default function useIdentityExportService() { + const pushDanger = usePushDanger(); + const setProgress = useSetProgress(); + const openModal = useOpenModal(); + + const identityService = useSponsorIdentitiesService(); + const { makeSections, saveExportedData } = useMakeExporterService(); + + const exportData = useCallback( + (organization_id: number, filters: object = {}) => { + const onSuccess = (data: { data_format: string; fields: string }) => { + const { data_format, fields } = data; + const queryFilters = { ...filters, data_format, fields }; + + setProgress(0); + console.info('- data loaded from the api.'); + + identityService + .export(organization_id, queryFilters) + .then((res) => saveExportedData(data, organization_id, res)) + .catch((res) => pushDanger('Mislukt!', res.data.message)) + .finally(() => setProgress(100)); + }; + + identityService.exportFields(organization_id).then((res) => { + openModal((modal) => ( + + )); + }); + }, + [makeSections, openModal, pushDanger, saveExportedData, setProgress, identityService], + ); + + return { exportData }; +} diff --git a/react/src/webshop/components/elements/top-navbar/desktop/TopNavbarDesktopMenuUser.tsx b/react/src/webshop/components/elements/top-navbar/desktop/TopNavbarDesktopMenuUser.tsx index 7cdafe486..1c3ae4bbd 100644 --- a/react/src/webshop/components/elements/top-navbar/desktop/TopNavbarDesktopMenuUser.tsx +++ b/react/src/webshop/components/elements/top-navbar/desktop/TopNavbarDesktopMenuUser.tsx @@ -177,6 +177,10 @@ export const TopNavbarDesktopMenuUser = () => { {translate('top_navbar.user_menu.preferences_notifications')} + + + {translate('top_navbar.user_menu.profile')} + {envData.config.sessions && ( diff --git a/react/src/webshop/components/elements/top-navbar/mobile/TopNavbarMobile.tsx b/react/src/webshop/components/elements/top-navbar/mobile/TopNavbarMobile.tsx index 25d088fe2..503fe9e8a 100644 --- a/react/src/webshop/components/elements/top-navbar/mobile/TopNavbarMobile.tsx +++ b/react/src/webshop/components/elements/top-navbar/mobile/TopNavbarMobile.tsx @@ -6,7 +6,6 @@ import StateNavLink from '../../../../modules/state_router/StateNavLink'; import useAssetUrl from '../../../../hooks/useAssetUrl'; import { useStateRoutes } from '../../../../modules/state_router/Router'; import { clickOnKeyEnter } from '../../../../../dashboard/helpers/wcag'; -import useLangSelector from '../../../../hooks/useLangSelector'; import classNames from 'classnames'; import useAuthIdentity from '../../../../hooks/useAuthIdentity'; import TopNavbarMobileMenu from './TopNavbarMobileMenu'; @@ -50,8 +49,6 @@ export const TopNavbarMobile = () => { [setMobileMenuOpened, setShowSearchBox], ); - const langSelector = useLangSelector(); - return (
{appConfigs?.announcements && ( @@ -90,11 +87,9 @@ export const TopNavbarMobile = () => { /> -
{langSelector}
- {envData.config?.flags?.genericSearch ? (
{ e.stopPropagation(); toggleSearchBox(e); diff --git a/react/src/webshop/components/elements/top-navbar/mobile/TopNavbarMobileMenu.tsx b/react/src/webshop/components/elements/top-navbar/mobile/TopNavbarMobileMenu.tsx index c58a3a97a..72662dc26 100644 --- a/react/src/webshop/components/elements/top-navbar/mobile/TopNavbarMobileMenu.tsx +++ b/react/src/webshop/components/elements/top-navbar/mobile/TopNavbarMobileMenu.tsx @@ -16,6 +16,7 @@ import ModalAuthPincode from '../../../modals/ModalAuthPincode'; import { clickOnKeyEnter } from '../../../../../dashboard/helpers/wcag'; import useSelectControlKeyEventHandlers from '../../../../../dashboard/components/elements/select-control/hooks/useSelectControlKeyEventHandlers'; import TopNavbarMobileButtons from './TopNavbarMobileButtons'; +import useMobileLangSelector from '../../../../hooks/useMobileLangSelector'; export default function TopNavbarMobileMenu() { const translate = useTranslate(); @@ -27,6 +28,7 @@ export default function TopNavbarMobileMenu() { const envData = useEnvData(); const appConfigs = useAppConfigs(); const openModal = useOpenModal(); + const langSelector = useMobileLangSelector(); const authIdentity = useAuthIdentity(); const authIdentity2FAState = useAuthIdentity2FAState(); @@ -75,6 +77,8 @@ export default function TopNavbarMobileMenu() { return (
+ {langSelector} +
{translate('top_navbar.main_menu')}
{menuItems.map((menuItem) => ( diff --git a/react/src/webshop/components/modals/modal-product-reserve/ModalProductReserve.tsx b/react/src/webshop/components/modals/modal-product-reserve/ModalProductReserve.tsx index f44a02708..2804dd4ea 100644 --- a/react/src/webshop/components/modals/modal-product-reserve/ModalProductReserve.tsx +++ b/react/src/webshop/components/modals/modal-product-reserve/ModalProductReserve.tsx @@ -1359,20 +1359,20 @@ export default function ModalProductReserve({
- {translate('product_reserve_extra_payment.offer_cost')} + {translate('modal_reserve_product.extra_payment.offer_cost')}
{product.price_locale}
- {translate('product_reserve_extra_payment.remaining_credit')} + {translate('modal_reserve_product.extra_payment.remaining_credit')}
{voucher.amount_locale}
- {translate('product_reserve_extra_payment.extra_payment')} + {translate('modal_reserve_product.extra_payment.extra_payment')}
{currencyFormat(voucher.amount_extra)}
@@ -1382,7 +1382,7 @@ export default function ModalProductReserve({
- {translate('product_reserve_extra_payment.external_link')} + {translate('modal_reserve_product.extra_payment.external_link')}
@@ -1419,8 +1419,8 @@ export default function ModalProductReserve({ data-dusk="btnConfirmSubmit"> {submitting &&
} {submitting - ? translate('modal_reserve_product.buttons.buttons.processing') - : translate('modal_reserve_product.buttons.buttons.submit')} + ? translate('modal_reserve_product.buttons.processing') + : translate('modal_reserve_product.buttons.submit')} )}
diff --git a/react/src/webshop/components/pages/auth/Start.tsx b/react/src/webshop/components/pages/auth/Start.tsx index fe5610558..1bac479fa 100644 --- a/react/src/webshop/components/pages/auth/Start.tsx +++ b/react/src/webshop/components/pages/auth/Start.tsx @@ -48,12 +48,17 @@ export default function Start() { const [qrValue, setQrValue] = useState(null); const [emailValue, setEmailValue] = useState(null); - const [{ reset, logout, restore_with_digid, restore_with_email }, setQueryParams] = useQueryParams({ - reset: BooleanParam, - logout: BooleanParam, - restore_with_digid: BooleanParam, - restore_with_email: BooleanParam, - }); + const [{ reset, logout, restore_with_digid, restore_with_email }, setQueryParams] = useQueryParams( + { + reset: BooleanParam, + logout: BooleanParam, + restore_with_digid: BooleanParam, + restore_with_email: BooleanParam, + }, + { + updateType: 'replace', + }, + ); const { onAuthRedirect } = useAuthService(); const digIdService = useDigiDService(); diff --git a/react/src/webshop/components/pages/funds-request/FundRequest.tsx b/react/src/webshop/components/pages/funds-request/FundRequest.tsx index bbe0a6c0f..2a2a01eca 100644 --- a/react/src/webshop/components/pages/funds-request/FundRequest.tsx +++ b/react/src/webshop/components/pages/funds-request/FundRequest.tsx @@ -335,13 +335,13 @@ export default function FundRequest() { files: [], label: control_type === 'ui_control_checkbox' - ? item.label || 'Ik verklaar aan de bovenstaande voorwaarden te voldoen' + ? item.label || translate('fund_request.sign_up.record_checkbox.default') : '', input_value: fundService.getCriterionControlDefaultValue(item.record_type, item.operator), control_type, }; }, - [criterionTitle, fundService], + [criterionTitle, fundService, translate], ); const buildSteps = useCallback(() => { diff --git a/react/src/webshop/components/pages/identity-security/SecuritySessions.tsx b/react/src/webshop/components/pages/identity-security/SecuritySessions.tsx index 18a3bc88a..7c5bbcf06 100644 --- a/react/src/webshop/components/pages/identity-security/SecuritySessions.tsx +++ b/react/src/webshop/components/pages/identity-security/SecuritySessions.tsx @@ -208,7 +208,7 @@ export default function SecuritySessions() { {translate('security_sessions.details.started_at')}
- {session.started_at_locale} + {session.created_at_locale}
diff --git a/react/src/webshop/components/pages/me-app/MeApp.tsx b/react/src/webshop/components/pages/me-app/MeApp.tsx index 594bea4de..542600b29 100644 --- a/react/src/webshop/components/pages/me-app/MeApp.tsx +++ b/react/src/webshop/components/pages/me-app/MeApp.tsx @@ -4,6 +4,7 @@ import AppLinks from '../../elements/app-links/AppLinks'; import useAssetUrl from '../../../hooks/useAssetUrl'; import BlockShowcase from '../../elements/block-showcase/BlockShowcase'; import useTranslate from '../../../../dashboard/hooks/useTranslate'; +import TranslateHtml from '../../../../dashboard/components/elements/translate-html/TranslateHtml'; export default function MeApp() { const envData = useEnvData(); @@ -27,7 +28,11 @@ export default function MeApp() {

{translate('me.download.title')}

-

{translate('me.download.description', { download_link: envData.config.me_app_link })}

+ } + i18n={'me.download.description'} + values={{ download_link: envData.config.me_app_link }} + />
diff --git a/react/src/webshop/components/pages/profile/Profile.tsx b/react/src/webshop/components/pages/profile/Profile.tsx index 596727e7b..ba97d1dd1 100644 --- a/react/src/webshop/components/pages/profile/Profile.tsx +++ b/react/src/webshop/components/pages/profile/Profile.tsx @@ -10,6 +10,8 @@ import { useRecordTypeService } from '../../../../dashboard/services/RecordTypeS import IdentityRecordKeyValueListHistory from './elements/IdentityRecordKeyValueListHistory'; import IdentityContactInformationCard from './cards/IdentityContactInformationCard'; import { useProfileService } from '../../../../dashboard/services/ProfileService'; +import { differenceInYears } from 'date-fns'; +import { dateParse } from '../../../../dashboard/helpers/dates'; export default function Profile() { const translate = useTranslate(); @@ -31,6 +33,12 @@ export default function Profile() { }, {}) as ProfileRecords; }, [recordTypes]); + const identityCalculatedAge = useMemo(() => { + return profile?.records?.birth_date?.[0]?.value + ? Math.max(differenceInYears(new Date(), dateParse(profile?.records?.birth_date?.[0]?.value)), 0) + : null; + }, [profile?.records?.birth_date]); + const fetchRecordTypes = useCallback(() => { setProgress(0); @@ -88,7 +96,59 @@ export default function Profile() { ), }, + { + label: translate('profile.personal.age'), + value: identityCalculatedAge || '-', + }, + { + label: recordTypesByKey?.gender?.name, + value: , + }, + { + label: recordTypesByKey?.marital_status?.name, + value: ( + + ), + }, { label: translate('profile.personal.bsn'), value: profile?.bsn }, + { + label: recordTypesByKey?.client_number?.name, + value: ( + + ), + }, + ]} + /> +
+
+ +
+
+

{translate('profile.household.title')}

+
+
+ + ), + }, + { + label: recordTypesByKey?.living_arrangement?.name, + value: ( + + ), + }, ]} />
@@ -107,6 +167,10 @@ export default function Profile() { }, { label: translate('profile.account.last_login'), + value: profile?.last_login_at_locale, + }, + { + label: translate('profile.account.last_activity'), value: profile?.last_activity_at_locale, }, ]} diff --git a/react/src/webshop/components/pages/profile/cards/IdentityContactInformationCard.tsx b/react/src/webshop/components/pages/profile/cards/IdentityContactInformationCard.tsx index 1167e97df..8a8dedbe5 100644 --- a/react/src/webshop/components/pages/profile/cards/IdentityContactInformationCard.tsx +++ b/react/src/webshop/components/pages/profile/cards/IdentityContactInformationCard.tsx @@ -143,6 +143,22 @@ export default function IdentityContactInformationCard({
))} +
+ + +
+
+ + +
@@ -223,8 +239,16 @@ export default function IdentityContactInformationCard({ ), }, { - label: recordTypesByKey?.postal_code?.name, - value: , + label: recordTypesByKey?.neighborhood_name?.name, + value: ( + + ), + }, + { + label: recordTypesByKey?.municipality_name?.name, + value: ( + + ), }, ]} /> diff --git a/react/src/webshop/components/pages/vouchers-show/VouchersShow.tsx b/react/src/webshop/components/pages/vouchers-show/VouchersShow.tsx index d673aec1b..1409d02d5 100644 --- a/react/src/webshop/components/pages/vouchers-show/VouchersShow.tsx +++ b/react/src/webshop/components/pages/vouchers-show/VouchersShow.tsx @@ -757,19 +757,25 @@ export default function VouchersShow() { {voucherCard.records_title ? (

- Persoonsgegevens + {translate('voucher.physical_card.personal_date')}

{voucherCard.records_title} - - - {voucherCard.records_by_key.birth_date} - + {voucherCard.records_by_key.birth_date && ( + + + + {voucherCard.records_by_key.birth_date} + + + )}

) : (
-

Persoonsgegevens

+

+ {translate('voucher.physical_card.personal_date')} +

)} @@ -777,8 +783,9 @@ export default function VouchersShow() {
setShowRecords(!showRecords)}> - {showRecords ? 'Verberg alle details' : 'Toon alle details'} - + {showRecords + ? translate('voucher.physical_card.less_details') + : translate('voucher.physical_card.more_details')} {showRecords ? ( ) : ( diff --git a/react/src/webshop/hooks/useMobileLangSelector.tsx b/react/src/webshop/hooks/useMobileLangSelector.tsx new file mode 100644 index 000000000..01328dba5 --- /dev/null +++ b/react/src/webshop/hooks/useMobileLangSelector.tsx @@ -0,0 +1,68 @@ +import React, { Fragment, useMemo, useState } from 'react'; +import useMainContext from './useMainContext'; +import { clickOnKeyEnter } from '../../dashboard/helpers/wcag'; +import useTranslate from '../../dashboard/hooks/useTranslate'; +import classNames from 'classnames'; + +export default function useMobileLangSelector() { + const { language, languages, changeLanguage } = useMainContext(); + const translate = useTranslate(); + const [showOptions, setShowOptions] = useState(false); + + return useMemo(() => { + if (languages?.length <= 1) { + return null; + } + + const languageResource = languages?.filter((lang) => lang.locale === language)?.[0]; + + return ( +
+
setShowOptions(!showOptions)}> +
+ +
+
+
+ {translate('top_navbar.language.prefix')} +
+ {`${languageResource.locale.toUpperCase()} - ${languageResource.name}`} +
+
+ +
+
+ + {showOptions && ( + + {languages.map((lang) => ( +
changeLanguage(lang.locale)}> + {lang.locale.toUpperCase()} +
+
{lang.name}
+ {languageResource.locale === lang.locale && ( +
+ )} +
+ ))} + + )} +
+ ); + }, [changeLanguage, language, languages, showOptions, translate]); +} diff --git a/react/src/webshop/i18n/nl/layout/top_navbar.mjs b/react/src/webshop/i18n/nl/layout/top_navbar.mjs index e1cb3b996..b226743b5 100644 --- a/react/src/webshop/i18n/nl/layout/top_navbar.mjs +++ b/react/src/webshop/i18n/nl/layout/top_navbar.mjs @@ -9,6 +9,9 @@ export default { midden_drenthe: 'Tegoed activeren', berg_en_dal: 'Tegoed activeren', }, + language: { + prefix: 'Uw taal:', + }, items: { home: 'Home', funds: 'Activeren', @@ -127,7 +130,7 @@ export default { notifications: 'Notificaties', preferences_notifications: 'Notificatievoorkeuren', preferences_emails: 'E-mailinstellingen', - records: 'Profiel', + profile: 'Gegevens', funds: 'Alle tegoeden', security: 'Beveiliging', sessions: 'Sessies', @@ -191,6 +194,7 @@ export default { payouts: 'Uitbetalingen', notifications: 'Notificaties', preferences_notifications: 'Notificatievoorkeuren', + profile: 'Gegevens', security_sessions: 'Sessies', preferences_emails: 'E-mail instellingen', security_2fa: 'Beveiliging', diff --git a/react/src/webshop/i18n/nl/pages/me.mjs b/react/src/webshop/i18n/nl/pages/me.mjs index 096c2194c..46e2695b4 100644 --- a/react/src/webshop/i18n/nl/pages/me.mjs +++ b/react/src/webshop/i18n/nl/pages/me.mjs @@ -11,6 +11,6 @@ export default { download: { title: 'Download Me op je telefoon of tablet', description: - 'Download de Me-app via onderstaande app stores.
Klik hier om direct de juiste app store te openen op je telefoon of tablet.', + 'Download de Me-app via onderstaande app stores. Klik hier om direct de juiste app store te openen op je telefoon of tablet.', }, }; diff --git a/react/src/webshop/i18n/nl/pages/profile.mjs b/react/src/webshop/i18n/nl/pages/profile.mjs index 7c1f6633e..1cb2fa087 100644 --- a/react/src/webshop/i18n/nl/pages/profile.mjs +++ b/react/src/webshop/i18n/nl/pages/profile.mjs @@ -8,12 +8,19 @@ export default { personal: { title: 'Persoonsgegevens', bsn: 'BSN', + age: 'Leeftijd', }, account: { title: 'Accountgegevens', active_since: 'Actief sinds', last_login: 'Laatste inlog', + last_activity: 'Laatste handeling', + }, + household: { + title: 'Huishouden', + house_composition: 'Gezinssamenstelling', + living_arrangement: 'Leefvorm', }, contacts: { title: 'Contactgegevens aanpassen', diff --git a/react/src/webshop/i18n/nl/pages/reservation.mjs b/react/src/webshop/i18n/nl/pages/reservation.mjs index 01aa50143..16fc23b80 100644 --- a/react/src/webshop/i18n/nl/pages/reservation.mjs +++ b/react/src/webshop/i18n/nl/pages/reservation.mjs @@ -38,7 +38,7 @@ export default { status: 'Status', refunded: 'Terugbetaald', date: 'Datum', - mount: 'Zelf bijbetaal', + amount: 'Zelf bijbetaal', method: 'Methode', }, extra_amount_refund: { diff --git a/react/src/webshop/i18n/nl/pages/voucher.mjs b/react/src/webshop/i18n/nl/pages/voucher.mjs index ff4b9be0e..42f42dbaf 100644 --- a/react/src/webshop/i18n/nl/pages/voucher.mjs +++ b/react/src/webshop/i18n/nl/pages/voucher.mjs @@ -72,7 +72,7 @@ export default { cancel: 'Annuleren', stop_participation: 'Stop deelname', }, - voucher_card_combined: { + card_combined: { header: { title: 'Hoe werkt het?', }, @@ -97,6 +97,9 @@ export default { title: 'Activeer mijn pas', alt: "Fysieke pas: '{[ title ]}'", card_number: 'Pasnummer', + personal_date: 'Persoonsgegevens', + less_details: 'Verberg alle details', + more_details: 'Toon alle details', buttons: { reactivate: 'Activeer', lost_pass: 'Ik ben mijn pas kwijt', diff --git a/react/src/webshop/i18n/translated/ar.json b/react/src/webshop/i18n/translated/ar.json index b8c9dd83f..33f82edee 100644 --- a/react/src/webshop/i18n/translated/ar.json +++ b/react/src/webshop/i18n/translated/ar.json @@ -611,7 +611,6 @@ }, "preferences_emails": "إعدادات البريد الإلكتروني", "preferences_notifications": "تفضيلات الإخطار", - "records": "الملف الشخصي", "reimbursements": "استرداد التكاليف", "reservations": "الحجوزات", "schagen": { @@ -631,7 +630,8 @@ }, "winterswijk": { "funds": "تفعيل" - } + }, + "profile": "البيانات" }, "groningen": { "voucher": "بطاقة مدينتي" @@ -741,7 +741,8 @@ "security_2fa": "الأمن", "security_sessions": "الجلسات", "aria_label": "قائمة المستخدم", - "title": "شخصي" + "title": "شخصي", + "profile": "البيانات" }, "main_menu": "القائمة الرئيسية", "open_home": "العودة إلى الصفحة الرئيسية", @@ -752,6 +753,9 @@ "hartvanwestbrabant": "بدء التطبيق", "midden_drenthe": "تفعيل الائتمان", "potjeswijzer": "بدء التطبيق" + }, + "language": { + "prefix": "لغتك" } }, "week_days": { @@ -1075,8 +1079,8 @@ }, "description": "تطبيق Me هو عبارة عن محفظة رقمية وسجِّل نقدي في جهاز واحد. تستخدم البلديات تطبيق Me-app لإصدار الأرصدة. باستخدام التطبيق، يمكن للمقيمين إدارة أرصدتهم بسهولة. يستخدم مقدمو الخدمات التطبيق لمسح رموز QR.", "download": { - "description": "قم بتنزيل تطبيق Me من متاجر التطبيقات أدناه. انقر هنا لفتح متجر التطبيقات المناسب مباشرةً على هاتفك أو جهازك اللوحي.", - "title": "قم بتنزيل Me على هاتفك أو جهازك اللوحي" + "title": "قم بتنزيل Me على هاتفك أو جهازك اللوحي", + "description": "قم بتنزيل تطبيق Me من متاجر التطبيقات أدناه. انقر هنا لفتح متجر التطبيقات المناسب مباشرةً على هاتفك أو جهازك اللوحي." }, "title": "نبذة عن تطبيق Me", "img_alt": "أنا-التطبيق" @@ -1962,7 +1966,10 @@ "reactivate": "تفعيل" }, "card_number": "رقم المرور", - "title": "تفعيل بطاقتي" + "title": "تفعيل بطاقتي", + "less_details": "إخفاء جميع التفاصيل", + "more_details": "إظهار كل التفاصيل", + "personal_date": "البيانات الشخصية" }, "reimbursement": { "button": "إرسال القسيمة", @@ -2003,7 +2010,7 @@ "title": "المعاملات", "top_up": "ترقية" }, - "voucher_card_combined": { + "card_combined": { "header": { "title": "كيف تعمل؟" }, @@ -2477,7 +2484,8 @@ "account": { "active_since": "نشط منذ", "last_login": "آخر تسجيل دخول", - "title": "تفاصيل الحساب" + "title": "تفاصيل الحساب", + "last_activity": "الإجراء الأخير" }, "bank_accounts": { "title": "الحساب البنكي", @@ -2506,9 +2514,15 @@ }, "personal": { "bsn": "BSN", - "title": "البيانات الشخصية" - }, - "title": "البيانات" + "title": "البيانات الشخصية", + "age": "العمر" + }, + "title": "البيانات", + "household": { + "house_composition": "تكوين الأسرة", + "living_arrangement": "الشكل الحي", + "title": "الأسرة المعيشية" + } }, "reimbursements": { "breadcrumbs": { @@ -2625,9 +2639,9 @@ "extra_amount": { "date": "التاريخ", "method": "الطريقة", - "mount": "الدفع الذاتي", "refunded": "مستردة", - "status": "الحالة" + "status": "الحالة", + "amount": "الدفع الذاتي" }, "labels": { "cancel": "إلغاء", @@ -3016,7 +3030,6 @@ }, "description_formal": "سوف تستخدم رصيدك {{fund}}
رصيدك لهذا الحجز هل تقوم بالحجز؟ إذن أنت توافق على مشاركة بياناتك الشخصية مع مقدم الخدمة.", "description_formal_time": "{{ days_to_cancel }} لا يزال بإمكانك إلغاء الحجز في غضون أيام بعد تأكيد الحجز.", - "description_informal": "هل تستخدم رصيدك {{fund}}
رصيدك لهذا الحجز هل تقوم بالحجز؟ إذن أنت توافق على مشاركة بياناتك الشخصية مع مقدم الخدمة.", "description_informal_time": "{{ days_to_cancel }} لا يزال بإمكانك إلغاء الحجز في غضون أيام بعد تأكيد الحجز.", "email_setup_description": "أضف عنوان بريدك الإلكتروني لتلقي الرسائل.", "email_setup_title": "إضافة عنوان البريد الإلكتروني", @@ -3081,7 +3094,8 @@ "description": "تم إجراء الحجز الخاص بك.", "title": "لقد نجح الأمر!" }, - "voucher_image_alt": "الائتمان" + "voucher_image_alt": "الائتمان", + "description_informal": "يمكنك استخدام {{fund}} رصيدك لهذا الحجز.
هل تقوم بالحجز؟ إذن أنت توافق على مشاركة بياناتك الشخصية مع مقدم الخدمة." }, "modal": { "buttons": { diff --git a/react/src/webshop/i18n/translated/de.json b/react/src/webshop/i18n/translated/de.json index 6018844d4..baf7cb2b3 100644 --- a/react/src/webshop/i18n/translated/de.json +++ b/react/src/webshop/i18n/translated/de.json @@ -1314,8 +1314,8 @@ }, "description": "Die Me-App ist eine digitale Geldbörse und eine Registrierkasse in einem. Die Kommunen nutzen die Me-App, um Kredite zu vergeben. Mit der App können die Einwohner ihre Guthaben einfach verwalten. Anbieter nutzen die App, um QR-Codes zu scannen.", "download": { - "description": "Laden Sie die Me-App aus den unten stehenden App-Stores herunter. Klicken Sie hier, um den entsprechenden App-Store direkt auf Ihrem Telefon oder Tablet zu öffnen.", - "title": "Laden Sie Me auf Ihr Handy oder Tablet herunter" + "title": "Laden Sie Me auf Ihr Handy oder Tablet herunter", + "description": "Laden Sie die Me-App aus den unten stehenden App-Stores herunter. Klicken Sie hier, um den entsprechenden App-Store direkt auf Ihrem Telefon oder Tablet zu öffnen." }, "title": "Über die Me-App", "img_alt": "Me-app" @@ -1628,7 +1628,6 @@ }, "description_formal": "Sie verwenden Ihr {{fund}}
Guthaben für diese Reservierung verwenden. Buchen Sie eine Reservierung? Dann stimmen Sie zu, dass wir Ihre persönlichen Daten mit dem Anbieter teilen.", "description_formal_time": "{{ days_to_cancel }} Sie können die Reservierung noch innerhalb weniger Tage nach der Bestätigung stornieren.", - "description_informal": "Sie verwenden Ihr {{fund}}
Guthaben für diese Reservierung. Nehmen Sie eine Reservierung vor? Dann stimmen Sie zu, dass wir Ihre persönlichen Daten mit dem Anbieter teilen.", "description_informal_time": "{{ days_to_cancel }} Sie können die Reservierung noch innerhalb weniger Tage nach der Bestätigung stornieren.", "email_setup_description": "Fügen Sie Ihre E-Mail-Adresse hinzu, um Nachrichten zu erhalten.", "email_setup_title": "E-Mail Adresse hinzufügen", @@ -1693,7 +1692,8 @@ "description": "Ihre Reservierung wurde vorgenommen.", "title": "Es hat geklappt!" }, - "voucher_image_alt": "Kredit" + "voucher_image_alt": "Kredit", + "description_informal": "Sie verwenden Ihr {{fund}} Guthaben für diese Reservierung.
Sie nehmen eine Reservierung vor? Dann sind Sie damit einverstanden, dass wir Ihre persönlichen Daten mit dem Anbieter teilen." }, "modal": { "buttons": { @@ -2341,7 +2341,8 @@ "account": { "active_since": "Aktiv seit", "last_login": "Letzte Anmeldung", - "title": "Details zum Konto" + "title": "Details zum Konto", + "last_activity": "Letzte Aktion" }, "bank_accounts": { "title": "Bankkonto", @@ -2370,9 +2371,15 @@ }, "personal": { "bsn": "BSN", - "title": "Persönliche Daten" - }, - "title": "Daten" + "title": "Persönliche Daten", + "age": "Alter" + }, + "title": "Daten", + "household": { + "house_composition": "Zusammensetzung der Familie", + "living_arrangement": "Lebendige Form", + "title": "Haushalt" + } }, "provider_sign_up": { "breadcrumbs": { @@ -2676,9 +2683,9 @@ "extra_amount": { "date": "Datum", "method": "Methode", - "mount": "Selbstzahler", "refunded": "Erstattet", - "status": "Status" + "status": "Status", + "amount": "Selbstzahler" }, "labels": { "cancel": "Abbrechen", @@ -3028,7 +3035,6 @@ }, "preferences_emails": "E-Mail-Einstellungen", "preferences_notifications": "Einstellungen für Benachrichtigungen", - "records": "Profil", "reimbursements": "Kostendeckung", "reservations": "Reservierungen", "schagen": { @@ -3048,7 +3054,8 @@ }, "winterswijk": { "funds": "Aktivieren Sie" - } + }, + "profile": "Daten" }, "groningen": { "voucher": "Meine Stadtkarte" @@ -3158,7 +3165,8 @@ "security_2fa": "Sicherheit", "security_sessions": "Sitzungen", "aria_label": "Benutzermenü", - "title": "Persönlich" + "title": "Persönlich", + "profile": "Daten" }, "main_menu": "Hauptmenü", "open_home": "Zurück zur Hauptseite", @@ -3169,6 +3177,9 @@ "hartvanwestbrabant": "Anwendung starten", "midden_drenthe": "Kredit aktivieren", "potjeswijzer": "Anwendung starten" + }, + "language": { + "prefix": "Ihre Sprache:" } }, "voucher_printable": { @@ -3291,7 +3302,10 @@ "reactivate": "Aktivieren Sie" }, "card_number": "Pass-Nummer", - "title": "Meinen Pass aktivieren" + "title": "Meinen Pass aktivieren", + "less_details": "Alle Details ausblenden", + "more_details": "Alle Details anzeigen", + "personal_date": "Persönliche Daten" }, "reimbursement": { "button": "Coupon einreichen", @@ -3332,7 +3346,7 @@ "title": "Transaktionen", "top_up": "Verbessert" }, - "voucher_card_combined": { + "card_combined": { "header": { "title": "Wie funktioniert das?" }, @@ -3345,7 +3359,7 @@ "redirect_to": "Möchten Sie immer noch eine Erstattung beantragen?" }, "meedoenregeling_volwassenen_ww": { - "how_it_works": "Haben Sie Ausgaben getätigt, die unter diese Regelung fallen? Beantragen Sie die Erstattung Ihrer Ausgaben, indem Sie eine Quittung einsenden. Nach der Genehmigung erhalten Sie den Betrag auf Ihr persönliches Bankkonto.", + "how_it_works": "Haben Sie Ausgaben getätigt, die unter diese Regelung fallen? Beantragen Sie die Rückerstattung Ihrer Ausgaben, indem Sie eine Quittung einreichen. Nach der Genehmigung erhalten Sie den Betrag auf Ihr persönliches Bankkonto.", "redirect_to": "Kosten zurückfordern?" }, "redirect_to": "Möchten Sie immer noch eine Erstattung beantragen?" diff --git a/react/src/webshop/i18n/translated/en-US.json b/react/src/webshop/i18n/translated/en-US.json index d682d365e..dc944cd6e 100644 --- a/react/src/webshop/i18n/translated/en-US.json +++ b/react/src/webshop/i18n/translated/en-US.json @@ -207,7 +207,6 @@ }, "preferences_emails": "Email settings", "preferences_notifications": "Notification preferences", - "records": "Profile", "reimbursements": "Cost recovery", "reservations": "Reservations", "schagen": { @@ -227,7 +226,8 @@ }, "winterswijk": { "funds": "Activate" - } + }, + "profile": "Data" }, "groningen": { "voucher": "My City Pass" @@ -337,7 +337,8 @@ "security_2fa": "Security", "security_sessions": "Sessions", "aria_label": "User menu", - "title": "Personal" + "title": "Personal", + "profile": "Data" }, "main_menu": "Main menu", "open_home": "Back to main page", @@ -348,6 +349,9 @@ "hartvanwestbrabant": "Start application", "midden_drenthe": "Activate credit", "potjeswijzer": "Start application" + }, + "language": { + "prefix": "Your language:" } }, "auth_start": { @@ -1264,8 +1268,8 @@ }, "description": "The Me app is a digital wallet and cash register in one. Municipalities use the Me app to issue credits. The app allows residents to easily manage their balances. Providers use the app to scan QR codes.", "download": { - "description": "Download the Me app from the app stores below. Click here to directly open the appropriate app store on your phone or tablet.", - "title": "Download Me on your phone or tablet" + "title": "Download Me on your phone or tablet", + "description": "Download the Me app from the app stores below. Click here to directly open the appropriate app store on your phone or tablet." }, "title": "About the Me app", "img_alt": "Me-app" @@ -1613,7 +1617,10 @@ }, "title": "Activate my pass", "alt": "Physical pass: '{[ title ]}'", - "card_number": "Pass number" + "card_number": "Pass number", + "less_details": "Hide all details", + "more_details": "Show all details", + "personal_date": "Personal data" }, "share_voucher": { "buttons": { @@ -1637,25 +1644,6 @@ "reason_placeholder": "Message for provider", "close": "Close" }, - "voucher_card_combined": { - "header": { - "title": "How does it work?" - }, - "labels": { - "contact_sponsor": "Do you have any questions?", - "contact_sponsor_details": "If so, please contact us.", - "how_it_works": "We have received your application. You will receive a decision on your application within 8 weeks.", - "IIT": { - "how_it_works": "We have received your application. You will receive a decision on your application within 8 weeks.", - "redirect_to": "Do you still want to apply for reimbursement?" - }, - "meedoenregeling_volwassenen_ww": { - "how_it_works": "Have you incurred expenses that fall within this scheme? Reclaim your expenses by submitting a receipt. After approval, you will receive the amount in your personal bank account.", - "redirect_to": "Reclaim expenses?" - }, - "redirect_to": "Do you still want to apply for reimbursement?" - } - }, "breadcrumbs": { "home": "Home", "voucher": "{{ title }}", @@ -1726,6 +1714,25 @@ "expired": "Expired" }, "title": "Expenditures" + }, + "card_combined": { + "header": { + "title": "How does it work?" + }, + "labels": { + "contact_sponsor": "Do you have any questions?", + "contact_sponsor_details": "If so, please contact us.", + "how_it_works": "We have received your application. You will receive a decision on your application within 8 weeks.", + "IIT": { + "how_it_works": "We have received your application. You will receive a decision on your application within 8 weeks.", + "redirect_to": "Do you still want to apply for reimbursement?" + }, + "meedoenregeling_volwassenen_ww": { + "how_it_works": "Have you incurred expenses that fall within this scheme? Reclaim your expenses by submitting a receipt. After approval, you will receive the amount in your personal bank account.", + "redirect_to": "Reclaim expenses?" + }, + "redirect_to": "Do you still want to apply for reimbursement?" + } } }, "vouchers": { @@ -2182,7 +2189,8 @@ "account": { "active_since": "Active since", "last_login": "Last login", - "title": "Account information" + "title": "Account information", + "last_activity": "Final act" }, "bank_accounts": { "title": "Bank account", @@ -2211,9 +2219,15 @@ }, "personal": { "bsn": "BSN", - "title": "Personal data" - }, - "title": "Data" + "title": "Personal data", + "age": "Age" + }, + "title": "Data", + "household": { + "house_composition": "Family composition", + "living_arrangement": "Living Form", + "title": "Household" + } }, "reimbursements": { "breadcrumbs": { @@ -2758,9 +2772,9 @@ "extra_amount": { "date": "Date", "method": "Method", - "mount": "Self additional payment", "refunded": "Refunded", - "status": "Status" + "status": "Status", + "amount": "Self additional payment" }, "title": "Top-up data" }, @@ -3340,7 +3354,6 @@ }, "description_formal": "You use your {{fund}} credit for this reservation.
Are you placing a reservation? Then you agree that we share your personal information with the provider.", "description_formal_time": "You can still cancel the reservation within {{ days_to_cancel }} days after confirmation. ", - "description_informal": "You use your {{fund}} credit for this reservation.
Are you placing a reservation? Then you agree that we share your personal data with the provider.", "description_informal_time": "You can still cancel the reservation within {{ days_to_cancel }} days after confirmation.", "email_setup_description": "Add your email address to receive messages.", "email_setup_title": "Add email address", @@ -3405,7 +3418,8 @@ "description": "Your reservation has been made.", "title": "It worked!" }, - "voucher_image_alt": "Credit" + "voucher_image_alt": "Credit", + "description_informal": "You use your {{fund}} credit for this reservation.
Are you making a reservation? Then you agree that we share your personal data with the provider." }, "modal_logout": { "description_formal": "Are you sure you want to log out?", diff --git a/react/src/webshop/i18n/translated/fr.json b/react/src/webshop/i18n/translated/fr.json index 43494487e..43c232547 100644 --- a/react/src/webshop/i18n/translated/fr.json +++ b/react/src/webshop/i18n/translated/fr.json @@ -1314,8 +1314,8 @@ }, "description": "L'application Me est à la fois un portefeuille numérique et une caisse enregistreuse. Les municipalités utilisent l'application Me pour émettre des crédits. Grâce à l'application, les résidents peuvent facilement gérer leurs crédits. Les prestataires utilisent l'application pour scanner les codes QR.", "download": { - "description": "Téléchargez l'application Me via les magasins d'applications ci-dessous. Cliquez ici pour ouvrir directement le magasin d'applications approprié sur votre téléphone ou votre tablette.", - "title": "Téléchargez Me sur votre téléphone ou tablette" + "title": "Téléchargez Me sur votre téléphone ou tablette", + "description": "Téléchargez l'application Me dans les magasins d'applications ci-dessous. Cliquez ici pour ouvrir directement le magasin d'applications approprié sur votre téléphone ou votre tablette." }, "title": "À propos de l'application Me", "img_alt": "Me-app" @@ -1628,7 +1628,6 @@ }, "description_formal": "Vous utiliserez votre {{fund}}
Vous placez une réservation ? Dans ce cas, vous acceptez que nous partagions vos données personnelles avec le fournisseur.", "description_formal_time": "{{ days_to_cancel }} Vous pouvez encore annuler la réservation dans les jours qui suivent la confirmation.", - "description_informal": "Vous utilisez votre {{fund}}
Vous placez une réservation ? Dans ce cas, vous acceptez que nous partagions vos données personnelles avec le fournisseur.", "description_informal_time": "{{ days_to_cancel }} Vous pouvez encore annuler la réservation dans les jours qui suivent la confirmation.", "email_setup_description": "Ajoutez votre adresse e-mail pour recevoir les messages.", "email_setup_title": "Ajouter une adresse électronique", @@ -1693,7 +1692,8 @@ "description": "Votre réservation a été effectuée.", "title": "Cela a fonctionné !" }, - "voucher_image_alt": "Crédit" + "voucher_image_alt": "Crédit", + "description_informal": "Vous utilisez votre {{fund}} crédit pour cette réservation.
Vous effectuez une réservation ? Dans ce cas, vous acceptez que nous partagions vos données personnelles avec le fournisseur." }, "modal": { "buttons": { @@ -2341,7 +2341,8 @@ "account": { "active_since": "Actif depuis", "last_login": "Dernière connexion", - "title": "Détails du compte" + "title": "Détails du compte", + "last_activity": "Dernière action" }, "bank_accounts": { "title": "Compte bancaire", @@ -2370,9 +2371,15 @@ }, "personal": { "bsn": "BSN", - "title": "Données personnelles" - }, - "title": "Données" + "title": "Données personnelles", + "age": "L'âge" + }, + "title": "Données", + "household": { + "house_composition": "Composition de la famille", + "living_arrangement": "Forme vivante", + "title": "Ménage" + } }, "provider_sign_up": { "breadcrumbs": { @@ -2676,9 +2683,9 @@ "extra_amount": { "date": "Date", "method": "Méthode", - "mount": "Autofinancement", "refunded": "Remboursé", - "status": "Statut" + "status": "Statut", + "amount": "Autofinancement" }, "labels": { "cancel": "Annuler", @@ -3028,7 +3035,6 @@ }, "preferences_emails": "Paramètres du courrier électronique", "preferences_notifications": "Préférences de notification", - "records": "Profil", "reimbursements": "Recouvrement des coûts", "reservations": "Réservations", "schagen": { @@ -3048,7 +3054,8 @@ }, "winterswijk": { "funds": "Activer" - } + }, + "profile": "Données" }, "groningen": { "voucher": "Ma carte de ville" @@ -3158,7 +3165,8 @@ "security_2fa": "Sécurité", "security_sessions": "Sessions", "aria_label": "Menu utilisateur", - "title": "Personnel" + "title": "Personnel", + "profile": "Données" }, "main_menu": "Menu principal", "open_home": "Retour à la page principale", @@ -3169,6 +3177,9 @@ "hartvanwestbrabant": "Démarrer la demande", "midden_drenthe": "Activer le crédit", "potjeswijzer": "Démarrer la demande" + }, + "language": { + "prefix": "Votre langue :" } }, "voucher_printable": { @@ -3291,7 +3302,10 @@ "reactivate": "Activer" }, "card_number": "Numéro de passage", - "title": "Activer mon pass" + "title": "Activer mon pass", + "less_details": "Cacher tous les détails", + "more_details": "Afficher tous les détails", + "personal_date": "Données personnelles" }, "reimbursement": { "button": "Soumettre un coupon", @@ -3332,7 +3346,7 @@ "title": "Transactions", "top_up": "Mise à niveau" }, - "voucher_card_combined": { + "card_combined": { "header": { "title": "Comment cela fonctionne-t-il ?" }, diff --git a/react/src/webshop/i18n/translated/pl.json b/react/src/webshop/i18n/translated/pl.json index 4f15f3542..22133eca5 100644 --- a/react/src/webshop/i18n/translated/pl.json +++ b/react/src/webshop/i18n/translated/pl.json @@ -1314,8 +1314,8 @@ }, "description": "Aplikacja Me to cyfrowy portfel i kasa fiskalna w jednym. Gminy używają aplikacji Me do wydawania kredytów. Dzięki aplikacji mieszkańcy mogą łatwo zarządzać swoimi kredytami. Dostawcy używają aplikacji do skanowania kodów QR.", "download": { - "description": "Pobierz aplikację Me z poniższych sklepów z aplikacjami. Kliknij tutaj, aby bezpośrednio otworzyć odpowiedni sklep z aplikacjami na telefonie lub tablecie.", - "title": "Pobierz aplikację Me na swój telefon lub tablet" + "title": "Pobierz aplikację Me na swój telefon lub tablet", + "description": "Pobierz aplikację Me z poniższych sklepów z aplikacjami. Kliknij tutaj, aby bezpośrednio otworzyć odpowiedni sklep z aplikacjami na telefonie lub tablecie." }, "title": "Informacje o aplikacji Me", "img_alt": "Me-app" @@ -1628,7 +1628,6 @@ }, "description_formal": "Wykorzystasz swój {{fund}}
Czy dokonujesz rezerwacji? W takim przypadku zgadzasz się na udostępnienie przez nas Twoich danych osobowych dostawcy.", "description_formal_time": "{{ days_to_cancel }} Rezerwację można anulować w ciągu kilku dni od jej potwierdzenia.", - "description_informal": "Używasz swojego {{fund}}
Czy dokonujesz rezerwacji? W takim przypadku zgadzasz się, że udostępniamy Twoje dane osobowe dostawcy.", "description_informal_time": "{{ days_to_cancel }} Rezerwację można anulować w ciągu kilku dni od jej potwierdzenia.", "email_setup_description": "Dodaj swój adres e-mail, aby otrzymywać wiadomości.", "email_setup_title": "Dodaj adres e-mail", @@ -1693,7 +1692,8 @@ "description": "Rezerwacja została dokonana.", "title": "Udało się!" }, - "voucher_image_alt": "Kredyt" + "voucher_image_alt": "Kredyt", + "description_informal": "Używasz swojego {{fund}} kredyt na tę rezerwację.
Dokonujesz rezerwacji? W takim razie zgadzasz się, że udostępniamy Twoje dane osobowe dostawcy." }, "modal": { "buttons": { @@ -2341,7 +2341,8 @@ "account": { "active_since": "Aktywny od", "last_login": "Ostatnie logowanie", - "title": "Szczegóły konta" + "title": "Szczegóły konta", + "last_activity": "Ostatnia akcja" }, "bank_accounts": { "title": "Konto bankowe", @@ -2370,9 +2371,15 @@ }, "personal": { "bsn": "BSN", - "title": "Dane osobowe" - }, - "title": "Dane" + "title": "Dane osobowe", + "age": "Wiek" + }, + "title": "Dane", + "household": { + "house_composition": "Skład rodziny", + "living_arrangement": "Żywa forma", + "title": "Gospodarstwo domowe" + } }, "provider_sign_up": { "breadcrumbs": { @@ -2676,9 +2683,9 @@ "extra_amount": { "date": "Data", "method": "Metoda", - "mount": "Płatność własna", "refunded": "Zwrócone", - "status": "Status" + "status": "Status", + "amount": "Płatność własna" }, "labels": { "cancel": "Anuluj", @@ -3028,7 +3035,6 @@ }, "preferences_emails": "Ustawienia poczty e-mail", "preferences_notifications": "Preferencje powiadomień", - "records": "Profil", "reimbursements": "Zwrot kosztów", "reservations": "Rezerwacje", "schagen": { @@ -3048,7 +3054,8 @@ }, "winterswijk": { "funds": "Aktywuj" - } + }, + "profile": "Dane" }, "groningen": { "voucher": "Moja karta miejska" @@ -3158,7 +3165,8 @@ "security_2fa": "Bezpieczeństwo", "security_sessions": "Sesje", "aria_label": "Menu użytkownika", - "title": "Osobiste" + "title": "Osobiste", + "profile": "Dane" }, "main_menu": "Menu główne", "open_home": "Powrót do strony głównej", @@ -3169,6 +3177,9 @@ "hartvanwestbrabant": "Rozpoczęcie aplikacji", "midden_drenthe": "Aktywacja kredytu", "potjeswijzer": "Rozpoczęcie aplikacji" + }, + "language": { + "prefix": "Twój język:" } }, "voucher_printable": { @@ -3291,7 +3302,10 @@ "reactivate": "Aktywuj" }, "card_number": "Numer przepustki", - "title": "Aktywuj moją przepustkę" + "title": "Aktywuj moją przepustkę", + "less_details": "Ukryj wszystkie szczegóły", + "more_details": "Pokaż wszystkie szczegóły", + "personal_date": "Dane osobowe" }, "reimbursement": { "button": "Prześlij kupon", @@ -3332,7 +3346,7 @@ "title": "Transakcje", "top_up": "Ulepszony" }, - "voucher_card_combined": { + "card_combined": { "header": { "title": "Jak to działa?" }, diff --git a/react/src/webshop/i18n/translated/ru.json b/react/src/webshop/i18n/translated/ru.json index c1f4e4168..24a1b487c 100644 --- a/react/src/webshop/i18n/translated/ru.json +++ b/react/src/webshop/i18n/translated/ru.json @@ -1314,8 +1314,8 @@ }, "description": "Приложение Me - это цифровой кошелек и кассовый аппарат в одном лице. Муниципалитеты используют Me-приложение для выдачи кредитов. С помощью приложения жители могут легко управлять своими кредитами. Поставщики услуг используют приложение для сканирования QR-кодов.", "download": { - "description": "Загрузите приложение Me из указанных ниже магазинов приложений. Нажмите здесь, чтобы открыть соответствующий магазин приложений на вашем телефоне или планшете.", - "title": "Загрузите меня на свой телефон или планшет" + "title": "Загрузите меня на свой телефон или планшет", + "description": "Загрузите приложение Me из указанных ниже магазинов приложений. Нажмите здесь, чтобы открыть соответствующий магазин приложений на вашем телефоне или планшете." }, "title": "О приложении \"Я", "img_alt": "Me-app" @@ -1628,7 +1628,6 @@ }, "description_formal": "Вы используете свой {{fund}}
кредит для этого бронирования. Вы бронируете номер? Тогда вы соглашаетесь с тем, что мы передаем ваши личные данные поставщику услуг.", "description_formal_time": "{{ days_to_cancel }} Вы все еще можете отменить бронирование в течение нескольких дней после подтверждения.", - "description_informal": "Вы используете свой {{fund}}
кредит для этого бронирования. Вы бронируете? Тогда вы соглашаетесь с тем, что мы передаем ваши личные данные поставщику услуг.", "description_informal_time": "{{ days_to_cancel }} Вы все еще можете отменить бронирование в течение нескольких дней после подтверждения.", "email_setup_description": "Добавьте свой адрес электронной почты для получения сообщений.", "email_setup_title": "Добавить адрес электронной почты", @@ -1693,7 +1692,8 @@ "description": "Ваша бронь сделана.", "title": "Это сработало!" }, - "voucher_image_alt": "Кредит" + "voucher_image_alt": "Кредит", + "description_informal": "Вы используете свой {{fund}} Кредит для этого бронирования.
Вы бронируете? Тогда вы соглашаетесь с тем, что мы передаем ваши личные данные поставщику услуг." }, "modal": { "buttons": { @@ -2341,7 +2341,8 @@ "account": { "active_since": "Активно работает с", "last_login": "Последний вход в систему", - "title": "Детали счета" + "title": "Детали счета", + "last_activity": "Последнее действие" }, "bank_accounts": { "title": "Банковский счет", @@ -2370,9 +2371,15 @@ }, "personal": { "bsn": "BSN", - "title": "Персональные данные" - }, - "title": "Данные" + "title": "Персональные данные", + "age": "Возраст" + }, + "title": "Данные", + "household": { + "house_composition": "Состав семьи", + "living_arrangement": "Живая форма", + "title": "Домашнее хозяйство" + } }, "provider_sign_up": { "breadcrumbs": { @@ -2676,9 +2683,9 @@ "extra_amount": { "date": "Дата", "method": "Метод", - "mount": "Самостоятельная оплата", "refunded": "Возмещено", - "status": "Статус" + "status": "Статус", + "amount": "Самостоятельная оплата" }, "labels": { "cancel": "Отмена", @@ -3028,7 +3035,6 @@ }, "preferences_emails": "Настройки электронной почты", "preferences_notifications": "Параметры уведомлений", - "records": "Профиль", "reimbursements": "Возмещение затрат", "reservations": "Бронирование", "schagen": { @@ -3048,7 +3054,8 @@ }, "winterswijk": { "funds": "Активируйте" - } + }, + "profile": "Данные" }, "groningen": { "voucher": "Карта моего города" @@ -3158,7 +3165,8 @@ "security_2fa": "Безопасность", "security_sessions": "Сессии", "aria_label": "Меню пользователя", - "title": "Личный" + "title": "Личный", + "profile": "Данные" }, "main_menu": "Главное меню", "open_home": "Назад к главной странице", @@ -3169,6 +3177,9 @@ "hartvanwestbrabant": "Начать применение", "midden_drenthe": "Активировать кредит", "potjeswijzer": "Начать применение" + }, + "language": { + "prefix": "Ваш язык:" } }, "voucher_printable": { @@ -3291,7 +3302,10 @@ "reactivate": "Активируйте" }, "card_number": "Номер пропуска", - "title": "Активируйте мой пропуск" + "title": "Активируйте мой пропуск", + "less_details": "Скрыть все детали", + "more_details": "Показать все детали", + "personal_date": "Персональные данные" }, "reimbursement": { "button": "Отправить купон", @@ -3332,7 +3346,7 @@ "title": "Транзакции", "top_up": "Обновленный" }, - "voucher_card_combined": { + "card_combined": { "header": { "title": "Как это работает?" }, diff --git a/react/src/webshop/i18n/translated/tr.json b/react/src/webshop/i18n/translated/tr.json index cdfecf421..6ea56c1b6 100644 --- a/react/src/webshop/i18n/translated/tr.json +++ b/react/src/webshop/i18n/translated/tr.json @@ -611,7 +611,6 @@ }, "preferences_emails": "E-posta ayarları", "preferences_notifications": "Bildirim tercihleri", - "records": "Profil", "reimbursements": "Maliyet geri kazanımı", "reservations": "Rezervasyonlar", "schagen": { @@ -631,7 +630,8 @@ }, "winterswijk": { "funds": "Etkinleştir" - } + }, + "profile": "Veri" }, "groningen": { "voucher": "Şehir Kartım" @@ -741,7 +741,8 @@ "security_2fa": "Güvenlik", "security_sessions": "Oturumlar", "aria_label": "Kullanıcı menüsü", - "title": "Kişisel" + "title": "Kişisel", + "profile": "Veri" }, "main_menu": "Ana menü", "open_home": "Ana sayfaya geri dön", @@ -752,6 +753,9 @@ "hartvanwestbrabant": "Uygulamayı başlat", "midden_drenthe": "Krediyi etkinleştirin", "potjeswijzer": "Uygulamayı başlat" + }, + "language": { + "prefix": "Senin dilin:" } }, "week_days": { @@ -1031,8 +1035,8 @@ }, "description": "Me uygulaması dijital bir cüzdan ve yazar kasadır. Belediyeler kredi vermek için Me-uygulamasını kullanmaktadır. Uygulama sayesinde vatandaşlar kredilerini kolayca yönetebilir. Sağlayıcılar QR kodlarını taramak için uygulamayı kullanır.", "download": { - "description": "Me uygulamasını aşağıdaki uygulama mağazalarından indirin. Telefonunuzda veya tabletinizde ilgili uygulama mağazasını doğrudan açmak için buraya tıklayın.", - "title": "Beni telefonunuza veya tabletinize indirin" + "title": "Beni telefonunuza veya tabletinize indirin", + "description": "Me uygulamasını aşağıdaki uygulama mağazalarından indirin. Telefonunuzda veya tabletinizde ilgili uygulama mağazasını doğrudan açmak için buraya tıklayın." }, "title": "Me uygulaması hakkında", "img_alt": "Me-app" @@ -1962,7 +1966,10 @@ "reactivate": "Etkinleştir" }, "card_number": "Geçiş numarası", - "title": "Geçiş kartımı etkinleştir" + "title": "Geçiş kartımı etkinleştir", + "less_details": "Tüm detayları gizle", + "more_details": "Tüm detayları göster", + "personal_date": "Kişisel veriler" }, "reimbursement": { "button": "Kupon gönder", @@ -2003,7 +2010,7 @@ "title": "İşlemler", "top_up": "Yükseltilmiş" }, - "voucher_card_combined": { + "card_combined": { "header": { "title": "Nasıl çalışıyor?" }, @@ -2477,7 +2484,8 @@ "account": { "active_since": "O zamandan beri aktif", "last_login": "Son giriş", - "title": "Hesap bilgileri" + "title": "Hesap bilgileri", + "last_activity": "Son eylem" }, "bank_accounts": { "title": "Banka hesabı", @@ -2506,9 +2514,15 @@ }, "personal": { "bsn": "BSN", - "title": "Kişisel veriler" - }, - "title": "Veri" + "title": "Kişisel veriler", + "age": "Yaş" + }, + "title": "Veri", + "household": { + "house_composition": "Aile yapısı", + "living_arrangement": "Yaşayan form", + "title": "Hane halkı" + } }, "reimbursements": { "breadcrumbs": { @@ -2625,9 +2639,9 @@ "extra_amount": { "date": "Tarih", "method": "Yöntem", - "mount": "Kendi kendine ödeme", "refunded": "İade Edildi", - "status": "Durum" + "status": "Durum", + "amount": "Kendi kendine ödeme" }, "labels": { "cancel": "İptal", @@ -3016,7 +3030,6 @@ }, "description_formal": "Sen kullanacaksın {{fund}}
Bu rezervasyon için kredi. Rezervasyon mu yapıyorsunuz? O zaman kişisel verilerinizi sağlayıcı ile paylaşmamızı kabul etmiş olursunuz.", "description_formal_time": "{{ days_to_cancel }} Rezervasyonu onaylandıktan sonraki günler içinde de iptal edebilirsiniz.", - "description_informal": "Sen kendi {{fund}}
Bu rezervasyon için kredi. Rezervasyon mu yapıyorsunuz? O zaman kişisel verilerinizi sağlayıcı ile paylaşmamızı kabul etmiş olursunuz.", "description_informal_time": "{{ days_to_cancel }} Rezervasyonu onaylandıktan sonraki günler içinde de iptal edebilirsiniz.", "email_setup_description": "Mesaj almak için e-posta adresinizi ekleyin.", "email_setup_title": "E-posta adresi ekle", @@ -3081,7 +3094,8 @@ "description": "Rezervasyonunuz yapılmıştır.", "title": "İşe yaradı!" }, - "voucher_image_alt": "Kredi" + "voucher_image_alt": "Kredi", + "description_informal": "Sen kendi {{fund}} Bu rezervasyon için kredi.
Rezervasyon mu yapıyorsunuz? O zaman kişisel verilerinizi sağlayıcı ile paylaşmamızı kabul etmiş olursunuz." }, "modal": { "buttons": { diff --git a/react/src/webshop/i18n/translated/uk.json b/react/src/webshop/i18n/translated/uk.json index 7bcc02b0f..961daf05d 100644 --- a/react/src/webshop/i18n/translated/uk.json +++ b/react/src/webshop/i18n/translated/uk.json @@ -1314,8 +1314,8 @@ }, "description": "Додаток Me - це цифровий гаманець і касовий апарат в одному. Муніципалітети використовують додаток Me для видачі кредитів. За допомогою додатку мешканці можуть легко керувати своїми кредитами. Постачальники використовують додаток для сканування QR-кодів.", "download": { - "description": "Завантажте додаток Me з наведених нижче магазинів додатків. Натисніть тут, щоб безпосередньо відкрити відповідний магазин додатків на вашому телефоні або планшеті.", - "title": "Завантажте Мене на телефон або планшет" + "title": "Завантажте Мене на телефон або планшет", + "description": "Завантажте додаток Me із зазначених нижче магазинів додатків. Натисніть тут, щоб безпосередньо відкрити відповідний магазин додатків на вашому телефоні або планшеті." }, "title": "Про додаток \"Я", "img_alt": "Me-app" @@ -1628,7 +1628,6 @@ }, "description_formal": "Ви використаєте свій {{fund}}
кредит для цього бронювання. Ви робите бронювання? Тоді ви погоджуєтесь, що ми передаємо ваші персональні дані постачальнику.", "description_formal_time": "{{ days_to_cancel }} Ви все ще можете скасувати бронювання протягом декількох днів після підтвердження.", - "description_informal": "Ви використовуєте свій {{fund}}
Ви використовуєте свій кредит для цього бронювання. Ви робите бронювання? Тоді ви погоджуєтесь, що ми передаємо ваші персональні дані постачальнику.", "description_informal_time": "{{ days_to_cancel }} Ви все ще можете скасувати бронювання протягом декількох днів після підтвердження.", "email_setup_description": "Додайте свою електронну адресу, щоб отримувати повідомлення.", "email_setup_title": "Додати адресу електронної пошти", @@ -1693,7 +1692,8 @@ "description": "Ваше бронювання зроблено.", "title": "Спрацювало!" }, - "voucher_image_alt": "Кредит" + "voucher_image_alt": "Кредит", + "description_informal": "Ви використовуєте свій {{fund}} кредит для цього бронювання.
Здійснюєте бронювання? Тоді ви погоджуєтесь, що ми передаємо ваші персональні дані постачальнику послуг." }, "modal": { "buttons": { @@ -2341,7 +2341,8 @@ "account": { "active_since": "Активний з", "last_login": "Останній вхід", - "title": "Реквізити рахунку" + "title": "Реквізити рахунку", + "last_activity": "Остання дія" }, "bank_accounts": { "title": "Банківський рахунок", @@ -2370,9 +2371,15 @@ }, "personal": { "bsn": "BSN", - "title": "Персональні дані" - }, - "title": "Дані" + "title": "Персональні дані", + "age": "Вік" + }, + "title": "Дані", + "household": { + "house_composition": "Склад сім'ї", + "living_arrangement": "Жива форма", + "title": "Домогосподарство" + } }, "provider_sign_up": { "breadcrumbs": { @@ -2676,9 +2683,9 @@ "extra_amount": { "date": "Дата", "method": "Метод", - "mount": "Самостійна оплата", "refunded": "Відшкодовано", - "status": "Статус" + "status": "Статус", + "amount": "Самостійна оплата" }, "labels": { "cancel": "Скасувати", @@ -3028,7 +3035,6 @@ }, "preferences_emails": "Налаштування електронної пошти", "preferences_notifications": "Налаштування сповіщень", - "records": "Профіль", "reimbursements": "Відшкодування витрат", "reservations": "Бронювання", "schagen": { @@ -3048,7 +3054,8 @@ }, "winterswijk": { "funds": "Активувати" - } + }, + "profile": "Дані" }, "groningen": { "voucher": "Моя міська картка" @@ -3158,7 +3165,8 @@ "security_2fa": "Безпека", "security_sessions": "Сесії", "aria_label": "Меню користувача", - "title": "Особисте" + "title": "Особисте", + "profile": "Дані" }, "main_menu": "Головне меню", "open_home": "Повернутися на головну сторінку", @@ -3169,6 +3177,9 @@ "hartvanwestbrabant": "Запустити програму", "midden_drenthe": "Активувати кредит", "potjeswijzer": "Запустити програму" + }, + "language": { + "prefix": "Твоя мова:" } }, "voucher_printable": { @@ -3291,7 +3302,10 @@ "reactivate": "Активувати" }, "card_number": "Номер пропуску", - "title": "Активуйте мій пропуск" + "title": "Активуйте мій пропуск", + "less_details": "Приховати всі деталі", + "more_details": "Показати всі деталі", + "personal_date": "Персональні дані" }, "reimbursement": { "button": "Надіслати купон", @@ -3332,7 +3346,7 @@ "title": "Транзакції", "top_up": "Оновлений" }, - "voucher_card_combined": { + "card_combined": { "header": { "title": "Як це працює?" }, diff --git a/translations/cache/cache.json b/translations/cache/cache.json index b1a3a8f27..1949663fa 100644 --- a/translations/cache/cache.json +++ b/translations/cache/cache.json @@ -3561,7 +3561,7 @@ ], [ "me.download.description", - "Download de Me-app via onderstaande app stores. Klik hier om direct de juiste app store te openen op je telefoon of tablet." + "Download de Me-app via onderstaande app stores. Klik hier om direct de juiste app store te openen op je telefoon of tablet." ], [ "me.download.title", @@ -4421,7 +4421,7 @@ ], [ "modal_reserve_product.description_informal", - "Je gebruikt jouw {{fund}} tegoed voor deze reservering.
Plaatst je een reservering? Dan gaat je ermee akkoord dat wij je persoonlijke gegevens delen met de aanbieder." + "Je gebruikt jouw {{fund}} tegoed voor deze reservering.
Plaats je een reservering? Dan ga je ermee akkoord dat wij je persoonlijke gegevens delen met de aanbieder." ], [ "modal_reserve_product.description_informal_time", @@ -6347,6 +6347,10 @@ "profile.account.active_since", "Actief sinds" ], + [ + "profile.account.last_activity", + "Laatste handeling" + ], [ "profile.account.last_login", "Laatste inlog" @@ -6423,6 +6427,22 @@ "profile.history.you", "jou" ], + [ + "profile.household.house_composition", + "Gezinssamenstelling" + ], + [ + "profile.household.living_arrangement", + "Leefvorm" + ], + [ + "profile.household.title", + "Huishouden" + ], + [ + "profile.personal.age", + "Leeftijd" + ], [ "profile.personal.bsn", "BSN" @@ -7207,6 +7227,10 @@ "reservation.extra_amount_refund.title", "Details van terugbetaling" ], + [ + "reservation.extra_amount.amount", + "Zelf bijbetaal" + ], [ "reservation.extra_amount.date", "Datum" @@ -7215,10 +7239,6 @@ "reservation.extra_amount.method", "Methode" ], - [ - "reservation.extra_amount.mount", - "Zelf bijbetaal" - ], [ "reservation.extra_amount.refunded", "Terugbetaald" @@ -8024,8 +8044,8 @@ "Notificatievoorkeuren" ], [ - "top_navbar.buttons.mobile.dropdown.records", - "Profiel" + "top_navbar.buttons.mobile.dropdown.profile", + "Gegevens" ], [ "top_navbar.buttons.mobile.dropdown.reimbursements", @@ -8247,6 +8267,10 @@ "top_navbar.items.westerkwartier.funds", "Potjes" ], + [ + "top_navbar.language.prefix", + "Uw taal:" + ], [ "top_navbar.main_menu", "Hoofdmenu" @@ -8323,6 +8347,10 @@ "top_navbar.user_menu.preferences_notifications", "Notificatievoorkeuren" ], + [ + "top_navbar.user_menu.profile", + "Gegevens" + ], [ "top_navbar.user_menu.providers", "Aanbieders" @@ -8419,6 +8447,42 @@ "voucher.buttons.send", "E-mail naar mij" ], + [ + "voucher.card_combined.header.title", + "Hoe werkt het?" + ], + [ + "voucher.card_combined.labels.contact_sponsor", + "Heeft u vragen?" + ], + [ + "voucher.card_combined.labels.contact_sponsor_details", + "Neem dan contact met ons op." + ], + [ + "voucher.card_combined.labels.how_it_works", + "Wij hebben uw aanvraag ontvangen. U ontvangt binnen 8 weken een beslissing op uw aanvraag." + ], + [ + "voucher.card_combined.labels.IIT.how_it_works", + "Wij hebben uw aanvraag ontvangen. U ontvangt binnen 8 weken een beslissing op uw aanvraag." + ], + [ + "voucher.card_combined.labels.IIT.redirect_to", + "Wilt u nog een vergoeding aanvragen?" + ], + [ + "voucher.card_combined.labels.meedoenregeling_volwassenen_ww.how_it_works", + "Heeft u kosten gemaakt die binnen deze regeling vallen? Vraag uw kosten terug door een bon in te sturen. Na goedkeuring ontvangt u het bedrag op uw persoonlijke bankrekening." + ], + [ + "voucher.card_combined.labels.meedoenregeling_volwassenen_ww.redirect_to", + "Kosten terugvragen?" + ], + [ + "voucher.card_combined.labels.redirect_to", + "Wilt u nog een vergoeding aanvragen?" + ], [ "voucher.card.activate_my_pass", "Activeer mijn pas" @@ -8627,6 +8691,18 @@ "voucher.physical_card.card_number", "Pasnummer" ], + [ + "voucher.physical_card.less_details", + "Verberg alle details" + ], + [ + "voucher.physical_card.more_details", + "Toon alle details" + ], + [ + "voucher.physical_card.personal_date", + "Persoonsgegevens" + ], [ "voucher.physical_card.title", "Activeer mijn pas" @@ -8731,42 +8807,6 @@ "voucher.transactions.top_up", "Opgewaardeerd" ], - [ - "voucher.voucher_card_combined.header.title", - "Hoe werkt het?" - ], - [ - "voucher.voucher_card_combined.labels.contact_sponsor", - "Heeft u vragen?" - ], - [ - "voucher.voucher_card_combined.labels.contact_sponsor_details", - "Neem dan contact met ons op." - ], - [ - "voucher.voucher_card_combined.labels.how_it_works", - "Wij hebben uw aanvraag ontvangen. U ontvangt binnen 8 weken een beslissing op uw aanvraag." - ], - [ - "voucher.voucher_card_combined.labels.IIT.how_it_works", - "Wij hebben uw aanvraag ontvangen. U ontvangt binnen 8 weken een beslissing op uw aanvraag." - ], - [ - "voucher.voucher_card_combined.labels.IIT.redirect_to", - "Wilt u nog een vergoeding aanvragen?" - ], - [ - "voucher.voucher_card_combined.labels.meedoenregeling_volwassenen_ww.how_it_works", - "Heeft u kosten gemaakt die binnen deze regeling vallen? Vraag uw kosten terug door een bon in te sturen. Na goedkeuring ontvangt u het bedrag op uw persoonlijke bankrekening." - ], - [ - "voucher.voucher_card_combined.labels.meedoenregeling_volwassenen_ww.redirect_to", - "Kosten terugvragen?" - ], - [ - "voucher.voucher_card_combined.labels.redirect_to", - "Wilt u nog een vergoeding aanvragen?" - ], [ "vouchers.breadcrumbs.home", "Home"