all repos — caroster @ fbc9e225b5270c61549fce0c2fd4c1c1faa05e48

[Octree] Group carpool to your event https://caroster.io

feat: :globe_with_meridians: Add german translation

#536
Tim Izzo tim@octree.ch
Wed, 21 Aug 2024 13:37:54 +0200
commit

fbc9e225b5270c61549fce0c2fd4c1c1faa05e48

parent

319a37b5975c4983a15f2c9184558c81cee2fca9

M backend/src/api/event/content-types/event/schema.jsonbackend/src/api/event/content-types/event/schema.json

@@ -25,6 +25,7 @@ "type": "enumeration",

"enum": [ "fr", "en", + "de", "nl" ], "default": "en"
M backend/src/extensions/users-permissions/content-types/user/schema.jsonbackend/src/extensions/users-permissions/content-types/user/schema.json

@@ -102,6 +102,7 @@ "type": "enumeration",

"enum": [ "fr", "en", + "de", "nl" ], "default": "fr"
M backend/types/generated/contentTypes.d.tsbackend/types/generated/contentTypes.d.ts

@@ -790,7 +790,8 @@ firstName: Attribute.String;

lastName: Attribute.String; onboardingUser: Attribute.Boolean & Attribute.DefaultTo<false>; onboardingCreator: Attribute.Boolean & Attribute.DefaultTo<false>; - lang: Attribute.Enumeration<['fr', 'en', 'nl']> & Attribute.DefaultTo<'fr'>; + lang: Attribute.Enumeration<['fr', 'en', 'de', 'nl']> & + Attribute.DefaultTo<'fr'>; newsletterConsent: Attribute.Boolean & Attribute.DefaultTo<false>; notificationEnabled: Attribute.Boolean & Attribute.DefaultTo<true>; notifications: Attribute.Relation<

@@ -831,7 +832,8 @@ };

attributes: { name: Attribute.String & Attribute.Required; email: Attribute.String & Attribute.Required; - lang: Attribute.Enumeration<['fr', 'en', 'nl']> & Attribute.DefaultTo<'en'>; + lang: Attribute.Enumeration<['fr', 'en', 'de', 'nl']> & + Attribute.DefaultTo<'en'>; date: Attribute.Date; address: Attribute.Text; position: Attribute.JSON;
M frontend/README.mdfrontend/README.md

@@ -81,3 +81,13 @@

## Standalone This is pre-configured to be installed in a repo with a backend code as parent with React and React DOM (Strapi). If you want to install it out of a Strapi installation, you need to remove `peerDependencies` in `package.json` and add `react` and `react-dom` to `dependencies` modules. + +## Add new language + +- Add JSON file with locales in `frontend/locales` +- Import corresponding moment locales in `frontend/hooks/useLocale.ts` +- Add language key to `locales` field in `frontend/next-i18next.config.js` +- Add language key to `lang` field in `backend/src/api/event/content-types/event/schema.json` +- Add language key to `lang` field in `backend/src/extensions/users-permissions/content-types/user/schema.json` +- Add `PROTECTED.languages.<lang>: <Lang label>` in `frontend/locales/en.json` (See existing keys) +- (Re)start backend and run `yarn gql` from frontend directory
M frontend/generated/graphql.tsxfrontend/generated/graphql.tsx

@@ -47,107 +47,6 @@ or?: InputMaybe<Array<InputMaybe<Scalars['Boolean']['input']>>>;

startsWith?: InputMaybe<Scalars['Boolean']['input']>; }; -export type ContentReleasesRelease = { - __typename?: 'ContentReleasesRelease'; - actions?: Maybe<ContentReleasesReleaseActionRelationResponseCollection>; - createdAt?: Maybe<Scalars['DateTime']['output']>; - name: Scalars['String']['output']; - releasedAt?: Maybe<Scalars['DateTime']['output']>; - updatedAt?: Maybe<Scalars['DateTime']['output']>; -}; - - -export type ContentReleasesReleaseActionsArgs = { - filters?: InputMaybe<ContentReleasesReleaseActionFiltersInput>; - pagination?: InputMaybe<PaginationArg>; - sort?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>; -}; - -export type ContentReleasesReleaseAction = { - __typename?: 'ContentReleasesReleaseAction'; - contentType: Scalars['String']['output']; - createdAt?: Maybe<Scalars['DateTime']['output']>; - entry?: Maybe<GenericMorph>; - release?: Maybe<ContentReleasesReleaseEntityResponse>; - type: Enum_Contentreleasesreleaseaction_Type; - updatedAt?: Maybe<Scalars['DateTime']['output']>; -}; - -export type ContentReleasesReleaseActionEntity = { - __typename?: 'ContentReleasesReleaseActionEntity'; - attributes?: Maybe<ContentReleasesReleaseAction>; - id?: Maybe<Scalars['ID']['output']>; -}; - -export type ContentReleasesReleaseActionEntityResponse = { - __typename?: 'ContentReleasesReleaseActionEntityResponse'; - data?: Maybe<ContentReleasesReleaseActionEntity>; -}; - -export type ContentReleasesReleaseActionEntityResponseCollection = { - __typename?: 'ContentReleasesReleaseActionEntityResponseCollection'; - data: Array<ContentReleasesReleaseActionEntity>; - meta: ResponseCollectionMeta; -}; - -export type ContentReleasesReleaseActionFiltersInput = { - and?: InputMaybe<Array<InputMaybe<ContentReleasesReleaseActionFiltersInput>>>; - contentType?: InputMaybe<StringFilterInput>; - createdAt?: InputMaybe<DateTimeFilterInput>; - id?: InputMaybe<IdFilterInput>; - not?: InputMaybe<ContentReleasesReleaseActionFiltersInput>; - or?: InputMaybe<Array<InputMaybe<ContentReleasesReleaseActionFiltersInput>>>; - release?: InputMaybe<ContentReleasesReleaseFiltersInput>; - type?: InputMaybe<StringFilterInput>; - updatedAt?: InputMaybe<DateTimeFilterInput>; -}; - -export type ContentReleasesReleaseActionInput = { - contentType?: InputMaybe<Scalars['String']['input']>; - release?: InputMaybe<Scalars['ID']['input']>; - type?: InputMaybe<Enum_Contentreleasesreleaseaction_Type>; -}; - -export type ContentReleasesReleaseActionRelationResponseCollection = { - __typename?: 'ContentReleasesReleaseActionRelationResponseCollection'; - data: Array<ContentReleasesReleaseActionEntity>; -}; - -export type ContentReleasesReleaseEntity = { - __typename?: 'ContentReleasesReleaseEntity'; - attributes?: Maybe<ContentReleasesRelease>; - id?: Maybe<Scalars['ID']['output']>; -}; - -export type ContentReleasesReleaseEntityResponse = { - __typename?: 'ContentReleasesReleaseEntityResponse'; - data?: Maybe<ContentReleasesReleaseEntity>; -}; - -export type ContentReleasesReleaseEntityResponseCollection = { - __typename?: 'ContentReleasesReleaseEntityResponseCollection'; - data: Array<ContentReleasesReleaseEntity>; - meta: ResponseCollectionMeta; -}; - -export type ContentReleasesReleaseFiltersInput = { - actions?: InputMaybe<ContentReleasesReleaseActionFiltersInput>; - and?: InputMaybe<Array<InputMaybe<ContentReleasesReleaseFiltersInput>>>; - createdAt?: InputMaybe<DateTimeFilterInput>; - id?: InputMaybe<IdFilterInput>; - name?: InputMaybe<StringFilterInput>; - not?: InputMaybe<ContentReleasesReleaseFiltersInput>; - or?: InputMaybe<Array<InputMaybe<ContentReleasesReleaseFiltersInput>>>; - releasedAt?: InputMaybe<DateTimeFilterInput>; - updatedAt?: InputMaybe<DateTimeFilterInput>; -}; - -export type ContentReleasesReleaseInput = { - actions?: InputMaybe<Array<InputMaybe<Scalars['ID']['input']>>>; - name?: InputMaybe<Scalars['String']['input']>; - releasedAt?: InputMaybe<Scalars['DateTime']['input']>; -}; - export type DateFilterInput = { and?: InputMaybe<Array<InputMaybe<Scalars['Date']['input']>>>; between?: InputMaybe<Array<InputMaybe<Scalars['Date']['input']>>>;

@@ -198,12 +97,8 @@ or?: InputMaybe<Array<InputMaybe<Scalars['DateTime']['input']>>>;

startsWith?: InputMaybe<Scalars['DateTime']['input']>; }; -export enum Enum_Contentreleasesreleaseaction_Type { - publish = 'publish', - unpublish = 'unpublish' -} - export enum Enum_Event_Lang { + de = 'de', en = 'en', fr = 'fr', nl = 'nl'

@@ -230,6 +125,7 @@ tos = 'tos'

} export enum Enum_Userspermissionsuser_Lang { + de = 'de', en = 'en', fr = 'fr', nl = 'nl'

@@ -364,7 +260,7 @@ or?: InputMaybe<Array<InputMaybe<Scalars['Float']['input']>>>;

startsWith?: InputMaybe<Scalars['Float']['input']>; }; -export type GenericMorph = ContentReleasesRelease | ContentReleasesReleaseAction | Event | I18NLocale | Module | Notification | Page | Passenger | Setting | Travel | TripAlert | UploadFile | UploadFolder | UsersPermissionsPermission | UsersPermissionsRole | UsersPermissionsUser | Vehicle; +export type GenericMorph = Event | I18NLocale | Module | Notification | Page | Passenger | Setting | Travel | TripAlert | UploadFile | UploadFolder | UsersPermissionsPermission | UsersPermissionsRole | UsersPermissionsUser | Vehicle; export type I18NLocale = { __typename?: 'I18NLocale';

@@ -520,8 +416,6 @@ __typename?: 'Mutation';

addEventAdmin?: Maybe<EventEntityResponse>; /** Change user password. Confirm with the current password. */ changePassword?: Maybe<UsersPermissionsLoginPayload>; - createContentReleasesRelease?: Maybe<ContentReleasesReleaseEntityResponse>; - createContentReleasesReleaseAction?: Maybe<ContentReleasesReleaseActionEntityResponse>; createEvent?: Maybe<EventEntityResponse>; createModuleLocalization?: Maybe<ModuleEntityResponse>; createNotification?: Maybe<NotificationEntityResponse>;

@@ -538,8 +432,6 @@ createUsersPermissionsRole?: Maybe<UsersPermissionsCreateRolePayload>;

/** Create a new user */ createUsersPermissionsUser: UsersPermissionsUserEntityResponse; createVehicle?: Maybe<VehicleEntityResponse>; - deleteContentReleasesRelease?: Maybe<ContentReleasesReleaseEntityResponse>; - deleteContentReleasesReleaseAction?: Maybe<ContentReleasesReleaseActionEntityResponse>; deleteEvent?: Maybe<EventEntityResponse>; deleteEventAdmin?: Maybe<EventEntityResponse>; deleteModule?: Maybe<ModuleEntityResponse>;

@@ -569,8 +461,6 @@ removeFile?: Maybe<UploadFileEntityResponse>;

/** Reset user password. Confirm with a code (resetToken from forgotPassword) */ resetPassword?: Maybe<UsersPermissionsLoginPayload>; setTripAlert?: Maybe<TripAlertEntityResponse>; - updateContentReleasesRelease?: Maybe<ContentReleasesReleaseEntityResponse>; - updateContentReleasesReleaseAction?: Maybe<ContentReleasesReleaseActionEntityResponse>; updateEvent?: Maybe<EventEntityResponse>; /** Update an event using its UUID */ updateEventByUUID?: Maybe<EventEntityResponse>;

@@ -608,16 +498,6 @@ passwordConfirmation: Scalars['String']['input'];

}; -export type MutationCreateContentReleasesReleaseArgs = { - data: ContentReleasesReleaseInput; -}; - - -export type MutationCreateContentReleasesReleaseActionArgs = { - data: ContentReleasesReleaseActionInput; -}; - - export type MutationCreateEventArgs = { data: EventInput; };

@@ -685,16 +565,6 @@

export type MutationCreateVehicleArgs = { data: VehicleInput; -}; - - -export type MutationDeleteContentReleasesReleaseArgs = { - id: Scalars['ID']['input']; -}; - - -export type MutationDeleteContentReleasesReleaseActionArgs = { - id: Scalars['ID']['input']; };

@@ -824,18 +694,6 @@ radius?: InputMaybe<Scalars['Float']['input']>;

}; -export type MutationUpdateContentReleasesReleaseArgs = { - data: ContentReleasesReleaseInput; - id: Scalars['ID']['input']; -}; - - -export type MutationUpdateContentReleasesReleaseActionArgs = { - data: ContentReleasesReleaseActionInput; - id: Scalars['ID']['input']; -}; - - export type MutationUpdateEventArgs = { data: EventInput; id: Scalars['ID']['input'];

@@ -1119,10 +977,6 @@ };

export type Query = { __typename?: 'Query'; - contentReleasesRelease?: Maybe<ContentReleasesReleaseEntityResponse>; - contentReleasesReleaseAction?: Maybe<ContentReleasesReleaseActionEntityResponse>; - contentReleasesReleaseActions?: Maybe<ContentReleasesReleaseActionEntityResponseCollection>; - contentReleasesReleases?: Maybe<ContentReleasesReleaseEntityResponseCollection>; event?: Maybe<EventEntityResponse>; /** Retrieve an event using its UUID */ eventByUUID?: Maybe<EventEntityResponse>;

@@ -1154,30 +1008,6 @@ vehicles?: Maybe<VehicleEntityResponseCollection>;

}; -export type QueryContentReleasesReleaseArgs = { - id?: InputMaybe<Scalars['ID']['input']>; -}; - - -export type QueryContentReleasesReleaseActionArgs = { - id?: InputMaybe<Scalars['ID']['input']>; -}; - - -export type QueryContentReleasesReleaseActionsArgs = { - filters?: InputMaybe<ContentReleasesReleaseActionFiltersInput>; - pagination?: InputMaybe<PaginationArg>; - sort?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>; -}; - - -export type QueryContentReleasesReleasesArgs = { - filters?: InputMaybe<ContentReleasesReleaseFiltersInput>; - pagination?: InputMaybe<PaginationArg>; - sort?: InputMaybe<Array<InputMaybe<Scalars['String']['input']>>>; -}; - - export type QueryEventArgs = { id?: InputMaybe<Scalars['ID']['input']>; };

@@ -2437,7 +2267,7 @@ * eventId: // value for 'eventId'

* }, * }); */ -export function useTripAlertQuery(baseOptions: Apollo.QueryHookOptions<TripAlertQuery, TripAlertQueryVariables>) { +export function useTripAlertQuery(baseOptions: Apollo.QueryHookOptions<TripAlertQuery, TripAlertQueryVariables> & ({ variables: TripAlertQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { const options = {...defaultOptions, ...baseOptions} return Apollo.useQuery<TripAlertQuery, TripAlertQueryVariables>(TripAlertDocument, options); }

@@ -2445,8 +2275,13 @@ export function useTripAlertLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<TripAlertQuery, TripAlertQueryVariables>) {

const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery<TripAlertQuery, TripAlertQueryVariables>(TripAlertDocument, options); } +export function useTripAlertSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<TripAlertQuery, TripAlertQueryVariables>) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery<TripAlertQuery, TripAlertQueryVariables>(TripAlertDocument, options); + } export type TripAlertQueryHookResult = ReturnType<typeof useTripAlertQuery>; export type TripAlertLazyQueryHookResult = ReturnType<typeof useTripAlertLazyQuery>; +export type TripAlertSuspenseQueryHookResult = ReturnType<typeof useTripAlertSuspenseQuery>; export type TripAlertQueryResult = Apollo.QueryResult<TripAlertQuery, TripAlertQueryVariables>; export const SetTripAlertDocument = gql` mutation SetTripAlert($eventId: ID!, $enabled: Boolean, $latitude: Float, $longitude: Float, $address: String, $radius: Float) {

@@ -2787,7 +2622,7 @@ * uuid: // value for 'uuid'

* }, * }); */ -export function useEventByUuidQuery(baseOptions: Apollo.QueryHookOptions<EventByUuidQuery, EventByUuidQueryVariables>) { +export function useEventByUuidQuery(baseOptions: Apollo.QueryHookOptions<EventByUuidQuery, EventByUuidQueryVariables> & ({ variables: EventByUuidQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { const options = {...defaultOptions, ...baseOptions} return Apollo.useQuery<EventByUuidQuery, EventByUuidQueryVariables>(EventByUuidDocument, options); }

@@ -2795,8 +2630,13 @@ export function useEventByUuidLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<EventByUuidQuery, EventByUuidQueryVariables>) {

const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery<EventByUuidQuery, EventByUuidQueryVariables>(EventByUuidDocument, options); } +export function useEventByUuidSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<EventByUuidQuery, EventByUuidQueryVariables>) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery<EventByUuidQuery, EventByUuidQueryVariables>(EventByUuidDocument, options); + } export type EventByUuidQueryHookResult = ReturnType<typeof useEventByUuidQuery>; export type EventByUuidLazyQueryHookResult = ReturnType<typeof useEventByUuidLazyQuery>; +export type EventByUuidSuspenseQueryHookResult = ReturnType<typeof useEventByUuidSuspenseQuery>; export type EventByUuidQueryResult = Apollo.QueryResult<EventByUuidQuery, EventByUuidQueryVariables>; export const ModuleDocument = gql` query module($locale: I18NLocaleCode!) {

@@ -2830,7 +2670,7 @@ * locale: // value for 'locale'

* }, * }); */ -export function useModuleQuery(baseOptions: Apollo.QueryHookOptions<ModuleQuery, ModuleQueryVariables>) { +export function useModuleQuery(baseOptions: Apollo.QueryHookOptions<ModuleQuery, ModuleQueryVariables> & ({ variables: ModuleQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { const options = {...defaultOptions, ...baseOptions} return Apollo.useQuery<ModuleQuery, ModuleQueryVariables>(ModuleDocument, options); }

@@ -2838,8 +2678,13 @@ export function useModuleLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<ModuleQuery, ModuleQueryVariables>) {

const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery<ModuleQuery, ModuleQueryVariables>(ModuleDocument, options); } +export function useModuleSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<ModuleQuery, ModuleQueryVariables>) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery<ModuleQuery, ModuleQueryVariables>(ModuleDocument, options); + } export type ModuleQueryHookResult = ReturnType<typeof useModuleQuery>; export type ModuleLazyQueryHookResult = ReturnType<typeof useModuleLazyQuery>; +export type ModuleSuspenseQueryHookResult = ReturnType<typeof useModuleSuspenseQuery>; export type ModuleQueryResult = Apollo.QueryResult<ModuleQuery, ModuleQueryVariables>; export const UserNotificationsDocument = gql` query UserNotifications($maxItems: Int = 20) {

@@ -2889,8 +2734,13 @@ export function useUserNotificationsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<UserNotificationsQuery, UserNotificationsQueryVariables>) {

const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery<UserNotificationsQuery, UserNotificationsQueryVariables>(UserNotificationsDocument, options); } +export function useUserNotificationsSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<UserNotificationsQuery, UserNotificationsQueryVariables>) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery<UserNotificationsQuery, UserNotificationsQueryVariables>(UserNotificationsDocument, options); + } export type UserNotificationsQueryHookResult = ReturnType<typeof useUserNotificationsQuery>; export type UserNotificationsLazyQueryHookResult = ReturnType<typeof useUserNotificationsLazyQuery>; +export type UserNotificationsSuspenseQueryHookResult = ReturnType<typeof useUserNotificationsSuspenseQuery>; export type UserNotificationsQueryResult = Apollo.QueryResult<UserNotificationsQuery, UserNotificationsQueryVariables>; export const ReadNotificationsDocument = gql` mutation readNotifications($id: ID) {

@@ -3074,7 +2924,7 @@ * locale: // value for 'locale'

* }, * }); */ -export function useSettingQuery(baseOptions: Apollo.QueryHookOptions<SettingQuery, SettingQueryVariables>) { +export function useSettingQuery(baseOptions: Apollo.QueryHookOptions<SettingQuery, SettingQueryVariables> & ({ variables: SettingQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { const options = {...defaultOptions, ...baseOptions} return Apollo.useQuery<SettingQuery, SettingQueryVariables>(SettingDocument, options); }

@@ -3082,8 +2932,13 @@ export function useSettingLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<SettingQuery, SettingQueryVariables>) {

const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery<SettingQuery, SettingQueryVariables>(SettingDocument, options); } +export function useSettingSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<SettingQuery, SettingQueryVariables>) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery<SettingQuery, SettingQueryVariables>(SettingDocument, options); + } export type SettingQueryHookResult = ReturnType<typeof useSettingQuery>; export type SettingLazyQueryHookResult = ReturnType<typeof useSettingLazyQuery>; +export type SettingSuspenseQueryHookResult = ReturnType<typeof useSettingSuspenseQuery>; export type SettingQueryResult = Apollo.QueryResult<SettingQuery, SettingQueryVariables>; export const CreateTravelDocument = gql` mutation createTravel($travel: TravelInput!, $createVehicle: Boolean) {

@@ -3227,8 +3082,13 @@ export function useProfileLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<ProfileQuery, ProfileQueryVariables>) {

const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery<ProfileQuery, ProfileQueryVariables>(ProfileDocument, options); } +export function useProfileSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<ProfileQuery, ProfileQueryVariables>) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery<ProfileQuery, ProfileQueryVariables>(ProfileDocument, options); + } export type ProfileQueryHookResult = ReturnType<typeof useProfileQuery>; export type ProfileLazyQueryHookResult = ReturnType<typeof useProfileLazyQuery>; +export type ProfileSuspenseQueryHookResult = ReturnType<typeof useProfileSuspenseQuery>; export type ProfileQueryResult = Apollo.QueryResult<ProfileQuery, ProfileQueryVariables>; export const UpdateMeDocument = gql` mutation updateMe($userUpdate: UsersPermissionsUserInput!) {

@@ -3307,8 +3167,13 @@ export function useFindUserVehiclesLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions<FindUserVehiclesQuery, FindUserVehiclesQueryVariables>) {

const options = {...defaultOptions, ...baseOptions} return Apollo.useLazyQuery<FindUserVehiclesQuery, FindUserVehiclesQueryVariables>(FindUserVehiclesDocument, options); } +export function useFindUserVehiclesSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions<FindUserVehiclesQuery, FindUserVehiclesQueryVariables>) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery<FindUserVehiclesQuery, FindUserVehiclesQueryVariables>(FindUserVehiclesDocument, options); + } export type FindUserVehiclesQueryHookResult = ReturnType<typeof useFindUserVehiclesQuery>; export type FindUserVehiclesLazyQueryHookResult = ReturnType<typeof useFindUserVehiclesLazyQuery>; +export type FindUserVehiclesSuspenseQueryHookResult = ReturnType<typeof useFindUserVehiclesSuspenseQuery>; export type FindUserVehiclesQueryResult = Apollo.QueryResult<FindUserVehiclesQuery, FindUserVehiclesQueryVariables>; export const DeleteVehicleDocument = gql` mutation deleteVehicle($id: ID!) {
M frontend/hooks/useLocale.tsfrontend/hooks/useLocale.ts

@@ -6,6 +6,7 @@ import {useEffect} from 'react';

// Import moment locales import 'moment/locale/fr'; +import 'moment/locale/de'; import 'moment/locale/nl'; const defaultLocale = SupportedLocales['en'];
A frontend/locales/de.json

@@ -0,0 +1,309 @@

+{ + "lost_password.sent": "Eine E-Mail mit einem Link zur Wiederherstellung Ihres Passworts wurde an {{email}} gesendet", + "alert.button.label": "Speichern", + "alert.create": "Ihr Alert wurde erfolgreich konfiguriert", + "alert.description": "Richten Sie einen Alarm ein, um eine E-Mail zu erhalten, wenn eine Abfahrt in der Nähe ist", + "alert.errors.cant_create": "Alarm konnte nicht erstellt werden", + "alert.location.label": "Ihr Standort", + "alert.optional": "Optional", + "alert.radius.label": "Gewünschter Radius", + "alert.title": "Alarme", + "confirm.google.title": "Anmeldung abschließen", + "event.creation.name": "Name der Veranstaltung", + "lost_password.email": "Deine E-Mail", + "menu.new_event": "Einen Caroster erstellen", + "confirm.text": "Sie haben eine E-Mail mit einem Link erhalten. Bitte klicken Sie auf diesen Link, um Ihr Konto zu bestätigen.", + "confirm.title": "E-Mail bestätigen", + "dashboard.actions.add_event": "Caroster erstellen", + "dashboard.actions.see_event": "Zu Caroster gehen", + "dashboard.noEvent.create_event": "$t(menu.new_event)", + "dashboard.noEvent.title": "Willkommen bei Caroster", + "dashboard.sections.future": "Kommender Caroster", + "dashboard.sections.future_plural": "Kommende Caroster", + "dashboard.sections.noDate": "Caroster ohne Datum", + "dashboard.sections.noDate_plural": "Carosters ohne Datum", + "dashboard.sections.past": "Vergangener Caroster", + "dashboard.sections.past_plural": "Vergangene Caroster", + "dashboard.title": "$t(menu.dashboard)", + "date.today": "Heute", + "drawer.alerts": "Alarme", + "drawer.information": "Informationen", + "drawer.options": "Optionen", + "drawer.travels": "Fahrten", + "drawer.waitingList": "Warteliste", + "event.actions.add_to_my_events": "Zu meinen Veranstaltungen hinzufügen", + "event.actions.noShareCapability": "Ihr Browser kann die Seite weder freigeben noch in die Zwischenablage kopieren. Bitte kopieren Sie stattdessen die URL der Seite.", + "event.actions.share": "Den Caroster teilen", + "event.add_to_my_events.login": "$t(menu.login)", + "event.add_to_my_events.register": "$t(menu.register)", + "event.add_to_my_events.title": "Sie müssen eingeloggt sein", + "event.creation.addFromAccount.actions.login": "$t(menu.login)", + "event.creation.addFromAccount.actions.register": "$t(menu.register)", + "event.creation.addFromAccount.subtitle": "Erstellen Sie es über Ihr Konto", + "event.creation.addFromAccount.title": "Möchten Sie diesen Caroster zu Ihren Veranstaltungen hinzufügen?", + "event.creation.address": "Adresse der Veranstaltung", + "event.creation.creator_email": "Ihre E-Mail", + "event.creation.date": "Datum der Veranstaltung", + "event.creation.description": "Beschreibung", + "event.creation.description_helper": "Optional", + "event.creation.newsletter": "Halten Sie mich per E-Mail über die Entwicklungen bei Caroster auf dem Laufenden", + "event.creation.next": "Weiter", + "event.creation.title": "Neue Veranstaltung", + "event.details": "Informationen", + "event.details.modify": "Ändern", + "event.details.save": "Speichern", + "event.errors.cant_update": "Veranstaltung kann nicht geändert werden", + "event.fields.address": "Adresse der Veranstaltung", + "event.fields.copyLink": "Link kopieren", + "event.fields.date": "Veranstaltungsdatum", + "event.fields.date_placeholder": "DD/MM/YYYY", + "event.fields.description": "Beschreibung", + "event.fields.empty": "Keine Angaben", + "event.fields.lang": "Sprache", + "event.fields.link": "Link teilen", + "event.fields.name": "Name der Veranstaltung", + "event.fields.share": "Teilen", + "event.filter.allDates": "Alle Termine", + "event.filter.dates": "Mehrere Termine", + "event.filter.title": "Termine filtern", + "event.loginToAttend": "Möchten Sie an dieser Veranstaltung teilnehmen?", + "event.loginToAttend.desc": "Registrieren Sie sich oder melden Sie sich an, um Fahrgemeinschaften zu bilden", + "event.loginToAttend.login": "$t(menu.login)", + "event.loginToAttend.signup": "$t(signup.title)", + "event.no_other_travel.title": "Derzeit gibt es keine anderen Fahrten", + "event.no_travel.desc": "1. Tragen Sie sich in die Warteliste ein\n2. Teilen Sie die Veranstaltung\n3. Sie werden benachrichtigt, wenn eine neue Fahrt hinzugefügt wird", + "event.no_travel.plus.action": "Einen Alarm erstellen", + "event.no_travel.plus.desc": "Erstellen Sie einen Alarm, um eine E-Mail zu erhalten, wenn eine Abfahrt in der Nähe ist", + "event.no_travel.title": "Derzeit gibt es keine Fahrten", + "event.not_found": "Projekt nicht gefunden", + "event.title": "{{title}} - Caroster", + "generic.access": "Zugang", + "generic.add": "Hinzufügen", + "generic.cancel": "Abbrechen", + "generic.confirm": "Bestätigen", + "generic.create": "Erstellen", + "generic.delete": "Löschen", + "generic.errors.not_found": "Ressource wurde nicht gefunden", + "generic.errors.unknown": "Ein unbekannter Fehler ist aufgetreten", + "generic.me": "Ich", + "generic.remove": "Entfernen", + "lost_password.actions.cancel": "Abbrechen", + "lost_password.actions.login": "Zurück zum Anmeldebildschirm", + "lost_password.actions.register": "Konto erstellen?", + "lost_password.actions.save_new_password": "Aktualisieren", + "lost_password.actions.send": "Senden einer Wiederherstellungs-E-Mail", + "lost_password.change_success": "Ihr Passwort wurde geändert", + "lost_password.message": "Passwort vergessen?", + "lost_password.password": "Neues Passwort", + "lost_password.password_confirmation": "Bestätigen Sie das neue Passwort", + "lost_password.reset_title": "Definition eines neuen Passworts", + "lost_password.title": "Passwort-Wiederherstellung", + "menu.about": "Entdecken Sie mehr über Caroster", + "menu.code": "Caroster ist Open Source", + "menu.dashboard": "Meine Carosters", + "menu.language": "Sprache ändern", + "menu.login": "Anmeldung", + "menu.logout": "Abmeldung", + "menu.profile": "Mein Profil", + "menu.register": "Registrierung", + "notification.type.ContactTripCreator.content": "Wenden Sie sich an den Fahrer, um Ihre Fahrt zu organisieren.", + "notification.type.DeletedFromTrip.content": "Sie wurden von einer Fahrt entfernt.", + "notification.type.DeletedTrip.content": "Eine Fahrt wurde entfernt.", + "notification.type.DeletedYourTrip.content": "Ihre Reise wurde von einem Veranstaltungsadministrator entfernt", + "notification.type.NewTrip.content": "Eine neue Fahrt in Ihrer Nähe ist verfügbar.", + "notification.type.NewTripAlert.content": "Eine neue Fahrt in Ihrer Nähe ist verfügbar.", + "notifications.content": "Keine Benachrichtigung", + "notifications.markAllRead": "Alles als gelesen markieren", + "notifications.title": "Benachrichtigungen", + "options.no_module": "Es sind derzeit keine Module verfügbar.", + "options.plus.activationOK": "Caroster Plus zu Ihrer Veranstaltung hinzufügen", + "options.plus.addAdmin": "Einen Administrator hinzufügen", + "options.plus.addAdmin.email": "E-Mail", + "options.plus.addAdmin.emailHelper": "Die E-Mail ist nicht gültig", + "options.plus.addAdminError": "Es ist ein Fehler aufgetreten", + "options.plus.adminAdded": "Der Administrator wurde eingeladen", + "options.plus.adminDeleted": "Der Administrator wurde gelöscht", + "options.plus.admins": "Administratoren", + "options.plus.creator": "Ersteller", + "options.plus.notRightForAddAdmin": "Sie sind nicht berechtigt, einen Administrator hinzuzufügen", + "options.plus.title": "Caroster Plus", + "passenger.actions.place": "Zuweisen", + "passenger.actions.remove_alert": "Sind Sie sicher, dass Sie <italic> <bold>{{name}} </bold> </italic> von der Warteliste entfernen möchten?", + "passenger.assign.assign": "Zuweisen", + "passenger.assign.availableCars": "Verfügbare Fahrten", + "passenger.assign.departure": "Abfahrt: ", + "passenger.assign.no_travel.title": "Im Moment sind keine Plätze frei...", + "passenger.assign.seats": "{{count}} verfügbare Plätze", + "passenger.assign.seats_zero": "Voll", + "passenger.assign.title": "Einen Passagier zuordnen", + "passenger.availability.seats": "{{count}} freier Platz", + "passenger.availability.seats_plural": "{{count}} freie Plätze", + "passenger.deleted": "Der Passagier wurde aus der Veranstaltung gelöscht.", + "passenger.errors.cant_add_passenger": "Passagier kann nicht hinzugefügt werden", + "passenger.errors.cant_select_travel": "Kann den Beifahrer nicht bewegen", + "passenger.informations.call.label": "Anrufen", + "passenger.informations.email.label": "E-mail", + "passenger.informations.name.label": "Name", + "passenger.informations.notSpecify": "Nicht angegeben", + "passenger.informations.phone.label": "Telefon", + "passenger.informations.surname.label": "Nachname", + "passenger.informations.title": "Kontaktieren Sie uns", + "passenger.success.added_self_to_car": "Du wurdest der Fahrt hinzugefügt", + "passenger.success.goToTravels": "Zu den Fahrten", + "passenger.title": "Warteliste", + "placeInput.mapboxUnavailable": "Zurzeit können wir keine Orte vorschlagen", + "placeInput.noCoordinates": "Dieser Ort ist nicht geografisch zugeordnet und wird nicht auf der Karte angezeigt", + "placeInput.item.noCoordinates": "Keine Koordinaten", + "profile.actions.cancel": "Abbrechen", + "profile.actions.change_password": "Passwort ändern", + "profile.actions.edit": "Bearbeiten", + "profile.actions.logout": "Abmeldung", + "profile.actions.save_new_password": "Aktualisieren", + "profile.current_password": "Aktuelles Passwort", + "profile.errors.password_nomatch": "Falsches Passwort", + "profile.firstName": "Vornamen", + "profile.lastName": "Nachname", + "profile.new_password": "Neues Passwort", + "profile.newsletter.label": "Erhalten Sie unseren Newsletter", + "profile.newsletter.value.no": "Nein", + "profile.newsletter.value.yes": "Ja", + "profile.not_defined": "Keine Angaben", + "profile.notification.label": "Benachrichtigungen", + "profile.notification.value.no": "Deaktiviert", + "profile.notification.value.yes": "Aktiviert", + "profile.password_changed": "Passwort aktualisiert", + "profile.stripe_link.button": "Verlauf", + "profile.title": "Profil", + "signin.emailConfirmation": "Ihr Konto wurde bestätigt. Sie können sich jetzt anmelden.", + "signin.errors.EmailNotConfirmed": "Ihr Konto wurde nicht bestätigt. Bitte überprüfen Sie Ihre E-Mails", + "signin.login": "$t(menu.login)", + "signin.no_account": "Sie haben noch kein Konto ?", + "signin.or": "oder", + "signin.password": "Passwort", + "signin.register": "$t(menu.register)", + "signin.title": "Anmelden", + "signin.withGoogle": "Google-Konto verwenden", + "signup.account_already": "Haben Sie bereits ein Konto?", + "signup.create": "Konto erstellen", + "signup.createForm": "Konto erstellen\nInformationen zum Ausfüllen", + "signup.email": "E-Mail", + "signup.errors.email_taken": "Diese E-Mail ist bereits mit einem Konto verbunden", + "signup.lastName": "Nachname", + "signup.login": "$t(menu.login)", + "signup.password": "Passwort", + "signup.submit": "Ihr Konto erstellen", + "signup.title": "Registrieren", + "signup.with_mail": "Weiter mit einer E-Mail", + "supportCaroster": "Caroster unterstützen", + "tour.creator.step1": "Fügen Sie eine neue Fahrt hinzu, indem Sie auf diese Schaltfläche klicken.", + "tour.creator.step2": "Die Warteliste umfasst Fahrgäste, die noch keinen Platz für eine Fahrt haben.", + "tour.creator.step3": "Die Informationen zur Veranstaltung können in diesem Menü geändert werden.", + "tour.creator.step4": "Die Veranstaltung kann durch Klicken auf die Schaltfläche \"Bearbeiten\" bearbeitet werden.", + "tour.user.step1": "Fügen Sie eine neue Reise hinzu, indem Sie auf diese Schaltfläche klicken.", + "tour.user.step2": "Möchten Sie einen Platz in einer Fahrt? Melden Sie sich auf der Warteliste oder direkt bei einer Fahrt an.", + "tour.user.step4": "Sie können den Link von nun an kopieren, um ihn per E-Mail, Whatsapp, Telegram usw. zu teilen.", + "tour.welcome.nope": "Später", + "tour.welcome.onboard": "Okay, los geht's!", + "tour.welcome.text": "Möchten Sie eine Feature-Tour machen?", + "tour.welcome.title": "Willkommen bei Caroster!", + "travel.actions.remove_alert": "Sind Sie sicher, dass Sie diese Fahrt entfernen und die Nutzer auf die Warteliste setzen wollen?", + "travel.actions.remove_alert.caroster_plus": "Sind Sie sicher, dass Sie diese Fahrt entfernen möchten? Die Passagiere werden benachrichtigt.", + "travel.actions.removed.caroster_plus": "Die Fahrt wurde gestrichen und die Passagiere wurden informiert.", + "travel.creation.created": "Die Fahrt wurde erstellt", + "travel.creation.date": "Datum der Abfahrt", + "travel.creation.meeting": "Treffpunkt", + "travel.creation.name": "Name des Fahrzeugs", + "travel.creation.notes": "Zusätzliche Informationen", + "travel.creation.phone": "Telefonnummer", + "travel.creation.phoneHelper.faq": "/de/faq", + "travel.creation.phoneHelper.why": "Warum fragen wir nach einer Telefonnummer?", + "travel.creation.seats": "Anzahl der verfügbaren Plätze", + "travel.creation.submit": "Hinzufügen", + "travel.creation.time": "Abfahrtszeit", + "travel.creation.title": "Fahrt hinzufügen", + "travel.creation.travel.timeHelper": "Bitte geben Sie eine gültige Uhrzeit an", + "travel.creation.travel.title": "Fahrt", + "travel.errors.cant_create": "Die Fahrt konnte nicht erstellt werden", + "travel.errors.cant_remove": "Die Reise konnte nicht gelöscht werden", + "travel.errors.cant_remove_passenger": "Passagier konnte nicht entfernt werden", + "travel.errors.cant_update": "Die Reise konnte nicht geändert werden", + "travel.fields.details": "Anmerkungen", + "travel.fields.meeting_point": "Treffpunkt", + "travel.fields.phone": "Kontakt", + "travel.passengers.add": "Passagier hinzufügen", + "travel.passengers.add_someone": "Jemanden hinzufügen", + "travel.passengers.add_to_car": "Zur Fahrt hinzufügen", + "travel.passengers.add_to_travel": "Passagier hinzufügen", + "travel.passengers.add_to_waitingList": "Zur Warteliste hinzufügen", + "travel.passengers.email": "E-Mail", + "travel.passengers.email_helpertext": "E-Mail ist nicht gültig", + "travel.passengers.email_placeholder_optionnal": "E-Mail (optional)", + "travel.passengers.empty": "Verfügbarer Sitzplatz", + "travel.passengers.location": "Treffpunkt", + "travel.passengers.location_helper": "Geben Sie Ihren bevorzugten Abfahrtsort an", + "travel.passengers.location_placeholder": "Treffpunkt (optional)", + "travel.passengers.name": "Name", + "travel.passengers.name_placeholder": "Name", + "travel.passengers.register_to_waiting_list": "Auf der Warteliste eintragen", + "travel.passengers.registered": "Zugewiesen", + "travel.passengers.remove": "Entfernen", + "travel.passengers.removed": "Passagier von der Fahrt entfernt", + "travel.removePassengerModal.cancel": "Abbrechen", + "travel.removePassengerModal.description": "Der Passagier wird auf die Warteliste gesetzt.", + "travel.removePassengerModal.remove": "Entfernen Sie den Passagier", + "travel.removePassengerModal.plus.self.description": "Sie müssen sich eine neue Fahrt suchen.", + "travel.removePassengerModal.self.description": "Sie werden dann auf die Warteliste gesetzt.", + "travel.removePassengerModal.self.remove": "Verlassen Sie die Fahrt", + "travel.removePassengerModal.self.title": "Diese Fahrt verlassen", + "travel.removePassengerModal.title": "Entfernen Sie den Passagier von der Fahrt", + "travel.requestTrip.email": "E-Mail", + "travel.requestTrip.emailHelper": "Ungültige E-Mail", + "travel.requestTrip.phone": "Telefon", + "travel.requestTrip.send": "Senden", + "travel.requestTrip.title": "Informationen gesendet", + "travel.vehicle.add": "Ein neues Fahrzeug hinzufügen", + "travel.vehicle.empty": "Ihnen ist noch kein Fahrzeug zugewiesen. Klicken Sie auf die Schaltfläche unten, um eines zu erstellen.", + "travel.vehicle.name": "Name des Fahrzeugs", + "travel.vehicle.seats_number": "Anzahl der Sitzplätze", + "travel.vehicle.title": "Meine Fahrzeuge", + "dashboard.noEvent.text_html": "Hier siehst du <strong>die Carosters, an denen du teilnimmst</strong>, um ein Caroster zu erstellen!", + "event.actions.copied": "Der Link wurde in Ihre Zwischenablage kopiert", + "event.errors.cant_create": "Veranstaltung kann nicht erstellt werden", + "event.fields.link_desc": "Teilen Sie diesen Link mit anderen Personen", + "generic.save": "Speichern", + "generic.select": "Auswählen", + "notification.type.AddedAsAdmin.content": "Sie sind zum Administrator der Veranstaltung befördert worden.", + "notification.type.EnabledCarosterPlus.content": "Caroster Plus wurde für Ihre Veranstaltung aktiviert.", + "notification.type.NewPassengerInYourTrip.content": "Ein Passagier wurde zu Ihrer Fahrt hinzugefügt.", + "event.loginToSetAlert": "Die Benachrichtigungen sind nur für die Teilnehmer dieser Fahrgemeinschaft verfügbar.", + "lost_password.error": "Diese E-Mail existiert nicht", + "notification.type.PassengerJoinTrip.content": "Ein neuer Passagier möchte Sie kontaktieren, um mit Ihnen zu reisen.", + "event.add_to_my_events.text_html": "Um <strong> {{eventName}}</strong> zu Ihren Veranstaltern hinzuzufügen, müssen Sie eingeloggt sein oder ein Konto erstellen.", + "confirm.creating": "Erstellen des Kontos", + "options.plus.deleteAdminError": "Es ist ein Fehler aufgetreten", + "signin.email": "E-Mail", + "tour.creator.step5": "Sie können den Link von nun an kopieren, um ihn per E-Mail, Whatsapp, Telegram usw. zu teilen.", + "travel.actions.removed": "Die Fahrt wurde gestrichen und die Passagiere auf die Warteliste gesetzt.", + "travel.passengers.add_me": "Mich hinzufügen", + "travel.passengers.moved_to_waiting_list": "Der Passagier wurde auf die Warteliste gesetzt.", + "travel.removePassengerModal.plus.description": "Der Benutzer erhält eine Benachrichtigung.", + "options.plus.activationForbiden": "Sie müssen der Ersteller der Veranstaltung und mit einem Caroster-Konto eingeloggt sein, um Module hinzuzufügen", + "passenger.assign.no_travel.desc": "{{name}} wird eine E-Mail erhalten, wenn neue Fahrten verfügbar sind. Sie können die Veranstaltung in der Zwischenzeit teilen.", + "passenger.errors.cant_remove_passenger": "Passagier kann nicht entfernt werden", + "passenger.success.added_self_to_waitlist": "Sie wurden in die Warteliste aufgenommen. Sie werden benachrichtigt, wenn neue Fahrten hinzugefügt werden.", + "passenger.success.added_to_car": "{{name}} wurde zur Fahrt hinzugefügt", + "profile.actions.save": "Speichern", + "profile.email": "E-Mail", + "profile.stripe_link.title": "Abrechnung", + "travel.creation.car.title": "Auto und Fahrer", + "passenger.success.added_to_waitlist": "{{name}} wurde zur Warteliste hinzugefügt", + "signin.errors.CredentialsSignin": "Überprüfen Sie Ihre E-Mail und Ihr Passwort. Wenn Ihr Konto mit Google verknüpft ist, verwenden Sie bitte Login mit Google.", + "signup.firstName": "Vorname", + "tour.user.step3": "Über dieses Menü können Sie auf die Veranstaltungsinformationen zugreifen.", + "travel.creation.travel.dateHelper": "Bitte geben Sie ein gültiges Datum an", + "travel.creation.travel.titleHelper": "Bitte geben Sie einen gültigen Namen an", + "travel.passengers.email_placeholder": "E-Mail", + "travel.requestTrip.description": "Die folgenden Informationen werden dem Fahrer der Fahrt zugeschickt.", + "signup.newsletter.consent": "Ich interessiere mich für Fahrgemeinschaften, ich möchte den Newsletter abonnieren.", + "signup.tos.consent": "Ich akzeptiere <tos-link>Nutzungsbedingungen</tos-link> und <data-privacy-link>Datenschutzbestimmungen</data-privacy-link>" +}
M frontend/locales/en.jsonfrontend/locales/en.json

@@ -201,6 +201,7 @@ "profile.title": "Profile",

"PROTECTED.languages.en": "English (100%)", "PROTECTED.languages.fr": "Français (100%)", "PROTECTED.languages.nl": "Nederlands (97%)", + "PROTECTED.languages.de": "Deutsch (96%)", "signin.email": "Email", "signin.emailConfirmation": "Your account has been confirmed. You can now login.", "signin.errors.CredentialsSignin": "Check your email and password. If your account is linked to Google, please use the Google auth. button.",
M frontend/locales/fr.jsonfrontend/locales/fr.json

@@ -201,6 +201,7 @@ "profile.title": "Profil",

"PROTECTED.languages.en": "English (100%)", "PROTECTED.languages.fr": "Français (100%)", "PROTECTED.languages.nl": "Nederlands (97%)", + "PROTECTED.languages.de": "Deutsch (96%)", "signin.email": "Email", "signin.emailConfirmation": "Votre compte a bien été confirmé. Vous pouvez maintenant vous connecter.", "signin.errors.CredentialsSignin": "Vérifiez votre email et mot de passe. Si votre compte est lié à Google, merci d'utiliser l'authentification Google.",
M frontend/next-i18next.config.jsfrontend/next-i18next.config.js

@@ -5,13 +5,13 @@

module.exports = { i18n: { defaultLocale: FALLBACK_LANGUAGE, - locales: [...new Set([FALLBACK_LANGUAGE, 'en', 'fr', 'nl'])], + locales: [...new Set([FALLBACK_LANGUAGE, 'en', 'fr', 'de', 'nl'])], }, // Load same lang file for every namespaces localePath: (locale, _namespace) => `./locales/${locale}.json`, ns: ['common'], localeDetection: false, - fallbackLng: ['fr'], + fallbackLng: ['en', 'fr'], trailingSlash: true, serializeConfig: false, interpolation: {