Merge pull request #3097 from opencloud-eu/update-idp-i18n

chore(idp): update i18n, document workflow
This commit is contained in:
Jörn Friedrich Dreyer
2026-07-10 08:38:34 +02:00
committed by GitHub
20 changed files with 1121 additions and 1429 deletions

View File

@@ -1,2 +1,4 @@
*.mo
dev-translation.json
# i18next-cli extracted keys (intermediate, regenerated on demand)
translation.*.json

View File

@@ -15,27 +15,31 @@ POS ?= $(wildcard *.po)
.PHONY: build
build: json
.PYTHON: json
.PHONY: json
json:
@for po in $(POS); do \
lang=$$(echo $$po | sed "s/\.po//"); \
$(PNPM) i18next-conv -K --skipUntranslated -l $$lang -s i18n/$$po -t ../src/locales/$$lang/translation.json; \
$(PNPM) i18next-conv -K --skipUntranslated -l $$lang -s $$po -t ../src/locales/$$lang/translation.json; \
done
$(PNPM) node i18n/build-json.js ../src/locales/locales.json $(POS)
$(PNPM) node build-json.js ../src/locales/locales.json $(POS)
dev-translation.json: FORCE
$(PNPM) i18next --fail-on-warnings
.PHONY: extract-keys
extract-keys:
$(PNPM) i18next-cli extract -q || true
translation.en.json: FORCE
$(MAKE) extract-keys
.PHONY: extract
extract: pot
.PHONY: pot
pot: dev-translation.json
pot: translation.en.json
@tmpfile1=$(shell mktemp).po; \
tmpfile2=$(shell mktemp).po; \
trap 'rm -f "$$tmpfile1" "$$tmpfile2"' EXIT; \
$(PNPM) i18next-conv --project "LibreGraph Connect Identifier" -K -l en -s i18n/dev-translation.json -t $$tmpfile1; \
$(PNPM) node i18n/build-pot.js $$tmpfile1 $$tmpfile2; \
$(PNPM) i18next-conv --project "LibreGraph Connect Identifier" -K -l en -s translation.en.json -t $$tmpfile1; \
$(PNPM) node build-pot.js $$tmpfile1 $$tmpfile2; \
$(MSGCAT) --no-wrap -o $(POT) $$tmpfile2
.PHONY: merge

View File

@@ -0,0 +1,92 @@
# IDP Translations
## Overview
The IDP service uses i18next for internationalization with gettext (`.po`)
files as the source of truth for translations. The workflow is:
```text
Source code t() calls → extract keys → .pot template
→ merge into .po → convert to JSON → app bundles
```
## File Structure
- `i18n/*.po` — translation files per language (committed)
- `i18n/translation.pot` — extracted keys template (committed)
- `i18n/translation.en.json` — intermediate EN keys (gitignored)
- `src/locales/*/translation.json` — JSON translations at runtime (committed)
- `src/locales/locales.json` — language metadata for locale selector (committed)
## Adding New Translation Keys
### 1. Add a key in source code
```jsx
t("konnect.new.key", "Default fallback text")
```
The first argument is the i18next key path (dot notation for nested JSON). The
second argument is the default/fallback English text — this is what translators
see in `.po` files as `msgid`.
### 2. Extract new keys into the `.pot` template
```bash
make -C i18n extract
```
This runs `i18next-cli extract` to scan all `src/**/*.{js,jsx,ts,tsx}` files,
writes extracted English keys to `i18n/translation.en.json`, then converts
them into `translation.pot`.
### 3. Merge new keys into existing `.po` files
```bash
make -C i18n merge
```
This runs `msgmerge` on each `.po` file to add any new keys from the updated
`.pot` template. Translators then fill in translations for the new entries.
### 4. Convert `.po` files to JSON for the app
```bash
make -C i18n json
```
This runs `i18next-conv` on each `.po` file to produce
`src/locales/{lang}/translation.json`. This step is also run automatically by
`make build`.
## Runtime Loading
The app loads translations via dynamic webpack imports:
```typescript
// src/i18n.ts
import(`./locales/${language}/translation.json`)
```
When the user selects a language, i18next fetches the corresponding JSON file.
The locale selector reads available languages from `src/locales/locales.json`.
## Build and CI
- **`make build`** → runs `make json` to convert `.po` files to JSON before
webpack bundling
- **CI (Woodpecker)** runs `make node-generate-prod` which calls
`pnpm install && pnpm build` — no translation extraction happens in CI, only
the committed JSON files are bundled
## Tools
- `i18next-cli` — extracts keys from source code (AST-based)
- `i18next-conv` — converts between `.po` and i18next JSON
- `msgmerge` / `msgcat` — standard gettext merge/collate tools
- `gettext-parser` — cleans headers in generated POT file
## Configuration
- `i18n/i18next.config.ts` — extraction config (input globs, output path)
- `src/i18n.ts` — runtime setup (detection, fallbacks, backend loader)

View File

@@ -57,11 +57,6 @@ msgstr "Konto auswählen"
msgid "Clicking \"Allow\" will redirect you to: {{redirectURI}}"
msgstr "Wenn Sie \"Einverstanden\" klicken werden Sie zu {{redirectURI}} weitergeleitet"
#. From: konnect##login##usernameField##placeholder##email
#: konnect##login##usernameField##placeholder##email
msgid "Email"
msgstr "E-Mail"
#. From: konnect##error##login##validate##missingUsername
#: konnect##error##login##validate##missingUsername
msgid "Enter a valid value."
@@ -92,11 +87,6 @@ msgstr "Hallo {{displayName}}"
msgid "Hi {{displayName}}"
msgstr "Hallo {{displayName}}"
#. From: konnect##login##usernameField##placeholder##identity
#: konnect##login##usernameField##placeholder##identity
msgid "Identity"
msgstr "Identität"
#. From: konnect##scopeDescription##offlineAccess
#: konnect##scopeDescription##offlineAccess
msgid "Keep the allowed access persistently and forever"
@@ -164,8 +154,8 @@ msgstr "Unerwarteter Antwort-Status: {{state}}"
msgid "Use another account"
msgstr "Anderes Konto"
#. From: konnect##login##usernameField##placeholder##username
#: konnect##login##usernameField##placeholder##username
#. From: konnect##login##usernameField##label
#: konnect##login##usernameField##label
msgid "Username"
msgstr "Benutzername"

View File

@@ -56,11 +56,6 @@ msgstr ""
msgid "Clicking \"Allow\" will redirect you to: {{redirectURI}}"
msgstr ""
#. From: konnect##login##usernameField##placeholder##email
#: konnect##login##usernameField##placeholder##email
msgid "Email"
msgstr ""
#. From: konnect##error##login##validate##missingUsername
#: konnect##error##login##validate##missingUsername
msgid "Enter a valid value."
@@ -91,11 +86,6 @@ msgstr ""
msgid "Hi {{displayName}}"
msgstr ""
#. From: konnect##login##usernameField##placeholder##identity
#: konnect##login##usernameField##placeholder##identity
msgid "Identity"
msgstr ""
#. From: konnect##scopeDescription##offlineAccess
#: konnect##scopeDescription##offlineAccess
msgid "Keep the allowed access persistently and forever"
@@ -163,8 +153,8 @@ msgstr ""
msgid "Use another account"
msgstr ""
#. From: konnect##login##usernameField##placeholder##username
#: konnect##login##usernameField##placeholder##username
#. From: konnect##login##usernameField##label
#: konnect##login##usernameField##label
msgid "Username"
msgstr ""

View File

@@ -57,11 +57,6 @@ msgstr "Choisir un compte"
msgid "Clicking \"Allow\" will redirect you to: {{redirectURI}}"
msgstr "En cliquant \"Autoriser\" vous serez redirigé vers: {{redirectURI}}"
#. From: konnect##login##usernameField##placeholder##email
#: konnect##login##usernameField##placeholder##email
msgid "Email"
msgstr ""
#. From: konnect##error##login##validate##missingUsername
#: konnect##error##login##validate##missingUsername
msgid "Enter a valid value."
@@ -92,11 +87,6 @@ msgstr "Bonjour {{displayName}}"
msgid "Hi {{displayName}}"
msgstr "Bonjour {{displayName}}"
#. From: konnect##login##usernameField##placeholder##identity
#: konnect##login##usernameField##placeholder##identity
msgid "Identity"
msgstr ""
#. From: konnect##scopeDescription##offlineAccess
#: konnect##scopeDescription##offlineAccess
msgid "Keep the allowed access persistently and forever"
@@ -164,8 +154,8 @@ msgstr "Erreur d'état inattendue : {{state}}"
msgid "Use another account"
msgstr "Utiliser un autre compte"
#. From: konnect##login##usernameField##placeholder##username
#: konnect##login##usernameField##placeholder##username
#. From: konnect##login##usernameField##label
#: konnect##login##usernameField##label
msgid "Username"
msgstr "Utilisateur"

View File

@@ -0,0 +1,10 @@
import { defineConfig } from 'i18next-cli';
export default defineConfig({
locales: ['en'],
extract: {
currentLocale: 'en',
input: ['../src/**/*.{js,jsx,ts,tsx}'],
output: 'translation.{{language}}.json',
},
});

View File

@@ -57,11 +57,6 @@ msgstr ""
msgid "Clicking \"Allow\" will redirect you to: {{redirectURI}}"
msgstr ""
#. From: konnect##login##usernameField##placeholder##email
#: konnect##login##usernameField##placeholder##email
msgid "Email"
msgstr ""
#. From: konnect##error##login##validate##missingUsername
#: konnect##error##login##validate##missingUsername
msgid "Enter a valid value."
@@ -92,11 +87,6 @@ msgstr ""
msgid "Hi {{displayName}}"
msgstr ""
#. From: konnect##login##usernameField##placeholder##identity
#: konnect##login##usernameField##placeholder##identity
msgid "Identity"
msgstr ""
#. From: konnect##scopeDescription##offlineAccess
#: konnect##scopeDescription##offlineAccess
msgid "Keep the allowed access persistently and forever"
@@ -164,8 +154,8 @@ msgstr ""
msgid "Use another account"
msgstr ""
#. From: konnect##login##usernameField##placeholder##username
#: konnect##login##usernameField##placeholder##username
#. From: konnect##login##usernameField##label
#: konnect##login##usernameField##label
msgid "Username"
msgstr ""

View File

@@ -57,11 +57,6 @@ msgstr "Account kiezen"
msgid "Clicking \"Allow\" will redirect you to: {{redirectURI}}"
msgstr "Door op \"Toestaan\" te klikken word je doorverwezen naar: {{redirectURI}}"
#. From: konnect##login##usernameField##placeholder##email
#: konnect##login##usernameField##placeholder##email
msgid "Email"
msgstr ""
#. From: konnect##error##login##validate##missingUsername
#: konnect##error##login##validate##missingUsername
msgid "Enter a valid value."
@@ -92,11 +87,6 @@ msgstr "Hallo {{displayName}}"
msgid "Hi {{displayName}}"
msgstr "Hoi {{displayName}}"
#. From: konnect##login##usernameField##placeholder##identity
#: konnect##login##usernameField##placeholder##identity
msgid "Identity"
msgstr ""
#. From: konnect##scopeDescription##offlineAccess
#: konnect##scopeDescription##offlineAccess
msgid "Keep the allowed access persistently and forever"
@@ -164,8 +154,8 @@ msgstr "Onverwachte respons status: {{state}}"
msgid "Use another account"
msgstr "Gebruik een ander account"
#. From: konnect##login##usernameField##placeholder##username
#: konnect##login##usernameField##placeholder##username
#. From: konnect##login##usernameField##label
#: konnect##login##usernameField##label
msgid "Username"
msgstr "Gebruikersnaam"

View File

@@ -3,192 +3,187 @@ msgstr ""
"Project-Id-Version: LibreGraph Connect Identifier\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2022-03-09T19:33:04.641Z\n"
"POT-Creation-Date: 2026-07-08T15:11:00.860Z\n"
"MIME-Version: 1.0\n"
#. From: konnect##loading##error##headline
#: konnect##loading##error##headline
msgid "Failed to connect to server"
msgstr ""
#. From: konnect##login##retryButton##label
#: konnect##login##retryButton##label
msgid "Retry"
msgstr ""
#. From: konnect##login##usernameField##placeholder##email
#: konnect##login##usernameField##placeholder##email
msgid "Email"
msgstr ""
#. From: konnect##login##usernameField##placeholder##identity
#: konnect##login##usernameField##placeholder##identity
msgid "Identity"
msgstr ""
#. From: konnect##login##usernameField##placeholder##username
#: konnect##login##usernameField##placeholder##username
msgid "Username"
msgstr ""
#. From: konnect##login##headline
#: konnect##login##headline
msgid "Sign in"
msgstr ""
#. From: konnect##login##passwordField##label
#: konnect##login##passwordField##label
msgid "Password"
msgstr ""
#. From: konnect##login##nextButton##label
#: konnect##login##nextButton##label
msgid "Next"
msgstr ""
#. From: konnect##scopeDescription##aliasBasic
#: konnect##scopeDescription##aliasBasic
msgid "Access your basic account information"
msgstr ""
#. From: konnect##scopeDescription##offlineAccess
#: konnect##scopeDescription##offlineAccess
msgid "Keep the allowed access persistently and forever"
msgstr ""
#. From: konnect##scopeDescription##scope
#: konnect##scopeDescription##scope
msgid "Scope: {{scope}}"
msgstr ""
#. From: konnect##goodbye##headline
#: konnect##goodbye##headline
msgid "Goodbye"
msgstr ""
#. From: konnect##goodbye##subHeader
#: konnect##goodbye##subHeader
msgid "you have been signed out from your account"
msgstr ""
#. From: konnect##goodbye##message##close
#: konnect##goodbye##message##close
msgid "You can close this window now."
msgstr ""
#. From: konnect##goodbye##message##confirm
#: konnect##goodbye##message##confirm
msgid "Press the button below, to sign out from your account now."
msgstr ""
#. From: konnect##goodbye##confirm##headline
#: konnect##goodbye##confirm##headline
msgid "Hello {{displayName}}"
msgstr ""
#. From: konnect##goodbye##confirm##subHeader
#: konnect##goodbye##confirm##subHeader
msgid "please confirm sign out"
msgstr ""
#. From: konnect##goodbye##signoutButton##label
#. konnect##welcome##signoutButton##label
#: konnect##goodbye##signoutButton##label
#: konnect##welcome##signoutButton##label
msgid "Sign out"
msgstr ""
#. From: konnect##chooseaccount##headline
#: konnect##chooseaccount##headline
#. From: translation##konnect##chooseaccount##headline
#: translation##konnect##chooseaccount##headline
msgid "Choose an account"
msgstr ""
#. From: konnect##chooseaccount##subHeader
#: konnect##chooseaccount##subHeader
#. From: translation##konnect##chooseaccount##subHeader
#: translation##konnect##chooseaccount##subHeader
msgid "to sign in"
msgstr ""
#. From: konnect##chooseaccount##useOther##persona##label
#: konnect##chooseaccount##useOther##persona##label
msgid "?"
msgstr ""
#. From: konnect##chooseaccount##useOther##label
#: konnect##chooseaccount##useOther##label
#. From: translation##konnect##chooseaccount##useOther##label
#: translation##konnect##chooseaccount##useOther##label
msgid "Use another account"
msgstr ""
#. From: konnect##consent##headline
#: konnect##consent##headline
msgid "Hi {{displayName}}"
#. From: translation##konnect##chooseaccount##useOther##persona##label
#: translation##konnect##chooseaccount##useOther##persona##label
msgid "?"
msgstr ""
#. From: konnect##consent##message
#: konnect##consent##message
msgid "<0><0><0></0></0></0> wants to"
msgstr ""
#. From: konnect##consent##tooltip##client
#: konnect##consent##tooltip##client
msgid "Clicking \"Allow\" will redirect you to: {{redirectURI}}"
msgstr ""
#. From: konnect##consent##question
#: konnect##consent##question
msgid "Allow <1><0></0></1> to do this?"
msgstr ""
#. From: konnect##consent##consequence
#: konnect##consent##consequence
msgid "By clicking Allow, you allow this app to use your information."
msgstr ""
#. From: konnect##consent##cancelButton##label
#: konnect##consent##cancelButton##label
msgid "Cancel"
msgstr ""
#. From: konnect##consent##allowButton##label
#: konnect##consent##allowButton##label
#. From: translation##konnect##consent##allowButton##label
#: translation##konnect##consent##allowButton##label
msgid "Allow"
msgstr ""
#. From: konnect##welcome##headline
#: konnect##welcome##headline
msgid "Welcome {{displayName}}"
#. From: translation##konnect##consent##cancelButton##label
#: translation##konnect##consent##cancelButton##label
msgid "Cancel"
msgstr ""
#. From: konnect##welcome##message
#: konnect##welcome##message
msgid "You are signed in - awesome!"
#. From: translation##konnect##consent##consequence
#: translation##konnect##consent##consequence
msgid "By clicking Allow, you allow this app to use your information."
msgstr ""
#. From: konnect##error##login##validate##missingUsername
#: konnect##error##login##validate##missingUsername
msgid "Enter a valid value."
#. From: translation##konnect##consent##headline
#: translation##konnect##consent##headline
msgid "Hi {{displayName}}"
msgstr ""
#. From: konnect##error##login##validate##missingPassword
#: konnect##error##login##validate##missingPassword
msgid "Enter your password."
#. From: translation##konnect##consent##message
#: translation##konnect##consent##message
msgid "<0><0><0></0></0></0> wants to"
msgstr ""
#. From: konnect##error##login##failed
#: konnect##error##login##failed
msgid "Logon failed. Please verify your credentials and try again."
#. From: translation##konnect##consent##question
#: translation##konnect##consent##question
msgid "Allow <1><0></0></1> to do this?"
msgstr ""
#. From: konnect##error##http##networkError
#: konnect##error##http##networkError
#. From: translation##konnect##consent##tooltip##client
#: translation##konnect##consent##tooltip##client
msgid "Clicking \"Allow\" will redirect you to: {{redirectURI}}"
msgstr ""
#. From: translation##konnect##error##http##networkError
#: translation##konnect##error##http##networkError
msgid "Network error. Please check your connection and try again."
msgstr ""
#. From: konnect##error##http##unexpectedResponseStatus
#: konnect##error##http##unexpectedResponseStatus
#. From: translation##konnect##error##http##unexpectedResponseState
#: translation##konnect##error##http##unexpectedResponseState
msgid "Unexpected response state: {{state}}"
msgstr ""
#. From: translation##konnect##error##http##unexpectedResponseStatus
#: translation##konnect##error##http##unexpectedResponseStatus
msgid "Unexpected HTTP response: {{status}}. Please check your connection and try again."
msgstr ""
#. From: konnect##error##http##unexpectedResponseState
#: konnect##error##http##unexpectedResponseState
msgid "Unexpected response state: {{state}}"
#. From: translation##konnect##error##login##failed
#: translation##konnect##error##login##failed
msgid "Logon failed. Please verify your credentials and try again."
msgstr ""
#. From: translation##konnect##error##login##validate##missingPassword
#: translation##konnect##error##login##validate##missingPassword
msgid "Enter your password."
msgstr ""
#. From: translation##konnect##error##login##validate##missingUsername
#: translation##konnect##error##login##validate##missingUsername
msgid "Enter a valid value."
msgstr ""
#. From: translation##konnect##footer##slogan
#: translation##konnect##footer##slogan
msgid "<strong>OpenCloud</strong> - excellent file sharing"
msgstr ""
#. From: translation##konnect##goodbye##confirm##headline
#: translation##konnect##goodbye##confirm##headline
msgid "Hello {{displayName}}"
msgstr ""
#. From: translation##konnect##goodbye##confirm##subHeader
#: translation##konnect##goodbye##confirm##subHeader
msgid "please confirm sign out"
msgstr ""
#. From: translation##konnect##goodbye##headline
#: translation##konnect##goodbye##headline
msgid "Goodbye"
msgstr ""
#. From: translation##konnect##goodbye##message##close
#: translation##konnect##goodbye##message##close
msgid "You can close this window now."
msgstr ""
#. From: translation##konnect##goodbye##message##confirm
#: translation##konnect##goodbye##message##confirm
msgid "Press the button below, to sign out from your account now."
msgstr ""
#. From: translation##konnect##goodbye##signoutButton##label
#. translation##konnect##welcome##signoutButton##label
#: translation##konnect##goodbye##signoutButton##label
#: translation##konnect##welcome##signoutButton##label
msgid "Sign out"
msgstr ""
#. From: translation##konnect##goodbye##subHeader
#: translation##konnect##goodbye##subHeader
msgid "you have been signed out from your account"
msgstr ""
#. From: translation##konnect##loading##error##headline
#: translation##konnect##loading##error##headline
msgid "Failed to connect to server"
msgstr ""
#. From: translation##konnect##login##headline
#: translation##konnect##login##headline
msgid "Sign in"
msgstr ""
#. From: translation##konnect##login##nextButton##label
#: translation##konnect##login##nextButton##label
msgid "Log in"
msgstr ""
#. From: translation##konnect##login##passwordField##label
#: translation##konnect##login##passwordField##label
msgid "Password"
msgstr ""
#. From: translation##konnect##login##retryButton##label
#: translation##konnect##login##retryButton##label
msgid "Retry"
msgstr ""
#. From: translation##konnect##login##usernameField##label
#: translation##konnect##login##usernameField##label
msgid "Username"
msgstr ""
#. From: translation##konnect##scopeDescription##aliasBasic
#: translation##konnect##scopeDescription##aliasBasic
msgid "Access your basic account information"
msgstr ""
#. From: translation##konnect##scopeDescription##offlineAccess
#: translation##konnect##scopeDescription##offlineAccess
msgid "Keep the allowed access persistently and forever"
msgstr ""
#. From: translation##konnect##scopeDescription##scope
#: translation##konnect##scopeDescription##scope
msgid "Scope: {{scope}}"
msgstr ""
#. From: translation##konnect##welcome##headline
#: translation##konnect##welcome##headline
msgid "Welcome {{displayName}}"
msgstr ""
#. From: translation##konnect##welcome##message
#: translation##konnect##welcome##message
msgid "You are signed in - awesome!"
msgstr ""

View File

@@ -55,11 +55,6 @@ msgstr ""
msgid "Clicking \"Allow\" will redirect you to: {{redirectURI}}"
msgstr ""
#. From: konnect##login##usernameField##placeholder##email
#: konnect##login##usernameField##placeholder##email
msgid "Email"
msgstr ""
#. From: konnect##error##login##validate##missingUsername
#: konnect##error##login##validate##missingUsername
msgid "Enter a valid value."
@@ -90,11 +85,6 @@ msgstr ""
msgid "Hi {{displayName}}"
msgstr ""
#. From: konnect##login##usernameField##placeholder##identity
#: konnect##login##usernameField##placeholder##identity
msgid "Identity"
msgstr ""
#. From: konnect##scopeDescription##offlineAccess
#: konnect##scopeDescription##offlineAccess
msgid "Keep the allowed access persistently and forever"
@@ -162,8 +152,8 @@ msgstr ""
msgid "Use another account"
msgstr ""
#. From: konnect##login##usernameField##placeholder##username
#: konnect##login##usernameField##placeholder##username
#. From: konnect##login##usernameField##label
#: konnect##login##usernameField##label
msgid "Username"
msgstr ""

View File

@@ -61,9 +61,10 @@
"css-minimizer-webpack-plugin": "^8.0.0",
"dotenv": "17.4.2",
"dotenv-expand": "^13.0.0",
"gettext-parser": "^9.0.2",
"html-webpack-plugin": "^5.6.7",
"i18next-cli": "^1.65.0",
"i18next-conv": "^17.0.0",
"i18next-parser": "^9.4.0",
"license-checker-rseidelsohn": "5.0.1",
"mini-css-extract-plugin": "2.9.2",
"pnp-webpack-plugin": "1.7.0",

View File

File diff suppressed because it is too large Load Diff

View File

@@ -26,7 +26,8 @@ overrides:
"serialize-javascript@<7.0.3": ">=7.0.3"
shell-quote: ">=1.8.4"
"@babel/plugin-transform-modules-systemjs": ">=7.29.4"
"@xmldom/xmldom": ">=0.8.13"
"@xmldom/xmldom": "0.8.11"
allowBuilds:
'@swc/core': false
esbuild: true

View File

@@ -30,26 +30,6 @@
"offlineAccess": "Dauerhaften Zugriff (läuft nicht ab)",
"scope": "Geltungsbereich: {{scope}}"
},
"login": {
"usernameField": {
"label": "Benutzername",
"placeholder": {
"email": "E-Mail",
"identity": "Identität",
"username": "Benutzername"
}
},
"nextButton": {
"label": "Weiter"
},
"passwordField": {
"label": "Passwort"
},
"retryButton": {
"label": "Wiederholen"
},
"headline": "Anmelden"
},
"error": {
"login": {
"validate": {
@@ -84,6 +64,21 @@
},
"subHeader": "sie sind jetzt abgemeldet"
},
"login": {
"nextButton": {
"label": "Weiter"
},
"passwordField": {
"label": "Passwort"
},
"retryButton": {
"label": "Wiederholen"
},
"headline": "Anmelden",
"usernameField": {
"label": "Benutzername"
}
},
"welcome": {
"signoutButton": {
"label": "Abmelden"
@@ -92,4 +87,4 @@
"message": "Sie sind angemeldet - super!"
}
}
}
}

View File

@@ -11,14 +11,6 @@
}
},
"scopeDescription": {},
"login": {
"usernameField": {
"placeholder": {}
},
"nextButton": {},
"passwordField": {},
"retryButton": {}
},
"error": {
"login": {
"validate": {}
@@ -33,6 +25,12 @@
"message": {},
"signoutButton": {}
},
"login": {
"nextButton": {},
"passwordField": {},
"retryButton": {},
"usernameField": {}
},
"welcome": {
"signoutButton": {}
}

View File

@@ -30,23 +30,6 @@
"offlineAccess": "Conserver les autorisations d'accès à l'avenir",
"scope": "Portée : {{scope}}"
},
"login": {
"usernameField": {
"placeholder": {
"username": "Utilisateur"
}
},
"nextButton": {
"label": "Suivant"
},
"passwordField": {
"label": "Mot de passe"
},
"retryButton": {
"label": "Réessayer"
},
"headline": "Identification"
},
"error": {
"login": {
"validate": {
@@ -80,6 +63,21 @@
},
"subHeader": "vous avez été déconnecté"
},
"login": {
"nextButton": {
"label": "Suivant"
},
"passwordField": {
"label": "Mot de passe"
},
"retryButton": {
"label": "Réessayer"
},
"headline": "Identification",
"usernameField": {
"label": "Utilisateur"
}
},
"welcome": {
"signoutButton": {
"label": "Quitter"

View File

@@ -11,14 +11,6 @@
}
},
"scopeDescription": {},
"login": {
"usernameField": {
"placeholder": {}
},
"nextButton": {},
"passwordField": {},
"retryButton": {}
},
"error": {
"login": {
"validate": {}
@@ -33,6 +25,12 @@
"message": {},
"signoutButton": {}
},
"login": {
"nextButton": {},
"passwordField": {},
"retryButton": {},
"usernameField": {}
},
"welcome": {
"signoutButton": {}
}

View File

@@ -30,23 +30,6 @@
"offlineAccess": "De toestemming voor altijd onthouden",
"scope": "Scope: {{scope}}"
},
"login": {
"usernameField": {
"placeholder": {
"username": "Gebruikersnaam"
}
},
"nextButton": {
"label": "Volgende"
},
"passwordField": {
"label": "Wachtwoord"
},
"retryButton": {
"label": "Opnieuw"
},
"headline": "Aanmelden"
},
"error": {
"login": {
"validate": {
@@ -80,6 +63,21 @@
},
"subHeader": "je bent afgemeld van je account"
},
"login": {
"nextButton": {
"label": "Volgende"
},
"passwordField": {
"label": "Wachtwoord"
},
"retryButton": {
"label": "Opnieuw"
},
"headline": "Aanmelden",
"usernameField": {
"label": "Gebruikersnaam"
}
},
"welcome": {
"signoutButton": {
"label": "Afmelden"

View File

@@ -11,14 +11,6 @@
}
},
"scopeDescription": {},
"login": {
"usernameField": {
"placeholder": {}
},
"nextButton": {},
"passwordField": {},
"retryButton": {}
},
"error": {
"login": {
"validate": {}
@@ -33,6 +25,12 @@
"message": {},
"signoutButton": {}
},
"login": {
"nextButton": {},
"passwordField": {},
"retryButton": {},
"usernameField": {}
},
"welcome": {
"signoutButton": {}
}