Compare commits
261 Commits
Author | SHA1 | Date | |
---|---|---|---|
ecaf1c7b7c | |||
8702ec29a8 | |||
d8206434bc | |||
c71c2a8710 | |||
e55b881017 | |||
ab906ec417 | |||
0b1ff529f7 | |||
85a6835748 | |||
259271bc0f | |||
b7bc0f178b | |||
688455d0aa | |||
3c96d2ea42 | |||
ab81481e5a | |||
a429ad5dcf | |||
5e1c5b510b | |||
9e63183f4b | |||
b1e740f026 | |||
ce4ea55438 | |||
18ab7cd22f | |||
8807743daf | |||
aad50377ff | |||
4b3ae58ea7 | |||
ce2c68ecc9 | |||
0c155a7a2e | |||
afddfe8b58 | |||
5fa0915271 | |||
6a0a170b17 | |||
4dde5b6e45 | |||
4b93a1cb9e | |||
e3a0639a0c | |||
4d3220820b | |||
a4ac9fb0f3 | |||
1ff79ecf07 | |||
1166b16420 | |||
213224942f | |||
ff16e66275 | |||
3c338e983f | |||
2c11ba6520 | |||
9a21656706 | |||
e96ee5ba53 | |||
b421633a8a | |||
e2e0d62560 | |||
c71fb06940 | |||
e2171af99c | |||
8cebf049d4 | |||
ef139ed1cc | |||
d717de006a | |||
a44f091878 | |||
1b37ba5339 | |||
bbaa90e997 | |||
86e6c4a419 | |||
4159883791 | |||
d8b00da3a1 | |||
a24945bc1b | |||
158759493f | |||
36e32d6ddc | |||
84908e2ec0 | |||
a2dc51d811 | |||
fb3b0e2c29 | |||
1a3e4c68bb | |||
11b2342da0 | |||
80d4a808d3 | |||
da4146eb59 | |||
a0be35db8b | |||
14db9cd523 | |||
0c315385dd | |||
c0a0eb02fb | |||
ee407c32ad | |||
9262d21829 | |||
a13f710325 | |||
eac1a6036f | |||
987f3d7586 | |||
875322669c | |||
33a264b3d0 | |||
c059eff170 | |||
b4a22fc9dd | |||
6d1cbdc463 | |||
2bfbba4daf | |||
21ffe82bde | |||
8e6f597027 | |||
16c5065560 | |||
c4b985f1a4 | |||
042747c7d2 | |||
e4a46f31de | |||
6d9e62d2b4 | |||
9caaa507b1 | |||
5c7d3c5b44 | |||
8bac57d87a | |||
b8d759cd63 | |||
da72e3e5ac | |||
2afd36fee0 | |||
b7e75d8828 | |||
30e20f4e7d | |||
ce0ab8dccf | |||
5b20ab2f7c | |||
daaaed43df | |||
3a4bd791ad | |||
eecddd7f6b | |||
a34eaa136e | |||
53be8b5e96 | |||
f0ae5ea908 | |||
9910556a8b | |||
5997416e1b | |||
9a9fc56f85 | |||
2a5e919f29 | |||
8031d51e15 | |||
56ce9c0d0d | |||
8cd584cbd5 | |||
f5b87f4669 | |||
a1a65c5529 | |||
832434095e | |||
b85f1ef351 | |||
8bee5d788e | |||
0752d857e2 | |||
07e4056694 | |||
0eb4ab85b3 | |||
69ef47daf8 | |||
6eaa1f69ac | |||
5aab75fae0 | |||
7407c98005 | |||
dcd4322e44 | |||
81a4d46b08 | |||
e85895ab55 | |||
095bdb16ba | |||
68de7f897d | |||
51b4c6b1bd | |||
6d4ac977c1 | |||
a73fc5ebc1 | |||
3c8461a39f | |||
de76d06e48 | |||
a27c28c24f | |||
ed234ec88b | |||
7a0a046596 | |||
0641151ca1 | |||
c6dc2377fa | |||
a3050b3983 | |||
69c15bd473 | |||
2be40816b2 | |||
a98bb25133 | |||
d130c23f5d | |||
cd936ee4ef | |||
67e3dca0c3 | |||
de53f1ff40 | |||
d79081dee4 | |||
449f100bc0 | |||
0612b2d0a4 | |||
583a3e541a | |||
9d8d30a864 | |||
95cda8538f | |||
b116f22152 | |||
ff2fb0d6dc | |||
020823e933 | |||
5879972924 | |||
8031294230 | |||
e0a6935c49 | |||
3d581a5454 | |||
317ad8386c | |||
7ad5011280 | |||
76990702f0 | |||
9a27824fe9 | |||
d877d90bf3 | |||
0b790c47e6 | |||
6b49c8dd95 | |||
e56f9b144e | |||
3c82944daf | |||
5e3070a6c4 | |||
a3a0e9eebe | |||
c6593f03bc | |||
54dc4f650c | |||
dec7af0381 | |||
ae001eea54 | |||
4d0e17a11e | |||
c708e619e9 | |||
2cceb3c929 | |||
aee8704691 | |||
43af60237b | |||
e615479b41 | |||
973fb4d2d5 | |||
964feae846 | |||
ea3d8a5634 | |||
48aab2d92a | |||
00eab73954 | |||
5f6f8b12bd | |||
c2d4d6fd49 | |||
04b660ff9b | |||
c292d926be | |||
23b83ceef7 | |||
1324648db6 | |||
735bff3348 | |||
05a6aee782 | |||
c7349c2556 | |||
51f3d06752 | |||
31759d86ab | |||
7c6eed99d2 | |||
bc4b0ec17d | |||
f766348b87 | |||
82281303d0 | |||
1caa17beb0 | |||
1c4d346f9f | |||
4320efb049 | |||
a756423768 | |||
8525fc74c0 | |||
30c0cc5aa8 | |||
b3bbd7c07d | |||
09d4ba2bb0 | |||
30315027c1 | |||
05acefe70e | |||
6c14758e33 | |||
b93ec20119 | |||
ce04646576 | |||
9282dfe491 | |||
fca6280bcc | |||
cdeb575ec6 | |||
271dbe4fb7 | |||
9a0337114d | |||
2d28f4eb55 | |||
f673927e16 | |||
52896b82a9 | |||
9d53ecb0cd | |||
aec3ac32e5 | |||
f150f1568e | |||
309189c55d | |||
f68c54cd3a | |||
bef8545161 | |||
c21cd14ac2 | |||
275d7f0072 | |||
58c8306cf4 | |||
f782b684ad | |||
092b2a5f52 | |||
42b2d40ad6 | |||
3f6fe6cfc0 | |||
1abf542a74 | |||
c4720ca03d | |||
4316878cce | |||
c180d75a83 | |||
4a040b32c0 | |||
ea330a1eef | |||
2451ba0a77 | |||
2c276a56e5 | |||
708030b8b5 | |||
d5fc0582bc | |||
f9dce82c83 | |||
e82602f994 | |||
1d36395e5a | |||
8f8857bc22 | |||
226247b3b6 | |||
b2ea5014f3 | |||
48bc416aa7 | |||
386e7203b2 | |||
9bdb224631 | |||
dd36aacbee | |||
6b57b1c720 | |||
9e9e6d41ff | |||
5140389502 | |||
fc6328131f | |||
9de0083ca6 | |||
f5231b840d | |||
afb6596c4b | |||
dde9afef92 | |||
6595e9c3cb | |||
f15c0ecbb0 |
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -1,3 +1,3 @@
|
||||
src/lib/i18n/generated_kcMessages/* linguist-documentation
|
||||
src/bin/build-keycloak-theme/index.ts -linguist-detectable
|
||||
src/bin/keycloakify/index.ts -linguist-detectable
|
||||
src/bin/install-builtin-keycloak-themes.ts -linguist-detectable
|
||||
|
4
.github/FUNDING.yaml
vendored
Normal file
4
.github/FUNDING.yaml
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [garronej]
|
||||
custom: ['https://www.ringerhq.com/experts/garronej']
|
25
.github/release.yaml
vendored
Normal file
25
.github/release.yaml
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
changelog:
|
||||
exclude:
|
||||
labels:
|
||||
- ignore-for-release
|
||||
authors:
|
||||
- octocat
|
||||
categories:
|
||||
- title: Breaking Changes đ
|
||||
labels:
|
||||
- breaking
|
||||
- title: Exciting New Features đ
|
||||
labels:
|
||||
- feature
|
||||
- title: Fixes đ§
|
||||
labels:
|
||||
- fix
|
||||
- title: Documentation đ§
|
||||
labels:
|
||||
- docs
|
||||
- title: CI đ·
|
||||
labels:
|
||||
- ci
|
||||
- title: Other Changes
|
||||
labels:
|
||||
- '*'
|
79
.github/workflows/ci.yaml
vendored
79
.github/workflows/ci.yaml
vendored
@ -9,11 +9,12 @@ on:
|
||||
|
||||
jobs:
|
||||
|
||||
test_formatting:
|
||||
test_lint:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ !github.event.created && github.repository != 'garronej/ts-ci' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2.3.4
|
||||
- uses: actions/setup-node@v2.1.3
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: bahmutov/npm-install@v1
|
||||
- name: If this step fails run 'yarn format' then commit again.
|
||||
run: |
|
||||
@ -23,20 +24,21 @@ jobs:
|
||||
fi
|
||||
$PACKAGE_MANAGER run format:check
|
||||
test:
|
||||
runs-on: macos-10.15
|
||||
needs: test_formatting
|
||||
runs-on: ${{ matrix.os }}
|
||||
needs: test_lint
|
||||
strategy:
|
||||
matrix:
|
||||
node: [ '15', '14' ]
|
||||
name: Test with Node v${{ matrix.node }}
|
||||
node: [ '14', '15' ,'16', '17' ]
|
||||
os: [ windows-latest, ubuntu-latest ]
|
||||
name: Test with Node v${{ matrix.node }} on ${{ matrix.os }}
|
||||
steps:
|
||||
- name: Tell if project is using npm or yarn
|
||||
id: step1
|
||||
uses: garronej/ts-ci@v1.1.6
|
||||
uses: garronej/ts-ci@v2.0.2
|
||||
with:
|
||||
action_name: tell_if_project_uses_npm_or_yarn
|
||||
- uses: actions/checkout@v2.3.4
|
||||
- uses: actions/setup-node@v2.1.3
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node }}
|
||||
- uses: bahmutov/npm-install@v1
|
||||
@ -62,64 +64,49 @@ jobs:
|
||||
from_version: ${{ steps.step1.outputs.from_version }}
|
||||
to_version: ${{ steps.step1.outputs.to_version }}
|
||||
is_upgraded_version: ${{ steps.step1.outputs.is_upgraded_version }}
|
||||
is_release_beta: ${{steps.step1.outputs.is_release_beta }}
|
||||
is_pre_release: ${{steps.step1.outputs.is_pre_release }}
|
||||
steps:
|
||||
- uses: garronej/ts-ci@v1.1.6
|
||||
- uses: garronej/ts-ci@v2.0.2
|
||||
id: step1
|
||||
with:
|
||||
action_name: is_package_json_version_upgraded
|
||||
branch: ${{ github.head_ref || github.ref }}
|
||||
|
||||
update_changelog:
|
||||
runs-on: ubuntu-latest
|
||||
needs: check_if_version_upgraded
|
||||
if: needs.check_if_version_upgraded.outputs.is_upgraded_version == 'true'
|
||||
steps:
|
||||
- uses: garronej/ts-ci@v1.1.6
|
||||
with:
|
||||
action_name: update_changelog
|
||||
branch: ${{ github.head_ref || github.ref }}
|
||||
|
||||
create_github_release:
|
||||
runs-on: ubuntu-latest
|
||||
# We create a release only if the version have been upgraded and we are on the main branch
|
||||
# or if we are on a branch of the repo that has an PR open on main.
|
||||
if: |
|
||||
needs.check_if_version_upgraded.outputs.is_upgraded_version == 'true' &&
|
||||
(
|
||||
github.event_name == 'push' ||
|
||||
needs.check_if_version_upgraded.outputs.is_pre_release == 'true'
|
||||
)
|
||||
needs:
|
||||
- update_changelog
|
||||
- check_if_version_upgraded
|
||||
steps:
|
||||
- name: Build GitHub release body
|
||||
id: step1
|
||||
run: |
|
||||
if [ "$FROM_VERSION" = "0.0.0" ]; then
|
||||
echo "::set-output name=body::đ"
|
||||
else
|
||||
echo "::set-output name=body::đ [CHANGELOG](https://github.com/$GITHUB_REPOSITORY/blob/v$TO_VERSION/CHANGELOG.md)"
|
||||
fi
|
||||
env:
|
||||
FROM_VERSION: ${{ needs.check_if_version_upgraded.outputs.from_version }}
|
||||
TO_VERSION: ${{ needs.check_if_version_upgraded.outputs.to_version }}
|
||||
- uses: garronej/action-gh-release@v0.2.0
|
||||
- uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
name: Release v${{ needs.check_if_version_upgraded.outputs.to_version }}
|
||||
tag_name: v${{ needs.check_if_version_upgraded.outputs.to_version }}
|
||||
target_commitish: ${{ github.head_ref || github.ref }}
|
||||
body: ${{ steps.step1.outputs.body }}
|
||||
generate_release_notes: true
|
||||
draft: false
|
||||
prerelease: ${{ needs.check_if_version_upgraded.outputs.is_release_beta == 'true' }}
|
||||
prerelease: ${{ needs.check_if_version_upgraded.outputs.is_pre_release == 'true' }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
publish_on_npm:
|
||||
runs-on: macos-10.15
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- update_changelog
|
||||
- create_github_release
|
||||
- check_if_version_upgraded
|
||||
steps:
|
||||
- uses: actions/checkout@v2.3.4
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
- uses: actions/setup-node@v2.1.3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '15'
|
||||
registry-url: https://registry.npmjs.org/
|
||||
- uses: bahmutov/npm-install@v1
|
||||
- run: |
|
||||
@ -128,7 +115,7 @@ jobs:
|
||||
PACKAGE_MANAGER=yarn
|
||||
fi
|
||||
$PACKAGE_MANAGER run build
|
||||
- run: npx -y -p denoify@0.6.5 denoify_enable_short_npm_import_path
|
||||
- run: npx -y -p denoify@1.2.2 enable_short_npm_import_path
|
||||
env:
|
||||
DRY_RUN: "0"
|
||||
- name: Publishing on NPM
|
||||
@ -142,11 +129,11 @@ jobs:
|
||||
false
|
||||
fi
|
||||
EXTRA_ARGS=""
|
||||
if [ "$IS_BETA" = "true" ]; then
|
||||
EXTRA_ARGS="--tag beta"
|
||||
if [ "$IS_PRE_RELEASE" = "true" ]; then
|
||||
EXTRA_ARGS="--tag next"
|
||||
fi
|
||||
npm publish $EXTRA_ARGS
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
|
||||
VERSION: ${{ needs.check_if_version_upgraded.outputs.to_version }}
|
||||
IS_BETA: ${{ needs.check_if_version_upgraded.outputs.is_release_beta }}
|
||||
IS_PRE_RELEASE: ${{ needs.check_if_version_upgraded.outputs.is_pre_release }}
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -41,6 +41,7 @@ jspm_packages
|
||||
.DS_Store
|
||||
|
||||
/dist
|
||||
/dist_test
|
||||
|
||||
/sample_react_project/
|
||||
/.yarn_home/
|
||||
|
@ -1,7 +1,9 @@
|
||||
node_modules/
|
||||
/dist/
|
||||
/dist_test/
|
||||
/CHANGELOG.md
|
||||
/.yarn_home/
|
||||
/src/test/apps/
|
||||
/src/tools/types/
|
||||
/sample_react_project
|
||||
/sample_react_project
|
||||
/build_keycloak/
|
@ -5,7 +5,7 @@
|
||||
"semi": true,
|
||||
"singleQuote": false,
|
||||
"quoteProps": "preserve",
|
||||
"trailingComma": "all",
|
||||
"trailingComma": "none",
|
||||
"bracketSpacing": true,
|
||||
"arrowParens": "avoid"
|
||||
}
|
||||
|
909
CHANGELOG.md
909
CHANGELOG.md
@ -1,909 +0,0 @@
|
||||
### **5.3.1** (2022-04-29)
|
||||
|
||||
- Comment out missleading informations
|
||||
|
||||
## **5.3.0** (2022-04-28)
|
||||
|
||||
- Rename keycloak_theme_email to keycloak_email (it's shorter)
|
||||
|
||||
## **5.2.0** (2022-04-27)
|
||||
|
||||
- Export KcApp
|
||||
|
||||
## **5.1.0** (2022-04-27)
|
||||
|
||||
- Export kcLanguageTags
|
||||
|
||||
# **5.0.0** (2022-04-27)
|
||||
|
||||
- i18n rebuild from the ground up
|
||||
|
||||
## **4.10.0** (2022-04-26)
|
||||
|
||||
- Merge pull request #92 from Tasyp/add-login-idp-link-email
|
||||
|
||||
feat: add login-idp-link-email page
|
||||
- feat: add mock data for login-idp-link-email page
|
||||
- feat: supply broker context with context
|
||||
|
||||
## **4.9.0** (2022-04-25)
|
||||
|
||||
- Test by default with kc 18. Update instructions to use quay.io/keycloak/keycloak instead of jboss/keycloak #93
|
||||
|
||||
### **4.8.7** (2022-04-25)
|
||||
|
||||
- Update instructions to test on Keycloak 18 https://github.com/keycloak/keycloak-web/issues/306 #93
|
||||
- Move the documentation form the readme to docs.keycloakify.dev
|
||||
- Update README.md
|
||||
- Update demo video
|
||||
|
||||
### **4.8.6** (2022-04-22)
|
||||
|
||||
- always offer to download v11.0.3
|
||||
|
||||
### **4.8.5** (2022-04-22)
|
||||
|
||||
- #91
|
||||
|
||||
### **4.8.4** (2022-04-22)
|
||||
|
||||
- #90
|
||||
|
||||
### **4.8.3** (2022-04-20)
|
||||
|
||||
|
||||
|
||||
### **4.8.2** (2022-04-20)
|
||||
|
||||
- Tell pepoles they can test with different keycloak version
|
||||
|
||||
### **4.8.1** (2022-04-20)
|
||||
|
||||
- Add missing shebang
|
||||
- Add video demo for npx download-builtin-keycloak-theme
|
||||
|
||||
## **4.8.0** (2022-04-20)
|
||||
|
||||
- Document email template customization feature #9
|
||||
- Add mention of download-builtin-keycloak-theme
|
||||
- Let the choice of kc version be auto in GH Action
|
||||
- Only test on node v15 and v14 (bellow is no longer supported (rmSync)
|
||||
- Feature email customization #9
|
||||
|
||||
### **4.7.6** (2022-04-12)
|
||||
|
||||
- Fix bugs with language switch #85
|
||||
|
||||
### **4.7.5** (2022-04-09)
|
||||
|
||||
- Fix #85
|
||||
|
||||
### **4.7.4** (2022-04-09)
|
||||
|
||||
- M1 Mac compat (for real this time)
|
||||
|
||||
### **4.7.3** (2022-04-08)
|
||||
|
||||
- Mention that there is still problems with M1 Mac
|
||||
|
||||
### **4.7.2** (2022-04-06)
|
||||
|
||||
- #43: M1 Mac support
|
||||
|
||||
### **4.7.1** (2022-03-30)
|
||||
|
||||
- Improve browser autofill
|
||||
- factorization
|
||||
|
||||
## **4.7.0** (2022-03-17)
|
||||
|
||||
- Add support for options validator
|
||||
- remove duplicate dependency
|
||||
|
||||
## **4.6.0** (2022-03-07)
|
||||
|
||||
- Remove powerhooks as dev dependency
|
||||
|
||||
### **4.5.5** (2022-03-07)
|
||||
|
||||
- Update tss-react
|
||||
|
||||
### **4.5.4** (2022-03-06)
|
||||
|
||||
- Remove tss-react from peerDependencies (it becomes a dependency)
|
||||
- (dev script) Use tsconfig.json to tell we are at the root of the project
|
||||
|
||||
### **4.5.3** (2022-01-26)
|
||||
|
||||
- Themes no longer have to break on minor Keycloakify update
|
||||
|
||||
### **4.5.2** (2022-01-20)
|
||||
|
||||
- Test container uses Keycloak 16.1.0
|
||||
- Merge pull request #78 from InseeFrLab/Ann2827/pull
|
||||
|
||||
Ann2827/pull
|
||||
- Refactor #78
|
||||
- Compat with Keycloak 16 (and probably 17, 18) #79
|
||||
- Warning about compat issues with Keycloak 16
|
||||
- fix: changes
|
||||
- fix: Errors on pages login-idp-link-confirm and login-idp-link-email
|
||||
|
||||
ref: https://github.com/InseeFrLab/keycloakify/issues/75
|
||||
|
||||
### **4.5.1** (2022-01-18)
|
||||
|
||||
- fix previous version
|
||||
|
||||
## **4.5.0** (2022-01-18)
|
||||
|
||||
- Read public/CNAME for domain name in --externel-assets mode
|
||||
|
||||
## **4.4.0** (2022-01-01)
|
||||
|
||||
- Merge pull request #73 from lazToum/main
|
||||
|
||||
(feature) added login-page-expired.ftl
|
||||
- added login-page-expired.ftl
|
||||
- Add update instruction for 4.3.0
|
||||
|
||||
## **4.3.0** (2021-12-27)
|
||||
|
||||
- Merge pull request #72 from praiz/main
|
||||
|
||||
feat(*): added login-update-password
|
||||
- feat(*): added login-update-password
|
||||
|
||||
### **4.2.21** (2021-12-27)
|
||||
|
||||
- update dependencies
|
||||
|
||||
### **4.2.19** (2021-12-21)
|
||||
|
||||
- Merge pull request #70 from VBustamante/patch-1
|
||||
- Added realm name field to KcContext mocks object
|
||||
- Merge pull request #69 from VBustamante/patch-1
|
||||
|
||||
Adding name field to realm in KcContext type
|
||||
- Adding name field to realm in KcContext type
|
||||
|
||||
### **4.2.18** (2021-12-17)
|
||||
|
||||
- Improve css url() import (fix CRA 5)
|
||||
|
||||
### **4.2.17** (2021-12-16)
|
||||
|
||||
- Fix path.join polyfill
|
||||
|
||||
### **4.2.16** (2021-12-16)
|
||||
|
||||
|
||||
|
||||
### **4.2.15** (2021-12-16)
|
||||
|
||||
- use custom polyfill for path.join (fix webpack 5 build)
|
||||
|
||||
### **4.2.14** (2021-12-12)
|
||||
|
||||
- Merge pull request #65 from InseeFrLab/doge_ftl_errors
|
||||
|
||||
Prevent ftl errors in Keycloak log
|
||||
- Encourage users to report errors in logs
|
||||
- Fix ftl error related to url.loginAction in saml-post-form.ftl
|
||||
- Ftl prevent error with updateProfileCtx
|
||||
- Ftl prevent error with auth.attemptedUsername
|
||||
- Fix ftl error as comment formatting
|
||||
- Merge remote-tracking branch 'origin/main' into doge_ftl_errors
|
||||
- Update README, remove all instruction about errors in logs
|
||||
- Avoid error in Keycloak logs, fix long template loading time
|
||||
- Add missing collon in README sample code
|
||||
|
||||
Add miss ','
|
||||
|
||||
### **4.2.13** (2021-12-08)
|
||||
|
||||
- Fix broken link about how to import fonts #62
|
||||
- Add a video to show how to test the theme in a local container
|
||||
|
||||
### **4.2.12** (2021-12-08)
|
||||
|
||||
- Update post build instructions
|
||||
|
||||
### **4.2.11** (2021-12-07)
|
||||
|
||||
|
||||
|
||||
### **4.2.10** (2021-11-12)
|
||||
|
||||
- Export an exaustive list of KcLanguageTag
|
||||
|
||||
### **4.2.9** (2021-11-11)
|
||||
|
||||
- Fix useAdvancedMsg
|
||||
|
||||
### **4.2.8** (2021-11-10)
|
||||
|
||||
- Update doc about pattern that can be used for user attributes #50
|
||||
- Bring back Safari compat
|
||||
|
||||
### **4.2.7** (2021-11-09)
|
||||
|
||||
- Fix useFormValidationSlice
|
||||
|
||||
### **4.2.6** (2021-11-08)
|
||||
|
||||
- Fix deepClone so we can overwrite with undefined in when we mock kcContext
|
||||
|
||||
### **4.2.5** (2021-11-07)
|
||||
|
||||
- Better debugging experience with user profile
|
||||
|
||||
### **4.2.4** (2021-11-01)
|
||||
|
||||
- Better autoComplete typings
|
||||
|
||||
### **4.2.3** (2021-11-01)
|
||||
|
||||
- Make it more easy to understand that error in the log are expected
|
||||
|
||||
### **4.2.2** (2021-10-27)
|
||||
|
||||
- Replace 'path' by 'browserify-path' #47
|
||||
|
||||
### **4.2.1** (2021-10-26)
|
||||
|
||||
- useFormValidationSlice: update when params have changed
|
||||
- Explains that the password can't be validated
|
||||
|
||||
## **4.2.0** (2021-10-26)
|
||||
|
||||
- Export types definitions for Attribue and Validator
|
||||
|
||||
## **4.1.0** (2021-10-26)
|
||||
|
||||
- Document what's new in v4
|
||||
|
||||
# **4.0.0** (2021-10-26)
|
||||
|
||||
- fix RegisterUserProfile password confirmation field
|
||||
- Much better support for frontend field validation
|
||||
- Fix css injection order
|
||||
- Makes the download output predictable. This fixes the case where GitHub redirects and wget was trying to download a filename called "15.0.2", and then unzip wouldn't pick it up.
|
||||
Changes wget to curl because curl is awesome. -L is to follow the GitHub redirects.
|
||||
- Remove duplicates
|
||||
|
||||
### **3.0.2** (2021-10-18)
|
||||
|
||||
- Scan deeper to retreive user attribute
|
||||
|
||||
### **3.0.1** (2021-10-17)
|
||||
|
||||
- Add client.description in type kcContext type def
|
||||
|
||||
# **3.0.0** (2021-10-16)
|
||||
|
||||
|
||||
|
||||
### **2.5.3** (2021-10-16)
|
||||
|
||||
|
||||
|
||||
### **2.5.2** (2021-10-13)
|
||||
|
||||
|
||||
|
||||
### **2.5.1** (2021-10-13)
|
||||
|
||||
- Update tss-react
|
||||
|
||||
## **2.5.0** (2021-10-12)
|
||||
|
||||
- register-user-profile.ftl tested working
|
||||
- Make kcMessage more easily hackable
|
||||
- fix useKcMessage
|
||||
- Implement and type validators
|
||||
- Remove syntax error in ftl and make it more directly debugable
|
||||
- Support register-user-profile.ftl
|
||||
|
||||
## **2.4.0** (2021-10-08)
|
||||
|
||||
- #38: Implement messagesPerField existsError and get
|
||||
|
||||
## **2.3.0** (2021-10-07)
|
||||
|
||||
- #20: Support advancedMsg
|
||||
|
||||
## **2.2.0** (2021-10-07)
|
||||
|
||||
- Feat scrip: download-builtin-keycloak-theme for downloading any version of the builtin themes
|
||||
- Use the latest version of keycloak for testing
|
||||
- Test locally with 15.0.2 instead of 11.0.3
|
||||
|
||||
## **2.1.0** (2021-10-06)
|
||||
|
||||
- Support Hungarian and Danish (use Keycloak 15 language resources)
|
||||
|
||||
### **2.0.20** (2021-10-05)
|
||||
|
||||
- Update README.md
|
||||
|
||||
### **2.0.19** (2021-09-17)
|
||||
|
||||
- Fix kcContext type definitions
|
||||
|
||||
### **2.0.18** (2021-09-14)
|
||||
|
||||
|
||||
|
||||
### **2.0.17** (2021-09-14)
|
||||
|
||||
|
||||
|
||||
### **2.0.16** (2021-09-12)
|
||||
|
||||
- Add explaination about errors in logs
|
||||
|
||||
### **2.0.15** (2021-08-31)
|
||||
|
||||
- Update tss-react
|
||||
|
||||
### **2.0.14** (2021-08-20)
|
||||
|
||||
- Update tss-react
|
||||
|
||||
### **2.0.13** (2021-08-04)
|
||||
|
||||
- Merge pull request #28 from marcmrf/main
|
||||
|
||||
fix(mvn): scoped packages compatibility
|
||||
- fix(mvn): scoped packages compatibility
|
||||
|
||||
### **2.0.12** (2021-07-28)
|
||||
|
||||
- Merge pull request #27 from jchn-codes/patch-1
|
||||
|
||||
add maven to requirements
|
||||
- add maven to requirements
|
||||
- Add #bluehats in the keyworks
|
||||
|
||||
### **2.0.11** (2021-07-21)
|
||||
|
||||
- Spaces in file path #22
|
||||
- uptdate dependnecies
|
||||
- Inport specific powerhooks files to reduce bundle size
|
||||
|
||||
### **2.0.10** (2021-07-16)
|
||||
|
||||
- Update dependencies
|
||||
|
||||
### **2.0.9** (2021-07-14)
|
||||
|
||||
- Fix #21
|
||||
|
||||
### **2.0.8** (2021-07-12)
|
||||
|
||||
- Fix previous release
|
||||
- #20: Add def for clientId and name on kcContext.client
|
||||
|
||||
### **2.0.6** (2021-07-08)
|
||||
|
||||
- Merge pull request #18 from asashay/add-custom-props-to-theme-properties
|
||||
|
||||
Add possibility to add custom properties to theme.properties file
|
||||
- add possibility to add custom properties to theme.properties file
|
||||
|
||||
### **2.0.5** (2021-07-05)
|
||||
|
||||
- Fix broken url for big stylesheet #16
|
||||
|
||||
### **2.0.4** (2021-07-03)
|
||||
|
||||
- Fix: #7
|
||||
|
||||
### **2.0.3** (2021-06-30)
|
||||
|
||||
- Escape double quote in ftl to js conversion #15
|
||||
- Update readme
|
||||
|
||||
### **2.0.2** (2021-06-28)
|
||||
|
||||
- Updagte README for implementing non incuded pages
|
||||
|
||||
### **2.0.1** (2021-06-28)
|
||||
|
||||
- Update documentation for v2
|
||||
|
||||
# **2.0.0** (2021-06-28)
|
||||
|
||||
- Fix last bugs before relasing v2
|
||||
- Implement a mechanism to overload kcContext
|
||||
- Give the option in template to pull the default assets or not
|
||||
- Enable possiblity to support custom pages (without forking keycloakify)
|
||||
- Implement a getter for kcContext
|
||||
- Update README.md
|
||||
|
||||
# **2.0.0** (2021-06-28)
|
||||
|
||||
- Fix last bugs before relasing v2
|
||||
- Implement a mechanism to overload kcContext
|
||||
- Give the option in template to pull the default assets or not
|
||||
- Enable possiblity to support custom pages (without forking keycloakify)
|
||||
- Implement a getter for kcContext
|
||||
- Update README.md
|
||||
|
||||
### **1.2.1** (2021-06-22)
|
||||
|
||||
- Remove unessesary log
|
||||
|
||||
## **1.2.0** (2021-06-22)
|
||||
|
||||
- Generate kcContext automatically :rocket:
|
||||
|
||||
### **1.1.6** (2021-06-21)
|
||||
|
||||
- Fix: Alert messages sometimes includes HTML that is not rendered
|
||||
- Update dist
|
||||
|
||||
### **1.1.5** (2021-06-15)
|
||||
|
||||
- #11: Provide socials in the register
|
||||
|
||||
### **1.1.4** (2021-06-15)
|
||||
|
||||
- Merge pull request #12 from InseeFrLab/email-typo
|
||||
|
||||
Fix typo on email
|
||||
- Fix typo on email
|
||||
|
||||
### **1.1.3** (2021-06-14)
|
||||
|
||||
- Add missing key in Login for providers
|
||||
|
||||
### **1.1.2** (2021-06-14)
|
||||
|
||||
|
||||
|
||||
### **1.1.1** (2021-06-14)
|
||||
|
||||
|
||||
|
||||
## **1.1.0** (2021-06-14)
|
||||
|
||||
- Add login-idp-link-confirm.ftl
|
||||
- Fix login-update-profile.ftl
|
||||
- Add login-update-profile.ftl page
|
||||
- Fix default background bug
|
||||
- Remove unused 'markdown' dependency
|
||||
- Fix warning related to powerhooks_useGlobalState_kcLanguageTag
|
||||
- Update README.md
|
||||
|
||||
### **1.0.4** (2021-05-28)
|
||||
|
||||
- Instructions for custom themes with custom components
|
||||
|
||||
### **1.0.3** (2021-05-23)
|
||||
|
||||
- Instuction about how to integrate with non CRA projects
|
||||
- Add mention to awesome list
|
||||
|
||||
### **1.0.2** (2021-05-01)
|
||||
|
||||
|
||||
|
||||
### **1.0.1** (2021-05-01)
|
||||
|
||||
- Fix: LoginOtp (and not otc)
|
||||
|
||||
# **1.0.0** (2021-05-01)
|
||||
|
||||
- #4: Guide for implementing a missing page
|
||||
- Support OTP #4
|
||||
|
||||
### **0.4.4** (2021-04-29)
|
||||
|
||||
- Fix previous release
|
||||
|
||||
### **0.4.3** (2021-04-29)
|
||||
|
||||
- Add infos about the plugin that defines authorizedMailDomains
|
||||
|
||||
### **0.4.2** (2021-04-29)
|
||||
|
||||
- Client side validation of allowed email domains
|
||||
- Support email whitlisting
|
||||
- Restore kickstart video in the readme
|
||||
- Update README.md
|
||||
- Update README.md
|
||||
- Important readme update
|
||||
|
||||
### **0.4.1** (2021-04-11)
|
||||
|
||||
- Quietly re-introduce --external-assets
|
||||
- Give example of customization
|
||||
|
||||
## **0.4.0** (2021-04-09)
|
||||
|
||||
- Acual support of Therms of services
|
||||
|
||||
### **0.3.24** (2021-04-08)
|
||||
|
||||
- Add missing dependency: markdown
|
||||
|
||||
### **0.3.23** (2021-04-08)
|
||||
|
||||
- Allow to lazily load therms
|
||||
|
||||
### **0.3.22** (2021-04-08)
|
||||
|
||||
- update powerhooks
|
||||
- Support terms and condition
|
||||
- Fix info.ftl
|
||||
- For useKcMessage we prefer returning callbacks with a changing references
|
||||
|
||||
### **0.3.21** (2021-04-04)
|
||||
|
||||
- Update powerhooks
|
||||
|
||||
### **0.3.20** (2021-04-01)
|
||||
|
||||
- Always catch freemarker errors
|
||||
|
||||
### **0.3.19** (2021-04-01)
|
||||
|
||||
- Fix previous release
|
||||
|
||||
### **0.3.18** (2021-04-01)
|
||||
|
||||
- Fix error.ftt, Adopt best effort strategy to convert ftl values into JS
|
||||
|
||||
### **0.3.17** (2021-03-29)
|
||||
|
||||
- Use push instead of replace in keycloak-js adapter to enable going back
|
||||
|
||||
### **0.3.15** (2021-03-28)
|
||||
|
||||
- Remove all reference to --external-assets, broken feature
|
||||
|
||||
### **0.3.14** (2021-03-28)
|
||||
|
||||
- Fix standalone mode: imports from js
|
||||
|
||||
### **0.3.13** (2021-03-26)
|
||||
|
||||
|
||||
|
||||
### **0.3.12** (2021-03-26)
|
||||
|
||||
- Fix mocksContext
|
||||
|
||||
### **0.3.11** (2021-03-26)
|
||||
|
||||
- Fix previous build, improve README
|
||||
|
||||
### **0.3.10** (2021-03-26)
|
||||
|
||||
- Handle <style> tag, improve documentation
|
||||
|
||||
### **0.3.9** (2021-03-25)
|
||||
|
||||
- Update readme
|
||||
- Document --external-assets
|
||||
- Update README.md
|
||||
- Update README.md
|
||||
- Update README.md
|
||||
|
||||
### **0.3.8** (2021-03-22)
|
||||
|
||||
- Make standalone mode the default
|
||||
|
||||
### **0.3.7** (2021-03-22)
|
||||
|
||||
- (test) external asset mode by default
|
||||
|
||||
### **0.3.6** (2021-03-22)
|
||||
|
||||
- Fix previous release
|
||||
|
||||
### **0.3.5** (2021-03-22)
|
||||
|
||||
- support homepage with urlPath
|
||||
|
||||
### **0.3.4** (2021-03-22)
|
||||
|
||||
- Bugfix: Import assets from CSS
|
||||
|
||||
### **0.3.3** (2021-03-22)
|
||||
|
||||
- Fix submit not receving correct text
|
||||
|
||||
### **0.3.2** (2021-03-21)
|
||||
|
||||
- Fix broken previous release
|
||||
|
||||
### **0.3.1** (2021-03-21)
|
||||
|
||||
- kcHeaderClass can be updated after initial mount
|
||||
|
||||
## **0.3.0** (2021-03-20)
|
||||
|
||||
- Bump version
|
||||
- Feat: Cary over states using URL search params
|
||||
- Bugfix: with kcHtmlClass
|
||||
|
||||
### **0.2.10** (2021-03-19)
|
||||
|
||||
- Remove dependency to denoify
|
||||
|
||||
### **0.2.9** (2021-03-19)
|
||||
|
||||
- Update deps and CI workflow
|
||||
|
||||
### **0.2.8** (2021-03-19)
|
||||
|
||||
- Bugfix: keycloak_build that grow and grow in size
|
||||
- Add disclaimer about maitainment strategy
|
||||
- Add a note for tested version support
|
||||
|
||||
### **0.2.7** (2021-03-13)
|
||||
|
||||
- Bump version
|
||||
- Update README.md
|
||||
- Update README.md
|
||||
|
||||
### **0.2.6** (2021-03-10)
|
||||
|
||||
- Fix generated gitignore
|
||||
|
||||
### **0.2.5** (2021-03-10)
|
||||
|
||||
- Fix generated .gitignore
|
||||
|
||||
### **0.2.4** (2021-03-10)
|
||||
|
||||
- Update README.md
|
||||
|
||||
### **0.2.3** (2021-03-09)
|
||||
|
||||
- fix gitignore generation
|
||||
|
||||
### **0.2.2** (2021-03-08)
|
||||
|
||||
- Add table of content
|
||||
- Update README.md
|
||||
- Update README.md
|
||||
|
||||
## **0.2.1** (2021-03-08)
|
||||
|
||||
- Update ci.yaml
|
||||
- Update readme
|
||||
- Update readme
|
||||
- update deps
|
||||
- Update readme
|
||||
- Add all mocks for testing
|
||||
- many small fixes
|
||||
|
||||
### **0.1.6** (2021-03-07)
|
||||
|
||||
- Fix Turkish
|
||||
|
||||
### **0.1.5** (2021-03-07)
|
||||
|
||||
- Fix getKcLanguageLabel
|
||||
|
||||
### **0.1.4** (2021-03-07)
|
||||
|
||||
|
||||
|
||||
### **0.1.3** (2021-03-07)
|
||||
|
||||
- Implement LoginVerifyEmail
|
||||
- Implement login-reset-password.ftl
|
||||
|
||||
### **0.1.2** (2021-03-07)
|
||||
|
||||
- Fix build
|
||||
- Fix build
|
||||
|
||||
### **0.1.1** (2021-03-06)
|
||||
|
||||
- Implement Error page
|
||||
- rename pageBasename by pageId
|
||||
- Implement reactive programing for language switching
|
||||
- Add Info page, refactor
|
||||
|
||||
## **0.1.0** (2021-03-05)
|
||||
|
||||
- Rename keycloakify
|
||||
|
||||
### **0.0.33** (2021-03-05)
|
||||
|
||||
- Fix syncronization with non react pages
|
||||
|
||||
### **0.0.32** (2021-03-05)
|
||||
|
||||
- bump version
|
||||
- Add log to tell when we are using react
|
||||
- Fix missing parentesis
|
||||
|
||||
### **0.0.31** (2021-03-05)
|
||||
|
||||
- Fix typo
|
||||
- Fix register page 500
|
||||
|
||||
### **0.0.30** (2021-03-05)
|
||||
|
||||
- Edit language statistique
|
||||
|
||||
### **0.0.30** (2021-03-05)
|
||||
|
||||
- avoid escaping urls
|
||||
- Use default value instead of value
|
||||
- Fix double single quote problem in messages
|
||||
- Fix typo
|
||||
- Fix non editable username
|
||||
- Fix some bugs
|
||||
- Fix Object.deepAssign
|
||||
- Make the dongle to download smaller
|
||||
- Split kcContext among pages
|
||||
- Implement register
|
||||
|
||||
### **0.0.29** (2021-03-04)
|
||||
|
||||
- Fix build
|
||||
- Fix i18n
|
||||
- Login appear to be working now
|
||||
- closer but not there yet
|
||||
|
||||
### **0.0.28** (2021-03-03)
|
||||
|
||||
- fix build
|
||||
- There is no reason not to let use translations outside of keycloak
|
||||
|
||||
### **0.0.27** (2021-03-02)
|
||||
|
||||
- Implement entrypoint
|
||||
|
||||
### **0.0.26** (2021-03-02)
|
||||
|
||||
- Login page implemented
|
||||
- Implement login
|
||||
- remove unesseary log
|
||||
|
||||
### **0.0.25** (2021-03-02)
|
||||
|
||||
- Fix build and reduce size
|
||||
- Implement the template
|
||||
|
||||
### **0.0.24** (2021-03-01)
|
||||
|
||||
- update
|
||||
- update
|
||||
- update
|
||||
|
||||
### **0.0.23** (2021-03-01)
|
||||
|
||||
- update
|
||||
|
||||
### **0.0.23** (2021-03-01)
|
||||
|
||||
- update
|
||||
- update
|
||||
|
||||
### **0.0.23** (2021-03-01)
|
||||
|
||||
- update
|
||||
- update
|
||||
|
||||
### **0.0.23** (2021-03-01)
|
||||
|
||||
- update
|
||||
- Handle formatting in translation function
|
||||
|
||||
### **0.0.22** (2021-02-28)
|
||||
|
||||
- Split page messages
|
||||
|
||||
### **0.0.21** (2021-02-28)
|
||||
|
||||
- Restore yarn file
|
||||
- Multiple fixes
|
||||
- Update deps
|
||||
- Update deps
|
||||
- includes translations
|
||||
- Update README.md
|
||||
- improve docs
|
||||
- update
|
||||
- Update README.md
|
||||
- update
|
||||
- update
|
||||
- update
|
||||
- update
|
||||
|
||||
### **0.0.20** (2021-02-27)
|
||||
|
||||
- update
|
||||
- update
|
||||
|
||||
### **0.0.19** (2021-02-27)
|
||||
|
||||
- update
|
||||
- update
|
||||
|
||||
### **0.0.18** (2021-02-23)
|
||||
|
||||
- Bump version number
|
||||
- Moving on with implementation of the lib
|
||||
- Update readme
|
||||
- Readme eddit
|
||||
- Fixing video link
|
||||
|
||||
### **0.0.16** (2021-02-23)
|
||||
|
||||
- Bump version
|
||||
- Give test container credentials
|
||||
|
||||
### **0.0.14** (2021-02-23)
|
||||
|
||||
- Bump version number
|
||||
- enable the docker container to be run from the root of the react project
|
||||
|
||||
### **0.0.13** (2021-02-23)
|
||||
|
||||
- bump version
|
||||
|
||||
### **0.0.12** (2021-02-23)
|
||||
|
||||
- update readme
|
||||
|
||||
### **0.0.11** (2021-02-23)
|
||||
|
||||
- Add documentation
|
||||
|
||||
### **0.0.10** (2021-02-23)
|
||||
|
||||
- Remove extra closing bracket
|
||||
|
||||
### **0.0.9** (2021-02-22)
|
||||
|
||||
- fix container startup script
|
||||
- minor update
|
||||
|
||||
### **0.0.8** (2021-02-21)
|
||||
|
||||
- Include theme properties
|
||||
|
||||
### **0.0.7** (2021-02-21)
|
||||
|
||||
- fix build
|
||||
- Fix bundle
|
||||
|
||||
### **0.0.6** (2021-02-21)
|
||||
|
||||
- Include missing files in the release bundle
|
||||
|
||||
### **0.0.5** (2021-02-21)
|
||||
|
||||
- Bump version number
|
||||
- Make the install faster
|
||||
|
||||
### **0.0.4** (2021-02-21)
|
||||
|
||||
- Fix script visibility
|
||||
|
||||
### **0.0.3** (2021-02-21)
|
||||
|
||||
- Do not run tests on window
|
||||
- Add script for downloading base themes
|
||||
- Generate debug files to be able to test the container
|
||||
- Fix many little bugs
|
||||
- refactor
|
||||
- Almoste there
|
||||
- Things are starting to take form
|
||||
- Seems to be working
|
||||
- First draft
|
||||
- Remove eslint and prettyer
|
||||
|
||||
### **0.0.2** (2021-02-20)
|
||||
|
||||
- Update package.json
|
||||
|
3
CONTRIBUTING.md
Normal file
3
CONTRIBUTING.md
Normal file
@ -0,0 +1,3 @@
|
||||
Looking to contribute? Thank you! PR are more than welcome.
|
||||
|
||||
Please refers to [this documentation page](https://docs.keycloakify.dev/contributing) that will help you get started.
|
74
README.md
74
README.md
@ -2,7 +2,7 @@
|
||||
<img src="https://user-images.githubusercontent.com/6702424/109387840-eba11f80-7903-11eb-9050-db1dad883f78.png">
|
||||
</p>
|
||||
<p align="center">
|
||||
<i>đ Create Keycloak themes using React đ</i>
|
||||
<i>đ Create Keycloak themes using React đ</i>
|
||||
<br>
|
||||
<br>
|
||||
<a href="https://github.com/garronej/keycloakify/actions">
|
||||
@ -12,7 +12,7 @@
|
||||
<img src="https://img.shields.io/bundlephobia/minzip/keycloakify">
|
||||
</a>
|
||||
<a href="https://www.npmjs.com/package/keycloakify">
|
||||
<img src="https://img.shields.io/npm/dw/keycloakify">
|
||||
<img src="https://img.shields.io/npm/dm/keycloakify">
|
||||
</a>
|
||||
<a href="https://github.com/garronej/keycloakify/blob/main/LICENSE">
|
||||
<img src="https://img.shields.io/npm/l/keycloakify">
|
||||
@ -27,7 +27,14 @@
|
||||
<a href="https://www.keycloakify.dev">Home</a>
|
||||
-
|
||||
<a href="https://docs.keycloakify.dev">Documentation</a>
|
||||
</p>
|
||||
</p>
|
||||
<p align="center"> ---- Project starter / Demo setup ---- </p>
|
||||
<p align="center">
|
||||
<a href="https://github.com/garronej/keycloakify-starter">CSS Level customization</a>
|
||||
-
|
||||
<a href="https://github.com/garronej/keycloakify-advanced-starter">Component Level customization</a>
|
||||
</p>
|
||||
<p align="center"> ---- </p>
|
||||
|
||||
</p>
|
||||
|
||||
@ -36,8 +43,65 @@
|
||||
<img src="https://user-images.githubusercontent.com/6702424/110260457-a1c3d380-7fac-11eb-853a-80459b65626b.png">
|
||||
</p>
|
||||
|
||||
> đŁ V6 have been released đ
|
||||
> [It features major improvements](https://github.com/InseeFrLab/keycloakify#600).
|
||||
> Checkout [the migration guide](https://docs.keycloakify.dev/v5-to-v6).
|
||||
|
||||
# Changelog highlights
|
||||
|
||||
## 6.8.4
|
||||
|
||||
- `@emotion/react` is no longer a peer dependency of Keycloakify.
|
||||
|
||||
## 6.8.0
|
||||
|
||||
- It is now possible to pass a custom `<Template />` component as a prop to `<KcApp />` and every
|
||||
individual page (`<Login />`, `<RegisterUserProfile />`, ...) it enables to customize only the header and footer for
|
||||
example without having to switch to a full-component level customization. [See issue](https://github.com/InseeFrLab/keycloakify/issues/191).
|
||||
|
||||
## 6.7.0
|
||||
|
||||
- Add support for `webauthn-authenticate.ftl` thanks to [@mstrodl](https://github.com/Mstrodl)'s hacktoberfest [PR](https://github.com/InseeFrLab/keycloakify/pull/185).
|
||||
|
||||
## 6.6.0
|
||||
|
||||
- Add support for `login-password.ftl` thanks to [@mstrodl](https://github.com/Mstrodl)'s hacktoberfest [PR](https://github.com/InseeFrLab/keycloakify/pull/184).
|
||||
|
||||
## 6.5.0
|
||||
|
||||
- Add support for `login-username.ftl` thanks to [@mstrodl](https://github.com/Mstrodl)'s hacktoberfest [PR](https://github.com/InseeFrLab/keycloakify/pull/183).
|
||||
|
||||
## 6.4.0
|
||||
|
||||
- You can now optionally pass a `doFetchDefaultThemeResources: boolean` prop to every page component and the default `<KcApp />`
|
||||
This enables you to prevent the default CSS and JS that comes with the builtin Keycloak theme to be downloaded.
|
||||
You'll get [a black slate](https://user-images.githubusercontent.com/6702424/192619083-4baa5df4-4a21-4ec7-8e28-d200d1208299.png).
|
||||
|
||||
## 6.0.0
|
||||
|
||||
- Bundle size drastically reduced, locals and component dynamically loaded.
|
||||
- First print much quicker, use of React.lazy() everywhere.
|
||||
- Real i18n API.
|
||||
- Actual documentation for build options.
|
||||
|
||||
Checkout [the migration guide](https://docs.keycloakify.dev/v5-to-v6)
|
||||
|
||||
## 5.8.0
|
||||
|
||||
- [React.lazy()](https://reactjs.org/docs/code-splitting.html#reactlazy) support đ. [#141](https://github.com/InseeFrLab/keycloakify/issues/141)
|
||||
|
||||
## 5.7.0
|
||||
|
||||
- Feat `logout-confirm.ftl`. [PR](https://github.com/InseeFrLab/keycloakify/pull/120)
|
||||
|
||||
## 5.6.4
|
||||
|
||||
Fix `login-verify-email.ftl` page. [Before](https://user-images.githubusercontent.com/6702424/177436014-0bad22c4-5bfb-45bb-8fc9-dad65143cd0c.png) - [After](https://user-images.githubusercontent.com/6702424/177435797-ec5d7db3-84cf-49cb-8efc-3427a81f744e.png)
|
||||
|
||||
## v5.6.0
|
||||
|
||||
Add support for `login-config-totp.ftl` page [#127](https://github.com/InseeFrLab/keycloakify/pull/127).
|
||||
|
||||
## v5.3.0
|
||||
|
||||
Rename `keycloak_theme_email` to `keycloak_email`.
|
||||
@ -45,7 +109,9 @@ If you already had a `keycloak_theme_email` you should rename it `keycloak_email
|
||||
|
||||
## v5.0.0
|
||||
|
||||
New i18n system. Import of terms and services have changed. [See example](https://github.com/garronej/keycloakify-demo-app/blob/a5b6a50f24bc25e082931f5ad9ebf47492acd12a/src/index.tsx#L46-L63).
|
||||
[Migration guide](https://github.com/garronej/keycloakify-demo-app/blob/a5b6a50f24bc25e082931f5ad9ebf47492acd12a/src/index.tsx#L46-L63)
|
||||
New i18n system.
|
||||
Import of terms and services have changed. [See example](https://github.com/garronej/keycloakify-demo-app/blob/a5b6a50f24bc25e082931f5ad9ebf47492acd12a/src/index.tsx#L46-L63).
|
||||
|
||||
## v4.10.0
|
||||
|
||||
|
39
package.json
39
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "keycloakify",
|
||||
"version": "5.3.1",
|
||||
"version": "6.8.4",
|
||||
"description": "Keycloak theme generator for Reacts app",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -9,11 +9,12 @@
|
||||
"main": "dist/lib/index.js",
|
||||
"types": "dist/lib/index.d.ts",
|
||||
"scripts": {
|
||||
"clean": "rimraf dist/",
|
||||
"build": "yarn clean && tsc && yarn grant-exec-perms && yarn copy-files",
|
||||
"build": "rimraf dist/ && tsc -p src/bin && tsc -p src/lib && yarn grant-exec-perms && yarn copy-files dist/",
|
||||
"build:test": "rimraf dist_test/ && tsc -p src/test && yarn copy-files dist_test/",
|
||||
"grant-exec-perms": "node dist/bin/tools/grant-exec-perms.js",
|
||||
"test": "node dist/test/bin/main && node dist/test/lib",
|
||||
"copy-files": "copyfiles -u 1 src/**/*.ftl src/**/*.xml src/**/*.js dist/",
|
||||
"copy-files": "copyfiles -u 1 src/**/*.ftl",
|
||||
"pretest": "yarn build:test",
|
||||
"test": "node dist_test/test/bin && node dist_test/test/lib",
|
||||
"generate-messages": "node dist/bin/generate-i18n-messages.js",
|
||||
"link_in_test_app": "node dist/bin/link_in_test_app.js",
|
||||
"_format": "prettier '**/*.{ts,tsx,json,md}'",
|
||||
@ -21,7 +22,7 @@
|
||||
"format:check": "yarn _format --list-different"
|
||||
},
|
||||
"bin": {
|
||||
"build-keycloak-theme": "dist/bin/build-keycloak-theme/index.js",
|
||||
"keycloakify": "dist/bin/keycloakify/index.js",
|
||||
"create-keycloak-email-directory": "dist/bin/create-keycloak-email-directory.js",
|
||||
"download-builtin-keycloak-theme": "dist/bin/download-builtin-keycloak-theme.js"
|
||||
},
|
||||
@ -39,9 +40,7 @@
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"src/",
|
||||
"!src/test/",
|
||||
"dist/",
|
||||
"!dist/test/",
|
||||
"!dist/tsconfig.tsbuildinfo"
|
||||
],
|
||||
"keywords": [
|
||||
@ -56,35 +55,39 @@
|
||||
],
|
||||
"homepage": "https://github.com/garronej/keycloakify",
|
||||
"peerDependencies": {
|
||||
"@emotion/react": "^11.4.1",
|
||||
"react": "^16.8.0 || ^17.0.0"
|
||||
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@emotion/react": "^11.4.1",
|
||||
"@babel/core": "^7.0.0",
|
||||
"@types/memoizee": "^0.4.7",
|
||||
"@types/minimist": "^1.2.2",
|
||||
"@types/node": "^17.0.25",
|
||||
"@types/react": "^17.0.0",
|
||||
"@types/react": "18.0.9",
|
||||
"copyfiles": "^2.4.1",
|
||||
"husky": "^4.3.8",
|
||||
"lint-staged": "^11.0.0",
|
||||
"prettier": "^2.3.0",
|
||||
"properties-parser": "^0.3.1",
|
||||
"react": "^17.0.1",
|
||||
"react": "18.1.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"@emotion/react": "^11.10.4",
|
||||
"typescript": "^4.2.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@octokit/rest": "^18.12.0",
|
||||
"cheerio": "^1.0.0-rc.5",
|
||||
"cli-select": "^1.1.2",
|
||||
"evt": "2.0.0-beta.39",
|
||||
"evt": "^2.4.6",
|
||||
"memoizee": "^0.4.15",
|
||||
"minimal-polyfills": "^2.2.1",
|
||||
"minimal-polyfills": "^2.2.2",
|
||||
"minimist": "^1.2.6",
|
||||
"path-browserify": "^1.0.1",
|
||||
"powerhooks": "^0.14.0",
|
||||
"powerhooks": "^0.20.23",
|
||||
"react-markdown": "^5.0.3",
|
||||
"rfc4648": "^1.5.2",
|
||||
"scripting-tools": "^0.19.13",
|
||||
"tsafe": "^0.9.0",
|
||||
"tss-react": "^3.5.2"
|
||||
"tsafe": "^1.1.3",
|
||||
"tss-react": "4.4.1-rc.0",
|
||||
"zod": "^3.17.10"
|
||||
}
|
||||
}
|
||||
|
27
renovate.json
Normal file
27
renovate.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"baseBranches": ["main", "landingpage"],
|
||||
"extends": ["config:base"],
|
||||
"dependencyDashboard": false,
|
||||
"bumpVersion": "patch",
|
||||
"rangeStrategy": "bump",
|
||||
"ignorePaths": [".github/**"],
|
||||
"branchPrefix": "renovate_",
|
||||
"vulnerabilityAlerts": {
|
||||
"enabled": false
|
||||
},
|
||||
"packageRules": [
|
||||
{
|
||||
"packagePatterns": ["*"],
|
||||
"excludePackagePatterns": ["powerhooks", "tsafe", "evt"],
|
||||
"enabled": false
|
||||
},
|
||||
{
|
||||
"packagePatterns": ["powerhooks", "tsafe", "evt"],
|
||||
"matchUpdateTypes": ["minor", "patch"],
|
||||
"automerge": true,
|
||||
"automergeType": "branch",
|
||||
"groupName": "garronej_modules_update"
|
||||
}
|
||||
]
|
||||
}
|
@ -1,136 +0,0 @@
|
||||
import cheerio from "cheerio";
|
||||
import { replaceImportsFromStaticInJsCode, replaceImportsInInlineCssCode, generateCssCodeToDefineGlobals } from "../replaceImportFromStatic";
|
||||
import fs from "fs";
|
||||
import { join as pathJoin } from "path";
|
||||
import { objectKeys } from "tsafe/objectKeys";
|
||||
import { ftlValuesGlobalName } from "../ftlValuesGlobalName";
|
||||
|
||||
export const pageIds = [
|
||||
"login.ftl",
|
||||
"register.ftl",
|
||||
"register-user-profile.ftl",
|
||||
"info.ftl",
|
||||
"error.ftl",
|
||||
"login-reset-password.ftl",
|
||||
"login-verify-email.ftl",
|
||||
"terms.ftl",
|
||||
"login-otp.ftl",
|
||||
"login-update-profile.ftl",
|
||||
"login-update-password.ftl",
|
||||
"login-idp-link-confirm.ftl",
|
||||
"login-idp-link-email.ftl",
|
||||
"login-page-expired.ftl",
|
||||
] as const;
|
||||
|
||||
export type PageId = typeof pageIds[number];
|
||||
|
||||
export function generateFtlFilesCodeFactory(params: {
|
||||
cssGlobalsToDefine: Record<string, string>;
|
||||
indexHtmlCode: string;
|
||||
urlPathname: string;
|
||||
urlOrigin: undefined | string;
|
||||
}) {
|
||||
const { cssGlobalsToDefine, indexHtmlCode, urlPathname, urlOrigin } = params;
|
||||
|
||||
const $ = cheerio.load(indexHtmlCode);
|
||||
|
||||
$("script:not([src])").each((...[, element]) => {
|
||||
const { fixedJsCode } = replaceImportsFromStaticInJsCode({
|
||||
"jsCode": $(element).html()!,
|
||||
urlOrigin,
|
||||
});
|
||||
|
||||
$(element).text(fixedJsCode);
|
||||
});
|
||||
|
||||
$("style").each((...[, element]) => {
|
||||
const { fixedCssCode } = replaceImportsInInlineCssCode({
|
||||
"cssCode": $(element).html()!,
|
||||
"urlPathname": params.urlPathname,
|
||||
urlOrigin,
|
||||
});
|
||||
|
||||
$(element).text(fixedCssCode);
|
||||
});
|
||||
|
||||
(
|
||||
[
|
||||
["link", "href"],
|
||||
["script", "src"],
|
||||
] as const
|
||||
).forEach(([selector, attrName]) =>
|
||||
$(selector).each((...[, element]) => {
|
||||
const href = $(element).attr(attrName);
|
||||
|
||||
if (href === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
$(element).attr(
|
||||
attrName,
|
||||
urlOrigin !== undefined
|
||||
? href.replace(/^\//, `${urlOrigin}/`)
|
||||
: href.replace(new RegExp(`^${urlPathname.replace(/\//g, "\\/")}`), "${url.resourcesPath}/build/"),
|
||||
);
|
||||
}),
|
||||
);
|
||||
|
||||
//FTL is no valid html, we can't insert with cheerio, we put placeholder for injecting later.
|
||||
const replaceValueBySearchValue = {
|
||||
'{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }': fs
|
||||
.readFileSync(pathJoin(__dirname, "ftl_object_to_js_code_declaring_an_object.ftl"))
|
||||
.toString("utf8")
|
||||
.match(/^<script>const _=((?:.|\n)+)<\/script>[\n]?$/)![1],
|
||||
"<!-- xIdLqMeOedErIdLsPdNdI9dSlxI -->": [
|
||||
"<#if scripts??>",
|
||||
" <#list scripts as script>",
|
||||
' <script src="${script}" type="text/javascript"></script>',
|
||||
" </#list>",
|
||||
"</#if>",
|
||||
].join("\n"),
|
||||
};
|
||||
|
||||
$("head").prepend(
|
||||
[
|
||||
...(Object.keys(cssGlobalsToDefine).length === 0
|
||||
? []
|
||||
: [
|
||||
"",
|
||||
"<style>",
|
||||
generateCssCodeToDefineGlobals({
|
||||
cssGlobalsToDefine,
|
||||
urlPathname,
|
||||
}).cssCodeToPrependInHead,
|
||||
"</style>",
|
||||
"",
|
||||
]),
|
||||
"<script>",
|
||||
` window.${ftlValuesGlobalName}= ${objectKeys(replaceValueBySearchValue)[0]};`,
|
||||
"</script>",
|
||||
"",
|
||||
objectKeys(replaceValueBySearchValue)[1],
|
||||
].join("\n"),
|
||||
);
|
||||
|
||||
const partiallyFixedIndexHtmlCode = $.html();
|
||||
|
||||
function generateFtlFilesCode(params: { pageId: string }): {
|
||||
ftlCode: string;
|
||||
} {
|
||||
const { pageId } = params;
|
||||
|
||||
const $ = cheerio.load(partiallyFixedIndexHtmlCode);
|
||||
|
||||
let ftlCode = $.html();
|
||||
|
||||
Object.entries({
|
||||
...replaceValueBySearchValue,
|
||||
//If updated, don't forget to change in the ftl script as well.
|
||||
"PAGE_ID_xIgLsPgGId9D8e": pageId,
|
||||
}).map(([searchValue, replaceValue]) => (ftlCode = ftlCode.replace(searchValue, replaceValue)));
|
||||
|
||||
return { ftlCode };
|
||||
}
|
||||
|
||||
return { generateFtlFilesCode };
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
export * from "./build-keycloak-theme";
|
||||
import { main } from "./build-keycloak-theme";
|
||||
|
||||
if (require.main === module) {
|
||||
main();
|
||||
}
|
@ -1,92 +0,0 @@
|
||||
import * as crypto from "crypto";
|
||||
import { ftlValuesGlobalName } from "./ftlValuesGlobalName";
|
||||
|
||||
export function replaceImportsFromStaticInJsCode(params: { jsCode: string; urlOrigin: undefined | string }): { fixedJsCode: string } {
|
||||
/*
|
||||
NOTE:
|
||||
|
||||
When we have urlOrigin defined it means that
|
||||
we are building with --external-assets
|
||||
so we have to make sur that the fixed js code will run
|
||||
inside and outside keycloak.
|
||||
|
||||
When urlOrigin isn't defined we can assume the fixedJsCode
|
||||
will always run in keycloak context.
|
||||
*/
|
||||
|
||||
const { jsCode, urlOrigin } = params;
|
||||
|
||||
const fixedJsCode = jsCode
|
||||
.replace(/(\w+\.\w+)\+"static\//g, (...[, group]) =>
|
||||
urlOrigin === undefined
|
||||
? `window.${ftlValuesGlobalName}.url.resourcesPath + "/build/static/`
|
||||
: `("${ftlValuesGlobalName}" in window ? "${urlOrigin}" : "") + ${group} + "static/`,
|
||||
)
|
||||
.replace(/".chunk.css",(\w)+=(\w+\.\w+)\+(\w+),/, (...[, group1, group2, group3]) =>
|
||||
urlOrigin === undefined
|
||||
? `".chunk.css",${group1} = window.${ftlValuesGlobalName}.url.resourcesPath + "/build/" + ${group3},`
|
||||
: `".chunk.css",${group1} = ("${ftlValuesGlobalName}" in window ? "${urlOrigin}" : "") + ${group2} + ${group3},`,
|
||||
);
|
||||
|
||||
return { fixedJsCode };
|
||||
}
|
||||
|
||||
export function replaceImportsInInlineCssCode(params: { cssCode: string; urlPathname: string; urlOrigin: undefined | string }): {
|
||||
fixedCssCode: string;
|
||||
} {
|
||||
const { cssCode, urlPathname, urlOrigin } = params;
|
||||
|
||||
const fixedCssCode = cssCode.replace(
|
||||
urlPathname === "/" ? /url\(["']?\/([^/][^)"']+)["']?\)/g : new RegExp(`url\\(["']?${urlPathname}([^)"']+)["']?\\)`, "g"),
|
||||
(...[, group]) => `url(${urlOrigin === undefined ? "${url.resourcesPath}/build/" + group : params.urlOrigin + urlPathname + group})`,
|
||||
);
|
||||
|
||||
return { fixedCssCode };
|
||||
}
|
||||
|
||||
export function replaceImportsInCssCode(params: { cssCode: string }): {
|
||||
fixedCssCode: string;
|
||||
cssGlobalsToDefine: Record<string, string>;
|
||||
} {
|
||||
const { cssCode } = params;
|
||||
|
||||
const cssGlobalsToDefine: Record<string, string> = {};
|
||||
|
||||
new Set(cssCode.match(/url\(["']?\/[^/][^)"']+["']?\)[^;}]*/g) ?? []).forEach(
|
||||
match => (cssGlobalsToDefine["url" + crypto.createHash("sha256").update(match).digest("hex").substring(0, 15)] = match),
|
||||
);
|
||||
|
||||
let fixedCssCode = cssCode;
|
||||
|
||||
Object.keys(cssGlobalsToDefine).forEach(
|
||||
cssVariableName =>
|
||||
//NOTE: split/join pattern ~ replace all
|
||||
(fixedCssCode = fixedCssCode.split(cssGlobalsToDefine[cssVariableName]).join(`var(--${cssVariableName})`)),
|
||||
);
|
||||
|
||||
return { fixedCssCode, cssGlobalsToDefine };
|
||||
}
|
||||
|
||||
export function generateCssCodeToDefineGlobals(params: { cssGlobalsToDefine: Record<string, string>; urlPathname: string }): {
|
||||
cssCodeToPrependInHead: string;
|
||||
} {
|
||||
const { cssGlobalsToDefine, urlPathname } = params;
|
||||
|
||||
return {
|
||||
"cssCodeToPrependInHead": [
|
||||
":root {",
|
||||
...Object.keys(cssGlobalsToDefine)
|
||||
.map(cssVariableName =>
|
||||
[
|
||||
`--${cssVariableName}:`,
|
||||
cssGlobalsToDefine[cssVariableName].replace(
|
||||
new RegExp(`url\\(${urlPathname.replace(/\//g, "\\/")}`, "g"),
|
||||
"url(${url.resourcesPath}/build/",
|
||||
),
|
||||
].join(" "),
|
||||
)
|
||||
.map(line => ` ${line};`),
|
||||
"}",
|
||||
].join("\n"),
|
||||
};
|
||||
}
|
@ -1,16 +1,20 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { downloadBuiltinKeycloakTheme } from "./download-builtin-keycloak-theme";
|
||||
import { keycloakThemeEmailDirPath } from "./build-keycloak-theme";
|
||||
import { keycloakThemeEmailDirPath } from "./keycloakify";
|
||||
import { join as pathJoin, basename as pathBasename } from "path";
|
||||
import { transformCodebase } from "./tools/transformCodebase";
|
||||
import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
||||
import * as fs from "fs";
|
||||
import { getCliOptions } from "./tools/cliOptions";
|
||||
import { getLogger } from "./tools/logger";
|
||||
|
||||
if (require.main === module) {
|
||||
(async () => {
|
||||
const { isSilent } = getCliOptions(process.argv.slice(2));
|
||||
const logger = getLogger({ isSilent });
|
||||
if (fs.existsSync(keycloakThemeEmailDirPath)) {
|
||||
console.log(`There is already a ./${pathBasename(keycloakThemeEmailDirPath)} directory in your project. Aborting.`);
|
||||
logger.warn(`There is already a ./${pathBasename(keycloakThemeEmailDirPath)} directory in your project. Aborting.`);
|
||||
|
||||
process.exit(-1);
|
||||
}
|
||||
@ -22,14 +26,15 @@ if (require.main === module) {
|
||||
downloadBuiltinKeycloakTheme({
|
||||
keycloakVersion,
|
||||
"destDirPath": builtinKeycloakThemeTmpDirPath,
|
||||
isSilent
|
||||
});
|
||||
|
||||
transformCodebase({
|
||||
"srcDirPath": pathJoin(builtinKeycloakThemeTmpDirPath, "base", "email"),
|
||||
"destDirPath": keycloakThemeEmailDirPath,
|
||||
"destDirPath": keycloakThemeEmailDirPath
|
||||
});
|
||||
|
||||
console.log(`./${pathBasename(keycloakThemeEmailDirPath)} ready to be customized`);
|
||||
logger.log(`./${pathBasename(keycloakThemeEmailDirPath)} ready to be customized`);
|
||||
|
||||
fs.rmSync(builtinKeycloakThemeTmpDirPath, { "recursive": true, "force": true });
|
||||
})();
|
||||
|
@ -1,33 +1,40 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { keycloakThemeBuildingDirPath } from "./build-keycloak-theme";
|
||||
import { keycloakThemeBuildingDirPath } from "./keycloakify";
|
||||
import { join as pathJoin } from "path";
|
||||
import { downloadAndUnzip } from "./tools/downloadAndUnzip";
|
||||
import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
||||
import { getCliOptions } from "./tools/cliOptions";
|
||||
import { getLogger } from "./tools/logger";
|
||||
|
||||
export function downloadBuiltinKeycloakTheme(params: { keycloakVersion: string; destDirPath: string }) {
|
||||
const { keycloakVersion, destDirPath } = params;
|
||||
export function downloadBuiltinKeycloakTheme(params: { keycloakVersion: string; destDirPath: string; isSilent: boolean }) {
|
||||
const { keycloakVersion, destDirPath, isSilent } = params;
|
||||
|
||||
for (const ext of ["", "-community"]) {
|
||||
downloadAndUnzip({
|
||||
"destDirPath": destDirPath,
|
||||
"url": `https://github.com/keycloak/keycloak/archive/refs/tags/${keycloakVersion}.zip`,
|
||||
"pathOfDirToExtractInArchive": `keycloak-${keycloakVersion}/themes/src/main/resources${ext}/theme`,
|
||||
"cacheDirPath": pathJoin(keycloakThemeBuildingDirPath, ".cache"),
|
||||
isSilent
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (require.main === module) {
|
||||
(async () => {
|
||||
const { isSilent } = getCliOptions(process.argv.slice(2));
|
||||
const logger = getLogger({ isSilent });
|
||||
const { keycloakVersion } = await promptKeycloakVersion();
|
||||
|
||||
const destDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme");
|
||||
|
||||
console.log(`Downloading builtins theme of Keycloak ${keycloakVersion} here ${destDirPath}`);
|
||||
logger.log(`Downloading builtins theme of Keycloak ${keycloakVersion} here ${destDirPath}`);
|
||||
|
||||
downloadBuiltinKeycloakTheme({
|
||||
keycloakVersion,
|
||||
destDirPath,
|
||||
isSilent
|
||||
});
|
||||
})();
|
||||
}
|
||||
|
@ -1,16 +1,24 @@
|
||||
import "minimal-polyfills/Object.fromEntries";
|
||||
import * as fs from "fs";
|
||||
import { join as pathJoin, relative as pathRelative } from "path";
|
||||
import { join as pathJoin, relative as pathRelative, dirname as pathDirname } from "path";
|
||||
import { crawl } from "./tools/crawl";
|
||||
import { downloadBuiltinKeycloakTheme } from "./download-builtin-keycloak-theme";
|
||||
import { getProjectRoot } from "./tools/getProjectRoot";
|
||||
import { rm_rf, rm_r } from "./tools/rm";
|
||||
import { getCliOptions } from "./tools/cliOptions";
|
||||
import { getLogger } from "./tools/logger";
|
||||
|
||||
//NOTE: To run without argument when we want to generate src/i18n/generated_kcMessages files,
|
||||
// update the version array for generating for newer version.
|
||||
|
||||
//@ts-ignore
|
||||
const propertiesParser = require("properties-parser");
|
||||
|
||||
for (const keycloakVersion of ["11.0.3", "15.0.2", "16.1.0"]) {
|
||||
console.log({ keycloakVersion });
|
||||
const { isSilent } = getCliOptions(process.argv.slice(2));
|
||||
const logger = getLogger({ isSilent });
|
||||
|
||||
for (const keycloakVersion of ["11.0.3", "15.0.2", "18.0.1"]) {
|
||||
logger.log(JSON.stringify({ keycloakVersion }));
|
||||
|
||||
const tmpDirPath = pathJoin(getProjectRoot(), "tmp_xImOef9dOd44");
|
||||
|
||||
@ -19,6 +27,7 @@ for (const keycloakVersion of ["11.0.3", "15.0.2", "16.1.0"]) {
|
||||
downloadBuiltinKeycloakTheme({
|
||||
keycloakVersion,
|
||||
"destDirPath": tmpDirPath,
|
||||
isSilent
|
||||
});
|
||||
|
||||
type Dictionary = { [idiomId: string]: string };
|
||||
@ -39,36 +48,40 @@ for (const keycloakVersion of ["11.0.3", "15.0.2", "16.1.0"]) {
|
||||
|
||||
(record[typeOfPage] ??= {})[language.replace(/_/g, "-")] = Object.fromEntries(
|
||||
Object.entries(propertiesParser.parse(fs.readFileSync(pathJoin(baseThemeDirPath, filePath)).toString("utf8"))).map(
|
||||
([key, value]: any) => [key, value.replace(/''/g, "'")],
|
||||
),
|
||||
([key, value]: any) => [key, value.replace(/''/g, "'")]
|
||||
)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
rm_r(tmpDirPath);
|
||||
|
||||
const targetDirPath = pathJoin(getProjectRoot(), "src", "lib", "i18n", "generated_kcMessages", keycloakVersion);
|
||||
|
||||
fs.mkdirSync(targetDirPath, { "recursive": true });
|
||||
|
||||
Object.keys(record).forEach(pageType => {
|
||||
const filePath = pathJoin(targetDirPath, `${pageType}.ts`);
|
||||
const recordForPageType = record[pageType];
|
||||
|
||||
fs.writeFileSync(
|
||||
filePath,
|
||||
Buffer.from(
|
||||
[
|
||||
`//This code was automatically generated by running ${pathRelative(getProjectRoot(), __filename)}`,
|
||||
"//PLEASE DO NOT EDIT MANUALLY",
|
||||
"",
|
||||
"/* spell-checker: disable */",
|
||||
`export const kcMessages= ${JSON.stringify(record[pageType], null, 2)};`,
|
||||
"/* spell-checker: enable */",
|
||||
].join("\n"),
|
||||
"utf8",
|
||||
),
|
||||
);
|
||||
Object.keys(recordForPageType).forEach(language => {
|
||||
const filePath = pathJoin(getProjectRoot(), "src", "lib", "i18n", "generated_messages", keycloakVersion, pageType, `${language}.ts`);
|
||||
|
||||
console.log(`${filePath} wrote`);
|
||||
fs.mkdirSync(pathDirname(filePath), { "recursive": true });
|
||||
|
||||
fs.writeFileSync(
|
||||
filePath,
|
||||
Buffer.from(
|
||||
[
|
||||
`//This code was automatically generated by running ${pathRelative(getProjectRoot(), __filename)}`,
|
||||
"//PLEASE DO NOT EDIT MANUALLY",
|
||||
"",
|
||||
"/* spell-checker: disable */",
|
||||
`const messages= ${JSON.stringify(recordForPageType[language], null, 2)};`,
|
||||
"",
|
||||
"export default messages;",
|
||||
"/* spell-checker: enable */"
|
||||
].join("\n"),
|
||||
"utf8"
|
||||
)
|
||||
);
|
||||
|
||||
logger.log(`${filePath} wrote`);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
180
src/bin/keycloakify/BuildOptions.ts
Normal file
180
src/bin/keycloakify/BuildOptions.ts
Normal file
@ -0,0 +1,180 @@
|
||||
import { z } from "zod";
|
||||
import { assert } from "tsafe/assert";
|
||||
import type { Equals } from "tsafe";
|
||||
import { id } from "tsafe/id";
|
||||
import { parse as urlParse } from "url";
|
||||
|
||||
type ParsedPackageJson = {
|
||||
name: string;
|
||||
version: string;
|
||||
homepage?: string;
|
||||
keycloakify?: {
|
||||
extraPages?: string[];
|
||||
extraThemeProperties?: string[];
|
||||
areAppAndKeycloakServerSharingSameDomain?: boolean;
|
||||
};
|
||||
};
|
||||
|
||||
const zParsedPackageJson = z.object({
|
||||
"name": z.string(),
|
||||
"version": z.string(),
|
||||
"homepage": z.string().optional(),
|
||||
"keycloakify": z
|
||||
.object({
|
||||
"extraPages": z.array(z.string()).optional(),
|
||||
"extraThemeProperties": z.array(z.string()).optional(),
|
||||
"areAppAndKeycloakServerSharingSameDomain": z.boolean().optional()
|
||||
})
|
||||
.optional()
|
||||
});
|
||||
|
||||
assert<Equals<ReturnType<typeof zParsedPackageJson["parse"]>, ParsedPackageJson>>();
|
||||
|
||||
/** Consolidated build option gathered form CLI arguments and config in package.json */
|
||||
export type BuildOptions = BuildOptions.Standalone | BuildOptions.ExternalAssets;
|
||||
|
||||
export namespace BuildOptions {
|
||||
export type Common = {
|
||||
isSilent: boolean;
|
||||
version: string;
|
||||
themeName: string;
|
||||
extraPages?: string[];
|
||||
extraThemeProperties?: string[];
|
||||
//NOTE: Only for the pom.xml file, questionable utility...
|
||||
groupId: string;
|
||||
};
|
||||
|
||||
export type Standalone = Common & {
|
||||
isStandalone: true;
|
||||
urlPathname: string | undefined;
|
||||
};
|
||||
|
||||
export type ExternalAssets = ExternalAssets.SameDomain | ExternalAssets.DifferentDomains;
|
||||
|
||||
export namespace ExternalAssets {
|
||||
export type CommonExternalAssets = Common & {
|
||||
isStandalone: false;
|
||||
};
|
||||
|
||||
export type SameDomain = CommonExternalAssets & {
|
||||
areAppAndKeycloakServerSharingSameDomain: true;
|
||||
};
|
||||
|
||||
export type DifferentDomains = CommonExternalAssets & {
|
||||
areAppAndKeycloakServerSharingSameDomain: false;
|
||||
urlOrigin: string;
|
||||
urlPathname: string | undefined;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export function readBuildOptions(params: {
|
||||
packageJson: string;
|
||||
CNAME: string | undefined;
|
||||
isExternalAssetsCliParamProvided: boolean;
|
||||
isSilent: boolean;
|
||||
}): BuildOptions {
|
||||
const { packageJson, CNAME, isExternalAssetsCliParamProvided, isSilent } = params;
|
||||
|
||||
const parsedPackageJson = zParsedPackageJson.parse(JSON.parse(packageJson));
|
||||
|
||||
const url = (() => {
|
||||
const { homepage } = parsedPackageJson;
|
||||
|
||||
let url: URL | undefined = undefined;
|
||||
|
||||
if (homepage !== undefined) {
|
||||
url = new URL(homepage);
|
||||
}
|
||||
|
||||
if (CNAME !== undefined) {
|
||||
url = new URL(`https://${CNAME.replace(/\s+$/, "")}`);
|
||||
}
|
||||
|
||||
if (url === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return {
|
||||
"origin": url.origin,
|
||||
"pathname": (() => {
|
||||
const out = url.pathname.replace(/([^/])$/, "$1/");
|
||||
|
||||
return out === "/" ? undefined : out;
|
||||
})()
|
||||
};
|
||||
})();
|
||||
|
||||
const common: BuildOptions.Common = (() => {
|
||||
const { name, keycloakify = {}, version, homepage } = parsedPackageJson;
|
||||
|
||||
const { extraPages, extraThemeProperties } = keycloakify ?? {};
|
||||
|
||||
const themeName = name
|
||||
.replace(/^@(.*)/, "$1")
|
||||
.split("/")
|
||||
.join("-");
|
||||
|
||||
return {
|
||||
themeName,
|
||||
"groupId": (() => {
|
||||
const fallbackGroupId = `${themeName}.keycloak`;
|
||||
|
||||
return (
|
||||
(!homepage
|
||||
? fallbackGroupId
|
||||
: urlParse(homepage)
|
||||
.host?.replace(/:[0-9]+$/, "")
|
||||
?.split(".")
|
||||
.reverse()
|
||||
.join(".") ?? fallbackGroupId) + ".keycloak"
|
||||
);
|
||||
})(),
|
||||
"version": version,
|
||||
extraPages,
|
||||
extraThemeProperties,
|
||||
isSilent
|
||||
};
|
||||
})();
|
||||
|
||||
if (isExternalAssetsCliParamProvided) {
|
||||
const commonExternalAssets = id<BuildOptions.ExternalAssets.CommonExternalAssets>({
|
||||
...common,
|
||||
"isStandalone": false
|
||||
});
|
||||
|
||||
if (parsedPackageJson.keycloakify?.areAppAndKeycloakServerSharingSameDomain) {
|
||||
return id<BuildOptions.ExternalAssets.SameDomain>({
|
||||
...commonExternalAssets,
|
||||
"areAppAndKeycloakServerSharingSameDomain": true
|
||||
});
|
||||
} else {
|
||||
assert(
|
||||
url !== undefined,
|
||||
[
|
||||
"Can't compile in external assets mode if we don't know where",
|
||||
"the app will be hosted.",
|
||||
"You should provide a homepage field in the package.json (or create a",
|
||||
"public/CNAME file.",
|
||||
"Alternatively, if your app and the Keycloak server are on the same domain, ",
|
||||
"eg https://example.com is your app and https://example.com/auth is the keycloak",
|
||||
'admin UI, you can set "keycloakify": { "areAppAndKeycloakServerSharingSameDomain": true }',
|
||||
"in your package.json"
|
||||
].join(" ")
|
||||
);
|
||||
|
||||
return id<BuildOptions.ExternalAssets.DifferentDomains>({
|
||||
...commonExternalAssets,
|
||||
"areAppAndKeycloakServerSharingSameDomain": false,
|
||||
"urlOrigin": url.origin,
|
||||
"urlPathname": url.pathname
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return id<BuildOptions.Standalone>({
|
||||
...common,
|
||||
"isStandalone": true,
|
||||
"urlPathname": url?.pathname
|
||||
});
|
||||
}
|
@ -30,50 +30,66 @@ ${ftl_object_to_js_code_declaring_an_object(.data_model, [])?no_esc};
|
||||
</#attempt>
|
||||
|
||||
"printIfExists": function (fieldName, x) {
|
||||
<#list fieldNames as fieldName>
|
||||
if(fieldName === "${fieldName}" ){
|
||||
<#attempt>
|
||||
return "${messagesPerField.printIfExists(fieldName,'1')}" ? x : undefined;
|
||||
<#recover>
|
||||
</#attempt>
|
||||
}
|
||||
</#list>
|
||||
throw new Error("There is no " + fieldName + " field");
|
||||
<#if !messagesPerField?? >
|
||||
return undefined;
|
||||
<#else>
|
||||
<#list fieldNames as fieldName>
|
||||
if(fieldName === "${fieldName}" ){
|
||||
<#attempt>
|
||||
return "${messagesPerField.printIfExists(fieldName,'1')}" ? x : undefined;
|
||||
<#recover>
|
||||
</#attempt>
|
||||
}
|
||||
</#list>
|
||||
throw new Error("There is no " + fieldName + " field");
|
||||
</#if>
|
||||
},
|
||||
"existsError": function (fieldName) {
|
||||
<#list fieldNames as fieldName>
|
||||
if(fieldName === "${fieldName}" ){
|
||||
<#attempt>
|
||||
return <#if messagesPerField.existsError('${fieldName}')>true<#else>false</#if>;
|
||||
<#recover>
|
||||
</#attempt>
|
||||
}
|
||||
</#list>
|
||||
throw new Error("There is no " + fieldName + " field");
|
||||
<#if !messagesPerField?? >
|
||||
return false;
|
||||
<#else>
|
||||
<#list fieldNames as fieldName>
|
||||
if(fieldName === "${fieldName}" ){
|
||||
<#attempt>
|
||||
return <#if messagesPerField.existsError('${fieldName}')>true<#else>false</#if>;
|
||||
<#recover>
|
||||
</#attempt>
|
||||
}
|
||||
</#list>
|
||||
throw new Error("There is no " + fieldName + " field");
|
||||
</#if>
|
||||
},
|
||||
"get": function (fieldName) {
|
||||
<#list fieldNames as fieldName>
|
||||
if(fieldName === "${fieldName}" ){
|
||||
<#attempt>
|
||||
<#if messagesPerField.existsError('${fieldName}')>
|
||||
return "${messagesPerField.get('${fieldName}')?no_esc}";
|
||||
</#if>
|
||||
<#recover>
|
||||
</#attempt>
|
||||
}
|
||||
</#list>
|
||||
throw new Error("There is no " + fieldName + " field");
|
||||
<#if !messagesPerField?? >
|
||||
return '';
|
||||
<#else>
|
||||
<#list fieldNames as fieldName>
|
||||
if(fieldName === "${fieldName}" ){
|
||||
<#attempt>
|
||||
<#if messagesPerField.existsError('${fieldName}')>
|
||||
return "${messagesPerField.get('${fieldName}')?no_esc}";
|
||||
</#if>
|
||||
<#recover>
|
||||
</#attempt>
|
||||
}
|
||||
</#list>
|
||||
throw new Error("There is no " + fieldName + " field");
|
||||
</#if>
|
||||
},
|
||||
"exists": function (fieldName) {
|
||||
<#list fieldNames as fieldName>
|
||||
if(fieldName === "${fieldName}" ){
|
||||
<#attempt>
|
||||
return <#if messagesPerField.exists('${fieldName}')>true<#else>false</#if>;
|
||||
<#recover>
|
||||
</#attempt>
|
||||
}
|
||||
</#list>
|
||||
throw new Error("There is no " + fieldName + " field");
|
||||
<#if !messagesPerField?? >
|
||||
return false;
|
||||
<#else>
|
||||
<#list fieldNames as fieldName>
|
||||
if(fieldName === "${fieldName}" ){
|
||||
<#attempt>
|
||||
return <#if messagesPerField.exists('${fieldName}')>true<#else>false</#if>;
|
||||
<#recover>
|
||||
</#attempt>
|
||||
}
|
||||
</#list>
|
||||
throw new Error("There is no " + fieldName + " field");
|
||||
</#if>
|
||||
}
|
||||
};
|
||||
|
||||
@ -124,9 +140,11 @@ ${ftl_object_to_js_code_declaring_an_object(.data_model, [])?no_esc};
|
||||
) || (
|
||||
<#-- https://github.com/InseeFrLab/keycloakify/pull/65#issuecomment-991896344 (reports with saml-post-form.ftl) -->
|
||||
<#-- https://github.com/InseeFrLab/keycloakify/issues/91#issue-1212319466 (reports with error.ftl and Kc18) -->
|
||||
<#-- https://github.com/InseeFrLab/keycloakify/issues/109#issuecomment-1134610163 -->
|
||||
key == "loginAction" &&
|
||||
are_same_path(path, ["url"]) &&
|
||||
["saml-post-form.ftl", "error.ftl"]?seq_contains(pageId)
|
||||
["saml-post-form.ftl", "error.ftl", "info.ftl"]?seq_contains(pageId) &&
|
||||
!(auth?has_content && auth.showTryAnotherWayLink())
|
||||
) || (
|
||||
["contextData", "idpConfig", "idp", "authenticationSession"]?seq_contains(key) &&
|
||||
are_same_path(path, ["brokerContext"]) &&
|
||||
@ -135,6 +153,9 @@ ${ftl_object_to_js_code_declaring_an_object(.data_model, [])?no_esc};
|
||||
key == "identityProviderBrokerCtx" &&
|
||||
are_same_path(path, []) &&
|
||||
["login-idp-link-confirm.ftl", "login-idp-link-email.ftl" ]?seq_contains(pageId)
|
||||
) || (
|
||||
["masterAdminClient", "delegateForUpdate", "defaultRole"]?seq_contains(key) &&
|
||||
are_same_path(path, ["realm"])
|
||||
)
|
||||
>
|
||||
<#local out_seq += ["/*If you need '" + key + "' on " + pageId + ", please submit an issue to the Keycloakify repo*/"]>
|
||||
@ -152,7 +173,7 @@ ${ftl_object_to_js_code_declaring_an_object(.data_model, [])?no_esc};
|
||||
</#attempt>
|
||||
|
||||
</#if>
|
||||
|
||||
|
||||
<#attempt>
|
||||
<#if !object[key]??>
|
||||
<#continue>
|
||||
@ -200,6 +221,31 @@ ${ftl_object_to_js_code_declaring_an_object(.data_model, [])?no_esc};
|
||||
</#attempt>
|
||||
|
||||
<#if isMethod>
|
||||
|
||||
<#if are_same_path(path, ["auth", "showUsername"])>
|
||||
<#attempt>
|
||||
<#return auth.showUsername()?c>
|
||||
<#recover>
|
||||
<#return "ABORT: Couldn't evaluate auth.showUsername()">
|
||||
</#attempt>
|
||||
</#if>
|
||||
|
||||
<#if are_same_path(path, ["auth", "showResetCredentials"])>
|
||||
<#attempt>
|
||||
<#return auth.showResetCredentials()?c>
|
||||
<#recover>
|
||||
<#return "ABORT: Couldn't evaluate auth.showResetCredentials()">
|
||||
</#attempt>
|
||||
</#if>
|
||||
|
||||
<#if are_same_path(path, ["auth", "showTryAnotherWayLink"])>
|
||||
<#attempt>
|
||||
<#return auth.showTryAnotherWayLink()?c>
|
||||
<#recover>
|
||||
<#return "ABORT: Couldn't evaluate auth.showTryAnotherWayLink()">
|
||||
</#attempt>
|
||||
</#if>
|
||||
|
||||
<#return "ABORT: It's a method">
|
||||
</#if>
|
||||
|
||||
@ -230,6 +276,11 @@ ${ftl_object_to_js_code_declaring_an_object(.data_model, [])?no_esc};
|
||||
|
||||
<#list object as array_item>
|
||||
|
||||
<#if !array_item??>
|
||||
<#local out_seq += ["null,"]>
|
||||
<#continue>
|
||||
</#if>
|
||||
|
||||
<#local rec_out = ftl_object_to_js_code_declaring_an_object(array_item, path + [ i ])>
|
||||
|
||||
<#local i = i + 1>
|
||||
@ -263,7 +314,7 @@ ${ftl_object_to_js_code_declaring_an_object(.data_model, [])?no_esc};
|
||||
</#function>
|
||||
<#function are_same_path path searchedPath>
|
||||
|
||||
<#if path?size != path?size>
|
||||
<#if path?size != searchedPath?size>
|
||||
<#return false>
|
||||
</#if>
|
||||
|
190
src/bin/keycloakify/generateFtl/generateFtl.ts
Normal file
190
src/bin/keycloakify/generateFtl/generateFtl.ts
Normal file
@ -0,0 +1,190 @@
|
||||
import cheerio from "cheerio";
|
||||
import { replaceImportsFromStaticInJsCode } from "../replacers/replaceImportsFromStaticInJsCode";
|
||||
import { generateCssCodeToDefineGlobals } from "../replacers/replaceImportsInCssCode";
|
||||
import { replaceImportsInInlineCssCode } from "../replacers/replaceImportsInInlineCssCode";
|
||||
import * as fs from "fs";
|
||||
import { join as pathJoin } from "path";
|
||||
import { objectKeys } from "tsafe/objectKeys";
|
||||
import { ftlValuesGlobalName } from "../ftlValuesGlobalName";
|
||||
import type { BuildOptions } from "../BuildOptions";
|
||||
import { assert } from "tsafe/assert";
|
||||
import { Reflect } from "tsafe/Reflect";
|
||||
|
||||
// https://github.com/keycloak/keycloak/blob/main/services/src/main/java/org/keycloak/forms/login/freemarker/Templates.java
|
||||
export const pageIds = [
|
||||
"login.ftl",
|
||||
"login-username.ftl",
|
||||
"login-password.ftl",
|
||||
"webauthn-authenticate.ftl",
|
||||
"register.ftl",
|
||||
"register-user-profile.ftl",
|
||||
"info.ftl",
|
||||
"error.ftl",
|
||||
"login-reset-password.ftl",
|
||||
"login-verify-email.ftl",
|
||||
"terms.ftl",
|
||||
"login-otp.ftl",
|
||||
"login-update-profile.ftl",
|
||||
"login-update-password.ftl",
|
||||
"login-idp-link-confirm.ftl",
|
||||
"login-idp-link-email.ftl",
|
||||
"login-page-expired.ftl",
|
||||
"login-config-totp.ftl",
|
||||
"logout-confirm.ftl",
|
||||
"update-user-profile.ftl",
|
||||
"idp-review-user-profile.ftl"
|
||||
] as const;
|
||||
|
||||
export type BuildOptionsLike = BuildOptionsLike.Standalone | BuildOptionsLike.ExternalAssets;
|
||||
|
||||
export namespace BuildOptionsLike {
|
||||
export type Standalone = {
|
||||
isStandalone: true;
|
||||
urlPathname: string | undefined;
|
||||
};
|
||||
|
||||
export type ExternalAssets = ExternalAssets.SameDomain | ExternalAssets.DifferentDomains;
|
||||
|
||||
export namespace ExternalAssets {
|
||||
export type CommonExternalAssets = {
|
||||
isStandalone: false;
|
||||
};
|
||||
|
||||
export type SameDomain = CommonExternalAssets & {
|
||||
areAppAndKeycloakServerSharingSameDomain: true;
|
||||
};
|
||||
|
||||
export type DifferentDomains = CommonExternalAssets & {
|
||||
areAppAndKeycloakServerSharingSameDomain: false;
|
||||
urlOrigin: string;
|
||||
urlPathname: string | undefined;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const buildOptions = Reflect<BuildOptions>();
|
||||
|
||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
||||
}
|
||||
|
||||
export type PageId = typeof pageIds[number];
|
||||
|
||||
export function generateFtlFilesCodeFactory(params: {
|
||||
indexHtmlCode: string;
|
||||
//NOTE: Expected to be an empty object if external assets mode is enabled.
|
||||
cssGlobalsToDefine: Record<string, string>;
|
||||
buildOptions: BuildOptionsLike;
|
||||
}) {
|
||||
const { cssGlobalsToDefine, indexHtmlCode, buildOptions } = params;
|
||||
|
||||
const $ = cheerio.load(indexHtmlCode);
|
||||
|
||||
fix_imports_statements: {
|
||||
if (!buildOptions.isStandalone && buildOptions.areAppAndKeycloakServerSharingSameDomain) {
|
||||
break fix_imports_statements;
|
||||
}
|
||||
|
||||
$("script:not([src])").each((...[, element]) => {
|
||||
const { fixedJsCode } = replaceImportsFromStaticInJsCode({
|
||||
"jsCode": $(element).html()!,
|
||||
buildOptions
|
||||
});
|
||||
|
||||
$(element).text(fixedJsCode);
|
||||
});
|
||||
|
||||
$("style").each((...[, element]) => {
|
||||
const { fixedCssCode } = replaceImportsInInlineCssCode({
|
||||
"cssCode": $(element).html()!,
|
||||
buildOptions
|
||||
});
|
||||
|
||||
$(element).text(fixedCssCode);
|
||||
});
|
||||
|
||||
(
|
||||
[
|
||||
["link", "href"],
|
||||
["script", "src"]
|
||||
] as const
|
||||
).forEach(([selector, attrName]) =>
|
||||
$(selector).each((...[, element]) => {
|
||||
const href = $(element).attr(attrName);
|
||||
|
||||
if (href === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
$(element).attr(
|
||||
attrName,
|
||||
buildOptions.isStandalone
|
||||
? href.replace(new RegExp(`^${(buildOptions.urlPathname ?? "/").replace(/\//g, "\\/")}`), "${url.resourcesPath}/build/")
|
||||
: href.replace(/^\//, `${buildOptions.urlOrigin}/`)
|
||||
);
|
||||
})
|
||||
);
|
||||
|
||||
if (Object.keys(cssGlobalsToDefine).length !== 0) {
|
||||
$("head").prepend(
|
||||
[
|
||||
"",
|
||||
"<style>",
|
||||
generateCssCodeToDefineGlobals({
|
||||
cssGlobalsToDefine,
|
||||
buildOptions
|
||||
}).cssCodeToPrependInHead,
|
||||
"</style>",
|
||||
""
|
||||
].join("\n")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
//FTL is no valid html, we can't insert with cheerio, we put placeholder for injecting later.
|
||||
const replaceValueBySearchValue = {
|
||||
'{ "x": "vIdLqMeOed9sdLdIdOxdK0d" }': fs
|
||||
.readFileSync(pathJoin(__dirname, "ftl_object_to_js_code_declaring_an_object.ftl"))
|
||||
.toString("utf8")
|
||||
.match(/^<script>const _=((?:.|\n)+)<\/script>[\n]?$/)![1],
|
||||
"<!-- xIdLqMeOedErIdLsPdNdI9dSlxI -->": [
|
||||
"<#if scripts??>",
|
||||
" <#list scripts as script>",
|
||||
' <script src="${script}" type="text/javascript"></script>',
|
||||
" </#list>",
|
||||
"</#if>"
|
||||
].join("\n")
|
||||
};
|
||||
|
||||
$("head").prepend(
|
||||
[
|
||||
"<script>",
|
||||
` window.${ftlValuesGlobalName}= ${objectKeys(replaceValueBySearchValue)[0]};`,
|
||||
"</script>",
|
||||
"",
|
||||
objectKeys(replaceValueBySearchValue)[1]
|
||||
].join("\n")
|
||||
);
|
||||
|
||||
const partiallyFixedIndexHtmlCode = $.html();
|
||||
|
||||
function generateFtlFilesCode(params: { pageId: string }): {
|
||||
ftlCode: string;
|
||||
} {
|
||||
const { pageId } = params;
|
||||
|
||||
const $ = cheerio.load(partiallyFixedIndexHtmlCode);
|
||||
|
||||
let ftlCode = $.html();
|
||||
|
||||
Object.entries({
|
||||
...replaceValueBySearchValue,
|
||||
//If updated, don't forget to change in the ftl script as well.
|
||||
"PAGE_ID_xIgLsPgGId9D8e": pageId
|
||||
}).map(([searchValue, replaceValue]) => (ftlCode = ftlCode.replace(searchValue, replaceValue)));
|
||||
|
||||
return { ftlCode };
|
||||
}
|
||||
|
||||
return { generateFtlFilesCode };
|
||||
}
|
@ -1,37 +1,39 @@
|
||||
import * as url from "url";
|
||||
import * as fs from "fs";
|
||||
import { join as pathJoin, dirname as pathDirname } from "path";
|
||||
import { assert } from "tsafe/assert";
|
||||
import { Reflect } from "tsafe/Reflect";
|
||||
import type { BuildOptions } from "./BuildOptions";
|
||||
|
||||
export type BuildOptionsLike = {
|
||||
themeName: string;
|
||||
groupId: string;
|
||||
};
|
||||
|
||||
{
|
||||
const buildOptions = Reflect<BuildOptions>();
|
||||
|
||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
||||
}
|
||||
|
||||
export function generateJavaStackFiles(params: {
|
||||
version: string;
|
||||
themeName: string;
|
||||
homepage?: string;
|
||||
keycloakThemeBuildingDirPath: string;
|
||||
doBundleEmailTemplate: boolean;
|
||||
doBundlesEmailTemplate: boolean;
|
||||
buildOptions: BuildOptionsLike;
|
||||
}): {
|
||||
jarFilePath: string;
|
||||
} {
|
||||
const { themeName, version, homepage, keycloakThemeBuildingDirPath, doBundleEmailTemplate } = params;
|
||||
const {
|
||||
version,
|
||||
buildOptions: { groupId, themeName },
|
||||
keycloakThemeBuildingDirPath,
|
||||
doBundlesEmailTemplate
|
||||
} = params;
|
||||
|
||||
{
|
||||
const { pomFileCode } = (function generatePomFileCode(): {
|
||||
pomFileCode: string;
|
||||
} {
|
||||
const groupId = (() => {
|
||||
const fallbackGroupId = `there.was.no.homepage.field.in.the.package.json.${themeName}`;
|
||||
|
||||
return (
|
||||
(!homepage
|
||||
? fallbackGroupId
|
||||
: url
|
||||
.parse(homepage)
|
||||
.host?.replace(/:[0-9]+$/, "")
|
||||
?.split(".")
|
||||
.reverse()
|
||||
.join(".") ?? fallbackGroupId) + ".keycloak"
|
||||
);
|
||||
})();
|
||||
|
||||
const artefactId = `${themeName}-keycloak-theme`;
|
||||
|
||||
const pomFileCode = [
|
||||
@ -45,7 +47,7 @@ export function generateJavaStackFiles(params: {
|
||||
` <version>${version}</version>`,
|
||||
` <name>${artefactId}</name>`,
|
||||
` <description />`,
|
||||
`</project>`,
|
||||
`</project>`
|
||||
].join("\n");
|
||||
|
||||
return { pomFileCode };
|
||||
@ -69,19 +71,19 @@ export function generateJavaStackFiles(params: {
|
||||
"themes": [
|
||||
{
|
||||
"name": themeName,
|
||||
"types": ["login", ...(doBundleEmailTemplate ? ["email"] : [])],
|
||||
},
|
||||
],
|
||||
"types": ["login", ...(doBundlesEmailTemplate ? ["email"] : [])]
|
||||
}
|
||||
]
|
||||
},
|
||||
null,
|
||||
2,
|
||||
2
|
||||
),
|
||||
"utf8",
|
||||
),
|
||||
"utf8"
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
"jarFilePath": pathJoin(keycloakThemeBuildingDirPath, "target", `${themeName}-${version}.jar`),
|
||||
"jarFilePath": pathJoin(keycloakThemeBuildingDirPath, "target", `${themeName}-${version}.jar`)
|
||||
};
|
||||
}
|
@ -1,116 +1,150 @@
|
||||
import { transformCodebase } from "../tools/transformCodebase";
|
||||
import * as fs from "fs";
|
||||
import { join as pathJoin, basename as pathBasename } from "path";
|
||||
import { replaceImportsInCssCode, replaceImportsFromStaticInJsCode } from "./replaceImportFromStatic";
|
||||
import { replaceImportsFromStaticInJsCode } from "./replacers/replaceImportsFromStaticInJsCode";
|
||||
import { replaceImportsInCssCode } from "./replacers/replaceImportsInCssCode";
|
||||
import { generateFtlFilesCodeFactory, pageIds } from "./generateFtl";
|
||||
import { downloadBuiltinKeycloakTheme } from "../download-builtin-keycloak-theme";
|
||||
import * as child_process from "child_process";
|
||||
import { resourcesCommonPath, resourcesPath, subDirOfPublicDirBasename } from "../../lib/getKcContext/kcContextMocks/urlResourcesPath";
|
||||
import { mockTestingResourcesCommonPath, mockTestingResourcesPath, mockTestingSubDirOfPublicDirBasename } from "../mockTestingResourcesPath";
|
||||
import { isInside } from "../tools/isInside";
|
||||
import type { BuildOptions } from "./BuildOptions";
|
||||
import { assert } from "tsafe/assert";
|
||||
import { Reflect } from "tsafe/Reflect";
|
||||
import { getLogger } from "../tools/logger";
|
||||
|
||||
export type BuildOptionsLike = BuildOptionsLike.Standalone | BuildOptionsLike.ExternalAssets;
|
||||
|
||||
export namespace BuildOptionsLike {
|
||||
export type Common = {
|
||||
themeName: string;
|
||||
extraPages?: string[];
|
||||
extraThemeProperties?: string[];
|
||||
isSilent: boolean;
|
||||
};
|
||||
|
||||
export type Standalone = Common & {
|
||||
isStandalone: true;
|
||||
urlPathname: string | undefined;
|
||||
};
|
||||
|
||||
export type ExternalAssets = ExternalAssets.SameDomain | ExternalAssets.DifferentDomains;
|
||||
|
||||
export namespace ExternalAssets {
|
||||
export type CommonExternalAssets = Common & {
|
||||
isStandalone: false;
|
||||
};
|
||||
|
||||
export type SameDomain = CommonExternalAssets & {
|
||||
areAppAndKeycloakServerSharingSameDomain: true;
|
||||
};
|
||||
|
||||
export type DifferentDomains = CommonExternalAssets & {
|
||||
areAppAndKeycloakServerSharingSameDomain: false;
|
||||
urlOrigin: string;
|
||||
urlPathname: string | undefined;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const buildOptions = Reflect<BuildOptions>();
|
||||
|
||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
||||
}
|
||||
|
||||
export function generateKeycloakThemeResources(params: {
|
||||
themeName: string;
|
||||
reactAppBuildDirPath: string;
|
||||
keycloakThemeBuildingDirPath: string;
|
||||
keycloakThemeEmailDirPath: string;
|
||||
urlPathname: string;
|
||||
//If urlOrigin is not undefined then it means --externals-assets
|
||||
urlOrigin: undefined | string;
|
||||
extraPagesId: string[];
|
||||
extraThemeProperties: string[];
|
||||
keycloakVersion: string;
|
||||
}): { doBundleEmailTemplate: boolean } {
|
||||
const {
|
||||
themeName,
|
||||
reactAppBuildDirPath,
|
||||
keycloakThemeBuildingDirPath,
|
||||
keycloakThemeEmailDirPath,
|
||||
urlPathname,
|
||||
urlOrigin,
|
||||
extraPagesId,
|
||||
extraThemeProperties,
|
||||
keycloakVersion,
|
||||
} = params;
|
||||
buildOptions: BuildOptionsLike;
|
||||
}): { doBundlesEmailTemplate: boolean } {
|
||||
const { reactAppBuildDirPath, keycloakThemeBuildingDirPath, keycloakThemeEmailDirPath, keycloakVersion, buildOptions } = params;
|
||||
|
||||
const themeDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme", themeName, "login");
|
||||
const logger = getLogger({ isSilent: buildOptions.isSilent });
|
||||
const themeDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme", buildOptions.themeName, "login");
|
||||
|
||||
let allCssGlobalsToDefine: Record<string, string> = {};
|
||||
|
||||
transformCodebase({
|
||||
"destDirPath": urlOrigin === undefined ? pathJoin(themeDirPath, "resources", "build") : reactAppBuildDirPath,
|
||||
"destDirPath": buildOptions.isStandalone ? pathJoin(themeDirPath, "resources", "build") : reactAppBuildDirPath,
|
||||
"srcDirPath": reactAppBuildDirPath,
|
||||
"transformSourceCode": ({ filePath, sourceCode }) => {
|
||||
//NOTE: Prevent cycles, excludes the folder we generated for debug in public/
|
||||
if (
|
||||
urlOrigin === undefined &&
|
||||
buildOptions.isStandalone &&
|
||||
isInside({
|
||||
"dirPath": pathJoin(reactAppBuildDirPath, subDirOfPublicDirBasename),
|
||||
filePath,
|
||||
"dirPath": pathJoin(reactAppBuildDirPath, mockTestingSubDirOfPublicDirBasename),
|
||||
filePath
|
||||
})
|
||||
) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (urlOrigin === undefined && /\.css?$/i.test(filePath)) {
|
||||
if (/\.css?$/i.test(filePath)) {
|
||||
if (!buildOptions.isStandalone) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const { cssGlobalsToDefine, fixedCssCode } = replaceImportsInCssCode({
|
||||
"cssCode": sourceCode.toString("utf8"),
|
||||
"cssCode": sourceCode.toString("utf8")
|
||||
});
|
||||
|
||||
allCssGlobalsToDefine = {
|
||||
...allCssGlobalsToDefine,
|
||||
...cssGlobalsToDefine,
|
||||
...cssGlobalsToDefine
|
||||
};
|
||||
|
||||
return {
|
||||
"modifiedSourceCode": Buffer.from(fixedCssCode, "utf8"),
|
||||
};
|
||||
return { "modifiedSourceCode": Buffer.from(fixedCssCode, "utf8") };
|
||||
}
|
||||
|
||||
if (/\.js?$/i.test(filePath)) {
|
||||
if (!buildOptions.isStandalone && buildOptions.areAppAndKeycloakServerSharingSameDomain) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const { fixedJsCode } = replaceImportsFromStaticInJsCode({
|
||||
"jsCode": sourceCode.toString("utf8"),
|
||||
urlOrigin,
|
||||
buildOptions
|
||||
});
|
||||
|
||||
return {
|
||||
"modifiedSourceCode": Buffer.from(fixedJsCode, "utf8"),
|
||||
};
|
||||
return { "modifiedSourceCode": Buffer.from(fixedJsCode, "utf8") };
|
||||
}
|
||||
|
||||
return urlOrigin === undefined ? { "modifiedSourceCode": sourceCode } : undefined;
|
||||
},
|
||||
return buildOptions.isStandalone ? { "modifiedSourceCode": sourceCode } : undefined;
|
||||
}
|
||||
});
|
||||
|
||||
let doBundleEmailTemplate: boolean;
|
||||
let doBundlesEmailTemplate: boolean;
|
||||
|
||||
email: {
|
||||
if (!fs.existsSync(keycloakThemeEmailDirPath)) {
|
||||
console.log(
|
||||
logger.log(
|
||||
[
|
||||
`Not bundling email template because ${pathBasename(keycloakThemeEmailDirPath)} does not exist`,
|
||||
`To start customizing the email template, run: đ npx create-keycloak-email-directory đ`,
|
||||
].join("\n"),
|
||||
`To start customizing the email template, run: đ npx create-keycloak-email-directory đ`
|
||||
].join("\n")
|
||||
);
|
||||
doBundleEmailTemplate = false;
|
||||
doBundlesEmailTemplate = false;
|
||||
break email;
|
||||
}
|
||||
|
||||
doBundleEmailTemplate = true;
|
||||
doBundlesEmailTemplate = true;
|
||||
|
||||
transformCodebase({
|
||||
"srcDirPath": keycloakThemeEmailDirPath,
|
||||
"destDirPath": pathJoin(themeDirPath, "..", "email"),
|
||||
"destDirPath": pathJoin(themeDirPath, "..", "email")
|
||||
});
|
||||
}
|
||||
|
||||
const { generateFtlFilesCode } = generateFtlFilesCodeFactory({
|
||||
"cssGlobalsToDefine": allCssGlobalsToDefine,
|
||||
"indexHtmlCode": fs.readFileSync(pathJoin(reactAppBuildDirPath, "index.html")).toString("utf8"),
|
||||
urlPathname,
|
||||
urlOrigin,
|
||||
"cssGlobalsToDefine": allCssGlobalsToDefine,
|
||||
"buildOptions": buildOptions
|
||||
});
|
||||
|
||||
[...pageIds, ...extraPagesId].forEach(pageId => {
|
||||
[...pageIds, ...(buildOptions.extraPages ?? [])].forEach(pageId => {
|
||||
const { ftlCode } = generateFtlFilesCode({ pageId });
|
||||
|
||||
fs.mkdirSync(themeDirPath, { "recursive": true });
|
||||
@ -124,34 +158,35 @@ export function generateKeycloakThemeResources(params: {
|
||||
downloadBuiltinKeycloakTheme({
|
||||
keycloakVersion,
|
||||
"destDirPath": tmpDirPath,
|
||||
isSilent: buildOptions.isSilent
|
||||
});
|
||||
|
||||
const themeResourcesDirPath = pathJoin(themeDirPath, "resources");
|
||||
|
||||
transformCodebase({
|
||||
"srcDirPath": pathJoin(tmpDirPath, "keycloak", "login", "resources"),
|
||||
"destDirPath": themeResourcesDirPath,
|
||||
"destDirPath": themeResourcesDirPath
|
||||
});
|
||||
|
||||
const reactAppPublicDirPath = pathJoin(reactAppBuildDirPath, "..", "public");
|
||||
|
||||
transformCodebase({
|
||||
"srcDirPath": pathJoin(tmpDirPath, "keycloak", "common", "resources"),
|
||||
"destDirPath": pathJoin(themeResourcesDirPath, pathBasename(resourcesCommonPath)),
|
||||
"destDirPath": pathJoin(themeResourcesDirPath, pathBasename(mockTestingResourcesCommonPath))
|
||||
});
|
||||
|
||||
transformCodebase({
|
||||
"srcDirPath": themeResourcesDirPath,
|
||||
"destDirPath": pathJoin(reactAppPublicDirPath, resourcesPath),
|
||||
"destDirPath": pathJoin(reactAppPublicDirPath, mockTestingResourcesPath)
|
||||
});
|
||||
|
||||
const keycloakResourcesWithinPublicDirPath = pathJoin(reactAppPublicDirPath, subDirOfPublicDirBasename);
|
||||
const keycloakResourcesWithinPublicDirPath = pathJoin(reactAppPublicDirPath, mockTestingSubDirOfPublicDirBasename);
|
||||
|
||||
fs.writeFileSync(
|
||||
pathJoin(keycloakResourcesWithinPublicDirPath, "README.txt"),
|
||||
Buffer.from(
|
||||
["This is just a test folder that helps develop", "the login and register page without having to run a Keycloak container"].join(" "),
|
||||
),
|
||||
["This is just a test folder that helps develop", "the login and register page without having to run a Keycloak container"].join(" ")
|
||||
)
|
||||
);
|
||||
|
||||
fs.writeFileSync(pathJoin(keycloakResourcesWithinPublicDirPath, ".gitignore"), Buffer.from("*", "utf8"));
|
||||
@ -161,8 +196,8 @@ export function generateKeycloakThemeResources(params: {
|
||||
|
||||
fs.writeFileSync(
|
||||
pathJoin(themeDirPath, "theme.properties"),
|
||||
Buffer.from("parent=keycloak".concat("\n\n", extraThemeProperties.join("\n\n")), "utf8"),
|
||||
Buffer.from(["parent=keycloak", ...(buildOptions.extraThemeProperties ?? [])].join("\n\n"), "utf8")
|
||||
);
|
||||
|
||||
return { doBundleEmailTemplate };
|
||||
return { doBundlesEmailTemplate };
|
||||
}
|
@ -1,13 +1,34 @@
|
||||
import * as fs from "fs";
|
||||
import { join as pathJoin } from "path";
|
||||
import { assert } from "tsafe/assert";
|
||||
import { Reflect } from "tsafe/Reflect";
|
||||
import type { BuildOptions } from "./BuildOptions";
|
||||
|
||||
export type BuildOptionsLike = {
|
||||
themeName: string;
|
||||
};
|
||||
|
||||
{
|
||||
const buildOptions = Reflect<BuildOptions>();
|
||||
|
||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
||||
}
|
||||
|
||||
generateStartKeycloakTestingContainer.basename = "start_keycloak_testing_container.sh";
|
||||
|
||||
const containerName = "keycloak-testing-container";
|
||||
|
||||
/** Files for being able to run a hot reload keycloak container */
|
||||
export function generateStartKeycloakTestingContainer(params: { keycloakVersion: string; themeName: string; keycloakThemeBuildingDirPath: string }) {
|
||||
const { themeName, keycloakThemeBuildingDirPath, keycloakVersion } = params;
|
||||
export function generateStartKeycloakTestingContainer(params: {
|
||||
keycloakVersion: string;
|
||||
keycloakThemeBuildingDirPath: string;
|
||||
buildOptions: BuildOptionsLike;
|
||||
}) {
|
||||
const {
|
||||
keycloakThemeBuildingDirPath,
|
||||
keycloakVersion,
|
||||
buildOptions: { themeName }
|
||||
} = params;
|
||||
|
||||
fs.writeFileSync(
|
||||
pathJoin(keycloakThemeBuildingDirPath, generateStartKeycloakTestingContainer.basename),
|
||||
@ -31,14 +52,14 @@ export function generateStartKeycloakTestingContainer(params: { keycloakVersion:
|
||||
"main",
|
||||
"resources",
|
||||
"theme",
|
||||
themeName,
|
||||
themeName
|
||||
)}:/opt/keycloak/themes/${themeName}:rw \\`,
|
||||
` -it quay.io/keycloak/keycloak:${keycloakVersion} \\`,
|
||||
` start-dev`,
|
||||
"",
|
||||
""
|
||||
].join("\n"),
|
||||
"utf8",
|
||||
"utf8"
|
||||
),
|
||||
{ "mode": 0o755 },
|
||||
{ "mode": 0o755 }
|
||||
);
|
||||
}
|
8
src/bin/keycloakify/index.ts
Normal file
8
src/bin/keycloakify/index.ts
Normal file
@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
export * from "./keycloakify";
|
||||
import { main } from "./keycloakify";
|
||||
|
||||
if (require.main === module) {
|
||||
main();
|
||||
}
|
@ -3,104 +3,68 @@ import { generateJavaStackFiles } from "./generateJavaStackFiles";
|
||||
import { join as pathJoin, relative as pathRelative, basename as pathBasename } from "path";
|
||||
import * as child_process from "child_process";
|
||||
import { generateStartKeycloakTestingContainer } from "./generateStartKeycloakTestingContainer";
|
||||
import { URL } from "url";
|
||||
import * as fs from "fs";
|
||||
|
||||
type ParsedPackageJson = {
|
||||
name: string;
|
||||
version: string;
|
||||
homepage?: string;
|
||||
};
|
||||
import { readBuildOptions } from "./BuildOptions";
|
||||
import { getLogger } from "../tools/logger";
|
||||
import { getCliOptions } from "../tools/cliOptions";
|
||||
|
||||
const reactProjectDirPath = process.cwd();
|
||||
|
||||
const doUseExternalAssets = process.argv[2]?.toLowerCase() === "--external-assets";
|
||||
|
||||
const parsedPackageJson: ParsedPackageJson = require(pathJoin(reactProjectDirPath, "package.json"));
|
||||
|
||||
export const keycloakThemeBuildingDirPath = pathJoin(reactProjectDirPath, "build_keycloak");
|
||||
export const keycloakThemeEmailDirPath = pathJoin(keycloakThemeBuildingDirPath, "..", "keycloak_email");
|
||||
|
||||
function sanitizeThemeName(name: string) {
|
||||
return name
|
||||
.replace(/^@(.*)/, "$1")
|
||||
.split("/")
|
||||
.join("-");
|
||||
}
|
||||
|
||||
export function main() {
|
||||
console.log("đ Building the keycloak theme...â");
|
||||
const { isSilent, hasExternalAssets } = getCliOptions(process.argv.slice(2));
|
||||
const logger = getLogger({ isSilent });
|
||||
logger.log("đ Building the keycloak theme...â");
|
||||
|
||||
const extraPagesId: string[] = (parsedPackageJson as any)["keycloakify"]?.["extraPages"] ?? [];
|
||||
const extraThemeProperties: string[] = (parsedPackageJson as any)["keycloakify"]?.["extraThemeProperties"] ?? [];
|
||||
const themeName = sanitizeThemeName(parsedPackageJson.name);
|
||||
const buildOptions = readBuildOptions({
|
||||
"packageJson": fs.readFileSync(pathJoin(reactProjectDirPath, "package.json")).toString("utf8"),
|
||||
"CNAME": (() => {
|
||||
const cnameFilePath = pathJoin(reactProjectDirPath, "public", "CNAME");
|
||||
|
||||
const { doBundleEmailTemplate } = generateKeycloakThemeResources({
|
||||
if (!fs.existsSync(cnameFilePath)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return fs.readFileSync(cnameFilePath).toString("utf8");
|
||||
})(),
|
||||
"isExternalAssetsCliParamProvided": hasExternalAssets,
|
||||
"isSilent": isSilent
|
||||
});
|
||||
|
||||
const { doBundlesEmailTemplate } = generateKeycloakThemeResources({
|
||||
keycloakThemeBuildingDirPath,
|
||||
keycloakThemeEmailDirPath,
|
||||
"reactAppBuildDirPath": pathJoin(reactProjectDirPath, "build"),
|
||||
themeName,
|
||||
...(() => {
|
||||
const url = (() => {
|
||||
const { homepage } = parsedPackageJson;
|
||||
|
||||
if (homepage !== undefined) {
|
||||
return new URL(homepage);
|
||||
}
|
||||
|
||||
const cnameFilePath = pathJoin(reactProjectDirPath, "public", "CNAME");
|
||||
|
||||
if (fs.existsSync(cnameFilePath)) {
|
||||
return new URL(`https://${fs.readFileSync(cnameFilePath).toString("utf8").replace(/\s+$/, "")}`);
|
||||
}
|
||||
|
||||
return undefined;
|
||||
})();
|
||||
|
||||
return {
|
||||
"urlPathname": url === undefined ? "/" : url.pathname.replace(/([^/])$/, "$1/"),
|
||||
"urlOrigin": !doUseExternalAssets
|
||||
? undefined
|
||||
: (() => {
|
||||
if (url === undefined) {
|
||||
console.error("ERROR: You must specify 'homepage' in your package.json");
|
||||
process.exit(-1);
|
||||
}
|
||||
|
||||
return url.origin;
|
||||
})(),
|
||||
};
|
||||
})(),
|
||||
extraPagesId,
|
||||
extraThemeProperties,
|
||||
buildOptions,
|
||||
//We have to leave it at that otherwise we break our default theme.
|
||||
//Problem is that we can't guarantee that the the old resources
|
||||
//will still be available on the newer keycloak version.
|
||||
"keycloakVersion": "11.0.3",
|
||||
"keycloakVersion": "11.0.3"
|
||||
});
|
||||
|
||||
const { jarFilePath } = generateJavaStackFiles({
|
||||
"version": parsedPackageJson.version,
|
||||
themeName,
|
||||
"homepage": parsedPackageJson.homepage,
|
||||
"version": buildOptions.version,
|
||||
keycloakThemeBuildingDirPath,
|
||||
doBundleEmailTemplate,
|
||||
doBundlesEmailTemplate,
|
||||
buildOptions
|
||||
});
|
||||
|
||||
child_process.execSync("mvn package", {
|
||||
"cwd": keycloakThemeBuildingDirPath,
|
||||
"cwd": keycloakThemeBuildingDirPath
|
||||
});
|
||||
|
||||
//We want, however to test in a container running the latest Keycloak version
|
||||
const containerKeycloakVersion = "18.0.0";
|
||||
//We want, however, to test in a container running the latest Keycloak version
|
||||
const containerKeycloakVersion = "19.0.1";
|
||||
|
||||
generateStartKeycloakTestingContainer({
|
||||
keycloakThemeBuildingDirPath,
|
||||
themeName,
|
||||
"keycloakVersion": containerKeycloakVersion,
|
||||
buildOptions
|
||||
});
|
||||
|
||||
console.log(
|
||||
logger.log(
|
||||
[
|
||||
"",
|
||||
`â
Your keycloak theme has been generated and bundled into ./${pathRelative(reactProjectDirPath, jarFilePath)} đ`,
|
||||
@ -145,11 +109,11 @@ export function main() {
|
||||
"- Log into the admin console đ http://localhost:8080/admin username: admin, password: admin đ",
|
||||
'- Create a realm named "myrealm"',
|
||||
'- Create a client with ID: "myclient", "Root URL": "https://www.keycloak.org/app/" and "Valid redirect URIs": "https://www.keycloak.org/app/*"',
|
||||
`- Select Login Theme: ${themeName} (don't forget to save at the bottom of the page)`,
|
||||
`- Select Login Theme: ${buildOptions.themeName} (don't forget to save at the bottom of the page)`,
|
||||
`- Go to đ https://www.keycloak.org/app/ đ Click "Save" then "Sign in". You should see your login page`,
|
||||
"",
|
||||
"Video demoing this process: https://youtu.be/N3wlBoH4hKg",
|
||||
"",
|
||||
].join("\n"),
|
||||
""
|
||||
].join("\n")
|
||||
);
|
||||
}
|
@ -0,0 +1,86 @@
|
||||
import { ftlValuesGlobalName } from "../ftlValuesGlobalName";
|
||||
import type { BuildOptions } from "../BuildOptions";
|
||||
import { assert } from "tsafe/assert";
|
||||
import { is } from "tsafe/is";
|
||||
import { Reflect } from "tsafe/Reflect";
|
||||
|
||||
export type BuildOptionsLike = BuildOptionsLike.Standalone | BuildOptionsLike.ExternalAssets;
|
||||
|
||||
export namespace BuildOptionsLike {
|
||||
export type Standalone = {
|
||||
isStandalone: true;
|
||||
};
|
||||
|
||||
export type ExternalAssets = {
|
||||
isStandalone: false;
|
||||
urlOrigin: string;
|
||||
};
|
||||
}
|
||||
|
||||
{
|
||||
const buildOptions = Reflect<BuildOptions>();
|
||||
|
||||
assert(!is<BuildOptions.ExternalAssets.CommonExternalAssets>(buildOptions));
|
||||
|
||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
||||
}
|
||||
|
||||
export function replaceImportsFromStaticInJsCode(params: { jsCode: string; buildOptions: BuildOptionsLike }): { fixedJsCode: string } {
|
||||
/*
|
||||
NOTE:
|
||||
|
||||
When we have urlOrigin defined it means that
|
||||
we are building with --external-assets
|
||||
so we have to make sur that the fixed js code will run
|
||||
inside and outside keycloak.
|
||||
|
||||
When urlOrigin isn't defined we can assume the fixedJsCode
|
||||
will always run in keycloak context.
|
||||
*/
|
||||
|
||||
const { jsCode, buildOptions } = params;
|
||||
|
||||
const getReplaceArgs = (language: "js" | "css"): Parameters<typeof String.prototype.replace> => [
|
||||
new RegExp(`([a-zA-Z_]+)\\.([a-zA-Z]+)=function\\(([a-zA-Z]+)\\){return"static\\/${language}\\/"`, "g"),
|
||||
(...[, n, u, e]) => `
|
||||
${n}[(function(){
|
||||
var pd= Object.getOwnPropertyDescriptor(${n}, "p");
|
||||
if( pd === undefined || pd.configurable ){
|
||||
${
|
||||
buildOptions.isStandalone
|
||||
? `
|
||||
Object.defineProperty(${n}, "p", {
|
||||
get: function() { return window.${ftlValuesGlobalName}.url.resourcesPath; },
|
||||
set: function (){}
|
||||
});
|
||||
`
|
||||
: `
|
||||
var p= "";
|
||||
Object.defineProperty(${n}, "p", {
|
||||
get: function() { return "${ftlValuesGlobalName}" in window ? "${buildOptions.urlOrigin}/" : p; },
|
||||
set: function (value){ p = value;}
|
||||
});
|
||||
`
|
||||
}
|
||||
}
|
||||
return "${u}";
|
||||
})()] = function(${e}) { return "${buildOptions.isStandalone ? "/build/" : ""}static/${language}/"`
|
||||
];
|
||||
|
||||
const fixedJsCode = jsCode
|
||||
.replace(...getReplaceArgs("js"))
|
||||
.replace(...getReplaceArgs("css"))
|
||||
.replace(/([a-zA-Z]+\.[a-zA-Z]+)\+"static\//g, (...[, group]) =>
|
||||
buildOptions.isStandalone
|
||||
? `window.${ftlValuesGlobalName}.url.resourcesPath + "/build/static/`
|
||||
: `("${ftlValuesGlobalName}" in window ? "${buildOptions.urlOrigin}/" : ${group}) + "static/`
|
||||
)
|
||||
//TODO: Write a test case for this
|
||||
.replace(/".chunk.css",([a-zA-Z])+=([a-zA-Z]+\.[a-zA-Z]+)\+([a-zA-Z]+),/, (...[, group1, group2, group3]) =>
|
||||
buildOptions.isStandalone
|
||||
? `".chunk.css",${group1} = window.${ftlValuesGlobalName}.url.resourcesPath + "/build/" + ${group3},`
|
||||
: `".chunk.css",${group1} = ("${ftlValuesGlobalName}" in window ? "${buildOptions.urlOrigin}/" : ${group2}) + ${group3},`
|
||||
);
|
||||
|
||||
return { fixedJsCode };
|
||||
}
|
64
src/bin/keycloakify/replacers/replaceImportsInCssCode.ts
Normal file
64
src/bin/keycloakify/replacers/replaceImportsInCssCode.ts
Normal file
@ -0,0 +1,64 @@
|
||||
import * as crypto from "crypto";
|
||||
import type { BuildOptions } from "../BuildOptions";
|
||||
import { assert } from "tsafe/assert";
|
||||
import { is } from "tsafe/is";
|
||||
import { Reflect } from "tsafe/Reflect";
|
||||
|
||||
export type BuildOptionsLike = {
|
||||
urlPathname: string | undefined;
|
||||
};
|
||||
|
||||
{
|
||||
const buildOptions = Reflect<BuildOptions>();
|
||||
|
||||
assert(!is<BuildOptions.ExternalAssets.CommonExternalAssets>(buildOptions));
|
||||
|
||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
||||
}
|
||||
|
||||
export function replaceImportsInCssCode(params: { cssCode: string }): {
|
||||
fixedCssCode: string;
|
||||
cssGlobalsToDefine: Record<string, string>;
|
||||
} {
|
||||
const { cssCode } = params;
|
||||
|
||||
const cssGlobalsToDefine: Record<string, string> = {};
|
||||
|
||||
new Set(cssCode.match(/url\(["']?\/[^/][^)"']+["']?\)[^;}]*/g) ?? []).forEach(
|
||||
match => (cssGlobalsToDefine["url" + crypto.createHash("sha256").update(match).digest("hex").substring(0, 15)] = match)
|
||||
);
|
||||
|
||||
let fixedCssCode = cssCode;
|
||||
|
||||
Object.keys(cssGlobalsToDefine).forEach(
|
||||
cssVariableName =>
|
||||
//NOTE: split/join pattern ~ replace all
|
||||
(fixedCssCode = fixedCssCode.split(cssGlobalsToDefine[cssVariableName]).join(`var(--${cssVariableName})`))
|
||||
);
|
||||
|
||||
return { fixedCssCode, cssGlobalsToDefine };
|
||||
}
|
||||
|
||||
export function generateCssCodeToDefineGlobals(params: { cssGlobalsToDefine: Record<string, string>; buildOptions: BuildOptionsLike }): {
|
||||
cssCodeToPrependInHead: string;
|
||||
} {
|
||||
const { cssGlobalsToDefine, buildOptions } = params;
|
||||
|
||||
return {
|
||||
"cssCodeToPrependInHead": [
|
||||
":root {",
|
||||
...Object.keys(cssGlobalsToDefine)
|
||||
.map(cssVariableName =>
|
||||
[
|
||||
`--${cssVariableName}:`,
|
||||
cssGlobalsToDefine[cssVariableName].replace(
|
||||
new RegExp(`url\\(${(buildOptions.urlPathname ?? "/").replace(/\//g, "\\/")}`, "g"),
|
||||
"url(${url.resourcesPath}/build/"
|
||||
)
|
||||
].join(" ")
|
||||
)
|
||||
.map(line => ` ${line};`),
|
||||
"}"
|
||||
].join("\n")
|
||||
};
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
import type { BuildOptions } from "../BuildOptions";
|
||||
import { assert } from "tsafe/assert";
|
||||
import { is } from "tsafe/is";
|
||||
import { Reflect } from "tsafe/Reflect";
|
||||
|
||||
export type BuildOptionsLike = BuildOptionsLike.Standalone | BuildOptionsLike.ExternalAssets;
|
||||
|
||||
export namespace BuildOptionsLike {
|
||||
export type Common = {
|
||||
urlPathname: string | undefined;
|
||||
};
|
||||
|
||||
export type Standalone = Common & {
|
||||
isStandalone: true;
|
||||
};
|
||||
|
||||
export type ExternalAssets = Common & {
|
||||
isStandalone: false;
|
||||
urlOrigin: string;
|
||||
};
|
||||
}
|
||||
|
||||
{
|
||||
const buildOptions = Reflect<BuildOptions>();
|
||||
|
||||
assert(!is<BuildOptions.ExternalAssets.CommonExternalAssets>(buildOptions));
|
||||
|
||||
assert<typeof buildOptions extends BuildOptionsLike ? true : false>();
|
||||
}
|
||||
|
||||
export function replaceImportsInInlineCssCode(params: { cssCode: string; buildOptions: BuildOptionsLike }): {
|
||||
fixedCssCode: string;
|
||||
} {
|
||||
const { cssCode, buildOptions } = params;
|
||||
|
||||
const fixedCssCode = cssCode.replace(
|
||||
buildOptions.urlPathname === undefined
|
||||
? /url\(["']?\/([^/][^)"']+)["']?\)/g
|
||||
: new RegExp(`url\\(["']?${buildOptions.urlPathname}([^)"']+)["']?\\)`, "g"),
|
||||
(...[, group]) =>
|
||||
`url(${
|
||||
buildOptions.isStandalone ? "${url.resourcesPath}/build/" + group : buildOptions.urlOrigin + (buildOptions.urlPathname ?? "/") + group
|
||||
})`
|
||||
);
|
||||
|
||||
return { fixedCssCode };
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
import { execSync } from "child_process";
|
||||
import { join as pathJoin, relative as pathRelative } from "path";
|
||||
import { exclude } from "tsafe/exclude";
|
||||
import * as fs from "fs";
|
||||
|
||||
const keycloakifyDirPath = pathJoin(__dirname, "..", "..");
|
||||
@ -14,14 +15,14 @@ fs.writeFileSync(
|
||||
return {
|
||||
...packageJsonParsed,
|
||||
"main": packageJsonParsed["main"].replace(/^dist\//, ""),
|
||||
"types": packageJsonParsed["types"].replace(/^dist\//, ""),
|
||||
"types": packageJsonParsed["types"].replace(/^dist\//, "")
|
||||
};
|
||||
})(),
|
||||
null,
|
||||
2,
|
||||
2
|
||||
),
|
||||
"utf8",
|
||||
),
|
||||
"utf8"
|
||||
)
|
||||
);
|
||||
|
||||
const commonThirdPartyDeps = (() => {
|
||||
@ -33,10 +34,10 @@ const commonThirdPartyDeps = (() => {
|
||||
.map(namespaceModuleName =>
|
||||
fs
|
||||
.readdirSync(pathJoin(keycloakifyDirPath, "node_modules", namespaceModuleName))
|
||||
.map(submoduleName => `${namespaceModuleName}/${submoduleName}`),
|
||||
.map(submoduleName => `${namespaceModuleName}/${submoduleName}`)
|
||||
)
|
||||
.reduce((prev, curr) => [...prev, ...curr], []),
|
||||
...standaloneModuleNames,
|
||||
...standaloneModuleNames
|
||||
];
|
||||
})();
|
||||
|
||||
@ -55,16 +56,37 @@ const execYarnLink = (params: { targetModuleName?: string; cwd: string }) => {
|
||||
cwd,
|
||||
"env": {
|
||||
...process.env,
|
||||
"HOME": yarnHomeDirPath,
|
||||
},
|
||||
"HOME": yarnHomeDirPath
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const testAppNames = ["keycloakify-demo-app"] as const;
|
||||
const testAppPaths = (() => {
|
||||
const arg = process.argv[2];
|
||||
|
||||
const getTestAppPath = (testAppName: typeof testAppNames[number]) => pathJoin(keycloakifyDirPath, "..", testAppName);
|
||||
const testAppNames = arg !== undefined ? [arg] : ["keycloakify-starter", "keycloakify-advanced-starter"];
|
||||
|
||||
testAppNames.forEach(testAppName => execSync("yarn install", { "cwd": getTestAppPath(testAppName) }));
|
||||
return testAppNames
|
||||
.map(testAppName => {
|
||||
const testAppPath = pathJoin(keycloakifyDirPath, "..", testAppName);
|
||||
|
||||
if (fs.existsSync(testAppPath)) {
|
||||
return testAppPath;
|
||||
}
|
||||
|
||||
console.warn(`Skipping ${testAppName} since it cant be found here: ${testAppPath}`);
|
||||
|
||||
return undefined;
|
||||
})
|
||||
.filter(exclude(undefined));
|
||||
})();
|
||||
|
||||
if (testAppPaths.length === 0) {
|
||||
console.error("No test app to link into!");
|
||||
process.exit(-1);
|
||||
}
|
||||
|
||||
testAppPaths.forEach(testAppPath => execSync("yarn install", { "cwd": testAppPath }));
|
||||
|
||||
console.log("=== Linking common dependencies ===");
|
||||
|
||||
@ -77,26 +99,28 @@ commonThirdPartyDeps.forEach(commonThirdPartyDep => {
|
||||
console.log(`${current}/${total} ${commonThirdPartyDep}`);
|
||||
|
||||
const localInstallPath = pathJoin(
|
||||
...[keycloakifyDirPath, "node_modules", ...(commonThirdPartyDep.startsWith("@") ? commonThirdPartyDep.split("/") : [commonThirdPartyDep])],
|
||||
...[keycloakifyDirPath, "node_modules", ...(commonThirdPartyDep.startsWith("@") ? commonThirdPartyDep.split("/") : [commonThirdPartyDep])]
|
||||
);
|
||||
|
||||
execYarnLink({ "cwd": localInstallPath });
|
||||
|
||||
testAppNames.forEach(testAppName =>
|
||||
execYarnLink({
|
||||
"cwd": getTestAppPath(testAppName),
|
||||
"targetModuleName": commonThirdPartyDep,
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
commonThirdPartyDeps.forEach(commonThirdPartyDep =>
|
||||
testAppPaths.forEach(testAppPath =>
|
||||
execYarnLink({
|
||||
"cwd": testAppPath,
|
||||
"targetModuleName": commonThirdPartyDep
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
console.log("=== Linking in house dependencies ===");
|
||||
|
||||
execYarnLink({ "cwd": pathJoin(keycloakifyDirPath, "dist") });
|
||||
|
||||
testAppNames.forEach(testAppName =>
|
||||
testAppPaths.forEach(testAppPath =>
|
||||
execYarnLink({
|
||||
"cwd": getTestAppPath(testAppName),
|
||||
"targetModuleName": "keycloakify",
|
||||
}),
|
||||
"cwd": testAppPath,
|
||||
"targetModuleName": "keycloakify"
|
||||
})
|
||||
);
|
||||
|
5
src/bin/mockTestingResourcesPath.ts
Normal file
5
src/bin/mockTestingResourcesPath.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import { pathJoin } from "./tools/pathJoin";
|
||||
|
||||
export const mockTestingSubDirOfPublicDirBasename = "keycloak_static";
|
||||
export const mockTestingResourcesPath = pathJoin(mockTestingSubDirOfPublicDirBasename, "resources");
|
||||
export const mockTestingResourcesCommonPath = pathJoin(mockTestingResourcesPath, "resources_common");
|
@ -24,9 +24,9 @@ export async function promptKeycloakVersion() {
|
||||
"count": 10,
|
||||
"doIgnoreBeta": true,
|
||||
"owner": "keycloak",
|
||||
"repo": "keycloak",
|
||||
"repo": "keycloak"
|
||||
}).then(arr => arr.map(({ tag }) => tag))),
|
||||
"11.0.3",
|
||||
"11.0.3"
|
||||
];
|
||||
|
||||
if (process.env["GITHUB_ACTIONS"] === "true") {
|
||||
@ -34,7 +34,7 @@ export async function promptKeycloakVersion() {
|
||||
}
|
||||
|
||||
const { value: keycloakVersion } = await cliSelect<string>({
|
||||
"values": tags,
|
||||
"values": tags
|
||||
}).catch(() => {
|
||||
console.log("Aborting");
|
||||
|
||||
|
@ -20,7 +20,7 @@ export namespace NpmModuleVersion {
|
||||
...(() => {
|
||||
const str = match[4];
|
||||
return str === undefined ? {} : { "betaPreRelease": parseInt(str) };
|
||||
})(),
|
||||
})()
|
||||
};
|
||||
}
|
||||
|
||||
|
15
src/bin/tools/cliOptions.ts
Normal file
15
src/bin/tools/cliOptions.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import parseArgv from "minimist";
|
||||
|
||||
export type CliOptions = {
|
||||
isSilent: boolean;
|
||||
hasExternalAssets: boolean;
|
||||
};
|
||||
|
||||
export const getCliOptions = (processArgv: string[]): CliOptions => {
|
||||
const argv = parseArgv(processArgv);
|
||||
|
||||
return {
|
||||
isSilent: typeof argv["silent"] === "boolean" ? argv["silent"] : false,
|
||||
hasExternalAssets: typeof argv["external-assets"] === "boolean" ? argv["external-assets"] : false
|
||||
};
|
||||
};
|
@ -1,7 +0,0 @@
|
||||
import { Octokit } from "@octokit/rest";
|
||||
|
||||
export function createOctokit(params: { github_token: string }) {
|
||||
const { github_token } = params;
|
||||
|
||||
return new Octokit({ ...(github_token !== "" ? { "auth": github_token } : {}) });
|
||||
}
|
@ -1,32 +1,81 @@
|
||||
import { basename as pathBasename, join as pathJoin } from "path";
|
||||
import { execSync } from "child_process";
|
||||
import fs from "fs";
|
||||
import * as fs from "fs";
|
||||
import { transformCodebase } from "./transformCodebase";
|
||||
import { rm_rf, rm, rm_r } from "./rm";
|
||||
import { rm, rm_rf } from "./rm";
|
||||
import * as crypto from "crypto";
|
||||
|
||||
/** assert url ends with .zip */
|
||||
export function downloadAndUnzip(params: { url: string; destDirPath: string; pathOfDirToExtractInArchive?: string }) {
|
||||
const { url, destDirPath, pathOfDirToExtractInArchive } = params;
|
||||
export function downloadAndUnzip(params: {
|
||||
isSilent: boolean;
|
||||
url: string;
|
||||
destDirPath: string;
|
||||
pathOfDirToExtractInArchive?: string;
|
||||
cacheDirPath: string;
|
||||
}) {
|
||||
const { url, destDirPath, pathOfDirToExtractInArchive, cacheDirPath } = params;
|
||||
|
||||
const tmpDirPath = pathJoin(destDirPath, "..", "tmp_xxKdOxnEdx");
|
||||
const zipFilePath = pathBasename(url);
|
||||
const extractDirPath = pathJoin(
|
||||
cacheDirPath,
|
||||
`_${crypto.createHash("sha256").update(JSON.stringify({ url, pathOfDirToExtractInArchive })).digest("hex").substring(0, 15)}`
|
||||
);
|
||||
|
||||
rm_rf(tmpDirPath);
|
||||
fs.mkdirSync(cacheDirPath, { "recursive": true });
|
||||
|
||||
fs.mkdirSync(tmpDirPath, { "recursive": true });
|
||||
const { readIsSuccessByExtractDirPath, writeIsSuccessByExtractDirPath } = (() => {
|
||||
const filePath = pathJoin(cacheDirPath, "isSuccessByExtractDirPath.json");
|
||||
|
||||
execSync(`curl -L ${url} -o ${zipFilePath}`, { "cwd": tmpDirPath });
|
||||
type IsSuccessByExtractDirPath = Record<string, boolean | undefined>;
|
||||
|
||||
execSync(`unzip ${zipFilePath}${pathOfDirToExtractInArchive === undefined ? "" : ` "${pathOfDirToExtractInArchive}/*"`}`, {
|
||||
"cwd": tmpDirPath,
|
||||
});
|
||||
function readIsSuccessByExtractDirPath(): IsSuccessByExtractDirPath {
|
||||
if (!fs.existsSync(filePath)) {
|
||||
return {};
|
||||
}
|
||||
|
||||
rm(pathBasename(url), { "cwd": tmpDirPath });
|
||||
return JSON.parse(fs.readFileSync(filePath).toString("utf8"));
|
||||
}
|
||||
|
||||
function writeIsSuccessByExtractDirPath(isSuccessByExtractDirPath: IsSuccessByExtractDirPath): void {
|
||||
fs.writeFileSync(filePath, Buffer.from(JSON.stringify(isSuccessByExtractDirPath, null, 2), "utf8"));
|
||||
}
|
||||
|
||||
return { readIsSuccessByExtractDirPath, writeIsSuccessByExtractDirPath };
|
||||
})();
|
||||
|
||||
downloadAndUnzip: {
|
||||
const isSuccessByExtractDirPath = readIsSuccessByExtractDirPath();
|
||||
|
||||
if (isSuccessByExtractDirPath[extractDirPath]) {
|
||||
break downloadAndUnzip;
|
||||
}
|
||||
|
||||
writeIsSuccessByExtractDirPath({
|
||||
...isSuccessByExtractDirPath,
|
||||
[extractDirPath]: false
|
||||
});
|
||||
|
||||
rm_rf(extractDirPath);
|
||||
|
||||
fs.mkdirSync(extractDirPath);
|
||||
|
||||
const zipFileBasename = pathBasename(url);
|
||||
|
||||
execSync(`curl -L ${url} -o ${zipFileBasename} ${params.isSilent ? "-s" : ""}`, { "cwd": extractDirPath });
|
||||
|
||||
execSync(`unzip -o ${zipFileBasename}${pathOfDirToExtractInArchive === undefined ? "" : ` "${pathOfDirToExtractInArchive}/**/*"`}`, {
|
||||
"cwd": extractDirPath
|
||||
});
|
||||
|
||||
rm(zipFileBasename, { "cwd": extractDirPath });
|
||||
|
||||
writeIsSuccessByExtractDirPath({
|
||||
...isSuccessByExtractDirPath,
|
||||
[extractDirPath]: true
|
||||
});
|
||||
}
|
||||
|
||||
transformCodebase({
|
||||
"srcDirPath": pathOfDirToExtractInArchive === undefined ? tmpDirPath : pathJoin(tmpDirPath, pathOfDirToExtractInArchive),
|
||||
destDirPath,
|
||||
"srcDirPath": pathOfDirToExtractInArchive === undefined ? extractDirPath : pathJoin(extractDirPath, pathOfDirToExtractInArchive),
|
||||
destDirPath
|
||||
});
|
||||
|
||||
rm_r(tmpDirPath);
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import * as fs from "fs";
|
||||
import * as path from "path";
|
||||
|
||||
function getProjectRootRec(dirPath: string): string {
|
||||
if (fs.existsSync(path.join(dirPath, "tsconfig.json"))) {
|
||||
if (fs.existsSync(path.join(dirPath, "package.json"))) {
|
||||
return dirPath;
|
||||
}
|
||||
return getProjectRootRec(path.join(dirPath, ".."));
|
||||
|
@ -1,9 +1,10 @@
|
||||
import { getProjectRoot } from "./getProjectRoot";
|
||||
import { join as pathJoin } from "path";
|
||||
import child_process from "child_process";
|
||||
import * as child_process from "child_process";
|
||||
import * as fs from "fs";
|
||||
|
||||
Object.entries<string>(require(pathJoin(getProjectRoot(), "package.json"))["bin"]).forEach(([, scriptPath]) =>
|
||||
Object.entries<string>(JSON.parse(fs.readFileSync(pathJoin(getProjectRoot(), "package.json")).toString("utf8"))["bin"]).forEach(([, scriptPath]) =>
|
||||
child_process.execSync(`chmod +x ${scriptPath}`, {
|
||||
"cwd": getProjectRoot(),
|
||||
}),
|
||||
"cwd": getProjectRoot()
|
||||
})
|
||||
);
|
||||
|
27
src/bin/tools/logger.ts
Normal file
27
src/bin/tools/logger.ts
Normal file
@ -0,0 +1,27 @@
|
||||
type LoggerOpts = {
|
||||
force?: boolean;
|
||||
};
|
||||
|
||||
type Logger = {
|
||||
log: (message: string, opts?: LoggerOpts) => void;
|
||||
warn: (message: string) => void;
|
||||
error: (message: string) => void;
|
||||
};
|
||||
|
||||
export const getLogger = ({ isSilent }: { isSilent?: boolean } = {}): Logger => {
|
||||
return {
|
||||
log: (message, { force } = {}) => {
|
||||
if (isSilent && !force) {
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(message);
|
||||
},
|
||||
warn: message => {
|
||||
console.warn(message);
|
||||
},
|
||||
error: message => {
|
||||
console.error(message);
|
||||
}
|
||||
};
|
||||
};
|
@ -19,7 +19,7 @@ export function listTagsFactory(params: { octokit: Octokit }) {
|
||||
owner,
|
||||
repo,
|
||||
per_page,
|
||||
"page": page++,
|
||||
"page": page++
|
||||
});
|
||||
|
||||
for (const branch of resp.data.map(({ name }) => name)) {
|
||||
|
@ -10,7 +10,7 @@ export function rm(pathToRemove: string, options?: { cwd: string }) {
|
||||
rmInternal({
|
||||
pathToRemove,
|
||||
"args": undefined,
|
||||
"cwd": options?.cwd,
|
||||
"cwd": options?.cwd
|
||||
});
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ export function rm_r(pathToRemove: string, options?: { cwd: string }) {
|
||||
rmInternal({
|
||||
pathToRemove,
|
||||
"args": "r",
|
||||
"cwd": options?.cwd,
|
||||
"cwd": options?.cwd
|
||||
});
|
||||
}
|
||||
|
||||
@ -26,6 +26,6 @@ export function rm_rf(pathToRemove: string, options?: { cwd: string }) {
|
||||
rmInternal({
|
||||
pathToRemove,
|
||||
"args": "rf",
|
||||
"cwd": options?.cwd,
|
||||
"cwd": options?.cwd
|
||||
});
|
||||
}
|
||||
|
@ -16,8 +16,8 @@ export function transformCodebase(params: { srcDirPath: string; destDirPath: str
|
||||
srcDirPath,
|
||||
destDirPath,
|
||||
transformSourceCode = id<TransformSourceCode>(({ sourceCode }) => ({
|
||||
"modifiedSourceCode": sourceCode,
|
||||
})),
|
||||
"modifiedSourceCode": sourceCode
|
||||
}))
|
||||
} = params;
|
||||
|
||||
for (const file_relative_path of crawl(srcDirPath)) {
|
||||
@ -25,7 +25,7 @@ export function transformCodebase(params: { srcDirPath: string; destDirPath: str
|
||||
|
||||
const transformSourceCodeResult = transformSourceCode({
|
||||
"sourceCode": fs.readFileSync(filePath),
|
||||
"filePath": path.join(srcDirPath, file_relative_path),
|
||||
"filePath": path.join(srcDirPath, file_relative_path)
|
||||
});
|
||||
|
||||
if (transformSourceCodeResult === undefined) {
|
||||
@ -33,14 +33,14 @@ export function transformCodebase(params: { srcDirPath: string; destDirPath: str
|
||||
}
|
||||
|
||||
fs.mkdirSync(path.dirname(path.join(destDirPath, file_relative_path)), {
|
||||
"recursive": true,
|
||||
"recursive": true
|
||||
});
|
||||
|
||||
const { newFileName, modifiedSourceCode } = transformSourceCodeResult;
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(path.dirname(path.join(destDirPath, file_relative_path)), newFileName ?? path.basename(file_relative_path)),
|
||||
modifiedSourceCode,
|
||||
modifiedSourceCode
|
||||
);
|
||||
}
|
||||
}
|
||||
|
11
src/bin/tsconfig.json
Normal file
11
src/bin/tsconfig.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"extends": "../../tsproject.json",
|
||||
"compilerOptions": {
|
||||
"module": "CommonJS",
|
||||
"target": "ES5",
|
||||
"esModuleInterop": true,
|
||||
"lib": ["es2015", "DOM", "ES2019.Object"],
|
||||
"outDir": "../../dist/bin",
|
||||
"rootDir": "."
|
||||
}
|
||||
}
|
@ -1,18 +1,27 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export const Error = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Error } & KcProps) => {
|
||||
const { msg } = getMsg(kcContext);
|
||||
export type ErrorProps = KcProps & {
|
||||
kcContext: KcContextBase.Error;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const Error = memo((props: ErrorProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { message, client } = kcContext;
|
||||
|
||||
const { msg } = i18n;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayMessage={false}
|
||||
headerNode={msg("errorTitle")}
|
||||
formNode={
|
||||
@ -30,3 +39,5 @@ export const Error = memo(({ kcContext, ...props }: { kcContext: KcContextBase.E
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default Error;
|
||||
|
58
src/lib/components/IdpReviewUserProfile.tsx
Normal file
58
src/lib/components/IdpReviewUserProfile.tsx
Normal file
@ -0,0 +1,58 @@
|
||||
import React, { useState, memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
import { UserProfileFormFields } from "./shared/UserProfileCommons";
|
||||
|
||||
export type IdpReviewUserProfileProps = KcProps & {
|
||||
kcContext: KcContextBase.IdpReviewUserProfile;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const IdpReviewUserProfile = memo((props: IdpReviewUserProfileProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const { url } = kcContext;
|
||||
|
||||
const [isFomSubmittable, setIsFomSubmittable] = useState(false);
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("loginIdpReviewProfileTitle")}
|
||||
formNode={
|
||||
<form id="kc-idp-review-profile-form" className={clsx(kcProps.kcFormClass)} action={url.loginAction} method="post">
|
||||
<UserProfileFormFields kcContext={kcContext} onIsFormSubmittableValueChange={setIsFomSubmittable} i18n={i18n} {...kcProps} />
|
||||
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={clsx(kcProps.kcFormOptionsClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)} />
|
||||
</div>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
<input
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
type="submit"
|
||||
value={msgStr("doSubmit")}
|
||||
disabled={!isFomSubmittable}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default IdpReviewUserProfile;
|
@ -1,12 +1,22 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import { assert } from "../tools/assert";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export const Info = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Info } & KcProps) => {
|
||||
const { msg } = getMsg(kcContext);
|
||||
export type InfoProps = KcProps & {
|
||||
kcContext: KcContextBase.Info;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const Info = memo((props: InfoProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { msgStr, msg } = i18n;
|
||||
|
||||
assert(kcContext.message !== undefined);
|
||||
|
||||
@ -14,8 +24,7 @@ export const Info = memo(({ kcContext, ...props }: { kcContext: KcContextBase.In
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayMessage={false}
|
||||
headerNode={messageHeader !== undefined ? <>{messageHeader}</> : <>{message.summary}</>}
|
||||
formNode={
|
||||
@ -24,7 +33,7 @@ export const Info = memo(({ kcContext, ...props }: { kcContext: KcContextBase.In
|
||||
{message.summary}
|
||||
|
||||
{requiredActions !== undefined && (
|
||||
<b>{requiredActions.map(requiredAction => msg(`requiredAction.${requiredAction}` as const)).join(",")}</b>
|
||||
<b>{requiredActions.map(requiredAction => msgStr(`requiredAction.${requiredAction}` as const)).join(",")}</b>
|
||||
)}
|
||||
</p>
|
||||
{!skipLink && pageRedirectUri !== undefined ? (
|
||||
@ -47,3 +56,5 @@ export const Info = memo(({ kcContext, ...props }: { kcContext: KcContextBase.In
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default Info;
|
||||
|
@ -1,50 +1,109 @@
|
||||
import { memo } from "react";
|
||||
import React, { lazy, memo, Suspense } from "react";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import { Login } from "./Login";
|
||||
import { Register } from "./Register";
|
||||
import { RegisterUserProfile } from "./RegisterUserProfile";
|
||||
import { Info } from "./Info";
|
||||
import { Error } from "./Error";
|
||||
import { LoginResetPassword } from "./LoginResetPassword";
|
||||
import { LoginVerifyEmail } from "./LoginVerifyEmail";
|
||||
import { Terms } from "./Terms";
|
||||
import { LoginOtp } from "./LoginOtp";
|
||||
import { LoginUpdatePassword } from "./LoginUpdatePassword";
|
||||
import { LoginUpdateProfile } from "./LoginUpdateProfile";
|
||||
import { LoginIdpLinkConfirm } from "./LoginIdpLinkConfirm";
|
||||
import { LoginPageExpired } from "./LoginPageExpired";
|
||||
import { LoginIdpLinkEmail } from "./LoginIdpLinkEmail";
|
||||
import { __unsafe_useI18n as useI18n } from "../i18n";
|
||||
import type { I18n } from "../i18n";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
|
||||
export const KcApp = memo(({ kcContext, ...props }: { kcContext: KcContextBase } & KcProps) => {
|
||||
switch (kcContext.pageId) {
|
||||
case "login.ftl":
|
||||
return <Login {...{ kcContext, ...props }} />;
|
||||
case "register.ftl":
|
||||
return <Register {...{ kcContext, ...props }} />;
|
||||
case "register-user-profile.ftl":
|
||||
return <RegisterUserProfile {...{ kcContext, ...props }} />;
|
||||
case "info.ftl":
|
||||
return <Info {...{ kcContext, ...props }} />;
|
||||
case "error.ftl":
|
||||
return <Error {...{ kcContext, ...props }} />;
|
||||
case "login-reset-password.ftl":
|
||||
return <LoginResetPassword {...{ kcContext, ...props }} />;
|
||||
case "login-verify-email.ftl":
|
||||
return <LoginVerifyEmail {...{ kcContext, ...props }} />;
|
||||
case "terms.ftl":
|
||||
return <Terms {...{ kcContext, ...props }} />;
|
||||
case "login-otp.ftl":
|
||||
return <LoginOtp {...{ kcContext, ...props }} />;
|
||||
case "login-update-password.ftl":
|
||||
return <LoginUpdatePassword {...{ kcContext, ...props }} />;
|
||||
case "login-update-profile.ftl":
|
||||
return <LoginUpdateProfile {...{ kcContext, ...props }} />;
|
||||
case "login-idp-link-confirm.ftl":
|
||||
return <LoginIdpLinkConfirm {...{ kcContext, ...props }} />;
|
||||
case "login-idp-link-email.ftl":
|
||||
return <LoginIdpLinkEmail {...{ kcContext, ...props }} />;
|
||||
case "login-page-expired.ftl":
|
||||
return <LoginPageExpired {...{ kcContext, ...props }} />;
|
||||
const Login = lazy(() => import("./Login"));
|
||||
const Register = lazy(() => import("./Register"));
|
||||
const RegisterUserProfile = lazy(() => import("./RegisterUserProfile"));
|
||||
const Info = lazy(() => import("./Info"));
|
||||
const Error = lazy(() => import("./Error"));
|
||||
const LoginResetPassword = lazy(() => import("./LoginResetPassword"));
|
||||
const LoginVerifyEmail = lazy(() => import("./LoginVerifyEmail"));
|
||||
const Terms = lazy(() => import("./Terms"));
|
||||
const LoginOtp = lazy(() => import("./LoginOtp"));
|
||||
const LoginPassword = lazy(() => import("./LoginPassword"));
|
||||
const LoginUsername = lazy(() => import("./LoginUsername"));
|
||||
const WebauthnAuthenticate = lazy(() => import("./WebauthnAuthenticate"));
|
||||
const LoginUpdatePassword = lazy(() => import("./LoginUpdatePassword"));
|
||||
const LoginUpdateProfile = lazy(() => import("./LoginUpdateProfile"));
|
||||
const LoginIdpLinkConfirm = lazy(() => import("./LoginIdpLinkConfirm"));
|
||||
const LoginPageExpired = lazy(() => import("./LoginPageExpired"));
|
||||
const LoginIdpLinkEmail = lazy(() => import("./LoginIdpLinkEmail"));
|
||||
const LoginConfigTotp = lazy(() => import("./LoginConfigTotp"));
|
||||
const LogoutConfirm = lazy(() => import("./LogoutConfirm"));
|
||||
const UpdateUserProfile = lazy(() => import("./UpdateUserProfile"));
|
||||
const IdpReviewUserProfile = lazy(() => import("./IdpReviewUserProfile"));
|
||||
|
||||
export type KcAppProps = KcProps & {
|
||||
kcContext: KcContextBase;
|
||||
i18n?: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const KcApp = memo((props_: KcAppProps) => {
|
||||
const { kcContext, i18n: userProvidedI18n, Template = DefaultTemplate, ...kcProps } = props_;
|
||||
|
||||
const i18n = (function useClosure() {
|
||||
const i18n = useI18n({
|
||||
kcContext,
|
||||
"extraMessages": {},
|
||||
"doSkip": userProvidedI18n !== undefined
|
||||
});
|
||||
|
||||
return userProvidedI18n ?? i18n;
|
||||
})();
|
||||
|
||||
if (i18n === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const commonProps = { i18n, Template, ...kcProps };
|
||||
|
||||
return (
|
||||
<Suspense>
|
||||
{(() => {
|
||||
switch (kcContext.pageId) {
|
||||
case "login.ftl":
|
||||
return <Login {...{ kcContext, ...commonProps }} />;
|
||||
case "register.ftl":
|
||||
return <Register {...{ kcContext, ...commonProps }} />;
|
||||
case "register-user-profile.ftl":
|
||||
return <RegisterUserProfile {...{ kcContext, ...commonProps }} />;
|
||||
case "info.ftl":
|
||||
return <Info {...{ kcContext, ...commonProps }} />;
|
||||
case "error.ftl":
|
||||
return <Error {...{ kcContext, ...commonProps }} />;
|
||||
case "login-reset-password.ftl":
|
||||
return <LoginResetPassword {...{ kcContext, ...commonProps }} />;
|
||||
case "login-verify-email.ftl":
|
||||
return <LoginVerifyEmail {...{ kcContext, ...commonProps }} />;
|
||||
case "terms.ftl":
|
||||
return <Terms {...{ kcContext, ...commonProps }} />;
|
||||
case "login-otp.ftl":
|
||||
return <LoginOtp {...{ kcContext, ...commonProps }} />;
|
||||
case "login-username.ftl":
|
||||
return <LoginUsername {...{ kcContext, ...commonProps }} />;
|
||||
case "login-password.ftl":
|
||||
return <LoginPassword {...{ kcContext, ...commonProps }} />;
|
||||
case "webauthn-authenticate.ftl":
|
||||
return <WebauthnAuthenticate {...{ kcContext, ...commonProps }} />;
|
||||
case "login-update-password.ftl":
|
||||
return <LoginUpdatePassword {...{ kcContext, ...commonProps }} />;
|
||||
case "login-update-profile.ftl":
|
||||
return <LoginUpdateProfile {...{ kcContext, ...commonProps }} />;
|
||||
case "login-idp-link-confirm.ftl":
|
||||
return <LoginIdpLinkConfirm {...{ kcContext, ...commonProps }} />;
|
||||
case "login-idp-link-email.ftl":
|
||||
return <LoginIdpLinkEmail {...{ kcContext, ...commonProps }} />;
|
||||
case "login-page-expired.ftl":
|
||||
return <LoginPageExpired {...{ kcContext, ...commonProps }} />;
|
||||
case "login-config-totp.ftl":
|
||||
return <LoginConfigTotp {...{ kcContext, ...commonProps }} />;
|
||||
case "logout-confirm.ftl":
|
||||
return <LogoutConfirm {...{ kcContext, ...commonProps }} />;
|
||||
case "update-user-profile.ftl":
|
||||
return <UpdateUserProfile {...{ kcContext, ...commonProps }} />;
|
||||
case "idp-review-user-profile.ftl":
|
||||
return <IdpReviewUserProfile {...{ kcContext, ...commonProps }} />;
|
||||
}
|
||||
})()}
|
||||
</Suspense>
|
||||
);
|
||||
});
|
||||
|
||||
export default KcApp;
|
||||
|
@ -37,7 +37,7 @@ export const defaultKcTemplateProps = {
|
||||
"stylesCommon": [
|
||||
"node_modules/patternfly/dist/css/patternfly.min.css",
|
||||
"node_modules/patternfly/dist/css/patternfly-additions.min.css",
|
||||
"lib/zocial/zocial.css",
|
||||
"lib/zocial/zocial.css"
|
||||
],
|
||||
"styles": ["css/login.css"],
|
||||
"scripts": [],
|
||||
@ -60,7 +60,7 @@ export const defaultKcTemplateProps = {
|
||||
"kcFormGroupClass": ["form-group"],
|
||||
"kcLabelWrapperClass": ["col-xs-12", "col-sm-12", "col-md-12", "col-lg-12"],
|
||||
"kcSignUpClass": ["login-pf-signup"],
|
||||
"kcInfoAreaWrapperClass": [],
|
||||
"kcInfoAreaWrapperClass": []
|
||||
} as const;
|
||||
|
||||
assert<typeof defaultKcTemplateProps extends KcTemplateProps ? true : false>();
|
||||
@ -84,6 +84,7 @@ export type KcProps = KcPropsGeneric<
|
||||
| "kcFormSocialAccountDoubleListClass"
|
||||
| "kcFormSocialAccountListLinkClass"
|
||||
| "kcWebAuthnKeyIcon"
|
||||
| "kcWebAuthnDefaultIcon"
|
||||
| "kcFormClass"
|
||||
| "kcFormGroupErrorClass"
|
||||
| "kcLabelClass"
|
||||
@ -105,12 +106,16 @@ export type KcProps = KcPropsGeneric<
|
||||
| "kcSrOnlyClass"
|
||||
| "kcSelectAuthListClass"
|
||||
| "kcSelectAuthListItemClass"
|
||||
| "kcSelectAuthListItemFillClass"
|
||||
| "kcSelectAuthListItemInfoClass"
|
||||
| "kcSelectAuthListItemLeftClass"
|
||||
| "kcSelectAuthListItemBodyClass"
|
||||
| "kcSelectAuthListItemDescriptionClass"
|
||||
| "kcSelectAuthListItemHeadingClass"
|
||||
| "kcSelectAuthListItemHelpTextClass"
|
||||
| "kcSelectAuthListItemIconPropertyClass"
|
||||
| "kcSelectAuthListItemIconClass"
|
||||
| "kcSelectAuthListItemTitle"
|
||||
| "kcAuthenticatorDefaultClass"
|
||||
| "kcAuthenticatorPasswordClass"
|
||||
| "kcAuthenticatorOTPClass"
|
||||
@ -138,6 +143,7 @@ export const defaultKcProps = {
|
||||
"kcFormSocialAccountDoubleListClass": ["login-pf-social-double-col"],
|
||||
"kcFormSocialAccountListLinkClass": ["login-pf-social-link"],
|
||||
"kcWebAuthnKeyIcon": ["pficon", "pficon-key"],
|
||||
"kcWebAuthnDefaultIcon": ["pficon", "pficon-key"],
|
||||
|
||||
"kcFormClass": ["form-horizontal"],
|
||||
"kcFormGroupErrorClass": ["has-error"],
|
||||
@ -173,6 +179,10 @@ export const defaultKcProps = {
|
||||
// css classes for select-authenticator form
|
||||
"kcSelectAuthListClass": ["list-group", "list-view-pf"],
|
||||
"kcSelectAuthListItemClass": ["list-group-item", "list-view-pf-stacked"],
|
||||
"kcSelectAuthListItemFillClass": ["pf-l-split__item", "pf-m-fill"],
|
||||
"kcSelectAuthListItemIconPropertyClass": ["fa-2x", "select-auth-box-icon-properties"],
|
||||
"kcSelectAuthListItemIconClass": ["pf-l-split__item", "select-auth-box-icon"],
|
||||
"kcSelectAuthListItemTitle": ["select-auth-box-paragraph"],
|
||||
"kcSelectAuthListItemInfoClass": ["list-view-pf-main-info"],
|
||||
"kcSelectAuthListItemLeftClass": ["list-view-pf-left"],
|
||||
"kcSelectAuthListItemBodyClass": ["list-view-pf-body"],
|
||||
@ -192,7 +202,7 @@ export const defaultKcProps = {
|
||||
"kcSelectOTPListItemClass": ["card-pf-body", "card-pf-top-element"],
|
||||
"kcAuthenticatorOtpCircleClass": ["fa", "fa-mobile", "card-pf-icon-circle"],
|
||||
"kcSelectOTPItemHeadingClass": ["card-pf-title", "text-center"],
|
||||
"kcFormOptionsWrapperClass": [],
|
||||
"kcFormOptionsWrapperClass": []
|
||||
} as const;
|
||||
|
||||
assert<typeof defaultKcProps extends KcProps ? true : false>();
|
||||
|
@ -1,18 +1,26 @@
|
||||
import { useState, memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { useState, memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import { useConstCallback } from "powerhooks/useConstCallback";
|
||||
import type { FormEventHandler } from "react";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginProps = KcProps & {
|
||||
kcContext: KcContextBase.Login;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const Login = memo((props: LoginProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Login } & KcProps) => {
|
||||
const { social, realm, url, usernameEditDisabled, login, auth, registrationDisabled } = kcContext;
|
||||
|
||||
const { msg, msgStr } = getMsg(kcContext);
|
||||
|
||||
const { cx } = useCssAndCx();
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const [isLoginButtonDisabled, setIsLoginButtonDisabled] = useState(false);
|
||||
|
||||
@ -32,20 +40,21 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayInfo={social.displayInfo}
|
||||
displayWide={realm.password && social.providers !== undefined}
|
||||
headerNode={msg("doLogIn")}
|
||||
formNode={
|
||||
<div id="kc-form" className={cx(realm.password && social.providers !== undefined && props.kcContentWrapperClass)}>
|
||||
<div id="kc-form" className={clsx(realm.password && social.providers !== undefined && kcProps.kcContentWrapperClass)}>
|
||||
<div
|
||||
id="kc-form-wrapper"
|
||||
className={cx(realm.password && social.providers && [props.kcFormSocialAccountContentClass, props.kcFormSocialAccountClass])}
|
||||
className={clsx(
|
||||
realm.password && social.providers && [kcProps.kcFormSocialAccountContentClass, kcProps.kcFormSocialAccountClass]
|
||||
)}
|
||||
>
|
||||
{realm.password && (
|
||||
<form id="kc-form-login" onSubmit={onSubmit} action={url.loginAction} method="post">
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
{(() => {
|
||||
const label = !realm.loginWithEmailAllowed
|
||||
? "username"
|
||||
@ -57,13 +66,13 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
||||
|
||||
return (
|
||||
<>
|
||||
<label htmlFor={autoCompleteHelper} className={cx(props.kcLabelClass)}>
|
||||
<label htmlFor={autoCompleteHelper} className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg(label)}
|
||||
</label>
|
||||
<input
|
||||
tabIndex={1}
|
||||
id={autoCompleteHelper}
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
//NOTE: This is used by Google Chrome auto fill so we use it to tell
|
||||
//the browser how to pre fill the form but before submit we put it back
|
||||
//to username because it is what keycloak expects.
|
||||
@ -74,27 +83,27 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
||||
? { "disabled": true }
|
||||
: {
|
||||
"autoFocus": true,
|
||||
"autoComplete": "off",
|
||||
"autoComplete": "off"
|
||||
})}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
})()}
|
||||
</div>
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<label htmlFor="password" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<label htmlFor="password" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("password")}
|
||||
</label>
|
||||
<input
|
||||
tabIndex={2}
|
||||
id="password"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
name="password"
|
||||
type="password"
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
<div className={cx(props.kcFormGroupClass, props.kcFormSettingClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, kcProps.kcFormSettingClass)}>
|
||||
<div id="kc-form-options">
|
||||
{realm.rememberMe && !usernameEditDisabled && (
|
||||
<div className="checkbox">
|
||||
@ -106,7 +115,7 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
||||
type="checkbox"
|
||||
{...(login.rememberMe
|
||||
? {
|
||||
"checked": true,
|
||||
"checked": true
|
||||
}
|
||||
: {})}
|
||||
/>
|
||||
@ -115,7 +124,7 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className={cx(props.kcFormOptionsWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)}>
|
||||
{realm.resetPasswordAllowed && (
|
||||
<span>
|
||||
<a tabIndex={5} href={url.loginResetCredentialsUrl}>
|
||||
@ -125,24 +134,24 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div id="kc-form-buttons" className={cx(props.kcFormGroupClass)}>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<input
|
||||
type="hidden"
|
||||
id="id-hidden-input"
|
||||
name="credentialId"
|
||||
{...(auth?.selectedCredential !== undefined
|
||||
? {
|
||||
"value": auth.selectedCredential,
|
||||
"value": auth.selectedCredential
|
||||
}
|
||||
: {})}
|
||||
/>
|
||||
<input
|
||||
tabIndex={4}
|
||||
className={cx(
|
||||
props.kcButtonClass,
|
||||
props.kcButtonPrimaryClass,
|
||||
props.kcButtonBlockClass,
|
||||
props.kcButtonLargeClass,
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
name="login"
|
||||
id="kc-login"
|
||||
@ -155,16 +164,16 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
||||
)}
|
||||
</div>
|
||||
{realm.password && social.providers !== undefined && (
|
||||
<div id="kc-social-providers" className={cx(props.kcFormSocialAccountContentClass, props.kcFormSocialAccountClass)}>
|
||||
<div id="kc-social-providers" className={clsx(kcProps.kcFormSocialAccountContentClass, kcProps.kcFormSocialAccountClass)}>
|
||||
<ul
|
||||
className={cx(
|
||||
props.kcFormSocialAccountListClass,
|
||||
social.providers.length > 4 && props.kcFormSocialAccountDoubleListClass,
|
||||
className={clsx(
|
||||
kcProps.kcFormSocialAccountListClass,
|
||||
social.providers.length > 4 && kcProps.kcFormSocialAccountDoubleListClass
|
||||
)}
|
||||
>
|
||||
{social.providers.map(p => (
|
||||
<li key={p.providerId} className={cx(props.kcFormSocialAccountListLinkClass)}>
|
||||
<a href={p.loginUrl} id={`zocial-${p.alias}`} className={cx("zocial", p.providerId)}>
|
||||
<li key={p.providerId} className={clsx(kcProps.kcFormSocialAccountListLinkClass)}>
|
||||
<a href={p.loginUrl} id={`zocial-${p.alias}`} className={clsx("zocial", p.providerId)}>
|
||||
<span>{p.displayName}</span>
|
||||
</a>
|
||||
</li>
|
||||
@ -191,3 +200,5 @@ export const Login = memo(({ kcContext, ...props }: { kcContext: KcContextBase.L
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default Login;
|
||||
|
193
src/lib/components/LoginConfigTotp.tsx
Normal file
193
src/lib/components/LoginConfigTotp.tsx
Normal file
@ -0,0 +1,193 @@
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginConfigTotpProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginConfigTotp;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LoginConfigTotp = memo((props: LoginConfigTotpProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { url, isAppInitiatedAction, totp, mode, messagesPerField } = kcContext;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const algToKeyUriAlg: Record<KcContextBase.LoginConfigTotp["totp"]["policy"]["algorithm"], string> = {
|
||||
"HmacSHA1": "SHA1",
|
||||
"HmacSHA256": "SHA256",
|
||||
"HmacSHA512": "SHA512"
|
||||
};
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("loginTotpTitle")}
|
||||
formNode={
|
||||
<>
|
||||
<ol id="kc-totp-settings">
|
||||
<li>
|
||||
<p>{msg("loginTotpStep1")}</p>
|
||||
|
||||
<ul id="kc-totp-supported-apps">
|
||||
{totp.policy.supportedApplications.map(app => (
|
||||
<li>{app}</li>
|
||||
))}
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
{mode && mode == "manual" ? (
|
||||
<>
|
||||
<li>
|
||||
<p>{msg("loginTotpManualStep2")}</p>
|
||||
<p>
|
||||
<span id="kc-totp-secret-key">{totp.totpSecretEncoded}</span>
|
||||
</p>
|
||||
<p>
|
||||
<a href={totp.qrUrl} id="mode-barcode">
|
||||
{msg("loginTotpScanBarcode")}
|
||||
</a>
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>{msg("loginTotpManualStep3")}</p>
|
||||
<p>
|
||||
<ul>
|
||||
<li id="kc-totp-type">
|
||||
{msg("loginTotpType")}: {msg(`loginTotp.${totp.policy.type}`)}
|
||||
</li>
|
||||
<li id="kc-totp-algorithm">
|
||||
{msg("loginTotpAlgorithm")}: {algToKeyUriAlg?.[totp.policy.algorithm] ?? totp.policy.algorithm}
|
||||
</li>
|
||||
<li id="kc-totp-digits">
|
||||
{msg("loginTotpDigits")}: {totp.policy.digits}
|
||||
</li>
|
||||
{totp.policy.type === "totp" ? (
|
||||
<li id="kc-totp-period">
|
||||
{msg("loginTotpInterval")}: {totp.policy.period}
|
||||
</li>
|
||||
) : (
|
||||
<li id="kc-totp-counter">
|
||||
{msg("loginTotpCounter")}: {totp.policy.initialCounter}
|
||||
</li>
|
||||
)}
|
||||
</ul>
|
||||
</p>
|
||||
</li>
|
||||
</>
|
||||
) : (
|
||||
<li>
|
||||
<p>{msg("loginTotpStep2")}</p>
|
||||
<img id="kc-totp-secret-qr-code" src={`data:image/png;base64, ${totp.totpSecretQrCode}`} alt="Figure: Barcode" />
|
||||
<br />
|
||||
<p>
|
||||
<a href={totp.manualUrl} id="mode-manual">
|
||||
{msg("loginTotpUnableToScan")}
|
||||
</a>
|
||||
</p>
|
||||
</li>
|
||||
)}
|
||||
<li>
|
||||
<p>{msg("loginTotpStep3")}</p>
|
||||
<p>{msg("loginTotpStep3DeviceName")}</p>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
<form action={url.loginAction} className={clsx(kcProps.kcFormClass)} id="kc-totp-settings-form" method="post">
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<label htmlFor="totp" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("authenticatorCode")}
|
||||
</label>{" "}
|
||||
<span className="required">*</span>
|
||||
</div>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="totp"
|
||||
name="totp"
|
||||
autoComplete="off"
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
aria-invalid={messagesPerField.existsError("totp")}
|
||||
/>
|
||||
|
||||
{messagesPerField.existsError("totp") && (
|
||||
<span id="input-error-otp-code" className={clsx(kcProps.kcInputErrorMessageClass)} aria-live="polite">
|
||||
{messagesPerField.get("totp")}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<input type="hidden" id="totpSecret" name="totpSecret" value={totp.totpSecret} />
|
||||
{mode && <input type="hidden" id="mode" value={mode} />}
|
||||
</div>
|
||||
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<label htmlFor="userLabel" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("loginTotpDeviceName")}
|
||||
</label>{" "}
|
||||
{totp.otpCredentials.length >= 1 && <span className="required">*</span>}
|
||||
</div>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="userLabel"
|
||||
name="userLabel"
|
||||
autoComplete="off"
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
aria-invalid={messagesPerField.existsError("userLabel")}
|
||||
/>
|
||||
{messagesPerField.existsError("userLabel") && (
|
||||
<span id="input-error-otp-label" className={clsx(kcProps.kcInputErrorMessageClass)} aria-live="polite">
|
||||
{messagesPerField.get("userLabel")}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{isAppInitiatedAction ? (
|
||||
<>
|
||||
<input
|
||||
type="submit"
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonPrimaryClass, kcProps.kcButtonLargeClass)}
|
||||
id="saveTOTPBtn"
|
||||
value={msgStr("doSubmit")}
|
||||
/>
|
||||
<button
|
||||
type="submit"
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonDefaultClass,
|
||||
kcProps.kcButtonLargeClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
id="cancelTOTPBtn"
|
||||
name="cancel-aia"
|
||||
value="true"
|
||||
>
|
||||
${msg("doCancel")}
|
||||
</button>
|
||||
</>
|
||||
) : (
|
||||
<input
|
||||
type="submit"
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonPrimaryClass, kcProps.kcButtonLargeClass)}
|
||||
id="saveTOTPBtn"
|
||||
value={msgStr("doSubmit")}
|
||||
/>
|
||||
)}
|
||||
</form>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginConfigTotp;
|
@ -1,28 +1,40 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginIdpLinkConfirmProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginIdpLinkConfirm;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LoginIdpLinkConfirm = memo((props: LoginIdpLinkConfirmProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
export const LoginIdpLinkConfirm = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginIdpLinkConfirm } & KcProps) => {
|
||||
const { url, idpAlias } = kcContext;
|
||||
|
||||
const { msg } = getMsg(kcContext);
|
||||
|
||||
const { cx } = useCssAndCx();
|
||||
const { msg } = i18n;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("confirmLinkIdpTitle")}
|
||||
formNode={
|
||||
<form id="kc-register-form" action={url.loginAction} method="post">
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<button
|
||||
type="submit"
|
||||
className={cx(props.kcButtonClass, props.kcButtonDefaultClass, props.kcButtonBlockClass, props.kcButtonLargeClass)}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonDefaultClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
name="submitAction"
|
||||
id="updateProfile"
|
||||
value="updateProfile"
|
||||
@ -31,7 +43,12 @@ export const LoginIdpLinkConfirm = memo(({ kcContext, ...props }: { kcContext: K
|
||||
</button>
|
||||
<button
|
||||
type="submit"
|
||||
className={cx(props.kcButtonClass, props.kcButtonDefaultClass, props.kcButtonBlockClass, props.kcButtonLargeClass)}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonDefaultClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
name="submitAction"
|
||||
id="linkAccount"
|
||||
value="linkAccount"
|
||||
@ -44,3 +61,5 @@ export const LoginIdpLinkConfirm = memo(({ kcContext, ...props }: { kcContext: K
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginIdpLinkConfirm;
|
||||
|
@ -1,18 +1,27 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginIdpLinkEmailProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginIdpLinkEmail;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LoginIdpLinkEmail = memo((props: LoginIdpLinkEmailProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
export const LoginIdpLinkEmail = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginIdpLinkEmail } & KcProps) => {
|
||||
const { url, realm, brokerContext, idpAlias } = kcContext;
|
||||
|
||||
const { msg } = getMsg(kcContext);
|
||||
const { msg } = i18n;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("emailLinkIdpTitle", idpAlias)}
|
||||
formNode={
|
||||
<>
|
||||
@ -30,3 +39,5 @@ export const LoginIdpLinkEmail = memo(({ kcContext, ...props }: { kcContext: KcC
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginIdpLinkEmail;
|
||||
|
@ -1,25 +1,33 @@
|
||||
import { useEffect, memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { useEffect, memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { headInsert } from "../tools/headInsert";
|
||||
import { pathJoin } from "../tools/pathJoin";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { pathJoin } from "../../bin/tools/pathJoin";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginOtpProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginOtp;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LoginOtp = memo((props: LoginOtpProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
export const LoginOtp = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginOtp } & KcProps) => {
|
||||
const { otpLogin, url } = kcContext;
|
||||
|
||||
const { cx } = useCssAndCx();
|
||||
|
||||
const { msg, msgStr } = getMsg(kcContext);
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
useEffect(() => {
|
||||
let isCleanedUp = false;
|
||||
|
||||
headInsert({
|
||||
"type": "javascript",
|
||||
"src": pathJoin(kcContext.url.resourcesCommonPath, "node_modules/jquery/dist/jquery.min.js"),
|
||||
"src": pathJoin(kcContext.url.resourcesCommonPath, "node_modules/jquery/dist/jquery.min.js")
|
||||
}).then(() => {
|
||||
if (isCleanedUp) return;
|
||||
|
||||
@ -33,46 +41,50 @@ export const LoginOtp = memo(({ kcContext, ...props }: { kcContext: KcContextBas
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("doLogIn")}
|
||||
formNode={
|
||||
<form id="kc-otp-login-form" className={cx(props.kcFormClass)} action={url.loginAction} method="post">
|
||||
<form id="kc-otp-login-form" className={clsx(kcProps.kcFormClass)} action={url.loginAction} method="post">
|
||||
{otpLogin.userOtpCredentials.length > 1 && (
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
{otpLogin.userOtpCredentials.map(otpCredential => (
|
||||
<div key={otpCredential.id} className={cx(props.kcSelectOTPListClass)}>
|
||||
<div key={otpCredential.id} className={clsx(kcProps.kcSelectOTPListClass)}>
|
||||
<input type="hidden" value="${otpCredential.id}" />
|
||||
<div className={cx(props.kcSelectOTPListItemClass)}>
|
||||
<span className={cx(props.kcAuthenticatorOtpCircleClass)} />
|
||||
<h2 className={cx(props.kcSelectOTPItemHeadingClass)}>{otpCredential.userLabel}</h2>
|
||||
<div className={clsx(kcProps.kcSelectOTPListItemClass)}>
|
||||
<span className={clsx(kcProps.kcAuthenticatorOtpCircleClass)} />
|
||||
<h2 className={clsx(kcProps.kcSelectOTPItemHeadingClass)}>{otpCredential.userLabel}</h2>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="otp" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="otp" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("loginOtpOneTime")}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<input id="otp" name="otp" autoComplete="off" type="text" className={cx(props.kcInputClass)} autoFocus />
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input id="otp" name="otp" autoComplete="off" type="text" className={clsx(kcProps.kcInputClass)} autoFocus />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={cx(props.kcFormOptionsClass)}>
|
||||
<div className={cx(props.kcFormOptionsWrapperClass)} />
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={clsx(kcProps.kcFormOptionsClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)} />
|
||||
</div>
|
||||
|
||||
<div id="kc-form-buttons" className={cx(props.kcFormButtonsClass)}>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
<input
|
||||
className={cx(props.kcButtonClass, props.kcButtonPrimaryClass, props.kcButtonBlockClass, props.kcButtonLargeClass)}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
name="login"
|
||||
id="kc-login"
|
||||
type="submit"
|
||||
@ -109,3 +121,5 @@ function evaluateInlineScript() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export default LoginOtp;
|
||||
|
@ -1,18 +1,27 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginPageExpired = KcProps & {
|
||||
kcContext: KcContextBase.LoginPageExpired;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LoginPageExpired = memo((props: LoginPageExpired) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
export const LoginPageExpired = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginPageExpired } & KcProps) => {
|
||||
const { url } = kcContext;
|
||||
|
||||
const { msg } = getMsg(kcContext);
|
||||
const { msg } = i18n;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayMessage={false}
|
||||
headerNode={msg("pageExpiredTitle")}
|
||||
formNode={
|
||||
@ -34,3 +43,5 @@ export const LoginPageExpired = memo(({ kcContext, ...props }: { kcContext: KcCo
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginPageExpired;
|
||||
|
97
src/lib/components/LoginPassword.tsx
Normal file
97
src/lib/components/LoginPassword.tsx
Normal file
@ -0,0 +1,97 @@
|
||||
import React, { useState, memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import { useConstCallback } from "powerhooks/useConstCallback";
|
||||
import type { FormEventHandler } from "react";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginPasswordProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginPassword;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LoginPassword = memo((props: LoginPasswordProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { realm, url, login } = kcContext;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const [isLoginButtonDisabled, setIsLoginButtonDisabled] = useState(false);
|
||||
|
||||
const onSubmit = useConstCallback<FormEventHandler<HTMLFormElement>>(e => {
|
||||
e.preventDefault();
|
||||
|
||||
setIsLoginButtonDisabled(true);
|
||||
|
||||
const formElement = e.target as HTMLFormElement;
|
||||
|
||||
formElement.submit();
|
||||
});
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("doLogIn")}
|
||||
formNode={
|
||||
<div id="kc-form">
|
||||
<div id="kc-form-wrapper">
|
||||
<form id="kc-form-login" onSubmit={onSubmit} action={url.loginAction} method="post">
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<hr />
|
||||
<label htmlFor="password" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("password")}
|
||||
</label>
|
||||
<input
|
||||
tabIndex={2}
|
||||
id="password"
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
name="password"
|
||||
type="password"
|
||||
autoFocus={true}
|
||||
autoComplete="on"
|
||||
defaultValue={login.password ?? ""}
|
||||
/>
|
||||
</div>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, kcProps.kcFormSettingClass)}>
|
||||
<div id="kc-form-options" />
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)}>
|
||||
{realm.resetPasswordAllowed && (
|
||||
<span>
|
||||
<a tabIndex={5} href={url.loginResetCredentialsUrl}>
|
||||
{msg("doForgotPassword")}
|
||||
</a>
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<input
|
||||
tabIndex={4}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
name="login"
|
||||
id="kc-login"
|
||||
type="submit"
|
||||
value={msgStr("doLogIn")}
|
||||
disabled={isLoginButtonDisabled}
|
||||
/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginPassword;
|
@ -1,28 +1,35 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginResetPasswordProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginResetPassword;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LoginResetPassword = memo((props: LoginResetPasswordProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
export const LoginResetPassword = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginResetPassword } & KcProps) => {
|
||||
const { url, realm, auth } = kcContext;
|
||||
|
||||
const { msg, msgStr } = getMsg(kcContext);
|
||||
|
||||
const { cx } = useCssAndCx();
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayMessage={false}
|
||||
headerNode={msg("emailForgotTitle")}
|
||||
formNode={
|
||||
<form id="kc-reset-password-form" className={cx(props.kcFormClass)} action={url.loginAction} method="post">
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="username" className={cx(props.kcLabelClass)}>
|
||||
<form id="kc-reset-password-form" className={clsx(kcProps.kcFormClass)} action={url.loginAction} method="post">
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="username" className={clsx(kcProps.kcLabelClass)}>
|
||||
{!realm.loginWithEmailAllowed
|
||||
? msg("username")
|
||||
: !realm.registrationEmailAsUsername
|
||||
@ -30,29 +37,34 @@ export const LoginResetPassword = memo(({ kcContext, ...props }: { kcContext: Kc
|
||||
: msg("email")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="username"
|
||||
name="username"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
autoFocus
|
||||
defaultValue={auth !== undefined && auth.showUsername ? auth.attemptedUsername : undefined}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className={cx(props.kcFormGroupClass, props.kcFormSettingClass)}>
|
||||
<div id="kc-form-options" className={cx(props.kcFormOptionsClass)}>
|
||||
<div className={cx(props.kcFormOptionsWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, kcProps.kcFormSettingClass)}>
|
||||
<div id="kc-form-options" className={clsx(kcProps.kcFormOptionsClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)}>
|
||||
<span>
|
||||
<a href={url.loginUrl}>{msg("backToLogin")}</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="kc-form-buttons" className={cx(props.kcFormButtonsClass)}>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
<input
|
||||
className={cx(props.kcButtonClass, props.kcButtonPrimaryClass, props.kcButtonBlockClass, props.kcButtonLargeClass)}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
type="submit"
|
||||
value={msgStr("doSubmit")}
|
||||
/>
|
||||
@ -64,3 +76,5 @@ export const LoginResetPassword = memo(({ kcContext, ...props }: { kcContext: Kc
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginResetPassword;
|
||||
|
@ -1,24 +1,31 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export const LoginUpdatePassword = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginUpdatePassword } & KcProps) => {
|
||||
const { cx } = useCssAndCx();
|
||||
export type LoginUpdatePasswordProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginUpdatePassword;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const { msg, msgStr } = getMsg(kcContext);
|
||||
const LoginUpdatePassword = memo((props: LoginUpdatePasswordProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const { url, messagesPerField, isAppInitiatedAction, username } = kcContext;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("updatePasswordTitle")}
|
||||
formNode={
|
||||
<form id="kc-passwd-update-form" className={cx(props.kcFormClass)} action={url.loginAction} method="post">
|
||||
<form id="kc-passwd-update-form" className={clsx(kcProps.kcFormClass)} action={url.loginAction} method="post">
|
||||
<input
|
||||
type="text"
|
||||
id="username"
|
||||
@ -30,44 +37,46 @@ export const LoginUpdatePassword = memo(({ kcContext, ...props }: { kcContext: K
|
||||
/>
|
||||
<input type="password" id="password" name="password" autoComplete="current-password" style={{ display: "none" }} />
|
||||
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("password", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="password-new" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("password", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="password-new" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("passwordNew")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="password"
|
||||
id="password-new"
|
||||
name="password-new"
|
||||
autoFocus
|
||||
autoComplete="new-password"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("password-confirm", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="password-confirm" className={cx(props.kcLabelClass)}>
|
||||
<div
|
||||
className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("password-confirm", kcProps.kcFormGroupErrorClass))}
|
||||
>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="password-confirm" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("passwordConfirm")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="password"
|
||||
id="password-confirm"
|
||||
name="password-confirm"
|
||||
autoComplete="new-password"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={cx(props.kcFormOptionsClass)}>
|
||||
<div className={cx(props.kcFormOptionsWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={clsx(kcProps.kcFormOptionsClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)}>
|
||||
{isAppInitiatedAction && (
|
||||
<div className="checkbox">
|
||||
<label>
|
||||
@ -79,16 +88,16 @@ export const LoginUpdatePassword = memo(({ kcContext, ...props }: { kcContext: K
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="kc-form-buttons" className={cx(props.kcFormButtonsClass)}>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
{isAppInitiatedAction ? (
|
||||
<>
|
||||
<input
|
||||
className={cx(props.kcButtonClass, props.kcButtonPrimaryClass, props.kcButtonLargeClass)}
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonPrimaryClass, kcProps.kcButtonLargeClass)}
|
||||
type="submit"
|
||||
defaultValue={msgStr("doSubmit")}
|
||||
/>
|
||||
<button
|
||||
className={cx(props.kcButtonClass, props.kcButtonDefaultClass, props.kcButtonLargeClass)}
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonDefaultClass, kcProps.kcButtonLargeClass)}
|
||||
type="submit"
|
||||
name="cancel-aia"
|
||||
value="true"
|
||||
@ -98,11 +107,11 @@ export const LoginUpdatePassword = memo(({ kcContext, ...props }: { kcContext: K
|
||||
</>
|
||||
) : (
|
||||
<input
|
||||
className={cx(
|
||||
props.kcButtonClass,
|
||||
props.kcButtonPrimaryClass,
|
||||
props.kcButtonBlockClass,
|
||||
props.kcButtonLargeClass,
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
type="submit"
|
||||
defaultValue={msgStr("doSubmit")}
|
||||
@ -115,3 +124,5 @@ export const LoginUpdatePassword = memo(({ kcContext, ...props }: { kcContext: K
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginUpdatePassword;
|
||||
|
@ -1,97 +1,110 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export const LoginUpdateProfile = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginUpdateProfile } & KcProps) => {
|
||||
const { cx } = useCssAndCx();
|
||||
export type LoginUpdateProfile = KcProps & {
|
||||
kcContext: KcContextBase.LoginUpdateProfile;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const { msg, msgStr } = getMsg(kcContext);
|
||||
const LoginUpdateProfile = memo((props: LoginUpdateProfile) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const { url, user, messagesPerField, isAppInitiatedAction } = kcContext;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("loginProfileTitle")}
|
||||
formNode={
|
||||
<form id="kc-update-profile-form" className={cx(props.kcFormClass)} action={url.loginAction} method="post">
|
||||
<form id="kc-update-profile-form" className={clsx(kcProps.kcFormClass)} action={url.loginAction} method="post">
|
||||
{user.editUsernameAllowed && (
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("username", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="username" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("username", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="username" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("username")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="username"
|
||||
name="username"
|
||||
defaultValue={user.username ?? ""}
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("email", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="email" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("email", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="email" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("email")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<input type="text" id="email" name="email" defaultValue={user.email ?? ""} className={cx(props.kcInputClass)} />
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input type="text" id="email" name="email" defaultValue={user.email ?? ""} className={clsx(kcProps.kcInputClass)} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("firstName", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="firstName" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("firstName", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="firstName" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("firstName")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="firstName"
|
||||
name="firstName"
|
||||
defaultValue={user.firstName ?? ""}
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("lastName", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="lastName" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("lastName", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="lastName" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("lastName")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<input type="text" id="lastName" name="lastName" defaultValue={user.lastName ?? ""} className={cx(props.kcInputClass)} />
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="lastName"
|
||||
name="lastName"
|
||||
defaultValue={user.lastName ?? ""}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={cx(props.kcFormOptionsClass)}>
|
||||
<div className={cx(props.kcFormOptionsWrapperClass)} />
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={clsx(kcProps.kcFormOptionsClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)} />
|
||||
</div>
|
||||
|
||||
<div id="kc-form-buttons" className={cx(props.kcFormButtonsClass)}>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
{isAppInitiatedAction ? (
|
||||
<>
|
||||
<input
|
||||
className={cx(props.kcButtonClass, props.kcButtonPrimaryClass, props.kcButtonLargeClass)}
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonPrimaryClass, kcProps.kcButtonLargeClass)}
|
||||
type="submit"
|
||||
defaultValue={msgStr("doSubmit")}
|
||||
/>
|
||||
<button
|
||||
className={cx(props.kcButtonClass, props.kcButtonDefaultClass, props.kcButtonLargeClass)}
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonDefaultClass, kcProps.kcButtonLargeClass)}
|
||||
type="submit"
|
||||
name="cancel-aia"
|
||||
value="true"
|
||||
@ -101,11 +114,11 @@ export const LoginUpdateProfile = memo(({ kcContext, ...props }: { kcContext: Kc
|
||||
</>
|
||||
) : (
|
||||
<input
|
||||
className={cx(
|
||||
props.kcButtonClass,
|
||||
props.kcButtonPrimaryClass,
|
||||
props.kcButtonBlockClass,
|
||||
props.kcButtonLargeClass,
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
type="submit"
|
||||
defaultValue={msgStr("doSubmit")}
|
||||
@ -118,3 +131,5 @@ export const LoginUpdateProfile = memo(({ kcContext, ...props }: { kcContext: Kc
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginUpdateProfile;
|
||||
|
169
src/lib/components/LoginUsername.tsx
Normal file
169
src/lib/components/LoginUsername.tsx
Normal file
@ -0,0 +1,169 @@
|
||||
import React, { useState, memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import { useConstCallback } from "powerhooks/useConstCallback";
|
||||
import type { FormEventHandler } from "react";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LoginUsernameProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginUsername;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LoginUsername = memo((props: LoginUsernameProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { social, realm, url, usernameHidden, login, registrationDisabled } = kcContext;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const [isLoginButtonDisabled, setIsLoginButtonDisabled] = useState(false);
|
||||
|
||||
const onSubmit = useConstCallback<FormEventHandler<HTMLFormElement>>(e => {
|
||||
e.preventDefault();
|
||||
|
||||
setIsLoginButtonDisabled(true);
|
||||
|
||||
const formElement = e.target as HTMLFormElement;
|
||||
|
||||
//NOTE: Even if we login with email Keycloak expect username and password in
|
||||
//the POST request.
|
||||
formElement.querySelector("input[name='email']")?.setAttribute("name", "username");
|
||||
|
||||
formElement.submit();
|
||||
});
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayInfo={social.displayInfo}
|
||||
displayWide={realm.password && social.providers !== undefined}
|
||||
headerNode={msg("doLogIn")}
|
||||
formNode={
|
||||
<div id="kc-form" className={clsx(realm.password && social.providers !== undefined && kcProps.kcContentWrapperClass)}>
|
||||
<div
|
||||
id="kc-form-wrapper"
|
||||
className={clsx(
|
||||
realm.password && social.providers && [kcProps.kcFormSocialAccountContentClass, kcProps.kcFormSocialAccountClass]
|
||||
)}
|
||||
>
|
||||
{realm.password && (
|
||||
<form id="kc-form-login" onSubmit={onSubmit} action={url.loginAction} method="post">
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
{!usernameHidden &&
|
||||
(() => {
|
||||
const label = !realm.loginWithEmailAllowed
|
||||
? "username"
|
||||
: realm.registrationEmailAsUsername
|
||||
? "email"
|
||||
: "usernameOrEmail";
|
||||
|
||||
const autoCompleteHelper: typeof label = label === "usernameOrEmail" ? "username" : label;
|
||||
|
||||
return (
|
||||
<>
|
||||
<label htmlFor={autoCompleteHelper} className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg(label)}
|
||||
</label>
|
||||
<input
|
||||
tabIndex={1}
|
||||
id={autoCompleteHelper}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
//NOTE: This is used by Google Chrome auto fill so we use it to tell
|
||||
//the browser how to pre fill the form but before submit we put it back
|
||||
//to username because it is what keycloak expects.
|
||||
name={autoCompleteHelper}
|
||||
defaultValue={login.username ?? ""}
|
||||
type="text"
|
||||
autoFocus={true}
|
||||
autoComplete="off"
|
||||
/>
|
||||
</>
|
||||
);
|
||||
})()}
|
||||
</div>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, kcProps.kcFormSettingClass)}>
|
||||
<div id="kc-form-options">
|
||||
{realm.rememberMe && !usernameHidden && (
|
||||
<div className="checkbox">
|
||||
<label>
|
||||
<input
|
||||
tabIndex={3}
|
||||
id="rememberMe"
|
||||
name="rememberMe"
|
||||
type="checkbox"
|
||||
{...(login.rememberMe
|
||||
? {
|
||||
"checked": true
|
||||
}
|
||||
: {})}
|
||||
/>
|
||||
{msg("rememberMe")}
|
||||
</label>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<input
|
||||
tabIndex={4}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
name="login"
|
||||
id="kc-login"
|
||||
type="submit"
|
||||
value={msgStr("doLogIn")}
|
||||
disabled={isLoginButtonDisabled}
|
||||
/>
|
||||
</div>
|
||||
</form>
|
||||
)}
|
||||
</div>
|
||||
{realm.password && social.providers !== undefined && (
|
||||
<div id="kc-social-providers" className={clsx(kcProps.kcFormSocialAccountContentClass, kcProps.kcFormSocialAccountClass)}>
|
||||
<ul
|
||||
className={clsx(
|
||||
kcProps.kcFormSocialAccountListClass,
|
||||
social.providers.length > 4 && kcProps.kcFormSocialAccountDoubleListClass
|
||||
)}
|
||||
>
|
||||
{social.providers.map(p => (
|
||||
<li key={p.providerId} className={clsx(kcProps.kcFormSocialAccountListLinkClass)}>
|
||||
<a href={p.loginUrl} id={`zocial-${p.alias}`} className={clsx("zocial", p.providerId)}>
|
||||
<span>{p.displayName}</span>
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
}
|
||||
infoNode={
|
||||
realm.password &&
|
||||
realm.registrationAllowed &&
|
||||
!registrationDisabled && (
|
||||
<div id="kc-registration">
|
||||
<span>
|
||||
{msg("noAccount")}
|
||||
<a tabIndex={6} href={url.registrationUrl}>
|
||||
{msg("doRegister")}
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginUsername;
|
@ -1,26 +1,37 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export const LoginVerifyEmail = memo(({ kcContext, ...props }: { kcContext: KcContextBase.LoginVerifyEmail } & KcProps) => {
|
||||
const { msg } = getMsg(kcContext);
|
||||
export type LoginVerifyEmailProps = KcProps & {
|
||||
kcContext: KcContextBase.LoginVerifyEmail;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const { url } = kcContext;
|
||||
const LoginVerifyEmail = memo((props: LoginVerifyEmailProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { msg } = i18n;
|
||||
|
||||
const { url, user } = kcContext;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayMessage={false}
|
||||
headerNode={msg("emailVerifyTitle")}
|
||||
formNode={
|
||||
<>
|
||||
<p className="instruction">{msg("emailVerifyInstruction1")}</p>
|
||||
<p className="instruction">{msg("emailVerifyInstruction1", user?.email)}</p>
|
||||
<p className="instruction">
|
||||
{msg("emailVerifyInstruction2")}
|
||||
<br />
|
||||
<a href={url.loginAction}>{msg("doClickHere")}</a>
|
||||
|
||||
{msg("emailVerifyInstruction3")}
|
||||
</p>
|
||||
</>
|
||||
@ -28,3 +39,5 @@ export const LoginVerifyEmail = memo(({ kcContext, ...props }: { kcContext: KcCo
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LoginVerifyEmail;
|
||||
|
69
src/lib/components/LogoutConfirm.tsx
Normal file
69
src/lib/components/LogoutConfirm.tsx
Normal file
@ -0,0 +1,69 @@
|
||||
import React, { memo } from "react";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type LogoutConfirmProps = KcProps & {
|
||||
kcContext: KcContextBase.LogoutConfirm;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const LogoutConfirm = memo((props: LogoutConfirmProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { url, client, logoutConfirm } = kcContext;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayMessage={false}
|
||||
headerNode={msg("logoutConfirmTitle")}
|
||||
formNode={
|
||||
<>
|
||||
<div id="kc-logout-confirm" className="content-area">
|
||||
<p className="instruction">{msg("logoutConfirmHeader")}</p>
|
||||
<form className="form-actions" action={url.logoutConfirmAction} method="POST">
|
||||
<input type="hidden" name="session_code" value={logoutConfirm.code} />
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div id="kc-form-options">
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)}></div>
|
||||
</div>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<input
|
||||
tabIndex={4}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
name="confirmLogout"
|
||||
id="kc-logout"
|
||||
type="submit"
|
||||
value={msgStr("doLogout")}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<div id="kc-info-message">
|
||||
{!logoutConfirm.skipLink && client.baseUrl && (
|
||||
<p>
|
||||
<a href={client.baseUrl} dangerouslySetInnerHTML={{ __html: msgStr("backToApplication") }} />
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default LogoutConfirm;
|
@ -1,69 +1,76 @@
|
||||
import { memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type RegisterProps = KcProps & {
|
||||
kcContext: KcContextBase.Register;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const Register = memo((props: RegisterProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
export const Register = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Register } & KcProps) => {
|
||||
const { url, messagesPerField, register, realm, passwordRequired, recaptchaRequired, recaptchaSiteKey } = kcContext;
|
||||
|
||||
const { msg, msgStr } = getMsg(kcContext);
|
||||
|
||||
const { cx } = useCssAndCx();
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("registerTitle")}
|
||||
formNode={
|
||||
<form id="kc-register-form" className={cx(props.kcFormClass)} action={url.registrationAction} method="post">
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("firstName", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="firstName" className={cx(props.kcLabelClass)}>
|
||||
<form id="kc-register-form" className={clsx(kcProps.kcFormClass)} action={url.registrationAction} method="post">
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("firstName", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="firstName" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("firstName")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="firstName"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
name="firstName"
|
||||
defaultValue={register.formData.firstName ?? ""}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("lastName", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="lastName" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("lastName", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="lastName" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("lastName")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="lastName"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
name="lastName"
|
||||
defaultValue={register.formData.lastName ?? ""}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("email", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="email" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("email", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="email" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("email")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="email"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
name="email"
|
||||
defaultValue={register.formData.email ?? ""}
|
||||
autoComplete="email"
|
||||
@ -71,17 +78,17 @@ export const Register = memo(({ kcContext, ...props }: { kcContext: KcContextBas
|
||||
</div>
|
||||
</div>
|
||||
{!realm.registrationEmailAsUsername && (
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("username", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="username" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("username", kcProps.kcFormGroupErrorClass))}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="username" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("username")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="text"
|
||||
id="username"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
name="username"
|
||||
defaultValue={register.formData.username ?? ""}
|
||||
autoComplete="username"
|
||||
@ -91,17 +98,19 @@ export const Register = memo(({ kcContext, ...props }: { kcContext: KcContextBas
|
||||
)}
|
||||
{passwordRequired && (
|
||||
<>
|
||||
<div className={cx(props.kcFormGroupClass, messagesPerField.printIfExists("password", props.kcFormGroupErrorClass))}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="password" className={cx(props.kcLabelClass)}>
|
||||
<div
|
||||
className={clsx(kcProps.kcFormGroupClass, messagesPerField.printIfExists("password", kcProps.kcFormGroupErrorClass))}
|
||||
>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="password" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("password")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input
|
||||
type="password"
|
||||
id="password"
|
||||
className={cx(props.kcInputClass)}
|
||||
className={clsx(kcProps.kcInputClass)}
|
||||
name="password"
|
||||
autoComplete="new-password"
|
||||
/>
|
||||
@ -109,41 +118,46 @@ export const Register = memo(({ kcContext, ...props }: { kcContext: KcContextBas
|
||||
</div>
|
||||
|
||||
<div
|
||||
className={cx(
|
||||
props.kcFormGroupClass,
|
||||
messagesPerField.printIfExists("password-confirm", props.kcFormGroupErrorClass),
|
||||
className={clsx(
|
||||
kcProps.kcFormGroupClass,
|
||||
messagesPerField.printIfExists("password-confirm", kcProps.kcFormGroupErrorClass)
|
||||
)}
|
||||
>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor="password-confirm" className={cx(props.kcLabelClass)}>
|
||||
<div className={clsx(kcProps.kcLabelWrapperClass)}>
|
||||
<label htmlFor="password-confirm" className={clsx(kcProps.kcLabelClass)}>
|
||||
{msg("passwordConfirm")}
|
||||
</label>
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<input type="password" id="password-confirm" className={cx(props.kcInputClass)} name="password-confirm" />
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<input type="password" id="password-confirm" className={clsx(kcProps.kcInputClass)} name="password-confirm" />
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
{recaptchaRequired && (
|
||||
<div className="form-group">
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<div className="g-recaptcha" data-size="compact" data-sitekey={recaptchaSiteKey}></div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={cx(props.kcFormOptionsClass)}>
|
||||
<div className={cx(props.kcFormOptionsWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={clsx(kcProps.kcFormOptionsClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)}>
|
||||
<span>
|
||||
<a href={url.loginUrl}>{msg("backToLogin")}</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="kc-form-buttons" className={cx(props.kcFormButtonsClass)}>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
<input
|
||||
className={cx(props.kcButtonClass, props.kcButtonPrimaryClass, props.kcButtonBlockClass, props.kcButtonLargeClass)}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
type="submit"
|
||||
value={msgStr("doRegister")}
|
||||
/>
|
||||
@ -154,3 +168,5 @@ export const Register = memo(({ kcContext, ...props }: { kcContext: KcContextBas
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default Register;
|
||||
|
@ -1,59 +1,61 @@
|
||||
import { useMemo, memo, useEffect, useState, Fragment } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { memo, useState } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase, Attribute } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import type { ReactComponent } from "../tools/ReactComponent";
|
||||
import { useCallbackFactory } from "powerhooks/useCallbackFactory";
|
||||
import { useFormValidationSlice } from "../useFormValidationSlice";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
import { UserProfileFormFields } from "./shared/UserProfileCommons";
|
||||
|
||||
export type RegisterUserProfileProps = KcProps & {
|
||||
kcContext: KcContextBase.RegisterUserProfile;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const RegisterUserProfile = memo((props: RegisterUserProfileProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
export const RegisterUserProfile = memo(({ kcContext, ...props_ }: { kcContext: KcContextBase.RegisterUserProfile } & KcProps) => {
|
||||
const { url, messagesPerField, recaptchaRequired, recaptchaSiteKey } = kcContext;
|
||||
|
||||
const { msg, msgStr } = getMsg(kcContext);
|
||||
|
||||
const { cx, css } = useCssAndCx();
|
||||
|
||||
const props = useMemo(
|
||||
() => ({
|
||||
...props_,
|
||||
"kcFormGroupClass": cx(props_.kcFormGroupClass, css({ "marginBottom": 20 })),
|
||||
}),
|
||||
[cx, css],
|
||||
);
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const [isFomSubmittable, setIsFomSubmittable] = useState(false);
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayMessage={messagesPerField.exists("global")}
|
||||
displayRequiredFields={true}
|
||||
doFetchDefaultThemeResources={true}
|
||||
headerNode={msg("registerTitle")}
|
||||
formNode={
|
||||
<form id="kc-register-form" className={cx(props.kcFormClass)} action={url.registrationAction} method="post">
|
||||
<UserProfileFormFields kcContext={kcContext} onIsFormSubmittableValueChange={setIsFomSubmittable} {...props} />
|
||||
<form id="kc-register-form" className={clsx(kcProps.kcFormClass)} action={url.registrationAction} method="post">
|
||||
<UserProfileFormFields kcContext={kcContext} onIsFormSubmittableValueChange={setIsFomSubmittable} i18n={i18n} {...kcProps} />
|
||||
{recaptchaRequired && (
|
||||
<div className="form-group">
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcInputWrapperClass)}>
|
||||
<div className="g-recaptcha" data-size="compact" data-sitekey={recaptchaSiteKey} />
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={cx(props.kcFormOptionsClass)}>
|
||||
<div className={cx(props.kcFormOptionsWrapperClass)}>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)} style={{ "marginBottom": 30 }}>
|
||||
<div id="kc-form-options" className={clsx(kcProps.kcFormOptionsClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)}>
|
||||
<span>
|
||||
<a href={url.loginUrl}>{msg("backToLogin")}</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="kc-form-buttons" className={cx(props.kcFormButtonsClass)}>
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
<input
|
||||
className={cx(props.kcButtonClass, props.kcButtonPrimaryClass, props.kcButtonBlockClass, props.kcButtonLargeClass)}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
type="submit"
|
||||
value={msgStr("doRegister")}
|
||||
disabled={!isFomSubmittable}
|
||||
@ -66,152 +68,4 @@ export const RegisterUserProfile = memo(({ kcContext, ...props_ }: { kcContext:
|
||||
);
|
||||
});
|
||||
|
||||
type UserProfileFormFieldsProps = { kcContext: KcContextBase.RegisterUserProfile } & KcProps &
|
||||
Partial<Record<"BeforeField" | "AfterField", ReactComponent<{ attribute: Attribute }>>> & {
|
||||
onIsFormSubmittableValueChange: (isFormSubmittable: boolean) => void;
|
||||
};
|
||||
|
||||
const UserProfileFormFields = memo(({ kcContext, onIsFormSubmittableValueChange, ...props }: UserProfileFormFieldsProps) => {
|
||||
const { cx, css } = useCssAndCx();
|
||||
|
||||
const { advancedMsg } = getMsg(kcContext);
|
||||
|
||||
const {
|
||||
formValidationState: { fieldStateByAttributeName, isFormSubmittable },
|
||||
formValidationReducer,
|
||||
attributesWithPassword,
|
||||
} = useFormValidationSlice({
|
||||
kcContext,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
onIsFormSubmittableValueChange(isFormSubmittable);
|
||||
}, [isFormSubmittable]);
|
||||
|
||||
const onChangeFactory = useCallbackFactory(
|
||||
(
|
||||
[name]: [string],
|
||||
[
|
||||
{
|
||||
target: { value },
|
||||
},
|
||||
]: [React.ChangeEvent<HTMLInputElement | HTMLSelectElement>],
|
||||
) =>
|
||||
formValidationReducer({
|
||||
"action": "update value",
|
||||
name,
|
||||
"newValue": value,
|
||||
}),
|
||||
);
|
||||
|
||||
const onBlurFactory = useCallbackFactory(([name]: [string]) =>
|
||||
formValidationReducer({
|
||||
"action": "focus lost",
|
||||
name,
|
||||
}),
|
||||
);
|
||||
|
||||
let currentGroup = "";
|
||||
|
||||
return (
|
||||
<>
|
||||
{attributesWithPassword.map((attribute, i) => {
|
||||
const { group = "", groupDisplayHeader = "", groupDisplayDescription = "" } = attribute;
|
||||
|
||||
const { value, displayableErrors } = fieldStateByAttributeName[attribute.name];
|
||||
|
||||
const formGroupClassName = cx(props.kcFormGroupClass, displayableErrors.length !== 0 && props.kcFormGroupErrorClass);
|
||||
|
||||
return (
|
||||
<Fragment key={i}>
|
||||
{group !== currentGroup && (currentGroup = group) !== "" && (
|
||||
<div className={formGroupClassName}>
|
||||
<div className={cx(props.kcContentWrapperClass)}>
|
||||
<label id={`header-${group}`} className={cx(props.kcFormGroupHeader)}>
|
||||
{advancedMsg(groupDisplayHeader) || currentGroup}
|
||||
</label>
|
||||
</div>
|
||||
{groupDisplayDescription !== "" && (
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label id={`description-${group}`} className={`${cx(props.kcLabelClass)}`}>
|
||||
{advancedMsg(groupDisplayDescription)}
|
||||
</label>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
<div className={formGroupClassName}>
|
||||
<div className={cx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor={attribute.name} className={cx(props.kcLabelClass)}>
|
||||
{advancedMsg(attribute.displayName ?? "")}
|
||||
</label>
|
||||
{attribute.required && <>*</>}
|
||||
</div>
|
||||
<div className={cx(props.kcInputWrapperClass)}>
|
||||
{(() => {
|
||||
const { options } = attribute.validators;
|
||||
|
||||
if (options !== undefined) {
|
||||
return (
|
||||
<select
|
||||
id={attribute.name}
|
||||
name={attribute.name}
|
||||
onChange={onChangeFactory(attribute.name)}
|
||||
onBlur={onBlurFactory(attribute.name)}
|
||||
value={value}
|
||||
>
|
||||
{options.options.map(option => (
|
||||
<option key={option} value={option}>
|
||||
{option}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<input
|
||||
type={(() => {
|
||||
switch (attribute.name) {
|
||||
case "password-confirm":
|
||||
case "password":
|
||||
return "password";
|
||||
default:
|
||||
return "text";
|
||||
}
|
||||
})()}
|
||||
id={attribute.name}
|
||||
name={attribute.name}
|
||||
value={value}
|
||||
onChange={onChangeFactory(attribute.name)}
|
||||
className={cx(props.kcInputClass)}
|
||||
aria-invalid={displayableErrors.length !== 0}
|
||||
disabled={attribute.readOnly}
|
||||
autoComplete={attribute.autocomplete}
|
||||
onBlur={onBlurFactory(attribute.name)}
|
||||
/>
|
||||
);
|
||||
})()}
|
||||
{displayableErrors.length !== 0 && (
|
||||
<span
|
||||
id={`input-error-${attribute.name}`}
|
||||
className={cx(
|
||||
props.kcInputErrorMessageClass,
|
||||
css({
|
||||
"position": displayableErrors.length === 1 ? "absolute" : undefined,
|
||||
"& > span": { "display": "block" },
|
||||
}),
|
||||
)}
|
||||
aria-live="polite"
|
||||
>
|
||||
{displayableErrors.map(({ errorMessage }) => errorMessage)}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</Fragment>
|
||||
);
|
||||
})}
|
||||
</>
|
||||
);
|
||||
});
|
||||
export default RegisterUserProfile;
|
||||
|
@ -1,15 +1,14 @@
|
||||
import { useReducer, useEffect, memo } from "react";
|
||||
import React, { useReducer, useEffect, memo } from "react";
|
||||
import type { ReactNode } from "react";
|
||||
import { getMsg, getCurrentKcLanguageTag, changeLocale, getTagLabel } from "../i18n";
|
||||
import type { KcLanguageTag } from "../i18n";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { assert } from "../tools/assert";
|
||||
import { useCallbackFactory } from "powerhooks/useCallbackFactory";
|
||||
import { headInsert } from "../tools/headInsert";
|
||||
import { pathJoin } from "../tools/pathJoin";
|
||||
import { pathJoin } from "../../bin/tools/pathJoin";
|
||||
import { useConstCallback } from "powerhooks/useConstCallback";
|
||||
import type { KcTemplateProps } from "./KcProps";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
|
||||
export type TemplateProps = {
|
||||
displayInfo?: boolean;
|
||||
@ -25,9 +24,9 @@ export type TemplateProps = {
|
||||
* to avoid pulling the default theme assets.
|
||||
*/
|
||||
doFetchDefaultThemeResources: boolean;
|
||||
} & { kcContext: KcContextBase } & KcTemplateProps;
|
||||
} & { kcContext: KcContextBase; i18n: I18n } & KcTemplateProps;
|
||||
|
||||
export const Template = memo((props: TemplateProps) => {
|
||||
const Template = memo((props: TemplateProps) => {
|
||||
const {
|
||||
displayInfo = false,
|
||||
displayMessage = true,
|
||||
@ -39,23 +38,13 @@ export const Template = memo((props: TemplateProps) => {
|
||||
formNode,
|
||||
infoNode = null,
|
||||
kcContext,
|
||||
doFetchDefaultThemeResources,
|
||||
i18n,
|
||||
doFetchDefaultThemeResources
|
||||
} = props;
|
||||
|
||||
const { cx } = useCssAndCx();
|
||||
const { msg, changeLocale, labelBySupportedLanguageTag, currentLanguageTag } = i18n;
|
||||
|
||||
useEffect(() => {
|
||||
console.log("Rendering this page with react using keycloakify");
|
||||
}, []);
|
||||
|
||||
const { msg } = getMsg(kcContext);
|
||||
|
||||
const onChangeLanguageClickFactory = useCallbackFactory(([kcLanguageTag]: [KcLanguageTag]) =>
|
||||
changeLocale({
|
||||
kcContext,
|
||||
kcLanguageTag,
|
||||
}),
|
||||
);
|
||||
const onChangeLanguageClickFactory = useCallbackFactory(([kcLanguageTag]: [string]) => changeLocale(kcLanguageTag));
|
||||
|
||||
const onTryAnotherWayClick = useConstCallback(() => (document.forms["kc-select-try-another-way-form" as never].submit(), false));
|
||||
|
||||
@ -77,16 +66,16 @@ export const Template = memo((props: TemplateProps) => {
|
||||
Promise.all(
|
||||
[
|
||||
...toArr(props.stylesCommon).map(relativePath => pathJoin(url.resourcesCommonPath, relativePath)),
|
||||
...toArr(props.styles).map(relativePath => pathJoin(url.resourcesPath, relativePath)),
|
||||
...toArr(props.styles).map(relativePath => pathJoin(url.resourcesPath, relativePath))
|
||||
]
|
||||
.reverse()
|
||||
.map(href =>
|
||||
headInsert({
|
||||
"type": "css",
|
||||
href,
|
||||
"position": "prepend",
|
||||
}),
|
||||
),
|
||||
"position": "prepend"
|
||||
})
|
||||
)
|
||||
).then(() => {
|
||||
if (isUnmounted) {
|
||||
return;
|
||||
@ -98,14 +87,14 @@ export const Template = memo((props: TemplateProps) => {
|
||||
toArr(props.scripts).forEach(relativePath =>
|
||||
headInsert({
|
||||
"type": "javascript",
|
||||
"src": pathJoin(url.resourcesPath, relativePath),
|
||||
}),
|
||||
"src": pathJoin(url.resourcesPath, relativePath)
|
||||
})
|
||||
);
|
||||
|
||||
if (props.kcHtmlClass !== undefined) {
|
||||
const htmlClassList = document.getElementsByTagName("html")[0].classList;
|
||||
|
||||
const tokens = cx(props.kcHtmlClass).split(" ");
|
||||
const tokens = clsx(props.kcHtmlClass).split(" ");
|
||||
|
||||
htmlClassList.add(...tokens);
|
||||
|
||||
@ -124,27 +113,27 @@ export const Template = memo((props: TemplateProps) => {
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={cx(props.kcLoginClass)}>
|
||||
<div id="kc-header" className={cx(props.kcHeaderClass)}>
|
||||
<div id="kc-header-wrapper" className={cx(props.kcHeaderWrapperClass)}>
|
||||
<div className={clsx(props.kcLoginClass)}>
|
||||
<div id="kc-header" className={clsx(props.kcHeaderClass)}>
|
||||
<div id="kc-header-wrapper" className={clsx(props.kcHeaderWrapperClass)}>
|
||||
{msg("loginTitleHtml", realm.displayNameHtml)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={cx(props.kcFormCardClass, displayWide && props.kcFormCardAccountClass)}>
|
||||
<header className={cx(props.kcFormHeaderClass)}>
|
||||
<div className={clsx(props.kcFormCardClass, displayWide && props.kcFormCardAccountClass)}>
|
||||
<header className={clsx(props.kcFormHeaderClass)}>
|
||||
{realm.internationalizationEnabled && (assert(locale !== undefined), true) && locale.supported.length > 1 && (
|
||||
<div id="kc-locale">
|
||||
<div id="kc-locale-wrapper" className={cx(props.kcLocaleWrapperClass)}>
|
||||
<div id="kc-locale-wrapper" className={clsx(props.kcLocaleWrapperClass)}>
|
||||
<div className="kc-dropdown" id="kc-locale-dropdown">
|
||||
<a href="#" id="kc-current-locale-link">
|
||||
{getTagLabel({ "kcLanguageTag": getCurrentKcLanguageTag(kcContext), kcContext })}
|
||||
{labelBySupportedLanguageTag[currentLanguageTag]}
|
||||
</a>
|
||||
<ul>
|
||||
{locale.supported.map(({ languageTag }) => (
|
||||
<li key={languageTag} className="kc-dropdown-item">
|
||||
<a href="#" onClick={onChangeLanguageClickFactory(languageTag)}>
|
||||
{getTagLabel({ "kcLanguageTag": languageTag, kcContext })}
|
||||
{labelBySupportedLanguageTag[languageTag]}
|
||||
</a>
|
||||
</li>
|
||||
))}
|
||||
@ -155,8 +144,8 @@ export const Template = memo((props: TemplateProps) => {
|
||||
)}
|
||||
{!(auth !== undefined && auth.showUsername && !auth.showResetCredentials) ? (
|
||||
displayRequiredFields ? (
|
||||
<div className={cx(props.kcContentWrapperClass)}>
|
||||
<div className={cx(props.kcLabelWrapperClass, "subtitle")}>
|
||||
<div className={clsx(props.kcContentWrapperClass)}>
|
||||
<div className={clsx(props.kcLabelWrapperClass, "subtitle")}>
|
||||
<span className="subtitle">
|
||||
<span className="required">*</span>
|
||||
{msg("requiredFields")}
|
||||
@ -170,20 +159,20 @@ export const Template = memo((props: TemplateProps) => {
|
||||
<h1 id="kc-page-title">{headerNode}</h1>
|
||||
)
|
||||
) : displayRequiredFields ? (
|
||||
<div className={cx(props.kcContentWrapperClass)}>
|
||||
<div className={cx(props.kcLabelWrapperClass, "subtitle")}>
|
||||
<div className={clsx(props.kcContentWrapperClass)}>
|
||||
<div className={clsx(props.kcLabelWrapperClass, "subtitle")}>
|
||||
<span className="subtitle">
|
||||
<span className="required">*</span> {msg("requiredFields")}
|
||||
</span>
|
||||
</div>
|
||||
<div className="col-md-10">
|
||||
{showUsernameNode}
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div className={clsx(props.kcFormGroupClass)}>
|
||||
<div id="kc-username">
|
||||
<label id="kc-attempted-username">{auth?.attemptedUsername}</label>
|
||||
<a id="reset-login" href={url.loginRestartFlowUrl}>
|
||||
<div className="kc-login-tooltip">
|
||||
<i className={cx(props.kcResetFlowIcon)}></i>
|
||||
<i className={clsx(props.kcResetFlowIcon)}></i>
|
||||
<span className="kc-tooltip-text">{msg("restartLoginTooltip")}</span>
|
||||
</div>
|
||||
</a>
|
||||
@ -194,12 +183,12 @@ export const Template = memo((props: TemplateProps) => {
|
||||
) : (
|
||||
<>
|
||||
{showUsernameNode}
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div className={clsx(props.kcFormGroupClass)}>
|
||||
<div id="kc-username">
|
||||
<label id="kc-attempted-username">{auth?.attemptedUsername}</label>
|
||||
<a id="reset-login" href={url.loginRestartFlowUrl}>
|
||||
<div className="kc-login-tooltip">
|
||||
<i className={cx(props.kcResetFlowIcon)}></i>
|
||||
<i className={clsx(props.kcResetFlowIcon)}></i>
|
||||
<span className="kc-tooltip-text">{msg("restartLoginTooltip")}</span>
|
||||
</div>
|
||||
</a>
|
||||
@ -212,15 +201,15 @@ export const Template = memo((props: TemplateProps) => {
|
||||
<div id="kc-content-wrapper">
|
||||
{/* App-initiated actions should not see warning messages about the need to complete the action during login. */}
|
||||
{displayMessage && message !== undefined && (message.type !== "warning" || !isAppInitiatedAction) && (
|
||||
<div className={cx("alert", `alert-${message.type}`)}>
|
||||
{message.type === "success" && <span className={cx(props.kcFeedbackSuccessIcon)}></span>}
|
||||
{message.type === "warning" && <span className={cx(props.kcFeedbackWarningIcon)}></span>}
|
||||
{message.type === "error" && <span className={cx(props.kcFeedbackErrorIcon)}></span>}
|
||||
{message.type === "info" && <span className={cx(props.kcFeedbackInfoIcon)}></span>}
|
||||
<div className={clsx("alert", `alert-${message.type}`)}>
|
||||
{message.type === "success" && <span className={clsx(props.kcFeedbackSuccessIcon)}></span>}
|
||||
{message.type === "warning" && <span className={clsx(props.kcFeedbackWarningIcon)}></span>}
|
||||
{message.type === "error" && <span className={clsx(props.kcFeedbackErrorIcon)}></span>}
|
||||
{message.type === "info" && <span className={clsx(props.kcFeedbackInfoIcon)}></span>}
|
||||
<span
|
||||
className="kc-feedback-text"
|
||||
dangerouslySetInnerHTML={{
|
||||
"__html": message.summary,
|
||||
"__html": message.summary
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
@ -231,10 +220,10 @@ export const Template = memo((props: TemplateProps) => {
|
||||
id="kc-select-try-another-way-form"
|
||||
action={url.loginAction}
|
||||
method="post"
|
||||
className={cx(displayWide && props.kcContentWrapperClass)}
|
||||
className={clsx(displayWide && props.kcContentWrapperClass)}
|
||||
>
|
||||
<div className={cx(displayWide && [props.kcFormSocialAccountContentClass, props.kcFormSocialAccountClass])}>
|
||||
<div className={cx(props.kcFormGroupClass)}>
|
||||
<div className={clsx(displayWide && [props.kcFormSocialAccountContentClass, props.kcFormSocialAccountClass])}>
|
||||
<div className={clsx(props.kcFormGroupClass)}>
|
||||
<input type="hidden" name="tryAnotherWay" value="on" />
|
||||
<a href="#" id="try-another-way" onClick={onTryAnotherWayClick}>
|
||||
{msg("doTryAnotherWay")}
|
||||
@ -244,8 +233,8 @@ export const Template = memo((props: TemplateProps) => {
|
||||
</form>
|
||||
)}
|
||||
{displayInfo && (
|
||||
<div id="kc-info" className={cx(props.kcSignUpClass)}>
|
||||
<div id="kc-info-wrapper" className={cx(props.kcInfoAreaWrapperClass)}>
|
||||
<div id="kc-info" className={clsx(props.kcSignUpClass)}>
|
||||
<div id="kc-info-wrapper" className={clsx(props.kcInfoAreaWrapperClass)}>
|
||||
{infoNode}
|
||||
</div>
|
||||
</div>
|
||||
@ -256,3 +245,5 @@ export const Template = memo((props: TemplateProps) => {
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
||||
export default Template;
|
||||
|
@ -1,55 +1,97 @@
|
||||
import { useReducer, useEffect, memo } from "react";
|
||||
import { Template } from "./Template";
|
||||
import React, { useEffect, memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { getMsg } from "../i18n";
|
||||
import { useCssAndCx } from "tss-react";
|
||||
import { kcMessages, getCurrentKcLanguageTag } from "../i18n";
|
||||
import type { KcLanguageTag } from "../i18n";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import { Evt } from "evt";
|
||||
import { useRerenderOnStateChange } from "evt/hooks";
|
||||
import { assert } from "tsafe/assert";
|
||||
import { fallbackLanguageTag } from "../i18n";
|
||||
import type { I18n } from "../i18n";
|
||||
import memoize from "memoizee";
|
||||
import { useConst } from "powerhooks/useConst";
|
||||
import { useConstCallback } from "powerhooks/useConstCallback";
|
||||
import { Markdown } from "../tools/Markdown";
|
||||
import type { Extends } from "tsafe";
|
||||
|
||||
export const evtTermMarkdown = Evt.create<string | undefined>(undefined);
|
||||
|
||||
export type KcContextLike = {
|
||||
pageId: KcContextBase["pageId"];
|
||||
locale?: {
|
||||
currentLanguageTag: string;
|
||||
};
|
||||
};
|
||||
|
||||
assert<Extends<KcContextBase, KcContextLike>>();
|
||||
|
||||
/** Allow to avoid bundling the terms and download it on demand*/
|
||||
export function useDownloadTerms(params: {
|
||||
kcContext: KcContextBase;
|
||||
downloadTermMarkdown: (params: { currentKcLanguageTag: KcLanguageTag }) => Promise<string>;
|
||||
kcContext: KcContextLike;
|
||||
downloadTermMarkdown: (params: { currentLanguageTag: string }) => Promise<string>;
|
||||
}) {
|
||||
const { kcContext, downloadTermMarkdown } = params;
|
||||
const { kcContext } = params;
|
||||
|
||||
const [, forceUpdate] = useReducer(x => x + 1, 0);
|
||||
const { downloadTermMarkdownMemoized } = (function useClosure() {
|
||||
const { downloadTermMarkdown } = params;
|
||||
|
||||
const downloadTermMarkdownConst = useConstCallback(downloadTermMarkdown);
|
||||
|
||||
const downloadTermMarkdownMemoized = useConst(() =>
|
||||
memoize((currentLanguageTag: string) => downloadTermMarkdownConst({ currentLanguageTag }), { "promise": true })
|
||||
);
|
||||
|
||||
return { downloadTermMarkdownMemoized };
|
||||
})();
|
||||
|
||||
useEffect(() => {
|
||||
const currentKcLanguageTag = getCurrentKcLanguageTag(kcContext);
|
||||
if (kcContext.pageId !== "terms.ftl") {
|
||||
return;
|
||||
}
|
||||
|
||||
downloadTermMarkdown({ currentKcLanguageTag }).then(thermMarkdown => {
|
||||
kcMessages[currentKcLanguageTag].termsText = thermMarkdown;
|
||||
forceUpdate();
|
||||
});
|
||||
downloadTermMarkdownMemoized(kcContext.locale?.currentLanguageTag ?? fallbackLanguageTag).then(
|
||||
thermMarkdown => (evtTermMarkdown.state = thermMarkdown)
|
||||
);
|
||||
}, []);
|
||||
}
|
||||
|
||||
export const Terms = memo(({ kcContext, ...props }: { kcContext: KcContextBase.Terms } & KcProps) => {
|
||||
const { msg, msgStr } = getMsg(kcContext);
|
||||
export type TermsProps = KcProps & {
|
||||
kcContext: KcContextBase.Terms;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const { cx } = useCssAndCx();
|
||||
const Terms = memo((props: TermsProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
useRerenderOnStateChange(evtTermMarkdown);
|
||||
|
||||
const { url } = kcContext;
|
||||
|
||||
if (evtTermMarkdown.state === undefined) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, ...props }}
|
||||
doFetchDefaultThemeResources={true}
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
displayMessage={false}
|
||||
headerNode={msg("termsTitle")}
|
||||
formNode={
|
||||
<>
|
||||
<div id="kc-terms-text">{msg("termsText")}</div>
|
||||
<div id="kc-terms-text">{evtTermMarkdown.state && <Markdown>{evtTermMarkdown.state}</Markdown>}</div>
|
||||
<form className="form-actions" action={url.loginAction} method="POST">
|
||||
<input
|
||||
className={cx(
|
||||
props.kcButtonClass,
|
||||
props.kcButtonClass,
|
||||
props.kcButtonClass,
|
||||
props.kcButtonPrimaryClass,
|
||||
props.kcButtonLargeClass,
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
name="accept"
|
||||
id="kc-accept"
|
||||
@ -57,7 +99,7 @@ export const Terms = memo(({ kcContext, ...props }: { kcContext: KcContextBase.T
|
||||
value={msgStr("doAccept")}
|
||||
/>
|
||||
<input
|
||||
className={cx(props.kcButtonClass, props.kcButtonDefaultClass, props.kcButtonLargeClass)}
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonDefaultClass, kcProps.kcButtonLargeClass)}
|
||||
name="cancel"
|
||||
id="kc-decline"
|
||||
type="submit"
|
||||
@ -70,3 +112,5 @@ export const Terms = memo(({ kcContext, ...props }: { kcContext: KcContextBase.T
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default Terms;
|
||||
|
78
src/lib/components/UpdateUserProfile.tsx
Normal file
78
src/lib/components/UpdateUserProfile.tsx
Normal file
@ -0,0 +1,78 @@
|
||||
import React, { useState, memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n } from "../i18n";
|
||||
import { UserProfileFormFields } from "./shared/UserProfileCommons";
|
||||
|
||||
export type UpdateUserProfileProps = KcProps & {
|
||||
kcContext: KcContextBase.UpdateUserProfile;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const UpdateUserProfile = memo((props: UpdateUserProfileProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const { url, isAppInitiatedAction } = kcContext;
|
||||
|
||||
const [isFomSubmittable, setIsFomSubmittable] = useState(false);
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("loginProfileTitle")}
|
||||
formNode={
|
||||
<form id="kc-update-profile-form" className={clsx(kcProps.kcFormClass)} action={url.loginAction} method="post">
|
||||
<UserProfileFormFields kcContext={kcContext} onIsFormSubmittableValueChange={setIsFomSubmittable} i18n={i18n} {...kcProps} />
|
||||
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
<div id="kc-form-options" className={clsx(kcProps.kcFormOptionsClass)}>
|
||||
<div className={clsx(kcProps.kcFormOptionsWrapperClass)}></div>
|
||||
</div>
|
||||
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
{isAppInitiatedAction ? (
|
||||
<>
|
||||
<input
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonPrimaryClass, kcProps.kcButtonLargeClass)}
|
||||
type="submit"
|
||||
value={msgStr("doSubmit")}
|
||||
/>
|
||||
<button
|
||||
className={clsx(kcProps.kcButtonClass, kcProps.kcButtonDefaultClass, kcProps.kcButtonLargeClass)}
|
||||
type="submit"
|
||||
name="cancel-aia"
|
||||
value="true"
|
||||
formNoValidate
|
||||
>
|
||||
{msg("doCancel")}
|
||||
</button>
|
||||
</>
|
||||
) : (
|
||||
<input
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
type="submit"
|
||||
defaultValue={msgStr("doSubmit")}
|
||||
disabled={!isFomSubmittable}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default UpdateUserProfile;
|
203
src/lib/components/WebauthnAuthenticate.tsx
Normal file
203
src/lib/components/WebauthnAuthenticate.tsx
Normal file
@ -0,0 +1,203 @@
|
||||
import React, { useRef, useState, memo } from "react";
|
||||
import DefaultTemplate from "./Template";
|
||||
import type { TemplateProps } from "./Template";
|
||||
import type { KcProps } from "./KcProps";
|
||||
import type { KcContextBase } from "../getKcContext/KcContextBase";
|
||||
import { clsx } from "../tools/clsx";
|
||||
import type { I18n, MessageKeyBase } from "../i18n";
|
||||
import { base64url } from "rfc4648";
|
||||
import { useConstCallback } from "powerhooks/useConstCallback";
|
||||
|
||||
export type WebauthnAuthenticateProps = KcProps & {
|
||||
kcContext: KcContextBase.WebauthnAuthenticate;
|
||||
i18n: I18n;
|
||||
doFetchDefaultThemeResources?: boolean;
|
||||
Template?: (props: TemplateProps) => JSX.Element | null;
|
||||
};
|
||||
|
||||
const WebauthnAuthenticate = memo((props: WebauthnAuthenticateProps) => {
|
||||
const { kcContext, i18n, doFetchDefaultThemeResources = true, Template = DefaultTemplate, ...kcProps } = props;
|
||||
|
||||
const { url } = kcContext;
|
||||
|
||||
const { msg, msgStr } = i18n;
|
||||
|
||||
const { authenticators, challenge, shouldDisplayAuthenticators, userVerification, rpId } = kcContext;
|
||||
const createTimeout = Number(kcContext.createTimeout);
|
||||
const isUserIdentified = kcContext.isUserIdentified == "true";
|
||||
|
||||
const webAuthnAuthenticate = useConstCallback(async () => {
|
||||
if (!isUserIdentified) {
|
||||
return;
|
||||
}
|
||||
const allowCredentials = authenticators.authenticators.map(
|
||||
authenticator =>
|
||||
({
|
||||
id: base64url.parse(authenticator.credentialId, { loose: true }),
|
||||
type: "public-key"
|
||||
} as PublicKeyCredentialDescriptor)
|
||||
);
|
||||
// Check if WebAuthn is supported by this browser
|
||||
if (!window.PublicKeyCredential) {
|
||||
setError(msgStr("webauthn-unsupported-browser-text"));
|
||||
submitForm();
|
||||
return;
|
||||
}
|
||||
|
||||
const publicKey: PublicKeyCredentialRequestOptions = {
|
||||
rpId,
|
||||
challenge: base64url.parse(challenge, { loose: true })
|
||||
};
|
||||
|
||||
if (createTimeout !== 0) {
|
||||
publicKey.timeout = createTimeout * 1000;
|
||||
}
|
||||
|
||||
if (allowCredentials.length) {
|
||||
publicKey.allowCredentials = allowCredentials;
|
||||
}
|
||||
|
||||
if (userVerification !== "not specified") {
|
||||
publicKey.userVerification = userVerification;
|
||||
}
|
||||
|
||||
try {
|
||||
const resultRaw = await navigator.credentials.get({ publicKey });
|
||||
if (!resultRaw || resultRaw.type != "public-key") return;
|
||||
const result = resultRaw as PublicKeyCredential;
|
||||
if (!("authenticatorData" in result.response)) return;
|
||||
const response = result.response as AuthenticatorAssertionResponse;
|
||||
const clientDataJSON = response.clientDataJSON;
|
||||
const authenticatorData = response.authenticatorData;
|
||||
const signature = response.signature;
|
||||
|
||||
setClientDataJSON(base64url.stringify(new Uint8Array(clientDataJSON), { pad: false }));
|
||||
setAuthenticatorData(base64url.stringify(new Uint8Array(authenticatorData), { pad: false }));
|
||||
setSignature(base64url.stringify(new Uint8Array(signature), { pad: false }));
|
||||
setCredentialId(result.id);
|
||||
setUserHandle(base64url.stringify(new Uint8Array(response.userHandle!), { pad: false }));
|
||||
submitForm();
|
||||
} catch (err) {
|
||||
setError(String(err));
|
||||
submitForm();
|
||||
}
|
||||
});
|
||||
|
||||
const webAuthForm = useRef<HTMLFormElement>(null);
|
||||
const submitForm = useConstCallback(() => {
|
||||
webAuthForm.current!.submit();
|
||||
});
|
||||
|
||||
const [clientDataJSON, setClientDataJSON] = useState("");
|
||||
const [authenticatorData, setAuthenticatorData] = useState("");
|
||||
const [signature, setSignature] = useState("");
|
||||
const [credentialId, setCredentialId] = useState("");
|
||||
const [userHandle, setUserHandle] = useState("");
|
||||
const [error, setError] = useState("");
|
||||
|
||||
return (
|
||||
<Template
|
||||
{...{ kcContext, i18n, doFetchDefaultThemeResources, ...kcProps }}
|
||||
headerNode={msg("webauthn-login-title")}
|
||||
formNode={
|
||||
<div id="kc-form-webauthn" className={clsx(kcProps.kcFormClass)}>
|
||||
<form id="webauth" action={url.loginAction} ref={webAuthForm} method="post">
|
||||
<input type="hidden" id="clientDataJSON" name="clientDataJSON" value={clientDataJSON} />
|
||||
<input type="hidden" id="authenticatorData" name="authenticatorData" value={authenticatorData} />
|
||||
<input type="hidden" id="signature" name="signature" value={signature} />
|
||||
<input type="hidden" id="credentialId" name="credentialId" value={credentialId} />
|
||||
<input type="hidden" id="userHandle" name="userHandle" value={userHandle} />
|
||||
<input type="hidden" id="error" name="error" value={error} />
|
||||
</form>
|
||||
<div className={clsx(kcProps.kcFormGroupClass)}>
|
||||
{authenticators &&
|
||||
(() => (
|
||||
<form id="authn_select" className={clsx(kcProps.kcFormClass)}>
|
||||
{authenticators.authenticators.map(authenticator => (
|
||||
<input
|
||||
type="hidden"
|
||||
name="authn_use_chk"
|
||||
value={authenticator.credentialId}
|
||||
key={authenticator.credentialId}
|
||||
/>
|
||||
))}
|
||||
</form>
|
||||
))()}
|
||||
{authenticators &&
|
||||
shouldDisplayAuthenticators &&
|
||||
(() => (
|
||||
<>
|
||||
{authenticators.authenticators.length > 1 && (
|
||||
<p className={clsx(kcProps.kcSelectAuthListItemTitle)}>{msg("webauthn-available-authenticators")}</p>
|
||||
)}
|
||||
<div className={clsx(kcProps.kcFormClass)}>
|
||||
{authenticators.authenticators.map(authenticator => (
|
||||
<div id="kc-webauthn-authenticator" className={clsx(kcProps.kcSelectAuthListItemClass)}>
|
||||
<div className={clsx(kcProps.kcSelectAuthListItemIconClass)}>
|
||||
<i
|
||||
className={clsx(
|
||||
kcProps[authenticator.transports.iconClass] ?? kcProps.kcWebAuthnDefaultIcon,
|
||||
kcProps.kcSelectAuthListItemIconPropertyClass
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
<div className={clsx(kcProps.kcSelectAuthListItemBodyClass)}>
|
||||
<div
|
||||
id="kc-webauthn-authenticator-label"
|
||||
className={clsx(kcProps.kcSelectAuthListItemHeadingClass)}
|
||||
>
|
||||
{authenticator.label}
|
||||
</div>
|
||||
|
||||
{authenticator.transports && authenticator.transports.displayNameProperties.length && (
|
||||
<div
|
||||
id="kc-webauthn-authenticator-transport"
|
||||
className={clsx(kcProps.kcSelectAuthListItemDescriptionClass)}
|
||||
>
|
||||
{authenticator.transports.displayNameProperties.map(
|
||||
(transport: MessageKeyBase, index: number) => (
|
||||
<>
|
||||
<span>{msg(transport)}</span>
|
||||
{index < authenticator.transports.displayNameProperties.length - 1 && (
|
||||
<span>{", "}</span>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className={clsx(kcProps.kcSelectAuthListItemDescriptionClass)}>
|
||||
<span id="kc-webauthn-authenticator-created-label">{msg("webauthn-createdAt-label")}</span>
|
||||
<span id="kc-webauthn-authenticator-created">{authenticator.createdAt}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className={clsx(kcProps.kcSelectAuthListItemFillClass)} />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</>
|
||||
))()}
|
||||
<div id="kc-form-buttons" className={clsx(kcProps.kcFormButtonsClass)}>
|
||||
<input
|
||||
id="authenticateWebAuthnButton"
|
||||
type="button"
|
||||
onClick={webAuthnAuthenticate}
|
||||
autoFocus={true}
|
||||
value={msgStr("webauthn-doAuthenticate")}
|
||||
className={clsx(
|
||||
kcProps.kcButtonClass,
|
||||
kcProps.kcButtonPrimaryClass,
|
||||
kcProps.kcButtonBlockClass,
|
||||
kcProps.kcButtonLargeClass
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
export default WebauthnAuthenticate;
|
173
src/lib/components/shared/UserProfileCommons.tsx
Normal file
173
src/lib/components/shared/UserProfileCommons.tsx
Normal file
@ -0,0 +1,173 @@
|
||||
import React, { memo, useEffect, Fragment } from "react";
|
||||
import type { KcProps } from "../KcProps";
|
||||
import type { Attribute } from "../../getKcContext/KcContextBase";
|
||||
import { clsx } from "../../tools/clsx";
|
||||
import type { ReactComponent } from "../../tools/ReactComponent";
|
||||
import { useCallbackFactory } from "powerhooks/useCallbackFactory";
|
||||
import { useFormValidationSlice } from "../../useFormValidationSlice";
|
||||
import type { I18n } from "../../i18n";
|
||||
import type { Param0 } from "tsafe/Param0";
|
||||
|
||||
export type UserProfileFormFieldsProps = {
|
||||
kcContext: Param0<typeof useFormValidationSlice>["kcContext"];
|
||||
i18n: I18n;
|
||||
} & KcProps &
|
||||
Partial<Record<"BeforeField" | "AfterField", ReactComponent<{ attribute: Attribute }>>> & {
|
||||
onIsFormSubmittableValueChange: (isFormSubmittable: boolean) => void;
|
||||
};
|
||||
|
||||
export const UserProfileFormFields = memo(
|
||||
({ kcContext, onIsFormSubmittableValueChange, i18n, BeforeField, AfterField, ...props }: UserProfileFormFieldsProps) => {
|
||||
const { advancedMsg } = i18n;
|
||||
|
||||
const {
|
||||
formValidationState: { fieldStateByAttributeName, isFormSubmittable },
|
||||
formValidationReducer,
|
||||
attributesWithPassword
|
||||
} = useFormValidationSlice({
|
||||
kcContext,
|
||||
i18n
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
onIsFormSubmittableValueChange(isFormSubmittable);
|
||||
}, [isFormSubmittable]);
|
||||
|
||||
const onChangeFactory = useCallbackFactory(
|
||||
(
|
||||
[name]: [string],
|
||||
[
|
||||
{
|
||||
target: { value }
|
||||
}
|
||||
]: [React.ChangeEvent<HTMLInputElement | HTMLSelectElement>]
|
||||
) =>
|
||||
formValidationReducer({
|
||||
"action": "update value",
|
||||
name,
|
||||
"newValue": value
|
||||
})
|
||||
);
|
||||
|
||||
const onBlurFactory = useCallbackFactory(([name]: [string]) =>
|
||||
formValidationReducer({
|
||||
"action": "focus lost",
|
||||
name
|
||||
})
|
||||
);
|
||||
|
||||
let currentGroup = "";
|
||||
|
||||
return (
|
||||
<>
|
||||
{attributesWithPassword.map((attribute, i) => {
|
||||
const { group = "", groupDisplayHeader = "", groupDisplayDescription = "" } = attribute;
|
||||
|
||||
const { value, displayableErrors } = fieldStateByAttributeName[attribute.name];
|
||||
|
||||
const formGroupClassName = clsx(props.kcFormGroupClass, displayableErrors.length !== 0 && props.kcFormGroupErrorClass);
|
||||
|
||||
return (
|
||||
<Fragment key={i}>
|
||||
{group !== currentGroup && (currentGroup = group) !== "" && (
|
||||
<div className={formGroupClassName}>
|
||||
<div className={clsx(props.kcContentWrapperClass)}>
|
||||
<label id={`header-${group}`} className={clsx(props.kcFormGroupHeader)}>
|
||||
{advancedMsg(groupDisplayHeader) || currentGroup}
|
||||
</label>
|
||||
</div>
|
||||
{groupDisplayDescription !== "" && (
|
||||
<div className={clsx(props.kcLabelWrapperClass)}>
|
||||
<label id={`description-${group}`} className={`${clsx(props.kcLabelClass)}`}>
|
||||
{advancedMsg(groupDisplayDescription)}
|
||||
</label>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{BeforeField && <BeforeField attribute={attribute} />}
|
||||
|
||||
<div className={formGroupClassName}>
|
||||
<div className={clsx(props.kcLabelWrapperClass)}>
|
||||
<label htmlFor={attribute.name} className={clsx(props.kcLabelClass)}>
|
||||
{advancedMsg(attribute.displayName ?? "")}
|
||||
</label>
|
||||
{attribute.required && <>*</>}
|
||||
</div>
|
||||
<div className={clsx(props.kcInputWrapperClass)}>
|
||||
{(() => {
|
||||
const { options } = attribute.validators;
|
||||
|
||||
if (options !== undefined) {
|
||||
return (
|
||||
<select
|
||||
id={attribute.name}
|
||||
name={attribute.name}
|
||||
onChange={onChangeFactory(attribute.name)}
|
||||
onBlur={onBlurFactory(attribute.name)}
|
||||
value={value}
|
||||
>
|
||||
{options.options.map(option => (
|
||||
<option key={option} value={option}>
|
||||
{option}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<input
|
||||
type={(() => {
|
||||
switch (attribute.name) {
|
||||
case "password-confirm":
|
||||
case "password":
|
||||
return "password";
|
||||
default:
|
||||
return "text";
|
||||
}
|
||||
})()}
|
||||
id={attribute.name}
|
||||
name={attribute.name}
|
||||
value={value}
|
||||
onChange={onChangeFactory(attribute.name)}
|
||||
className={clsx(props.kcInputClass)}
|
||||
aria-invalid={displayableErrors.length !== 0}
|
||||
disabled={attribute.readOnly}
|
||||
autoComplete={attribute.autocomplete}
|
||||
onBlur={onBlurFactory(attribute.name)}
|
||||
/>
|
||||
);
|
||||
})()}
|
||||
{displayableErrors.length !== 0 &&
|
||||
(() => {
|
||||
const divId = `input-error-${attribute.name}`;
|
||||
|
||||
return (
|
||||
<>
|
||||
<style>{`#${divId} > span: { display: block; }`}</style>
|
||||
<span
|
||||
id={divId}
|
||||
className={clsx(props.kcInputErrorMessageClass)}
|
||||
style={{
|
||||
"position": displayableErrors.length === 1 ? "absolute" : undefined
|
||||
}}
|
||||
aria-live="polite"
|
||||
>
|
||||
{displayableErrors.map(({ errorMessage }) => errorMessage)}
|
||||
</span>
|
||||
</>
|
||||
);
|
||||
})()}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{AfterField && <AfterField attribute={attribute} />}
|
||||
</Fragment>
|
||||
);
|
||||
})}
|
||||
</>
|
||||
);
|
||||
}
|
||||
);
|
@ -1,8 +1,8 @@
|
||||
import type { PageId } from "../../bin/build-keycloak-theme/generateFtl";
|
||||
import type { KcLanguageTag } from "../i18n";
|
||||
import type { PageId } from "../../bin/keycloakify/generateFtl";
|
||||
import { assert } from "tsafe/assert";
|
||||
import type { Equals } from "tsafe";
|
||||
import type { MessageKey } from "../i18n";
|
||||
import type { MessageKeyBase } from "../i18n";
|
||||
import type { KcTemplateClassKey } from "../components/KcProps";
|
||||
|
||||
type ExtractAfterStartingWith<Prefix extends string, StrEnum> = StrEnum extends `${Prefix}${infer U}` ? U : never;
|
||||
|
||||
@ -20,11 +20,28 @@ export type KcContextBase =
|
||||
| KcContextBase.LoginVerifyEmail
|
||||
| KcContextBase.Terms
|
||||
| KcContextBase.LoginOtp
|
||||
| KcContextBase.LoginUsername
|
||||
| KcContextBase.WebauthnAuthenticate
|
||||
| KcContextBase.LoginPassword
|
||||
| KcContextBase.LoginUpdatePassword
|
||||
| KcContextBase.LoginUpdateProfile
|
||||
| KcContextBase.LoginIdpLinkConfirm
|
||||
| KcContextBase.LoginIdpLinkEmail
|
||||
| KcContextBase.LoginPageExpired;
|
||||
| KcContextBase.LoginPageExpired
|
||||
| KcContextBase.LoginConfigTotp
|
||||
| KcContextBase.LogoutConfirm
|
||||
| KcContextBase.UpdateUserProfile
|
||||
| KcContextBase.IdpReviewUserProfile;
|
||||
|
||||
export type WebauthnAuthenticator = {
|
||||
credentialId: string;
|
||||
transports: {
|
||||
iconClass: KcTemplateClassKey;
|
||||
displayNameProperties: MessageKeyBase[];
|
||||
};
|
||||
label: string;
|
||||
createdAt: string;
|
||||
};
|
||||
|
||||
export declare namespace KcContextBase {
|
||||
export type Common = {
|
||||
@ -47,14 +64,14 @@ export declare namespace KcContextBase {
|
||||
supported: {
|
||||
url: string;
|
||||
label: string;
|
||||
languageTag: KcLanguageTag;
|
||||
languageTag: string;
|
||||
}[];
|
||||
currentLanguageTag: KcLanguageTag;
|
||||
currentLanguageTag: string;
|
||||
};
|
||||
auth?: {
|
||||
showUsername: boolean;
|
||||
showResetCredentials: boolean;
|
||||
showTryAnotherWayLink: boolean;
|
||||
showUsername?: boolean;
|
||||
showResetCredentials?: boolean;
|
||||
showTryAnotherWayLink?: boolean;
|
||||
attemptedUsername?: string;
|
||||
};
|
||||
scripts: string[];
|
||||
@ -152,7 +169,7 @@ export declare namespace KcContextBase {
|
||||
export type Info = Common & {
|
||||
pageId: "info.ftl";
|
||||
messageHeader?: string;
|
||||
requiredActions?: ExtractAfterStartingWith<"requiredAction.", MessageKey>[];
|
||||
requiredActions?: ExtractAfterStartingWith<"requiredAction.", MessageKeyBase>[];
|
||||
skipLink: boolean;
|
||||
pageRedirectUri?: string;
|
||||
actionUri?: string;
|
||||
@ -178,6 +195,10 @@ export declare namespace KcContextBase {
|
||||
|
||||
export type LoginVerifyEmail = Common & {
|
||||
pageId: "login-verify-email.ftl";
|
||||
//NOTE: Optional because maybe it wasn't defined in older keycloak versions.
|
||||
user?: {
|
||||
email: string;
|
||||
};
|
||||
};
|
||||
|
||||
export type Terms = Common & {
|
||||
@ -191,6 +212,77 @@ export declare namespace KcContextBase {
|
||||
};
|
||||
};
|
||||
|
||||
export type LoginUsername = Common & {
|
||||
pageId: "login-username.ftl";
|
||||
url: {
|
||||
loginResetCredentialsUrl: string;
|
||||
registrationUrl: string;
|
||||
};
|
||||
realm: {
|
||||
loginWithEmailAllowed: boolean;
|
||||
rememberMe: boolean;
|
||||
password: boolean;
|
||||
resetPasswordAllowed: boolean;
|
||||
registrationAllowed: boolean;
|
||||
};
|
||||
registrationDisabled: boolean;
|
||||
login: {
|
||||
username?: string;
|
||||
rememberMe?: boolean;
|
||||
};
|
||||
usernameHidden?: boolean;
|
||||
social: {
|
||||
displayInfo: boolean;
|
||||
providers?: {
|
||||
loginUrl: string;
|
||||
alias: string;
|
||||
providerId: string;
|
||||
displayName: string;
|
||||
}[];
|
||||
};
|
||||
};
|
||||
|
||||
export type LoginPassword = Common & {
|
||||
pageId: "login-password.ftl";
|
||||
url: {
|
||||
loginResetCredentialsUrl: string;
|
||||
registrationUrl: string;
|
||||
};
|
||||
realm: {
|
||||
resetPasswordAllowed: boolean;
|
||||
};
|
||||
auth?: {
|
||||
showUsername?: boolean;
|
||||
showResetCredentials?: boolean;
|
||||
showTryAnotherWayLink?: boolean;
|
||||
attemptedUsername?: string;
|
||||
};
|
||||
social: {
|
||||
displayInfo: boolean;
|
||||
};
|
||||
login: {
|
||||
password?: string;
|
||||
};
|
||||
};
|
||||
|
||||
export type WebauthnAuthenticate = Common & {
|
||||
pageId: "webauthn-authenticate.ftl";
|
||||
authenticators: {
|
||||
authenticators: WebauthnAuthenticator[];
|
||||
};
|
||||
challenge: string;
|
||||
// I hate this:
|
||||
userVerification: UserVerificationRequirement | "not specified";
|
||||
rpId: string;
|
||||
createTimeout: string;
|
||||
isUserIdentified: "true" | "false";
|
||||
shouldDisplayAuthenticators: boolean;
|
||||
social: {
|
||||
displayInfo: boolean;
|
||||
};
|
||||
login: {};
|
||||
};
|
||||
|
||||
export type LoginUpdatePassword = Common & {
|
||||
pageId: "login-update-password.ftl";
|
||||
username: string;
|
||||
@ -223,6 +315,65 @@ export declare namespace KcContextBase {
|
||||
export type LoginPageExpired = Common & {
|
||||
pageId: "login-page-expired.ftl";
|
||||
};
|
||||
|
||||
export type LoginConfigTotp = Common & {
|
||||
pageId: "login-config-totp.ftl";
|
||||
mode?: "qr" | "manual" | undefined | null;
|
||||
totp: {
|
||||
totpSecretEncoded: string;
|
||||
qrUrl: string;
|
||||
policy: {
|
||||
supportedApplications: string[];
|
||||
algorithm: "HmacSHA1" | "HmacSHA256" | "HmacSHA512";
|
||||
digits: number;
|
||||
lookAheadWindow: number;
|
||||
} & (
|
||||
| {
|
||||
type: "totp";
|
||||
period: number;
|
||||
}
|
||||
| {
|
||||
type: "hotp";
|
||||
initialCounter: number;
|
||||
}
|
||||
);
|
||||
totpSecretQrCode: string;
|
||||
manualUrl: string;
|
||||
totpSecret: string;
|
||||
otpCredentials: { id: string; userLabel: string }[];
|
||||
};
|
||||
};
|
||||
|
||||
export type LogoutConfirm = Common & {
|
||||
pageId: "logout-confirm.ftl";
|
||||
url: {
|
||||
logoutConfirmAction: string;
|
||||
};
|
||||
client: {
|
||||
baseUrl?: string;
|
||||
};
|
||||
logoutConfirm: {
|
||||
code: string;
|
||||
skipLink?: boolean;
|
||||
};
|
||||
};
|
||||
|
||||
export type UpdateUserProfile = Common & {
|
||||
pageId: "update-user-profile.ftl";
|
||||
profile: {
|
||||
attributes: Attribute[];
|
||||
attributesByName: Record<string, Attribute>;
|
||||
};
|
||||
};
|
||||
|
||||
export type IdpReviewUserProfile = Common & {
|
||||
pageId: "idp-review-user-profile.ftl";
|
||||
profile: {
|
||||
context: "IDP_REVIEW";
|
||||
attributes: Attribute[];
|
||||
attributesByName: Record<string, Attribute>;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
export type Attribute = {
|
||||
|
@ -7,9 +7,10 @@ import { exclude } from "tsafe/exclude";
|
||||
import { assert } from "tsafe/assert";
|
||||
import type { ExtendsKcContextBase } from "./getKcContextFromWindow";
|
||||
import { getKcContextFromWindow } from "./getKcContextFromWindow";
|
||||
import { pathJoin } from "../tools/pathJoin";
|
||||
import { pathJoin } from "../../bin/tools/pathJoin";
|
||||
import { pathBasename } from "../tools/pathBasename";
|
||||
import { resourcesCommonPath } from "./kcContextMocks/urlResourcesPath";
|
||||
import { mockTestingResourcesCommonPath } from "../../bin/mockTestingResourcesPath";
|
||||
import { symToStr } from "tsafe/symToStr";
|
||||
|
||||
export function getKcContext<KcContextExtended extends { pageId: string } = never>(params?: {
|
||||
mockPageId?: ExtendsKcContextBase<KcContextExtended>["pageId"];
|
||||
@ -17,9 +18,19 @@ export function getKcContext<KcContextExtended extends { pageId: string } = neve
|
||||
}): { kcContext: ExtendsKcContextBase<KcContextExtended> | undefined } {
|
||||
const { mockPageId, mockData } = params ?? {};
|
||||
|
||||
if (mockPageId !== undefined) {
|
||||
const realKcContext = getKcContextFromWindow<KcContextExtended>();
|
||||
|
||||
if (mockPageId !== undefined && realKcContext === undefined) {
|
||||
//TODO maybe trow if no mock fo custom page
|
||||
|
||||
console.log(
|
||||
[
|
||||
`%cKeycloakify: ${symToStr({ mockPageId })} set to ${mockPageId}.`,
|
||||
`If assets are missing make sure you have built your Keycloak theme at least once.`
|
||||
].join(" "),
|
||||
"background: red; color: yellow; font-size: medium"
|
||||
);
|
||||
|
||||
const kcContextDefaultMock = kcContextMocks.find(({ pageId }) => pageId === mockPageId);
|
||||
|
||||
const partialKcContextCustomMock = mockData?.find(({ pageId }) => pageId === mockPageId);
|
||||
@ -29,8 +40,8 @@ export function getKcContext<KcContextExtended extends { pageId: string } = neve
|
||||
[
|
||||
`WARNING: You declared the non build in page ${mockPageId} but you didn't `,
|
||||
`provide mock data needed to debug the page outside of Keycloak as you are trying to do now.`,
|
||||
`Please check the documentation of the getKcContext function`,
|
||||
].join("\n"),
|
||||
`Please check the documentation of the getKcContext function`
|
||||
].join("\n")
|
||||
);
|
||||
}
|
||||
|
||||
@ -38,17 +49,25 @@ export function getKcContext<KcContextExtended extends { pageId: string } = neve
|
||||
|
||||
deepAssign({
|
||||
"target": kcContext,
|
||||
"source": kcContextDefaultMock !== undefined ? kcContextDefaultMock : { "pageId": mockPageId, ...kcContextCommonMock },
|
||||
"source": kcContextDefaultMock !== undefined ? kcContextDefaultMock : { "pageId": mockPageId, ...kcContextCommonMock }
|
||||
});
|
||||
|
||||
if (partialKcContextCustomMock !== undefined) {
|
||||
deepAssign({
|
||||
"target": kcContext,
|
||||
"source": partialKcContextCustomMock,
|
||||
"source": partialKcContextCustomMock
|
||||
});
|
||||
|
||||
if (partialKcContextCustomMock.pageId === "register-user-profile.ftl") {
|
||||
assert(kcContextDefaultMock?.pageId === "register-user-profile.ftl");
|
||||
if (
|
||||
partialKcContextCustomMock.pageId === "register-user-profile.ftl" ||
|
||||
partialKcContextCustomMock.pageId === "update-user-profile.ftl" ||
|
||||
partialKcContextCustomMock.pageId === "idp-review-user-profile.ftl"
|
||||
) {
|
||||
assert(
|
||||
kcContextDefaultMock?.pageId === "register-user-profile.ftl" ||
|
||||
kcContextDefaultMock?.pageId === "update-user-profile.ftl" ||
|
||||
kcContextDefaultMock?.pageId === "idp-review-user-profile.ftl"
|
||||
);
|
||||
|
||||
const { attributes } = kcContextDefaultMock.profile;
|
||||
|
||||
@ -56,7 +75,7 @@ export function getKcContext<KcContextExtended extends { pageId: string } = neve
|
||||
id<KcContextBase.RegisterUserProfile>(kcContext).profile.attributesByName = {};
|
||||
|
||||
const partialAttributes = [
|
||||
...((partialKcContextCustomMock as DeepPartial<KcContextBase.RegisterUserProfile>).profile?.attributes ?? []),
|
||||
...((partialKcContextCustomMock as DeepPartial<KcContextBase.RegisterUserProfile>).profile?.attributes ?? [])
|
||||
].filter(exclude(undefined));
|
||||
|
||||
attributes.forEach(attribute => {
|
||||
@ -66,7 +85,7 @@ export function getKcContext<KcContextExtended extends { pageId: string } = neve
|
||||
|
||||
deepAssign({
|
||||
"target": augmentedAttribute,
|
||||
"source": attribute,
|
||||
"source": attribute
|
||||
});
|
||||
|
||||
if (partialAttribute !== undefined) {
|
||||
@ -74,7 +93,7 @@ export function getKcContext<KcContextExtended extends { pageId: string } = neve
|
||||
|
||||
deepAssign({
|
||||
"target": augmentedAttribute,
|
||||
"source": partialAttribute,
|
||||
"source": partialAttribute
|
||||
});
|
||||
}
|
||||
|
||||
@ -82,27 +101,31 @@ export function getKcContext<KcContextExtended extends { pageId: string } = neve
|
||||
id<KcContextBase.RegisterUserProfile>(kcContext).profile.attributesByName[augmentedAttribute.name] = augmentedAttribute;
|
||||
});
|
||||
|
||||
partialAttributes.forEach(partialAttribute => {
|
||||
const { name } = partialAttribute;
|
||||
partialAttributes
|
||||
.map(partialAttribute => ({ "validators": {}, ...partialAttribute }))
|
||||
.forEach(partialAttribute => {
|
||||
const { name } = partialAttribute;
|
||||
|
||||
assert(name !== undefined, "If you define a mock attribute it must have at least a name");
|
||||
assert(name !== undefined, "If you define a mock attribute it must have at least a name");
|
||||
|
||||
id<KcContextBase.RegisterUserProfile>(kcContext).profile.attributes.push(partialAttribute as any);
|
||||
id<KcContextBase.RegisterUserProfile>(kcContext).profile.attributesByName[name] = partialAttribute as any;
|
||||
});
|
||||
id<KcContextBase.RegisterUserProfile>(kcContext).profile.attributes.push(partialAttribute as any);
|
||||
id<KcContextBase.RegisterUserProfile>(kcContext).profile.attributesByName[name] = partialAttribute as any;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return { kcContext };
|
||||
}
|
||||
|
||||
const kcContext = getKcContextFromWindow<KcContextExtended>();
|
||||
|
||||
if (kcContext !== undefined) {
|
||||
const { url } = kcContext;
|
||||
|
||||
url.resourcesCommonPath = pathJoin(url.resourcesPath, pathBasename(resourcesCommonPath));
|
||||
if (realKcContext === undefined) {
|
||||
return { "kcContext": undefined };
|
||||
}
|
||||
|
||||
return { kcContext };
|
||||
{
|
||||
const { url } = realKcContext;
|
||||
|
||||
url.resourcesCommonPath = pathJoin(url.resourcesPath, pathBasename(mockTestingResourcesCommonPath));
|
||||
}
|
||||
|
||||
return { "kcContext": realKcContext };
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import type { KcContextBase } from "./KcContextBase";
|
||||
import type { AndByDiscriminatingKey } from "../tools/AndByDiscriminatingKey";
|
||||
import { ftlValuesGlobalName } from "../../bin/build-keycloak-theme/ftlValuesGlobalName";
|
||||
import { ftlValuesGlobalName } from "../../bin/keycloakify/ftlValuesGlobalName";
|
||||
|
||||
export type ExtendsKcContextBase<KcContextExtended extends { pageId: string }> = [KcContextExtended] extends [never]
|
||||
? KcContextBase
|
||||
|
@ -1,32 +1,126 @@
|
||||
import "minimal-polyfills/Object.fromEntries";
|
||||
import type { KcContextBase, Attribute } from "../KcContextBase";
|
||||
//NOTE: Aside because we want to be able to import them from node
|
||||
import { resourcesCommonPath, resourcesPath } from "./urlResourcesPath";
|
||||
import { mockTestingResourcesCommonPath, mockTestingResourcesPath } from "../../../bin/mockTestingResourcesPath";
|
||||
import { id } from "tsafe/id";
|
||||
import { pathJoin } from "../../tools/pathJoin";
|
||||
import { pathJoin } from "../../../bin/tools/pathJoin";
|
||||
|
||||
const PUBLIC_URL = process.env["PUBLIC_URL"] ?? "/";
|
||||
|
||||
const attributes: Attribute[] = [
|
||||
{
|
||||
"validators": {
|
||||
"username-prohibited-characters": {
|
||||
"ignore.empty.value": true
|
||||
},
|
||||
"up-username-has-value": {},
|
||||
"length": {
|
||||
"ignore.empty.value": true,
|
||||
"min": "3",
|
||||
"max": "255"
|
||||
},
|
||||
"up-duplicate-username": {},
|
||||
"up-username-mutation": {}
|
||||
},
|
||||
"displayName": "${username}",
|
||||
"annotations": {},
|
||||
"required": true,
|
||||
"groupAnnotations": {},
|
||||
"autocomplete": "username",
|
||||
"readOnly": false,
|
||||
"name": "username",
|
||||
"value": "xxxx"
|
||||
},
|
||||
{
|
||||
"validators": {
|
||||
"up-email-exists-as-username": {},
|
||||
"length": {
|
||||
"max": "255",
|
||||
"ignore.empty.value": true
|
||||
},
|
||||
"up-blank-attribute-value": {
|
||||
"error-message": "missingEmailMessage",
|
||||
"fail-on-null": false
|
||||
},
|
||||
"up-duplicate-email": {},
|
||||
"email": {
|
||||
"ignore.empty.value": true
|
||||
},
|
||||
"pattern": {
|
||||
"ignore.empty.value": true,
|
||||
"pattern": "gmail\\.com$"
|
||||
}
|
||||
},
|
||||
"displayName": "${email}",
|
||||
"annotations": {},
|
||||
"required": true,
|
||||
"groupAnnotations": {},
|
||||
"autocomplete": "email",
|
||||
"readOnly": false,
|
||||
"name": "email"
|
||||
},
|
||||
{
|
||||
"validators": {
|
||||
"length": {
|
||||
"max": "255",
|
||||
"ignore.empty.value": true
|
||||
},
|
||||
"person-name-prohibited-characters": {
|
||||
"ignore.empty.value": true
|
||||
},
|
||||
"up-immutable-attribute": {},
|
||||
"up-attribute-required-by-metadata-value": {}
|
||||
},
|
||||
"displayName": "${firstName}",
|
||||
"annotations": {},
|
||||
"required": true,
|
||||
"groupAnnotations": {},
|
||||
"readOnly": false,
|
||||
"name": "firstName"
|
||||
},
|
||||
{
|
||||
"validators": {
|
||||
"length": {
|
||||
"max": "255",
|
||||
"ignore.empty.value": true
|
||||
},
|
||||
"person-name-prohibited-characters": {
|
||||
"ignore.empty.value": true
|
||||
},
|
||||
"up-immutable-attribute": {},
|
||||
"up-attribute-required-by-metadata-value": {}
|
||||
},
|
||||
"displayName": "${lastName}",
|
||||
"annotations": {},
|
||||
"required": true,
|
||||
"groupAnnotations": {},
|
||||
"readOnly": false,
|
||||
"name": "lastName"
|
||||
}
|
||||
];
|
||||
|
||||
const attributesByName = Object.fromEntries(attributes.map(attribute => [attribute.name, attribute])) as any;
|
||||
|
||||
export const kcContextCommonMock: KcContextBase.Common = {
|
||||
"url": {
|
||||
"loginAction": "#",
|
||||
"resourcesPath": pathJoin(PUBLIC_URL, resourcesPath),
|
||||
"resourcesCommonPath": pathJoin(PUBLIC_URL, resourcesCommonPath),
|
||||
"resourcesPath": pathJoin(PUBLIC_URL, mockTestingResourcesPath),
|
||||
"resourcesCommonPath": pathJoin(PUBLIC_URL, mockTestingResourcesCommonPath),
|
||||
"loginRestartFlowUrl": "/auth/realms/myrealm/login-actions/restart?client_id=account&tab_id=HoAx28ja4xg",
|
||||
"loginUrl": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg",
|
||||
"loginUrl": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg"
|
||||
},
|
||||
"realm": {
|
||||
"name": "myrealm",
|
||||
"displayName": "myrealm",
|
||||
"displayNameHtml": "myrealm",
|
||||
"internationalizationEnabled": true,
|
||||
"registrationEmailAsUsername": false,
|
||||
"registrationEmailAsUsername": false
|
||||
},
|
||||
"messagesPerField": {
|
||||
"printIfExists": (...[, x]) => x,
|
||||
"existsError": () => true,
|
||||
"get": key => `Fake error for ${key}`,
|
||||
"exists": () => true,
|
||||
"exists": () => true
|
||||
},
|
||||
"locale": {
|
||||
"supported": [
|
||||
@ -34,117 +128,117 @@ export const kcContextCommonMock: KcContextBase.Common = {
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=de",
|
||||
"label": "Deutsch",
|
||||
"languageTag": "de",
|
||||
"languageTag": "de"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=no",
|
||||
"label": "Norsk",
|
||||
"languageTag": "no",
|
||||
"languageTag": "no"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ru",
|
||||
"label": "Đ ŃŃŃĐșĐžĐč",
|
||||
"languageTag": "ru",
|
||||
"languageTag": "ru"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=sv",
|
||||
"label": "Svenska",
|
||||
"languageTag": "sv",
|
||||
"languageTag": "sv"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=pt-BR",
|
||||
"label": "PortuguĂȘs (Brasil)",
|
||||
"languageTag": "pt-BR",
|
||||
"languageTag": "pt-BR"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=lt",
|
||||
"label": "LietuviĆł",
|
||||
"languageTag": "lt",
|
||||
"languageTag": "lt"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=en",
|
||||
"label": "English",
|
||||
"languageTag": "en",
|
||||
"languageTag": "en"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=it",
|
||||
"label": "Italiano",
|
||||
"languageTag": "it",
|
||||
"languageTag": "it"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=fr",
|
||||
"label": "Français",
|
||||
"languageTag": "fr",
|
||||
"languageTag": "fr"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=zh-CN",
|
||||
"label": "äžæçźäœ",
|
||||
"languageTag": "zh-CN",
|
||||
"languageTag": "zh-CN"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=es",
|
||||
"label": "Español",
|
||||
"languageTag": "es",
|
||||
"languageTag": "es"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=cs",
|
||||
"label": "ÄeĆĄtina",
|
||||
"languageTag": "cs",
|
||||
"languageTag": "cs"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ja",
|
||||
"label": "æ„æŹèȘ",
|
||||
"languageTag": "ja",
|
||||
"languageTag": "ja"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=sk",
|
||||
"label": "SlovenÄina",
|
||||
"languageTag": "sk",
|
||||
"languageTag": "sk"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=pl",
|
||||
"label": "Polski",
|
||||
"languageTag": "pl",
|
||||
"languageTag": "pl"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=ca",
|
||||
"label": "CatalĂ ",
|
||||
"languageTag": "ca",
|
||||
"languageTag": "ca"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=nl",
|
||||
"label": "Nederlands",
|
||||
"languageTag": "nl",
|
||||
"languageTag": "nl"
|
||||
},
|
||||
{
|
||||
"url": "/auth/realms/myrealm/login-actions/authenticate?client_id=account&tab_id=HoAx28ja4xg&execution=ee6c2834-46a4-4a20-a1b6-f6d6f6451b36&kc_locale=tr",
|
||||
"label": "TĂŒrkçe",
|
||||
"languageTag": "tr",
|
||||
},
|
||||
"languageTag": "tr"
|
||||
}
|
||||
/* spell-checker: enable */
|
||||
],
|
||||
"currentLanguageTag": "en",
|
||||
"currentLanguageTag": "en"
|
||||
},
|
||||
"auth": {
|
||||
"showUsername": false,
|
||||
"showResetCredentials": false,
|
||||
"showTryAnotherWayLink": false,
|
||||
"showTryAnotherWayLink": false
|
||||
},
|
||||
"client": {
|
||||
"clientId": "myApp",
|
||||
"clientId": "myApp"
|
||||
},
|
||||
"scripts": [],
|
||||
"message": {
|
||||
"type": "success",
|
||||
"summary": "This is a test message",
|
||||
"summary": "This is a test message"
|
||||
},
|
||||
"isAppInitiatedAction": false,
|
||||
"isAppInitiatedAction": false
|
||||
};
|
||||
|
||||
const loginUrl = {
|
||||
...kcContextCommonMock.url,
|
||||
"loginResetCredentialsUrl": "/auth/realms/myrealm/login-actions/reset-credentials?client_id=account&tab_id=HoAx28ja4xg",
|
||||
"registrationUrl": "/auth/realms/myrealm/login-actions/registration?client_id=account&tab_id=HoAx28ja4xg",
|
||||
"registrationUrl": "/auth/realms/myrealm/login-actions/registration?client_id=account&tab_id=HoAx28ja4xg"
|
||||
};
|
||||
|
||||
export const kcContextMocks: KcContextBase[] = [
|
||||
@ -158,17 +252,17 @@ export const kcContextMocks: KcContextBase[] = [
|
||||
"rememberMe": true,
|
||||
"password": true,
|
||||
"resetPasswordAllowed": true,
|
||||
"registrationAllowed": true,
|
||||
"registrationAllowed": true
|
||||
},
|
||||
"auth": kcContextCommonMock.auth!,
|
||||
"social": {
|
||||
"displayInfo": true,
|
||||
"displayInfo": true
|
||||
},
|
||||
"usernameEditDisabled": false,
|
||||
"login": {
|
||||
"rememberMe": false,
|
||||
"rememberMe": false
|
||||
},
|
||||
"registrationDisabled": false,
|
||||
"registrationDisabled": false
|
||||
}),
|
||||
...(() => {
|
||||
const registerCommon: KcContextBase.RegisterCommon = {
|
||||
@ -176,15 +270,15 @@ export const kcContextMocks: KcContextBase[] = [
|
||||
"url": {
|
||||
...loginUrl,
|
||||
"registrationAction":
|
||||
"http://localhost:8080/auth/realms/myrealm/login-actions/registration?session_code=gwZdUeO7pbYpFTRxiIxRg_QtzMbtFTKrNu6XW_f8asM&execution=12146ce0-b139-4bbd-b25b-0eccfee6577e&client_id=account&tab_id=uS8lYfebLa0",
|
||||
"http://localhost:8080/auth/realms/myrealm/login-actions/registration?session_code=gwZdUeO7pbYpFTRxiIxRg_QtzMbtFTKrNu6XW_f8asM&execution=12146ce0-b139-4bbd-b25b-0eccfee6577e&client_id=account&tab_id=uS8lYfebLa0"
|
||||
},
|
||||
"scripts": [],
|
||||
"isAppInitiatedAction": false,
|
||||
"passwordRequired": true,
|
||||
"recaptchaRequired": false,
|
||||
"social": {
|
||||
"displayInfo": true,
|
||||
},
|
||||
"displayInfo": true
|
||||
}
|
||||
};
|
||||
|
||||
return [
|
||||
@ -192,114 +286,18 @@ export const kcContextMocks: KcContextBase[] = [
|
||||
"pageId": "register.ftl",
|
||||
...registerCommon,
|
||||
"register": {
|
||||
"formData": {},
|
||||
},
|
||||
"formData": {}
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.RegisterUserProfile>({
|
||||
"pageId": "register-user-profile.ftl",
|
||||
...registerCommon,
|
||||
"profile": {
|
||||
"context": "REGISTRATION_PROFILE" as const,
|
||||
...(() => {
|
||||
const attributes: Attribute[] = [
|
||||
{
|
||||
"validators": {
|
||||
"username-prohibited-characters": {
|
||||
"ignore.empty.value": true,
|
||||
},
|
||||
"up-username-has-value": {},
|
||||
"length": {
|
||||
"ignore.empty.value": true,
|
||||
"min": "3",
|
||||
"max": "255",
|
||||
},
|
||||
"up-duplicate-username": {},
|
||||
"up-username-mutation": {},
|
||||
},
|
||||
"displayName": "${username}",
|
||||
"annotations": {},
|
||||
"required": true,
|
||||
"groupAnnotations": {},
|
||||
"autocomplete": "username",
|
||||
"readOnly": false,
|
||||
"name": "username",
|
||||
"value": "xxxx",
|
||||
},
|
||||
{
|
||||
"validators": {
|
||||
"up-email-exists-as-username": {},
|
||||
"length": {
|
||||
"max": "255",
|
||||
"ignore.empty.value": true,
|
||||
},
|
||||
"up-blank-attribute-value": {
|
||||
"error-message": "missingEmailMessage",
|
||||
"fail-on-null": false,
|
||||
},
|
||||
"up-duplicate-email": {},
|
||||
"email": {
|
||||
"ignore.empty.value": true,
|
||||
},
|
||||
"pattern": {
|
||||
"ignore.empty.value": true,
|
||||
"pattern": "gmail\\.com$",
|
||||
},
|
||||
},
|
||||
"displayName": "${email}",
|
||||
"annotations": {},
|
||||
"required": true,
|
||||
"groupAnnotations": {},
|
||||
"autocomplete": "email",
|
||||
"readOnly": false,
|
||||
"name": "email",
|
||||
},
|
||||
{
|
||||
"validators": {
|
||||
"length": {
|
||||
"max": "255",
|
||||
"ignore.empty.value": true,
|
||||
},
|
||||
"person-name-prohibited-characters": {
|
||||
"ignore.empty.value": true,
|
||||
},
|
||||
"up-immutable-attribute": {},
|
||||
"up-attribute-required-by-metadata-value": {},
|
||||
},
|
||||
"displayName": "${firstName}",
|
||||
"annotations": {},
|
||||
"required": true,
|
||||
"groupAnnotations": {},
|
||||
"readOnly": false,
|
||||
"name": "firstName",
|
||||
},
|
||||
{
|
||||
"validators": {
|
||||
"length": {
|
||||
"max": "255",
|
||||
"ignore.empty.value": true,
|
||||
},
|
||||
"person-name-prohibited-characters": {
|
||||
"ignore.empty.value": true,
|
||||
},
|
||||
"up-immutable-attribute": {},
|
||||
"up-attribute-required-by-metadata-value": {},
|
||||
},
|
||||
"displayName": "${lastName}",
|
||||
"annotations": {},
|
||||
"required": true,
|
||||
"groupAnnotations": {},
|
||||
"readOnly": false,
|
||||
"name": "lastName",
|
||||
},
|
||||
];
|
||||
|
||||
return {
|
||||
attributes,
|
||||
"attributesByName": Object.fromEntries(attributes.map(attribute => [attribute.name, attribute])) as any,
|
||||
} as any;
|
||||
})(),
|
||||
},
|
||||
}),
|
||||
attributes,
|
||||
attributesByName
|
||||
}
|
||||
})
|
||||
];
|
||||
})(),
|
||||
id<KcContextBase.Info>({
|
||||
@ -311,36 +309,39 @@ export const kcContextMocks: KcContextBase[] = [
|
||||
"actionUri": "#",
|
||||
"client": {
|
||||
"clientId": "myApp",
|
||||
"baseUrl": "#",
|
||||
},
|
||||
"baseUrl": "#"
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.Error>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "error.ftl",
|
||||
"client": {
|
||||
"clientId": "myApp",
|
||||
"baseUrl": "#",
|
||||
"baseUrl": "#"
|
||||
},
|
||||
"message": {
|
||||
"type": "error",
|
||||
"summary": "This is the error message",
|
||||
},
|
||||
"summary": "This is the error message"
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.LoginResetPassword>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "login-reset-password.ftl",
|
||||
"realm": {
|
||||
...kcContextCommonMock.realm,
|
||||
"loginWithEmailAllowed": false,
|
||||
},
|
||||
"loginWithEmailAllowed": false
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.LoginVerifyEmail>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "login-verify-email.ftl",
|
||||
"user": {
|
||||
"email": "john.doe@gmail.com"
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.Terms>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "terms.ftl",
|
||||
"pageId": "terms.ftl"
|
||||
}),
|
||||
id<KcContextBase.LoginOtp>({
|
||||
...kcContextCommonMock,
|
||||
@ -349,19 +350,74 @@ export const kcContextMocks: KcContextBase[] = [
|
||||
"userOtpCredentials": [
|
||||
{
|
||||
"id": "id1",
|
||||
"userLabel": "label1",
|
||||
"userLabel": "label1"
|
||||
},
|
||||
{
|
||||
"id": "id2",
|
||||
"userLabel": "label2",
|
||||
},
|
||||
],
|
||||
"userLabel": "label2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.LoginUsername>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "login-username.ftl",
|
||||
"url": loginUrl,
|
||||
"realm": {
|
||||
...kcContextCommonMock.realm,
|
||||
"loginWithEmailAllowed": true,
|
||||
"rememberMe": true,
|
||||
"password": true,
|
||||
"resetPasswordAllowed": true,
|
||||
"registrationAllowed": true
|
||||
},
|
||||
"social": {
|
||||
"displayInfo": true
|
||||
},
|
||||
"usernameHidden": false,
|
||||
"login": {
|
||||
"rememberMe": false
|
||||
},
|
||||
"registrationDisabled": false
|
||||
}),
|
||||
id<KcContextBase.LoginPassword>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "login-password.ftl",
|
||||
"url": loginUrl,
|
||||
"realm": {
|
||||
...kcContextCommonMock.realm,
|
||||
"resetPasswordAllowed": true
|
||||
},
|
||||
"social": {
|
||||
"displayInfo": false
|
||||
},
|
||||
"login": {}
|
||||
}),
|
||||
id<KcContextBase.WebauthnAuthenticate>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "webauthn-authenticate.ftl",
|
||||
"url": loginUrl,
|
||||
"authenticators": {
|
||||
"authenticators": []
|
||||
},
|
||||
"realm": {
|
||||
...kcContextCommonMock.realm
|
||||
},
|
||||
"challenge": "",
|
||||
"userVerification": "not specified",
|
||||
"rpId": "",
|
||||
"createTimeout": "0",
|
||||
"isUserIdentified": "false",
|
||||
"shouldDisplayAuthenticators": false,
|
||||
"social": {
|
||||
"displayInfo": false
|
||||
},
|
||||
"login": {}
|
||||
}),
|
||||
id<KcContextBase.LoginUpdatePassword>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "login-update-password.ftl",
|
||||
"username": "anUsername",
|
||||
"username": "anUsername"
|
||||
}),
|
||||
id<KcContextBase.LoginUpdateProfile>({
|
||||
...kcContextCommonMock,
|
||||
@ -371,20 +427,71 @@ export const kcContextMocks: KcContextBase[] = [
|
||||
"username": "anUsername",
|
||||
"email": "foo@example.com",
|
||||
"firstName": "aFirstName",
|
||||
"lastName": "aLastName",
|
||||
},
|
||||
"lastName": "aLastName"
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.LoginIdpLinkConfirm>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "login-idp-link-confirm.ftl",
|
||||
"idpAlias": "FranceConnect",
|
||||
"idpAlias": "FranceConnect"
|
||||
}),
|
||||
id<KcContextBase.LoginIdpLinkEmail>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "login-idp-link-email.ftl",
|
||||
"idpAlias": "FranceConnect",
|
||||
"brokerContext": {
|
||||
"username": "anUsername",
|
||||
},
|
||||
"username": "anUsername"
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.LoginConfigTotp>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "login-config-totp.ftl",
|
||||
totp: {
|
||||
totpSecretEncoded: "KVVF G2BY N4YX S6LB IUYT K2LH IFYE 4SBV",
|
||||
qrUrl: "#",
|
||||
totpSecretQrCode:
|
||||
"iVBORw0KGgoAAAANSUhEUgAAAPYAAAD2AQAAAADNaUdlAAACM0lEQVR4Xu3OIZJgOQwDUDFd2UxiurLAVnnbHw4YGDKtSiWOn4Gxf81//7r/+q8b4HfLGBZDK9d85NmNR+sB42sXvOYrN5P1DcgYYFTGfOlbzE8gzwy3euweGizw7cfdl34/GRhlkxjKNV+5AebPXPORX1JuB9x8ZfbyyD2y1krWAKsbMq1HnqQDaLfa77p4+MqvzEGSqvSAD/2IHW2yHaigR9tX3m8dDIYGcNf3f+gDpVBZbZU77zyJ6Rlcy+qoTMG887KAPD9hsh6a1Sv3gJUHGHUAxSMzj7zqDDe7Phmt2eG+8UsMxjRGm816MAO+8VMl1R1jGHOrZB/5Zo/WXAPgxixm9Mo96vDGrM1eOto8c4Ax4wF437mifOXlpiPzCnN7Y9l95NnEMxgMY9AAGA8fucH14Y1aVb6N/cqrmyh0BVht7k1e+bU8LK0Cg5vmVq9c5vHIjOfqxDIfeTraNVTwewa4wVe+SW5N+uP1qACeudUZbqGOfA6VZV750Noq2Xx3kpveV44ZelSV1V7KFHzkWyVrrlUwG0Pl9pWnoy3vsQoME6vKI69i5osVgwWzHT7zjmJtMcNUSVn1oYMd7ZodbgowZl45VG0uVuLPUr1yc79uaQBag/mqR34xhlWyHm1prplHboCWdZ4TeZjsK8+dI+jbz1C5hl65mcpgB5dhcj8+dGO+0Ko68+lD37JDD83dpDLzzK+TrQyaVwGj6pUboGV+7+AyN8An/pf84/7rv/4/1l4OCc/1BYMAAAAASUVORK5CYII=",
|
||||
manualUrl: "#",
|
||||
totpSecret: "G4nsI8lQagRMUchH8jEG",
|
||||
otpCredentials: [],
|
||||
policy: {
|
||||
supportedApplications: ["FreeOTP", "Google Authenticator"],
|
||||
algorithm: "HmacSHA1",
|
||||
digits: 6,
|
||||
lookAheadWindow: 1,
|
||||
type: "totp",
|
||||
period: 30
|
||||
}
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.LogoutConfirm>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "logout-confirm.ftl",
|
||||
"url": {
|
||||
...kcContextCommonMock.url,
|
||||
"logoutConfirmAction": "Continuer?"
|
||||
},
|
||||
"client": {
|
||||
"clientId": "myApp",
|
||||
"baseUrl": "#"
|
||||
},
|
||||
"logoutConfirm": { "code": "123", skipLink: false }
|
||||
}),
|
||||
id<KcContextBase.UpdateUserProfile>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "update-user-profile.ftl",
|
||||
"profile": {
|
||||
attributes,
|
||||
attributesByName
|
||||
}
|
||||
}),
|
||||
id<KcContextBase.IdpReviewUserProfile>({
|
||||
...kcContextCommonMock,
|
||||
"pageId": "idp-review-user-profile.ftl",
|
||||
"profile": {
|
||||
context: "IDP_REVIEW",
|
||||
attributes,
|
||||
attributesByName
|
||||
}
|
||||
})
|
||||
];
|
||||
|
@ -1,5 +0,0 @@
|
||||
import { pathJoin } from "../../tools/pathJoin";
|
||||
|
||||
export const subDirOfPublicDirBasename = "keycloak_static";
|
||||
export const resourcesPath = pathJoin(subDirOfPublicDirBasename, "resources");
|
||||
export const resourcesCommonPath = pathJoin(resourcesPath, "resources_common");
|
File diff suppressed because it is too large
Load Diff
@ -1,253 +0,0 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
export const kcMessages = {
|
||||
"ca": {
|
||||
"invalidPasswordHistoryMessage": "Contrasenya incorrecta: no pot ser igual a cap de les Ășltimes {0} contrasenyes.",
|
||||
"invalidPasswordMinDigitsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.",
|
||||
"invalidPasswordMinLengthMessage": "Contrasenya incorrecta: longitud mĂnima {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} lletres minĂșscules.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} carĂ cters especials.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} lletres majĂșscules.",
|
||||
"invalidPasswordNotUsernameMessage": "Contrasenya incorrecta: no pot ser igual al nom d'usuari.",
|
||||
"invalidPasswordRegexPatternMessage": "Contrasenya incorrecta: no compleix l'expressiĂł regular.",
|
||||
},
|
||||
"de": {
|
||||
"invalidPasswordMinLengthMessage": "UngĂŒltiges Passwort: muss mindestens {0} Zeichen beinhalten.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "UngĂŒltiges Passwort: muss mindestens {0} Kleinbuchstaben beinhalten.",
|
||||
"invalidPasswordMinDigitsMessage": "UngĂŒltiges Passwort: muss mindestens {0} Ziffern beinhalten.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "UngĂŒltiges Passwort: muss mindestens {0} GroĂbuchstaben beinhalten.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "UngĂŒltiges Passwort: muss mindestens {0} Sonderzeichen beinhalten.",
|
||||
"invalidPasswordNotUsernameMessage": "UngĂŒltiges Passwort: darf nicht identisch mit dem Benutzernamen sein.",
|
||||
"invalidPasswordRegexPatternMessage": "UngĂŒltiges Passwort: stimmt nicht mit Regex-Muster ĂŒberein.",
|
||||
"invalidPasswordHistoryMessage": "UngĂŒltiges Passwort: darf nicht identisch mit einem der letzten {0} Passwörter sein.",
|
||||
"invalidPasswordBlacklistedMessage": "UngĂŒltiges Passwort: Passwort ist zu bekannt und auf der schwarzen Liste.",
|
||||
"invalidPasswordGenericMessage": "UngĂŒltiges Passwort: neues Passwort erfĂŒllt die Passwort-Anforderungen nicht.",
|
||||
},
|
||||
"en": {
|
||||
"invalidPasswordMinLengthMessage": "Invalid password: minimum length {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Invalid password: must contain at least {0} lower case characters.",
|
||||
"invalidPasswordMinDigitsMessage": "Invalid password: must contain at least {0} numerical digits.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Invalid password: must contain at least {0} upper case characters.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Invalid password: must contain at least {0} special characters.",
|
||||
"invalidPasswordNotUsernameMessage": "Invalid password: must not be equal to the username.",
|
||||
"invalidPasswordRegexPatternMessage": "Invalid password: fails to match regex pattern(s).",
|
||||
"invalidPasswordHistoryMessage": "Invalid password: must not be equal to any of last {0} passwords.",
|
||||
"invalidPasswordBlacklistedMessage": "Invalid password: password is blacklisted.",
|
||||
"invalidPasswordGenericMessage": "Invalid password: new password does not match password policies.",
|
||||
"ldapErrorInvalidCustomFilter": 'Custom configured LDAP filter does not start with "(" or does not end with ")".',
|
||||
"ldapErrorConnectionTimeoutNotNumber": "Connection Timeout must be a number",
|
||||
"ldapErrorReadTimeoutNotNumber": "Read Timeout must be a number",
|
||||
"ldapErrorMissingClientId": "Client ID needs to be provided in config when Realm Roles Mapping is not used.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType":
|
||||
"Not possible to preserve group inheritance and use UID membership type together.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "Can not set write only when LDAP provider mode is not WRITABLE",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "Can not set write-only and read-only together",
|
||||
"ldapErrorCantEnableStartTlsAndConnectionPooling": "Can not enable both StartTLS and connection pooling.",
|
||||
"ldapErrorCantEnableUnsyncedAndImportOff": "Can not disable Importing users when LDAP provider mode is UNSYNCED",
|
||||
"ldapErrorMissingGroupsPathGroup": "Groups path group does not exist - please create the group on specified path first",
|
||||
"clientRedirectURIsFragmentError": "Redirect URIs must not contain an URI fragment",
|
||||
"clientRootURLFragmentError": "Root URL must not contain an URL fragment",
|
||||
"clientRootURLIllegalSchemeError": "Root URL uses an illegal scheme",
|
||||
"clientBaseURLIllegalSchemeError": "Base URL uses an illegal scheme",
|
||||
"clientRedirectURIsIllegalSchemeError": "A redirect URI uses an illegal scheme",
|
||||
"clientBaseURLInvalid": "Base URL is not a valid URL",
|
||||
"clientRootURLInvalid": "Root URL is not a valid URL",
|
||||
"clientRedirectURIsInvalid": "A redirect URI is not a valid URI",
|
||||
"pairwiseMalformedClientRedirectURI": "Client contained an invalid redirect URI.",
|
||||
"pairwiseClientRedirectURIsMissingHost": "Client redirect URIs must contain a valid host component.",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"Without a configured Sector Identifier URI, client redirect URIs must not contain multiple host components.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "Malformed Sector Identifier URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "Failed to get redirect URIs from the Sector Identifier URI.",
|
||||
"pairwiseRedirectURIsMismatch": "Client redirect URIs does not match redirect URIs fetched from the Sector Identifier URI.",
|
||||
},
|
||||
"es": {
|
||||
"invalidPasswordMinLengthMessage": "Contraseña incorrecta: longitud mĂnima {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Contraseña incorrecta: debe contener al menos {0} letras minĂșsculas.",
|
||||
"invalidPasswordMinDigitsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Contraseña incorrecta: debe contener al menos {0} letras mayĂșsculas.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres especiales.",
|
||||
"invalidPasswordNotUsernameMessage": "Contraseña incorrecta: no puede ser igual al nombre de usuario.",
|
||||
"invalidPasswordRegexPatternMessage": "Contraseña incorrecta: no cumple la expresión regular.",
|
||||
"invalidPasswordHistoryMessage": "Contraseña incorrecta: no puede ser igual a ninguna de las Ășltimas {0} contraseñas.",
|
||||
},
|
||||
"fr": {
|
||||
"invalidPasswordMinLengthMessage": "Mot de passe invalide : longueur minimale requise de {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Mot de passe invalide : doit contenir au moins {0} lettre(s) en minuscule.",
|
||||
"invalidPasswordMinDigitsMessage": "Mot de passe invalide : doit contenir au moins {0} chiffre(s).",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Mot de passe invalide : doit contenir au moins {0} lettre(s) en majuscule.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Mot de passe invalide : doit contenir au moins {0} caractÚre(s) spéciaux.",
|
||||
"invalidPasswordNotUsernameMessage": "Mot de passe invalide : ne doit pas ĂȘtre identique au nom d'utilisateur.",
|
||||
"invalidPasswordRegexPatternMessage": "Mot de passe invalide : ne valide pas l'expression rationnelle.",
|
||||
"invalidPasswordHistoryMessage": "Mot de passe invalide : ne doit pas ĂȘtre Ă©gal aux {0} derniers mot de passe.",
|
||||
},
|
||||
"it": {},
|
||||
"ja": {
|
||||
"invalidPasswordMinLengthMessage": "çĄćčăȘăăčăŻăŒă: æć°{0}ăźé·ăăćż
èŠă§ăă",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźć°æćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinDigitsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźæ°ćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźć€§æćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinSpecialCharsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźçčæźæćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordNotUsernameMessage": "çĄćčăȘăăčăŻăŒă: ăŠăŒă¶ăŒćăšćăăăčăŻăŒăăŻçŠæąăăăŠăăŸăă",
|
||||
"invalidPasswordRegexPatternMessage": "çĄćčăȘăăčăŻăŒă: æŁèŠèĄšçŸăăżăŒăłăšäžèŽăăŸăăă",
|
||||
"invalidPasswordHistoryMessage": "çĄćčăȘăăčăŻăŒă: æèżăź{0}ăăčăŻăŒăăźăăăăăšćăăăčăŻăŒăăŻçŠæąăăăŠăăŸăă",
|
||||
"invalidPasswordBlacklistedMessage": "çĄćčăȘăăčăŻăŒă: ăăčăŻăŒăăăă©ăăŻăȘăčăă«ć«ăŸăăŠăăŸăă",
|
||||
"invalidPasswordGenericMessage": "çĄćčăȘăăčăŻăŒă: æ°ăăăăčăŻăŒăăŻăăčăŻăŒăă»ăăȘă·ăŒăšäžèŽăăŸăăă",
|
||||
"ldapErrorInvalidCustomFilter": "LDAPăăŁă«ăżăŒăźă«ăčăżă èšćźăăă(ăăăéć§ăŸăăŻă)ăă§ç”äșăšăȘăŁăŠăăŸăăă",
|
||||
"ldapErrorConnectionTimeoutNotNumber": "æ„ç¶ăżă€ă ăąăŠăăŻæ°ćă§ăȘăăă°ăȘăăŸăă",
|
||||
"ldapErrorReadTimeoutNotNumber": "èȘăżćăăżă€ă ăąăŠăăŻæ°ćă§ăȘăăă°ăȘăăŸăă",
|
||||
"ldapErrorMissingClientId": "ăŹă«ă ăăŒă«ă»ăăăăłă°ăäœżçšăăȘăć ŽćăŻăăŻă©ă€ăąăłăIDăŻèšćźć
ă§æäŸăăăćż
èŠăăăăŸăă",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType":
|
||||
"ă°ă«ăŒăăźç¶æżăç¶æăăăăšăšăUIDăĄăłăăŒă·ăăă»ăżă€ăăäœżçšăăăăšăŻćæă«ă§ăăŸăăă",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "LDAPăăăă€ăăŒă»ăąăŒăăWRITABLEă§ăŻăȘăć ŽćăŻăwrite onlyăèšćźăăăăšăŻă§ăăŸăăă",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "write-onlyăšread-onlyăäžç·ă«èšćźăăăăšăŻă§ăăŸăăă",
|
||||
"ldapErrorCantEnableStartTlsAndConnectionPooling": "StartTLSăšæ„ç¶ăăŒăȘăłă°ăźäžĄæčăæćčă«ă§ăăŸăăă",
|
||||
"clientRedirectURIsFragmentError": "ăȘăă€ăŹăŻăURIă«URIăă©ă°ăĄăłăăć«ăăăăšăŻă§ăăŸăăă",
|
||||
"clientRootURLFragmentError": "ă«ăŒăURLă«URLăă©ă°ăĄăłăăć«ăăăăšăŻă§ăăŸăăă",
|
||||
"pairwiseMalformedClientRedirectURI": "ăŻă©ă€ăąăłăă«çĄćčăȘăȘăă€ăŹăŻăURIăć«ăŸăăŠăăŸăăă",
|
||||
"pairwiseClientRedirectURIsMissingHost": "ăŻă©ă€ăąăłăăźăȘăă€ăŹăŻăURIă«ăŻæćčăȘăăčăă»ăłăłăăŒăăłăăć«ăŸăăŠăăćż
èŠăăăăŸăă",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"èšćźăăăă»ăŹăŻăżăŒèć„ćURIăăȘăć ŽćăŻăăŻă©ă€ăąăłăăźăȘăă€ăŹăŻăURIăŻè€æ°ăźăăčăă»ăłăłăăŒăăłăăć«ăăăšăŻă§ăăŸăăă",
|
||||
"pairwiseMalformedSectorIdentifierURI": "äžæŁăȘă»ăŹăŻăżăŒèć„ćURIă§ăă",
|
||||
"pairwiseFailedToGetRedirectURIs": "ă»ăŻăżăŒèć„ćURIăăăȘăă€ăŹăŻăURIăććŸă§ăăŸăăă§ăăă",
|
||||
"pairwiseRedirectURIsMismatch": "ăŻă©ă€ăąăłăăźăȘăă€ăŹăŻăURIăŻăă»ăŻăżăŒèć„ćURIăăăă§ăăăăăăȘăă€ăŹăŻăURIăšäžèŽăăŸăăă",
|
||||
},
|
||||
"lt": {
|
||||
"invalidPasswordMinLengthMessage": "Per trumpas slaptaĆŸodis: maĆŸiausias ilgis {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} maĆŸÄ
jÄ
raidÄ.",
|
||||
"invalidPasswordMinDigitsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} skaitmenÄŻ.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} didĆŸiÄ
jÄ
raidÄ.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} specialĆł simbolÄŻ.",
|
||||
"invalidPasswordNotUsernameMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis negali sutapti su naudotojo vardu.",
|
||||
"invalidPasswordRegexPatternMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis netenkina regex taisyklÄs(iĆł).",
|
||||
"invalidPasswordHistoryMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis negali sutapti su prieĆĄ tai buvusiais {0} slaptaĆŸodĆŸiais.",
|
||||
"ldapErrorInvalidCustomFilter": 'Sukonfigƫruotas LDAP filtras neprasideda "(" ir nesibaigia ")" simboliais.',
|
||||
"ldapErrorMissingClientId": "Privaloma nurodyti kliento ID kai srities roliĆł susiejimas nÄra nenaudojamas.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "GrupiĆł paveldÄjimo ir UID narystÄs tipas kartu negali bĆ«ti naudojami.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "Negalima nustatyti raĆĄymo rÄĆŸimo kuomet LDAP teikÄjo rÄĆŸimas ne WRITABLE",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "Negalima nustatyti tik raĆĄyti ir tik skaityti kartu",
|
||||
"clientRedirectURIsFragmentError": "Nurodykite URI fragmentÄ
, kurio negali bƫti peradresuojamuose URI adresuose",
|
||||
"clientRootURLFragmentError": "Nurodykite URL fragmentÄ
, kurio negali bƫti ƥakniniame URL adrese",
|
||||
"pairwiseMalformedClientRedirectURI": "Klientas pateikÄ neteisingÄ
nukreipimo nuorodÄ
.",
|
||||
"pairwiseClientRedirectURIsMissingHost": "Kliento nukreipimo nuorodos privalo bƫti nurodytos su serverio vardo komponentu.",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"Kuomet nesukonfigĆ«ruotas sektoriaus identifikatoriaus URL, kliento nukreipimo nuorodos privalo talpinti ne daugiau kaip vienÄ
skirtingÄ
serverio vardo komponentÄ
.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "Neteisinga sektoriaus identifikatoriaus URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "Nepavyko gauti nukreipimo nuorodĆł iĆĄ sektoriaus identifikatoriaus URI.",
|
||||
"pairwiseRedirectURIsMismatch": "Kliento nukreipimo nuoroda neatitinka nukreipimo nuorodĆł iĆĄ sektoriaus identifikatoriaus URI.",
|
||||
},
|
||||
"nl": {
|
||||
"invalidPasswordMinLengthMessage": "Ongeldig wachtwoord: de minimale lengte is {0} karakters.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} kleine letters bevatten.",
|
||||
"invalidPasswordMinDigitsMessage": "Ongeldig wachtwoord: het moet minstens {0} getallen bevatten.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} hoofdletters bevatten.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} speciale karakters bevatten.",
|
||||
"invalidPasswordNotUsernameMessage": "Ongeldig wachtwoord: het mag niet overeenkomen met de gebruikersnaam.",
|
||||
"invalidPasswordRegexPatternMessage": "Ongeldig wachtwoord: het voldoet niet aan het door de beheerder ingestelde patroon.",
|
||||
"invalidPasswordHistoryMessage": "Ongeldig wachtwoord: het mag niet overeen komen met een van de laatste {0} wachtwoorden.",
|
||||
"invalidPasswordGenericMessage": "Ongeldig wachtwoord: het nieuwe wachtwoord voldoet niet aan het wachtwoordbeleid.",
|
||||
"ldapErrorInvalidCustomFilter": 'LDAP filter met aangepaste configuratie start niet met "(" of eindigt niet met ")".',
|
||||
"ldapErrorConnectionTimeoutNotNumber": "Verbindingstimeout moet een getal zijn",
|
||||
"ldapErrorReadTimeoutNotNumber": "Lees-timeout moet een getal zijn",
|
||||
"ldapErrorMissingClientId": "Client ID moet ingesteld zijn als Realm Roles Mapping niet gebruikt wordt.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "Kan groepsovererving niet behouden bij UID-lidmaatschapstype.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "Alleen-schrijven niet mogelijk als LDAP provider mode niet WRITABLE is",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "Alleen-schrijven en alleen-lezen mogen niet tegelijk ingesteld zijn",
|
||||
"clientRedirectURIsFragmentError": "Redirect URIs mogen geen URI fragment bevatten",
|
||||
"clientRootURLFragmentError": "Root URL mag geen URL fragment bevatten",
|
||||
"pairwiseMalformedClientRedirectURI": "Client heeft een ongeldige redirect URI.",
|
||||
"pairwiseClientRedirectURIsMissingHost": "Client redirect URIs moeten een geldige host-component bevatten.",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"Zonder een geconfigureerde Sector Identifier URI mogen client redirect URIs niet meerdere host componenten hebben.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "Onjuist notatie in Sector Identifier URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "Kon geen redirect URIs verkrijgen van de Sector Identifier URI.",
|
||||
"pairwiseRedirectURIsMismatch": "Client redirect URIs komen niet overeen met redict URIs ontvangen van de Sector Identifier URI.",
|
||||
},
|
||||
"no": {
|
||||
"invalidPasswordMinLengthMessage": "Ugyldig passord: minimum lengde {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Ugyldig passord: mÄ inneholde minst {0} smÄ bokstaver.",
|
||||
"invalidPasswordMinDigitsMessage": "Ugyldig passord: mÄ inneholde minst {0} sifre.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Ugyldig passord: mÄ inneholde minst {0} store bokstaver.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Ugyldig passord: mÄ inneholde minst {0} spesialtegn.",
|
||||
"invalidPasswordNotUsernameMessage": "Ugyldig passord: kan ikke vĂŠre likt brukernavn.",
|
||||
"invalidPasswordRegexPatternMessage": "Ugyldig passord: tilfredsstiller ikke kravene for passord-mĂžnster.",
|
||||
"invalidPasswordHistoryMessage": "Ugyldig passord: kan ikke vÊre likt noen av de {0} foregÄende passordene.",
|
||||
"ldapErrorInvalidCustomFilter": 'Tilpasset konfigurasjon av LDAP-filter starter ikke med "(" eller slutter ikke med ")".',
|
||||
"ldapErrorMissingClientId": "KlientID mÄ vÊre tilgjengelig i config nÄr sikkerhetsdomenerollemapping ikke brukes.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "Ikke mulig Ă„ bevare gruppearv og samtidig bruke UID medlemskapstype.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "Kan ikke sette write-only nÄr LDAP leverandÞr-modus ikke er WRITABLE",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "Kan ikke sette bÄde write-only og read-only",
|
||||
},
|
||||
"pl": {},
|
||||
"pt-BR": {
|
||||
"invalidPasswordMinLengthMessage": "Senha invĂĄlida: deve conter ao menos {0} caracteres.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Senha invĂĄlida: deve conter ao menos {0} caracteres minĂșsculos.",
|
||||
"invalidPasswordMinDigitsMessage": "Senha invålida: deve conter ao menos {0} digitos numéricos.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Senha invĂĄlida: deve conter ao menos {0} caracteres maiĂșsculos.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Senha invĂĄlida: deve conter ao menos {0} caracteres especiais.",
|
||||
"invalidPasswordNotUsernameMessage": "Senha invĂĄlida: nĂŁo deve ser igual ao nome de usuĂĄrio.",
|
||||
"invalidPasswordRegexPatternMessage": "Senha invålida: falha ao passar por padrÔes.",
|
||||
"invalidPasswordHistoryMessage": "Senha invĂĄlida: nĂŁo deve ser igual Ă s Ășltimas {0} senhas.",
|
||||
"ldapErrorInvalidCustomFilter": 'Filtro LDAP nĂŁo inicia com "(" ou nĂŁo termina com ")".',
|
||||
"ldapErrorMissingClientId": "ID do cliente precisa ser definido na configuração quando mapeamentos de Roles do Realm não é utilizado.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType":
|
||||
"NĂŁo Ă© possĂvel preservar herança de grupos e usar tipo de associação de UID ao mesmo tempo.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "NĂŁo Ă© possĂvel definir modo de somente escrita quando o provedor LDAP nĂŁo suporta escrita",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "NĂŁo Ă© possĂvel definir somente escrita e somente leitura ao mesmo tempo",
|
||||
"clientRedirectURIsFragmentError": "URIs de redirecionamento nĂŁo podem conter fragmentos",
|
||||
"clientRootURLFragmentError": "URL raiz nĂŁo pode conter fragmentos",
|
||||
},
|
||||
"ru": {
|
||||
"invalidPasswordMinLengthMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: ĐŽĐ»ĐžĐœĐ° паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶ĐœĐ° бŃŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ(а).",
|
||||
"invalidPasswordMinDigitsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžŃŃ(Ń).",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ(а) ĐČ ĐœĐžĐ¶ĐœĐ”ĐŒ ŃДгОŃŃŃĐ”.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ(а) ĐČ ĐČĐ”ŃŃ
ĐœĐ”ĐŒ ŃДгОŃŃŃĐ”.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃпДŃŃĐžĐŒĐČĐŸĐ»ĐŸĐČ(а).",
|
||||
"invalidPasswordNotUsernameMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐČпаЎаŃŃ Ń ĐžĐŒĐ”ĐœĐ”ĐŒ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃДлŃ.",
|
||||
"invalidPasswordRegexPatternMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ĐżŃĐŸŃДл ĐżŃĐŸĐČĐ”ŃĐșŃ ĐżĐŸ ŃДгŃĐ»ŃŃĐœĐŸĐŒŃ ĐČŃŃĐ°Đ¶Đ”ĐœĐžŃ.",
|
||||
"invalidPasswordHistoryMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐČпаЎаŃŃ Ń ĐżĐŸŃĐ»Đ”ĐŽĐœĐžĐŒ(Đž) {0} паŃĐŸĐ»Đ”ĐŒ(ŃĐŒĐž).",
|
||||
"invalidPasswordGenericMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: ĐœĐŸĐČŃĐč паŃĐŸĐ»Ń ĐœĐ” ŃĐŸĐŸŃĐČĐ”ŃŃŃĐČŃĐ”Ń ĐżŃаĐČĐžĐ»Đ°ĐŒ паŃĐŸĐ»Ń.",
|
||||
"ldapErrorInvalidCustomFilter": 'ĐĄĐșĐŸĐœŃОгŃŃĐžŃĐŸĐČĐ°ĐœĐœŃĐč ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃĐ”Đ»Đ”ĐŒ ŃОлŃŃŃ LDAP ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ĐœĐ°ŃĐžĐœĐ°ŃŃŃŃ Ń "(" ОлО заĐșĐ°ĐœŃĐžĐČаŃŃŃŃ ĐœĐ° ")".',
|
||||
"ldapErrorMissingClientId": "Client ID ĐŽĐŸĐ»Đ¶Đ”Đœ бŃŃŃ ĐœĐ°ŃŃŃĐŸĐ”Đœ ĐČ ĐșĐŸĐœŃОгŃŃаŃОО, Đ”ŃлО ĐœĐ” ĐžŃĐżĐŸĐ»ŃĐ·ŃĐ”ŃŃŃ ŃĐŸĐżĐŸŃŃаĐČĐ»Đ”ĐœĐžĐ” ŃĐŸĐ»Đ”Đč ĐČ realm.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "ĐĐ” ŃĐŽĐ°Đ»ĐŸŃŃ ŃĐœĐ°ŃĐ»Đ”ĐŽĐŸĐČаŃŃ ĐłŃŃĐżĐżŃ Đž ĐžŃĐżĐŸĐ»ŃĐ·ĐŸĐČаŃŃ ŃĐ»Đ”ĐœŃŃĐČĐŸ UID ŃОпа ĐČĐŒĐ”ŃŃĐ”.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": 'ĐĐ”ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ ŃŃŃĐ°ĐœĐŸĐČĐžŃŃ ŃĐ”Đ¶ĐžĐŒ "ŃĐŸĐ»ŃĐșĐŸ ĐœĐ° запОŃŃ", ĐșĐŸĐłĐŽĐ° LDAP ĐżŃĐŸĐČаĐčĐŽĐ”Ń ĐœĐ” ĐČ ŃĐ”Đ¶ĐžĐŒĐ” WRITABLE',
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": 'ĐĐ”ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ ĐŸĐŽĐœĐŸĐČŃĐ”ĐŒĐ”ĐœĐœĐŸ ŃŃŃĐ°ĐœĐŸĐČĐžŃŃ ŃĐ”Đ¶ĐžĐŒŃ "ŃĐŸĐ»ŃĐșĐŸ ĐœĐ° ŃŃĐ”ĐœĐžĐ”" Đž "ŃĐŸĐ»ŃĐșĐŸ ĐœĐ° запОŃŃ"',
|
||||
"clientRedirectURIsFragmentError": "URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ŃŃĐ°ĐłĐŒĐ”ĐœŃ URI",
|
||||
"clientRootURLFragmentError": "ĐĐŸŃĐœĐ”ĐČĐŸĐč URL ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ŃŃĐ°ĐłĐŒĐ”ĐœŃ URL ",
|
||||
"pairwiseMalformedClientRedirectURI": "ĐĐ»ĐžĐ”ĐœŃ ŃĐŸĐŽĐ”ŃĐ¶ĐžŃ ĐœĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ.",
|
||||
"pairwiseClientRedirectURIsMissingHost": "URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐșĐ»ĐžĐ”ĐœŃа ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ Ń
ĐŸŃŃа.",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"ĐДз ĐșĐŸĐœŃОгŃŃаŃОО ĐżĐŸ ŃаŃŃĐž ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа URI, URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐșĐ»ĐžĐ”ĐœŃа ĐœĐ” ĐŒĐŸĐ¶Đ”Ń ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ”ŃĐșĐŸĐ»ŃĐșĐŸ ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃĐŸĐČ Ń
ĐŸŃŃа.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "ĐŃĐșĐ°Đ¶Đ”ĐœĐœĐ°Ń ŃаŃŃŃ ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "ĐĐ” ŃĐŽĐ°Đ»ĐŸŃŃ ĐżĐŸĐ»ŃŃĐžŃŃ ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃŃ URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐžĐ· ŃаŃŃĐž ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа URI.",
|
||||
"pairwiseRedirectURIsMismatch": "ĐĐ»ĐžĐ”ĐœŃ URI пДŃДаЎŃĐ”ŃаŃОО ĐœĐ” ŃĐŸĐŸŃĐČĐ”ŃŃŃĐČŃĐ”Ń URI пДŃДаЎŃĐ”ŃаŃОО, ĐżĐŸĐ»ŃŃĐ”ĐœĐœĐŸĐč Оз ŃаŃŃĐž ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа URI.",
|
||||
},
|
||||
"zh-CN": {
|
||||
"invalidPasswordMinLengthMessage": "æ æçćŻç ïŒæçéżćșŠ {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "æ æçćŻç ïŒèłć°ć
ć« {0} ć°ććæŻ",
|
||||
"invalidPasswordMinDigitsMessage": "æ æçćŻç ïŒèłć°ć
ć« {0} äžȘæ°ć",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "æ æçćŻç ïŒæçéżćșŠ {0} 性ććæŻ",
|
||||
"invalidPasswordMinSpecialCharsMessage": "æ æçćŻç ïŒæçéżćșŠ {0} çčæźć珊",
|
||||
"invalidPasswordNotUsernameMessage": "æ æçćŻç ïŒ äžćŻä»„äžçšæ·ćçžć",
|
||||
"invalidPasswordRegexPatternMessage": "æ æçćŻç ïŒ æ æłäžæŁćèĄšèŸŸćŒćčé
",
|
||||
"invalidPasswordHistoryMessage": "æ æçćŻç ïŒäžèœäžæćäœżçšç {0} äžȘćŻç çžć",
|
||||
"ldapErrorInvalidCustomFilter": 'ćźć¶ç LDAPèżæ»€ćšäžæŻä»„ "(" ćŒć€Žæä»„ ")"ç»ć°Ÿ.',
|
||||
"ldapErrorConnectionTimeoutNotNumber": "Connection Timeout ćż
饻æŻäžȘæ°ć",
|
||||
"ldapErrorMissingClientId": "ćœćè§èČæ ć°æȘćŻçšæ¶ïŒćźąæ·ç«Ż ID éèŠæćźă",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "æ æłćšäœżçšUIDæćç±»ćçćæ¶ç»Žæ€ç»ç»§æżć±æ§ă",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "ćœLDAPæäŸæčäžæŻćŻćæšĄćŒæ¶ïŒæ æłèźŸçœźćȘć",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "æ æłćæ¶èźŸçœźćȘèŻ»ććȘć",
|
||||
"clientRedirectURIsFragmentError": "éćźćURLäžćșć
ć«URIçæź”",
|
||||
"clientRootURLFragmentError": "æ čURL äžćșć
ć« URL çæź”",
|
||||
"pairwiseMalformedClientRedirectURI": "ćźąæ·ç«Żć
ć«äžäžȘæ æçéćźćURL",
|
||||
"pairwiseClientRedirectURIsMissingHost": "ćźąæ·ç«ŻéćźćURLéèŠæäžäžȘææçäž»æș",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"Without a configured Sector Identifier URI, client redirect URIs must not contain multiple host components.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "Malformed Sector Identifier URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "æ æłä»æćĄćšè·ćŸéćźćURL",
|
||||
"pairwiseRedirectURIsMismatch": "ćźąæ·ç«ŻçéćźćURIäžæćĄćšç«Żè·ćçURIé
çœźäžćčé
ă",
|
||||
},
|
||||
};
|
||||
/* spell-checker: enable */
|
@ -1,853 +0,0 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
export const kcMessages = {
|
||||
"ca": {
|
||||
"emailVerificationSubject": "VerificaciĂł d'email",
|
||||
"emailVerificationBody":
|
||||
"AlgĂș ha creat un compte de {2} amb aquesta adreça de correu electrĂČnic. Si has estat tu, fes clic a l'enllaç segĂŒent per verificar la teva adreça de correu electrĂČnic.\n\n{0}\n\nAquest enllaç expirarĂ en {1} minuts.\n\nSi tu no has creat aquest compte, simplement ignora aquest missatge.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>AlgĂș ha creat un compte de {2} amb aquesta adreça de correu electrĂČnic. Si has estat tu, fes clic a l\'enllaç segĂŒent per verificar la teva adreça de correu electrĂČnic.</p><p><a href="{0}">{0}</a></p><p> Aquest enllaç expirarĂ en {1} minuts.</p><p> Si tu no has creat aquest compte, simplement ignora aquest missatge.</p>',
|
||||
"passwordResetSubject": "Reinicia contrasenya",
|
||||
"passwordResetBody":
|
||||
"AlgĂș ha demanat de canviar les credencials del teu compte de {2}. Si has estat tu, fes clic a l'enllaç segĂŒent per a reiniciar-les.\n\n{0}\n\nAquest enllaç expirarĂ en {1} minuts.\n\nSi no vols reiniciar les teves credencials, simplement ignora aquest missatge i no es realitzarĂ cap canvi.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>AlgĂș ha demanat de canviar les credencials del teu compte de {2}. Si has estat tu, fes clic a l\'enllaç segĂŒent per a reiniciar-les.</p><p><a href="{0}">{0}</a></p><p>Aquest enllaç expirarĂ en {1} minuts.</p><p>Si no vols reiniciar les teves credencials, simplement ignora aquest missatge i no es realitzarĂ cap canvi.</p>',
|
||||
"executeActionsSubject": "Actualitza el teu compte",
|
||||
"executeActionsBody":
|
||||
"L'administrador ha sol·licitat que actualitzis el teu compte de {2}. Fes clic a l'enllaç inferior per iniciar aquest procĂ©s.\n\n{0}\n\nAquest enllaç expirarĂ en {1} minutes.\n\nSi no estĂ s al tant que l'administrador hagi sol·licitat aixĂČ, simplement ignora aquest missatge i no es realitzarĂ cap canvi.",
|
||||
"executeActionsBodyHtml":
|
||||
"<p>L'administrador ha sol·licitat que actualitzis el teu compte de {2}. Fes clic a l'enllaç inferior per iniciar aquest procĂ©s.</p><p><a href=\"{0}\">{0}</a></p><p>Aquest enllaç expirarĂ en {1} minutes.</p><p>Si no estĂ s al tant que l'administrador hagi sol·licitat aixĂČ, simplement ignora aquest missatge i no es realitzarĂ cap canvi.</p>",
|
||||
"eventLoginErrorSubject": "Fallada en l'inici de sessiĂł",
|
||||
"eventLoginErrorBody":
|
||||
"S'ha detectat un intent d'accés fallit al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l'administrador.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>S'ha detectat un intent d'accés fallit al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l'administrador.</p>",
|
||||
"eventRemoveTotpSubject": "Esborrat OTP",
|
||||
"eventRemoveTotpBody": "OTP s'ha eliminat del teu compte el {0} des de {1}. Si no has estat tu, per favor contacta amb l'administrador.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>OTP s'ha eliminat del teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l'administrador. </ P>",
|
||||
"eventUpdatePasswordSubject": "ActualitzaciĂł de contrasenya",
|
||||
"eventUpdatePasswordBody":
|
||||
"La teva contrasenya s'ha actualitzat el {0} des de {1}. Si no has estat tu, si us plau contacta amb l'administrador.",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>La teva contrasenya s'ha actualitzat el {0} des de {1}. Si no has estat tu, si us plau contacta amb l'administrador.</p>",
|
||||
"eventUpdateTotpSubject": "ActualitzaciĂł de OTP",
|
||||
"eventUpdateTotpBody": "OTP s'ha actualitzat al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l'administrador.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>OTP s'ha actualitzat al teu compte el {0} des de {1}. Si no has estat tu, si us plau contacta amb l'administrador.</p>",
|
||||
},
|
||||
"cs": {
|
||||
"emailVerificationSubject": "OvÄĆenĂ e-mailu",
|
||||
"emailVerificationBody":
|
||||
"NÄkdo vytvoĆil ĂșÄet {2} s touto e-mailovou adresou. Pokud jste to vy, kliknÄte na nĂĆŸe uvedenĂœ odkaz a ovÄĆte svou e-mailovou adresu \n\n{0}\n\nTento odkaz vyprĆĄĂ za {1} minuty.\n\nPokud jste tento ĂșÄet nevytvoĆili, tuto zprĂĄvu ignorujte.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>NÄkdo vytvoĆil ĂșÄet {2} s touto e-mailovou adresou. Pokud jste to vy, kliknÄte na nĂĆŸe uvedenĂœ odkaz a ovÄĆte svou e-mailovou adresu. </p><p><a href="{0}">Odkaz na ovÄĆenĂ e-mailovĂ© adresy</a></p><p>Platnost odkazu vyprĆĄĂ za {1} minut.</p><p>Pokud jste tento ĂșÄet nevytvoĆili, tuto zprĂĄvu ignorujte.</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - testovacĂ zprĂĄva",
|
||||
"emailTestBody": "Toto je testovacĂ zprĂĄva",
|
||||
"emailTestBodyHtml": "<p>Toto je testovacĂ zprĂĄva </p>",
|
||||
"identityProviderLinkSubject": "Odkaz {0}",
|
||||
"identityProviderLinkBody":
|
||||
'NÄkdo chce propojit vĂĄĆĄ ĂșÄet "{1}" s ĂșÄtem "{0}" uĆŸivatele {2}. Pokud jste to vy, kliknÄte na nĂĆŸe uvedenĂœ odkaz a propojte ĂșÄty. \n\n{3}\n\nPlatnost tohoto odkazu je {5}.\n\nPokud nechcete propojit ĂșÄet, tuto zprĂĄvu ignorujte. Pokud propojĂte ĂșÄty, budete se moci pĆihlĂĄsit jako {1} pomocĂ {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>NÄkdo prĂĄvÄ poĆŸĂĄdal o zmÄnu hesla u vaĆĄeho ĂșÄtu {2}. Pokud jste to vy, pro jeho zmÄnu kliknÄte na odkaz nĂĆŸe.</p><p><a href="{0}">Odkaz na zmÄnu hesla.</a></p><p>Platnost tohoto odkazu je {3}.</p><p>Pokud heslo zmÄnit nechcete, tuto zprĂĄvu ignorujte a nic se nezmÄnĂ.</p>',
|
||||
"passwordResetSubject": "Zapomenuté heslo",
|
||||
"passwordResetBody":
|
||||
"NÄkdo prĂĄvÄ poĆŸĂĄdal o zmÄnu hesla u vaĆĄeho ĂșÄtu {2}. Pokud jste to vy, pro jeho zmÄnu kliknÄte na odkaz nĂĆŸe.\n\n{0}\n\nPlatnost tohoto odkazu je {3}.\n\nPokud heslo zmÄnit nechcete, tuto zprĂĄvu ignorujte a nic se nezmÄnĂ.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p> NÄkdo prĂĄvÄ poĆŸĂĄdal o zmÄnu povÄĆenĂ vaĆĄeho ĂșÄtu {2}. Pokud jste to vy, kliknÄte na odkaz nĂĆŸe, abyste je resetovali.</p><p><a href="{0}">Odkaz na obnovenĂ povÄĆenĂ </a></p><p> Platnost tohoto odkazu vyprĆĄĂ bÄhem {1} minut.</p><p> Pokud nechcete obnovit vaĆĄe povÄĆenĂ, ignorujte tuto zprĂĄvu a nic se nezmÄnĂ.</p>',
|
||||
"executeActionsSubject": "Aktualizujte svĆŻj ĂșÄet",
|
||||
"executeActionsBody":
|
||||
"VĂĄĆĄ administrĂĄtor vĂĄs poĆŸĂĄdal o provedenĂ nĂĄsledujĂcĂch akcĂ u ĂșÄtu {2}: {3}. ZaÄnÄte kliknutĂm na nĂĆŸe uvedenĂœ odkaz.\n\n{0}\n\nPlatnost tohoto odkazu je {4}.\n\nPokud si nejste jisti, zda je tento poĆŸadavek v poĆĂĄdku, ignorujte tuto zprĂĄvu.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>VĂĄĆĄ administrĂĄtor vĂĄs poĆŸĂĄdal o provedenĂ nĂĄsledujĂcĂch akcĂ u ĂșÄtu {2}: {3}. ZaÄnÄte kliknutĂm na nĂĆŸe uvedenĂœ odkaz.</p><p><a href="{0}">Odkaz na aktualizaci ĂșÄtu.</a></p><p>Platnost tohoto odkazu je {4}.</p><p>Pokud si nejste jisti, zda je tento poĆŸadavek v poĆĂĄdku, ignorujte tuto zprĂĄvu.</p>',
|
||||
"eventLoginErrorSubject": "Chyba pĆihlĂĄĆĄenĂ",
|
||||
"eventLoginErrorBody": "NÄkdo se neĂșspÄĆĄnÄ pokusil pĆihlĂĄsit k ĂșÄtu {0} z {1}. Pokud jste to nebyli vy, kontaktujte administrĂĄtora.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>NÄkdo se neĂșspÄĆĄnÄ pokusil pĆihlĂĄsit k ĂșÄtu {0} z {1}. Pokud jste to nebyli vy, kontaktujte administrĂĄtora.</p>",
|
||||
"eventRemoveTotpSubject": "Odebrat TOTP",
|
||||
"eventRemoveTotpBody": "V ĂșÄtu {0} bylo odebrĂĄno nastavenĂ OTP z {1}. Pokud jste to nebyli vy, kontaktujte administrĂĄtora.",
|
||||
"eventRemoveTotpBodyHtml": "<p>V ĂșÄtu {0} bylo odebrĂĄno nastavenĂ OTP z {1}. Pokud jste to nebyli vy, kontaktujte administrĂĄtora.</p>",
|
||||
"eventUpdatePasswordSubject": "Aktualizace hesla",
|
||||
"eventUpdatePasswordBody": "V ĂșÄtu {0} bylo zmÄnÄno heslo z {1}. Pokud jste to nebyli vy, kontaktujte administrĂĄtora.",
|
||||
"eventUpdatePasswordBodyHtml": "<p>V ĂșÄtu {0} bylo zmÄnÄno heslo z {1}. Pokud jste to nebyli vy, kontaktujte administrĂĄtora.</p>",
|
||||
"eventUpdateTotpSubject": "Aktualizace OTP",
|
||||
"eventUpdateTotpBody": "V ĂșÄtu {0} bylo zmÄnÄno nastavenĂ OTP z {1}. Pokud jste to nebyli vy, kontaktujte administrĂĄtora.",
|
||||
"eventUpdateTotpBodyHtml": "<p>V ĂșÄtu {0} bylo zmÄnÄno nastavenĂ OTP z {1}. Pokud jste to nebyli vy, kontaktujte administrĂĄtora.</p>",
|
||||
"requiredAction.CONFIGURE_TOTP": "Konfigurace OTP",
|
||||
"requiredAction.terms_and_conditions": "SmluvnĂ podmĂnky",
|
||||
"requiredAction.UPDATE_PASSWORD": "Aktualizace hesla",
|
||||
"requiredAction.UPDATE_PROFILE": "Aktualizace profilu",
|
||||
"requiredAction.VERIFY_EMAIL": "OvÄĆenĂ e-mailu",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "sekund",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "sekunda",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.2": "sekundy",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.3": "sekundy",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.4": "sekundy",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "minut",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "minuta",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.2": "minuty",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.3": "minuty",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.4": "minuty",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "hodin",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "hodina",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.2": "hodiny",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.3": "hodiny",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.4": "hodiny",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "dnĂ",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "den",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.2": "dny",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.3": "dny",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.4": "dny",
|
||||
},
|
||||
"de": {
|
||||
"emailVerificationSubject": "E-Mail verifizieren",
|
||||
"emailVerificationBody":
|
||||
"Jemand hat ein {2} Konto mit dieser E-Mail-Adresse erstellt. Falls Sie das waren, dann klicken Sie auf den Link, um die E-Mail-Adresse zu verifizieren.\n\n{0}\n\nDieser Link wird in {1} Minuten ablaufen.\n\nFalls Sie dieses Konto nicht erstellt haben, dann können sie diese Nachricht ignorieren.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Jemand hat ein {2} Konto mit dieser E-Mail-Adresse erstellt. Falls das Sie waren, klicken Sie auf den Link, um die E-Mail-Adresse zu verifizieren.</p><p><a href="{0}">Link zur BestÀtigung der E-Mail-Adresse</a></p><p>Dieser Link wird in {1} Minuten ablaufen.</p><p>Falls Sie dieses Konto nicht erstellt haben, dann können sie diese Nachricht ignorieren.</p>',
|
||||
"identityProviderLinkSubject": "Link {0}",
|
||||
"identityProviderLinkBody":
|
||||
"Es wurde beantragt Ihren Account {1} mit dem Account {0} von Benutzer {2} zu verlinken. Sollten Sie dies beantragt haben, klicken Sie auf den unten stehenden Link.\n\n{3}\n\n Die GĂŒltigkeit des Links wird in {4} Minuten verfallen.\n\nSollten Sie Ihren Account nicht verlinken wollen, ignorieren Sie diese Nachricht. Wenn Sie die Accounts verlinken wird ein Login auf {1} ĂŒber {0} ermöglicht.",
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>Es wurde beantragt Ihren Account {1} mit dem Account {0} von Benutzer {2} zu verlinken. Sollten Sie dies beantragt haben, klicken Sie auf den unten stehenden Link.</p><p><a href="{3}">Link zur BestĂ€tigung der KontoverknĂŒpfung</a></p><p>Die GĂŒltigkeit des Links wird in {4} Minuten verfallen.</p><p>Sollten Sie Ihren Account nicht verlinken wollen, ignorieren Sie diese Nachricht. Wenn Sie die Accounts verlinken wird ein Login auf {1} ĂŒber {0} ermöglicht.</p>',
|
||||
"passwordResetSubject": "Passwort zurĂŒcksetzen",
|
||||
"passwordResetBody":
|
||||
"Es wurde eine Ănderung der Anmeldeinformationen fĂŒr Ihren Account {2} angefordert. Wenn Sie diese Ănderung beantragt haben, klicken Sie auf den unten stehenden Link.\n\n{0}\n\nDie GĂŒltigkeit des Links wird in {1} Minuten verfallen.\n\nSollten Sie keine Ănderung vollziehen wollen können Sie diese Nachricht ignorieren und an Ihrem Account wird nichts geĂ€ndert.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>Es wurde eine Ănderung der Anmeldeinformationen fĂŒr Ihren Account {2} angefordert. Wenn Sie diese Ănderung beantragt haben, klicken Sie auf den unten stehenden Link.</p><p><a href="{0}">Link zum ZurĂŒcksetzen von Anmeldeinformationen</a></p><p>Die GĂŒltigkeit des Links wird in {1} Minuten verfallen.</p><p>Sollten Sie keine Ănderung vollziehen wollen können Sie diese Nachricht ignorieren und an Ihrem Account wird nichts geĂ€ndert.</p>',
|
||||
"executeActionsSubject": "Aktualisieren Sie Ihr Konto",
|
||||
"executeActionsBody":
|
||||
"Ihr Administrator hat Sie aufgefordert Ihren Account {2} zu aktualisieren. Klicken Sie auf den unten stehenden Link um den Prozess zu starten.\n\n{0}\n\nDie GĂŒltigkeit des Links wird in {1} Minuten verfallen.\n\nSollten Sie sich dieser Aufforderung nicht bewusst sein, ignorieren Sie diese Nachricht und Ihr Account bleibt unverĂ€ndert.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Ihr Administrator hat Sie aufgefordert Ihren Account {2} zu aktualisieren. Klicken Sie auf den unten stehenden Link um den Prozess zu starten.</p><p><a href="{0}">Link zum Account-Update</a></p><p>Die GĂŒltigkeit des Links wird in {1} Minuten verfallen.</p><p>Sollten Sie sich dieser Aufforderung nicht bewusst sein, ignorieren Sie diese Nachricht und Ihr Account bleibt unverĂ€ndert.</p>',
|
||||
"eventLoginErrorSubject": "Fehlgeschlagene Anmeldung",
|
||||
"eventLoginErrorBody":
|
||||
"Jemand hat um {0} von {1} versucht, sich mit Ihrem Konto anzumelden. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Jemand hat um {0} von {1} versucht, sich mit Ihrem Konto anzumelden. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.</p>",
|
||||
"eventRemoveTotpSubject": "OTP Entfernt",
|
||||
"eventRemoveTotpBody":
|
||||
"OTP wurde von Ihrem Konto am {0} von {1} entfernt. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>OTP wurde von Ihrem Konto am {0} von {1} entfernt. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.</p>",
|
||||
"eventUpdatePasswordSubject": "Passwort Aktualisiert",
|
||||
"eventUpdatePasswordBody": "Ihr Passwort wurde am {0} von {1} geÀndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>Ihr Passwort wurde am {0} von {1} geÀndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.</p>",
|
||||
"eventUpdateTotpSubject": "OTP Aktualisiert",
|
||||
"eventUpdateTotpBody": "OTP wurde am {0} von {1} geÀndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.",
|
||||
"eventUpdateTotpBodyHtml": "<p>OTP wurde am {0} von {1} geÀndert. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin.</p>",
|
||||
},
|
||||
"en": {
|
||||
"emailVerificationSubject": "Verify email",
|
||||
"emailVerificationBody":
|
||||
"Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address\n\n{0}\n\nThis link will expire within {3}.\n\nIf you didn't create this account, just ignore this message.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address</p><p><a href="{0}">Link to e-mail address verification</a></p><p>This link will expire within {3}.</p><p>If you didn\'t create this account, just ignore this message.</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - SMTP test message",
|
||||
"emailTestBody": "This is a test message",
|
||||
"emailTestBodyHtml": "<p>This is a test message</p>",
|
||||
"identityProviderLinkSubject": "Link {0}",
|
||||
"identityProviderLinkBody":
|
||||
'Someone wants to link your "{1}" account with "{0}" account of user {2} . If this was you, click the link below to link accounts\n\n{3}\n\nThis link will expire within {5}.\n\nIf you don\'t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>Someone wants to link your <b>{1}</b> account with <b>{0}</b> account of user {2} . If this was you, click the link below to link accounts</p><p><a href="{3}">Link to confirm account linking</a></p><p>This link will expire within {5}.</p><p>If you don\'t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.</p>',
|
||||
"passwordResetSubject": "Reset password",
|
||||
"passwordResetBody":
|
||||
"Someone just requested to change your {2} account's credentials. If this was you, click on the link below to reset them.\n\n{0}\n\nThis link and code will expire within {3}.\n\nIf you don't want to reset your credentials, just ignore this message and nothing will be changed.",
|
||||
"passwordResetBodyHtml":
|
||||
"<p>Someone just requested to change your {2} account's credentials. If this was you, click on the link below to reset them.</p><p><a href=\"{0}\">Link to reset credentials</a></p><p>This link will expire within {3}.</p><p>If you don't want to reset your credentials, just ignore this message and nothing will be changed.</p>",
|
||||
"executeActionsSubject": "Update Your Account",
|
||||
"executeActionsBody":
|
||||
"Your administrator has just requested that you update your {2} account by performing the following action(s): {3}. Click on the link below to start this process.\n\n{0}\n\nThis link will expire within {4}.\n\nIf you are unaware that your administrator has requested this, just ignore this message and nothing will be changed.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Your administrator has just requested that you update your {2} account by performing the following action(s): {3}. Click on the link below to start this process.</p><p><a href="{0}">Link to account update</a></p><p>This link will expire within {4}.</p><p>If you are unaware that your administrator has requested this, just ignore this message and nothing will be changed.</p>',
|
||||
"eventLoginErrorSubject": "Login error",
|
||||
"eventLoginErrorBody":
|
||||
"A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an administrator.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an administrator.</p>",
|
||||
"eventRemoveTotpSubject": "Remove OTP",
|
||||
"eventRemoveTotpBody": "OTP was removed from your account on {0} from {1}. If this was not you, please contact an administrator.",
|
||||
"eventRemoveTotpBodyHtml": "<p>OTP was removed from your account on {0} from {1}. If this was not you, please contact an administrator.</p>",
|
||||
"eventUpdatePasswordSubject": "Update password",
|
||||
"eventUpdatePasswordBody": "Your password was changed on {0} from {1}. If this was not you, please contact an administrator.",
|
||||
"eventUpdatePasswordBodyHtml": "<p>Your password was changed on {0} from {1}. If this was not you, please contact an administrator.</p>",
|
||||
"eventUpdateTotpSubject": "Update OTP",
|
||||
"eventUpdateTotpBody": "OTP was updated for your account on {0} from {1}. If this was not you, please contact an administrator.",
|
||||
"eventUpdateTotpBodyHtml": "<p>OTP was updated for your account on {0} from {1}. If this was not you, please contact an administrator.</p>",
|
||||
"requiredAction.CONFIGURE_TOTP": "Configure OTP",
|
||||
"requiredAction.terms_and_conditions": "Terms and Conditions",
|
||||
"requiredAction.UPDATE_PASSWORD": "Update Password",
|
||||
"requiredAction.UPDATE_PROFILE": "Update Profile",
|
||||
"requiredAction.VERIFY_EMAIL": "Verify Email",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "seconds",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "second",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "minutes",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "minute",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "hours",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "hour",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "days",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "day",
|
||||
"emailVerificationBodyCode": "Please verify your email address by entering in the following code.\n\n{0}\n\n.",
|
||||
"emailVerificationBodyCodeHtml": "<p>Please verify your email address by entering in the following code.</p><p><b>{0}</b></p>",
|
||||
},
|
||||
"es": {
|
||||
"emailVerificationSubject": "VerificaciĂłn de email",
|
||||
"emailVerificationBody":
|
||||
"Alguien ha creado una cuenta de {2} con esta direcciĂłn de email. Si has sido tĂș, haz click en el enlace siguiente para verificar tu direcciĂłn de email.\n\n{0}\n\nEste enlace expirarĂĄ en {1} minutos.\n\nSi tĂș no has creado esta cuenta, simplemente ignora este mensaje.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Alguien ha creado una cuenta de {2} con esta direcciĂłn de email. Si has sido tĂș, haz click en el enlace siguiente para verificar tu direcciĂłn de email.</p><p><a href="{0}">{0}</a></p><p>Este enlace expirarĂĄ en {1} minutos.</p><p>Si tĂș no has creado esta cuenta, simplemente ignora este mensaje.</p>',
|
||||
"passwordResetSubject": "Reiniciar contraseña",
|
||||
"passwordResetBody":
|
||||
"Alguien ha solicitado cambiar las credenciales de tu cuenta de {2}. Si has sido tĂș, haz clic en el enlace siguiente para reiniciarlas.\n\n{0}\n\nEste enlace expirarĂĄ en {1} minutos.\n\nSi no quieres reiniciar tus credenciales, simplemente ignora este mensaje y no se realizarĂĄ ningĂșn cambio.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>Alguien ha solicitado cambiar las credenciales de tu cuenta de {2}. Si has sido tĂș, haz clic en el enlace siguiente para reiniciarlas.</p><p><a href="{0}">{0}</a></p><p>Este enlace expirarĂĄ en {1} minutos.</p><p>Si no quieres reiniciar tus credenciales, simplemente ignora este mensaje y no se realizarĂĄ ningĂșn cambio.</p>',
|
||||
"executeActionsSubject": "Actualiza tu cuenta",
|
||||
"executeActionsBody":
|
||||
"El administrador ha solicitado que actualices tu cuenta de {2}. Haz clic en el enlace inferior para iniciar este proceso.\n\n{0}\n\nEste enlace expirarĂĄ en {1} minutos.\n\nSi no estĂĄs al tanto de que el administrador haya solicitado esto, simplemente ignora este mensaje y no se realizarĂĄ ningĂșn cambio.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>El administrador ha solicitado que actualices tu cuenta de {2}. Haz clic en el enlace inferior para iniciar este proceso.</p><p><a href="{0}">{0}</a></p><p>Este enlace expirarĂĄ en {1} minutos.</p><p>Si no estĂĄs al tanto de que el administrador haya solicitado esto, simplemente ignora este mensaje y no se realizarĂĄ ningĂșn cambio.</p>',
|
||||
"eventLoginErrorSubject": "Fallo en el inicio de sesiĂłn",
|
||||
"eventLoginErrorBody":
|
||||
"Se ha detectado un intento de acceso fallido a tu cuenta el {0} desde {1}. Si no has sido tĂș, por favor contacta con el administrador.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Se ha detectado un intento de acceso fallido a tu cuenta el {0} desde {1}. Si no has sido tĂș, por favor contacta con el administrador.</p>",
|
||||
"eventRemoveTotpSubject": "Borrado OTP",
|
||||
"eventRemoveTotpBody": "OTP fue eliminado de tu cuenta el {0} desde {1}. Si no has sido tĂș, por favor contacta con el administrador.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>OTP fue eliminado de tu cuenta el {0} desde {1}. Si no has sido tĂș, por favor contacta con el administrador.</p>",
|
||||
"eventUpdatePasswordSubject": "Actualización de contraseña",
|
||||
"eventUpdatePasswordBody": "Tu contraseña se ha actualizado el {0} desde {1}. Si no has sido tĂș, por favor contacta con el administrador.",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>Tu contraseña se ha actualizado el {0} desde {1}. Si no has sido tĂș, por favor contacta con el administrador.</p>",
|
||||
"eventUpdateTotpSubject": "ActualizaciĂłn de OTP",
|
||||
"eventUpdateTotpBody": "OTP se ha actualizado en tu cuenta el {0} desde {1}. Si no has sido tĂș, por favor contacta con el administrador.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>OTP se ha actualizado en tu cuenta el {0} desde {1}. Si no has sido tĂș, por favor contacta con el administrador.</p>",
|
||||
},
|
||||
"fr": {
|
||||
"emailVerificationSubject": "Vérification du courriel",
|
||||
"emailVerificationBody":
|
||||
"Quelqu'un vient de crĂ©er un compte \"{2}\" avec votre courriel. Si vous ĂȘtes Ă l'origine de cette requĂȘte, veuillez cliquer sur le lien ci-dessous afin de vĂ©rifier votre adresse de courriel\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSinon, veuillez ignorer ce message.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Quelqu\'un vient de crĂ©er un compte "{2}" avec votre courriel. Si vous ĂȘtes Ă l\'origine de cette requĂȘte, veuillez cliquer sur le lien ci-dessous afin de vĂ©rifier votre adresse de courriel</p><p><a href="{0}">{0}</a></p><p>Ce lien expire dans {1} minute(s).</p><p>Sinon, veuillez ignorer ce message.</p>',
|
||||
"passwordResetSubject": "Réinitialiser le mot de passe",
|
||||
"passwordResetBody":
|
||||
"Quelqu'un vient de demander une rĂ©initialisation de mot de passe pour votre compte {2}. Si vous ĂȘtes Ă l'origine de cette requĂȘte, veuillez cliquer sur le lien ci-dessous pour le mettre Ă jour.\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSinon, veuillez ignorer ce message ; aucun changement ne sera effectuĂ© sur votre compte.",
|
||||
"passwordResetBodyHtml":
|
||||
"<p>Quelqu'un vient de demander une rĂ©initialisation de mot de passe pour votre compte {2}. Si vous ĂȘtes Ă l'origine de cette requĂȘte, veuillez cliquer sur le lien ci-dessous pour le mettre Ă jour.</p><p><a href=\"{0}\">Lien pour rĂ©initialiser votre mot de passe</a></p><p>Ce lien expire dans {1} minute(s).</p><p>Sinon, veuillez ignorer ce message ; aucun changement ne sera effectuĂ© sur votre compte.</p>",
|
||||
"executeActionsSubject": "Mettre Ă jour votre compte",
|
||||
"executeActionsBody":
|
||||
"Votre administrateur vient de demander une mise Ă jour de votre compte {2}. Veuillez cliquer sur le lien ci-dessous afin de commencer le processus.\n\n{0}\n\nCe lien expire dans {1} minute(s).\n\nSi vous n'ĂȘtes pas Ă l'origine de cette requĂȘte, veuillez ignorer ce message ; aucun changement ne sera effectuĂ© sur votre compte.",
|
||||
"executeActionsBodyHtml":
|
||||
"<p>Votre administrateur vient de demander une mise Ă jour de votre compte {2}. Veuillez cliquer sur le lien ci-dessous afin de commencer le processus.</p><p><a href=\"{0}\">{0}</a></p><p>Ce lien expire dans {1} minute(s).</p><p>Si vous n'ĂȘtes pas Ă l'origine de cette requĂȘte, veuillez ignorer ce message ; aucun changement ne sera effectuĂ© sur votre compte.</p>",
|
||||
"eventLoginErrorSubject": "Erreur de connexion",
|
||||
"eventLoginErrorBody":
|
||||
"Une tentative de connexion a Ă©tĂ© dĂ©tectĂ©e sur votre compte {0} depuis {1}. Si vous n'ĂȘtes pas Ă l'origine de cette requĂȘte, veuillez contacter votre administrateur.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Une tentative de connexion a Ă©tĂ© dĂ©tectĂ©e sur votre compte {0} depuis {1}. Si vous n'ĂȘtes pas Ă l'origine de cette requĂȘte, veuillez contacter votre administrateur.</p>",
|
||||
"eventRemoveTotpSubject": "Suppression du OTP",
|
||||
"eventRemoveTotpBody":
|
||||
"Le OTP a Ă©tĂ© supprimĂ© de votre compte {0} depuis {1}. Si vous n'Ă©tiez pas Ă l'origine de cette requĂȘte, veuillez contacter votre administrateur.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>Le OTP a Ă©tĂ© supprimĂ© de votre compte {0} depuis {1}. Si vous n'Ă©tiez pas Ă l'origine de cette requĂȘte, veuillez contacter votre administrateur.</p>",
|
||||
"eventUpdatePasswordSubject": "Mise Ă jour du mot de passe",
|
||||
"eventUpdatePasswordBody":
|
||||
"Votre mot de passe pour votre compte {0} a Ă©tĂ© modifiĂ© depuis {1}. Si vous n'Ă©tiez pas Ă l'origine de cette requĂȘte, veuillez contacter votre administrateur.",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>Votre mot de passe pour votre compte {0} a Ă©tĂ© modifiĂ© depuis {1}. Si vous n'Ă©tiez pas Ă l'origine de cette requĂȘte, veuillez contacter votre administrateur.</p>",
|
||||
"eventUpdateTotpSubject": "Mise Ă jour du OTP",
|
||||
"eventUpdateTotpBody":
|
||||
"Le OTP a Ă©tĂ© mis Ă jour pour votre compte {0} depuis {1}. Si vous n'Ă©tiez pas Ă l'origine de cette requĂȘte, veuillez contacter votre administrateur.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>Le OTP a Ă©tĂ© mis Ă jour pour votre compte {0} depuis {1}. Si vous n'Ă©tiez pas Ă l'origine de cette requĂȘte, veuillez contacter votre administrateur.</p>",
|
||||
},
|
||||
"it": {
|
||||
"emailVerificationSubject": "Verifica l'email",
|
||||
"emailVerificationBody":
|
||||
"Qualcuno ha creato un account {2} con questo indirizzo email. Se sei stato tu, fai clic sul link seguente per verificare il tuo indirizzo email\n\n{0}\n\nQuesto link scadrĂ in {3}.\n\nSe non sei stato tu a creare questo account, ignora questo messaggio.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Qualcuno ha creato un account {2} con questo indirizzo email. Se sei stato tu, fai clic sul link seguente per verificare il tuo indirizzo email</p><p><a href="{0}">{0}</a></p><p>Questo link scadrĂ in {3}.</p><p>Se non sei stato tu a creare questo account, ignora questo messaggio.</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - messaggio di test SMTP",
|
||||
"emailTestBody": "Questo Ăš un messaggio di test",
|
||||
"emailTestBodyHtml": "<p>Questo Ăš un messaggio di test</p>",
|
||||
"identityProviderLinkSubject": "Link {0}",
|
||||
"identityProviderLinkBody":
|
||||
'Qualcuno vuole associare il tuo account "{1}" con l\'account "{0}" dell\'utente {2}. Se sei stato tu, fai clic sul link seguente per associare gli account\n\n{3}\n\nQuesto link scadrĂ in {5}.\n\nSe non vuoi associare l\'account, ignora questo messaggio. Se associ gli account, potrai accedere a {1} attraverso {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
"<p>Qualcuno vuole associare il tuo account <b>{1}</b> con l'account <b>{0}</b> dell'utente {2}. Se sei stato tu, fai clic sul link seguente per associare gli account</p><p><a href=\"{3}\">{3}</a></p><p>Questo link scadrĂ in {5}.</p><p>Se non vuoi associare l'account, ignora questo messaggio. Se associ gli account, potrai accedere a {1} attraverso {0}.</p>",
|
||||
"passwordResetSubject": "Reimposta la password",
|
||||
"passwordResetBody":
|
||||
"Qualcuno ha appena richiesto di cambiare le credenziali di accesso al tuo account {2}. Se sei stato tu, fai clic sul link seguente per reimpostarle.\n\n{0}\n\nQuesto link e codice scadranno in {3}.\n\nSe non vuoi reimpostare le tue credenziali di accesso, ignora questo messaggio e non verrĂ effettuato nessun cambio.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>Qualcuno ha appena richiesto di cambiare le credenziali di accesso al tuo account {2}. Se sei stato tu, fai clic sul link seguente per reimpostarle.</p><p><a href="{0}">{0}</a></p><p>Questo link scadrĂ in {3}.</p><p>Se non vuoi reimpostare le tue credenziali di accesso, ignora questo messaggio e non verrĂ effettuato nessun cambio.</p>',
|
||||
"executeActionsSubject": "Aggiorna il tuo account",
|
||||
"executeActionsBody":
|
||||
"Il tuo amministratore ha appena richiesto un aggiornamento del tuo account {2} ed Ăš necessario che tu esegua la/le seguente/i azione/i: {3}. Fai clic sul link seguente per iniziare questo processo.\n\n{0}\n\nQuesto link scadrĂ in {4}.\n\nSe non sei a conoscenza della richiesta del tuo amministratore, ignora questo messaggio e non verrĂ effettuato nessun cambio.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Il tuo amministratore ha appena richiesto un aggiornamento del tuo account {2} ed Ăš necessario che tu esegua la/le seguente/i azione/i: {3}. Fai clic sul link seguente per iniziare questo processo.</p><p><a href="{0}">Link to account update</a></p><p>Questo link scadrĂ in {4}.</p><p>Se non sei a conoscenza della richiesta del tuo amministratore, ignora questo messaggio e non verrĂ effettuato nessun cambio.</p>',
|
||||
"eventLoginErrorSubject": "Errore di accesso",
|
||||
"eventLoginErrorBody":
|
||||
"Ă stato rilevato un tentativo fallito di accesso al tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l'amministratore.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Ă stato rilevato un tentativo fallito di accesso al tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l'amministratore.</p>",
|
||||
"eventRemoveTotpSubject": "Rimozione OTP (password temporanea valida una volta sola)",
|
||||
"eventRemoveTotpBody":
|
||||
"La OTP (password temporanea valida una volta sola) Ăš stata rimossa dal tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l'amministratore.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>La OTP (password temporanea valida una volta sola) Ăš stata rimossa dal tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l'amministratore.</p>",
|
||||
"eventUpdatePasswordSubject": "Aggiornamento password",
|
||||
"eventUpdatePasswordBody": "La tua password Ăš stata cambiata il {0} da {1}. Se non sei stato tu, per favore contatta l'amministratore.",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>La tua password Ăš stata cambiata il {0} da {1}. Se non sei stato tu, per favore contatta l'amministratore.</p>",
|
||||
"eventUpdateTotpSubject": "Aggiornamento OTP (password temporanea valida una volta sola)",
|
||||
"eventUpdateTotpBody":
|
||||
"La OTP (password temporanea valida una volta sola) Ăš stata aggiornata per il tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l'amministratore.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>La OTP (password temporanea valida una volta sola) Ăš stata aggiornata per il tuo account il {0} da {1}. Se non sei stato tu, per favore contatta l'amministratore.</p>",
|
||||
"requiredAction.CONFIGURE_TOTP": "Configurazione OTP",
|
||||
"requiredAction.terms_and_conditions": "Termini e condizioni",
|
||||
"requiredAction.UPDATE_PASSWORD": "Aggiornamento password",
|
||||
"requiredAction.UPDATE_PROFILE": "Aggiornamento profilo",
|
||||
"requiredAction.VERIFY_EMAIL": "Verifica dell'indirizzo email",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "secondi",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "secondo",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "minuti",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "minuto",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "ore",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "ora",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "giorni",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "giorno",
|
||||
"emailVerificationBodyCode": "Per favore verifica il tuo indirizzo email inserendo il codice seguente.\n\n{0}\n\n.",
|
||||
"emailVerificationBodyCodeHtml": "<p>Per favore verifica il tuo indirizzo email inserendo il codice seguente.</p><p><b>{0}</b></p>",
|
||||
},
|
||||
"ja": {
|
||||
"emailVerificationSubject": "EăĄăŒă«ăźçąșèȘ",
|
||||
"emailVerificationBody":
|
||||
"ăăźăĄăŒă«ăąăăŹăčă§{2}ăąă«ăŠăłăăäœæăăăŸăăă仄äžăźăȘăłăŻăăŻăȘăăŻăăŠăĄăŒă«ăąăăŹăčăźçąșèȘăćźäșăăŠăă ăăă\n\n{0}\n\năăźăȘăłăŻăŻ{3}ă ăæćčă§ăă\n\năăăăźăąă«ăŠăłăăźäœæă«ćżćœăăăăȘăć ŽćăŻăăăźăĄăŒă«ăçĄèŠăăŠăă ăăă",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>ăăźăĄăŒă«ăąăăŹăčă§{2}ăąă«ăŠăłăăäœæăăăŸăăă仄äžăźăȘăłăŻăăŻăȘăăŻăăŠăĄăŒă«ăąăăŹăčăźçąșèȘăćźäșăăŠăă ăăă</p><p><a href="{0}">ăĄăŒă«ăąăăŹăčăźçąșèȘ</a></p><p>ăăźăȘăłăŻăŻ{3}ă ăæćčă§ăă</p><p>ăăăăźăąă«ăŠăłăăźäœæă«ćżćœăăăăȘăć ŽćăŻăăăźăĄăŒă«ăçĄèŠăăŠăă ăăă</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - SMTPăăčăăĄăă»ăŒăž",
|
||||
"emailTestBody": "ăăăŻăăčăăĄăă»ăŒăžă§ă",
|
||||
"emailTestBodyHtml": "<p>ăăăŻăăčăăĄăă»ăŒăžă§ă</p>",
|
||||
"identityProviderLinkSubject": "ăȘăłăŻ {0}",
|
||||
"identityProviderLinkBody":
|
||||
'ăăȘăăź"{1}"ăąă«ăŠăłăăš{2}ăŠăŒă¶ăŒăź"{0}"ăąă«ăŠăłăăźăȘăłăŻăèŠæ±ăăăŸăăă仄äžăźăȘăłăŻăăŻăȘăăŻăăŠăąă«ăŠăłăăźăȘăłăŻăèĄăŁăŠăă ăăă\n\n{3}\n\năăźăȘăłăŻăŻ{5}ă ăæćčă§ăă\n\năăăąă«ăŠăłăăźăȘăłăŻăèĄăăȘăć ŽćăŻăăăźăĄăă»ăŒăžăçĄèŠăăŠăă ăăăăąă«ăŠăłăăźăȘăłăŻăèĄăăăšă§ă{0}ç”ç±ă§{1}ă«ăă°ă€ăłăăăăšăă§ăăăăă«ăȘăăŸăă',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>ăăȘăăź<b>{1}</b>ăąă«ăŠăłăăš{2}ăŠăŒă¶ăŒăź<b>{0}</b>ăąă«ăŠăłăăźăȘăłăŻăèŠæ±ăăăŸăăă仄äžăźăȘăłăŻăăŻăȘăăŻăăŠăąă«ăŠăłăăźăȘăłăŻăèĄăŁăŠăă ăăă</p><p><a href="{3}">ăąă«ăŠăłăăȘăłăŻăźçąșèȘ</a></p><p>ăăźăȘăłăŻăŻ{5}ă ăæćčă§ăă</p><p>ăăăąă«ăŠăłăăźăȘăłăŻăèĄăăȘăć ŽćăŻăăăźăĄăă»ăŒăžăçĄèŠăăŠăă ăăăăąă«ăŠăłăăźăȘăłăŻăèĄăăăšă§ă{0}ç”ç±ă§{1}ă«ăă°ă€ăłăăăăšăă§ăăăăă«ăȘăăŸăă</p>',
|
||||
"passwordResetSubject": "ăăčăŻăŒăăźăȘă»ăă",
|
||||
"passwordResetBody":
|
||||
"ăăȘăăź{2}ăąă«ăŠăłăăźăăčăŻăŒăăźć€æŽăèŠæ±ăăăŠăăŸăă仄äžăźăȘăłăŻăăŻăȘăăŻăăŠăăčăŻăŒăăźăȘă»ăăăèĄăŁăŠăă ăăă\n\n{0}\n\năăźăȘăłăŻăŻ{3}ă ăæćčă§ăă\n\năăăăčăŻăŒăăźăȘă»ăăăèĄăăȘăć ŽćăŻăăăźăĄăă»ăŒăžăçĄèŠăăŠăă ăăăäœă〿ŽăăăŸăăă",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>ăăȘăăź{2}ăąă«ăŠăłăăźăăčăŻăŒăăźć€æŽăèŠæ±ăăăŠăăŸăă仄äžăźăȘăłăŻăăŻăȘăăŻăăŠăăčăŻăŒăăźăȘă»ăăăèĄăŁăŠăă ăăă</p><p><a href="{0}">ăăčăŻăŒăăźăȘă»ăă</a></p><p>ăăźăȘăłăŻăŻ{3}ă ăæćčă§ăă</p><p>ăăăăčăŻăŒăăźăȘă»ăăăèĄăăȘăć ŽćăŻăăăźăĄăă»ăŒăžăçĄèŠăăŠăă ăăăäœă〿ŽăăăŸăăă</p>',
|
||||
"executeActionsSubject": "ăąă«ăŠăłăăźæŽæ°",
|
||||
"executeActionsBody":
|
||||
"æŹĄăźăąăŻă·ă§ăłăćźèĄăăăăšă«ăăă知çè
ăăăăȘăăź{2}ăąă«ăŠăłăăźæŽæ°ăèŠæ±ăăăŠăăŸă: {3}ă仄äžăźăȘăłăŻăăŻăȘăăŻăăŠăăźăăă»ăčăéć§ăăŠăă ăăă\n\n{0}\n\năăźăȘăłăŻăŻ{4}ă ăæćčă§ăă\n\n知çè
ăăăźăăźć€æŽèŠæ±ă«ă€ăăŠăćç„ăȘăć ŽćăŻăăăźăĄăă»ăŒăžăçĄèŠăăŠăă ăăăäœă〿ŽăăăŸăăă",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>æŹĄăźăąăŻă·ă§ăłăćźèĄăăăăšă«ăăă知çè
ăăăăȘăăź{2}ăąă«ăŠăłăăźæŽæ°ăèŠæ±ăăăŠăăŸă: {3}ă仄äžăźăȘăłăŻăăŻăȘăăŻăăŠăăźăăă»ăčăéć§ăăŠăă ăăă</p><p><a href="{0}">ăąă«ăŠăłăăźæŽæ°</a></p><p>ăăźăȘăłăŻăŻ{4}ă ăæćčă§ăă</p><p>知çè
ăăăźăăźć€æŽèŠæ±ă«ă€ăăŠăćç„ăȘăć ŽćăŻăăăźăĄăă»ăŒăžăçĄèŠăăŠăă ăăăäœă〿ŽăăăŸăăă</p>',
|
||||
"eventLoginErrorSubject": "ăă°ă€ăłăšă©ăŒ",
|
||||
"eventLoginErrorBody": "{0}ă«{1}ăăăźăă°ă€ăłć€±æăăăȘăăźăąă«ăŠăłăă§æ€ćșăăăŸăăăćżćœăăăăȘăć ŽćăŻă知çè
ă«éŁç”ĄăăŠăă ăăă",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>{0}ă«{1}ăăăźăă°ă€ăłć€±æăăăȘăăźăąă«ăŠăłăă§æ€ćșăăăŸăăăćżćœăăăăȘăć ŽćăŻçźĄçè
ă«éŁç”ĄăăŠăă ăăă</p>",
|
||||
"eventRemoveTotpSubject": "OTPăźćé€",
|
||||
"eventRemoveTotpBody": "{0}ă«{1}ăăăźæäœă§OTPăćé€ăăăŸăăăćżćœăăăăȘăć ŽćăŻă知çè
ă«éŁç”ĄăăŠăă ăăă",
|
||||
"eventRemoveTotpBodyHtml": "<p>{0}ă«{1}ăăăźæäœă§OTPăćé€ăăăŸăăăćżćœăăăăȘăć ŽćăŻă知çè
ă«éŁç”ĄăăŠăă ăăă</p>",
|
||||
"eventUpdatePasswordSubject": "ăăčăŻăŒăăźæŽæ°",
|
||||
"eventUpdatePasswordBody": "{0}ă«{1}ăăăźæäœă§ăăȘăăźăăčăŻăŒăă〿ŽăăăŸăăăćżćœăăăăȘăć ŽćăŻă知çè
ă«éŁç”ĄăăŠăă ăăă",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>{0}ă«{1}ăăăźæäœă§ăăȘăăźăăčăŻăŒăă〿ŽăăăŸăăăćżćœăăăăȘăć ŽćăŻă知çè
ă«éŁç”ĄăăŠăă ăăă</p>",
|
||||
"eventUpdateTotpSubject": "OTPăźæŽæ°",
|
||||
"eventUpdateTotpBody": "{0}ă«{1}ăăăźæäœă§OTPăæŽæ°ăăăŸăăăćżćœăăăăȘăć ŽćăŻă知çè
ă«éŁç”ĄăăŠăă ăăă",
|
||||
"eventUpdateTotpBodyHtml": "<p>{0}ă«{1}ăăăźæäœă§OTPăæŽæ°ăăăŸăăăćżćœăăăăȘăć ŽćăŻă知çè
ă«éŁç”ĄăăŠăă ăăă</p>",
|
||||
"requiredAction.CONFIGURE_TOTP": "OTPăźèšćź",
|
||||
"requiredAction.terms_and_conditions": "ć©çšèŠçŽ",
|
||||
"requiredAction.UPDATE_PASSWORD": "ăăčăŻăŒăăźæŽæ°",
|
||||
"requiredAction.UPDATE_PROFILE": "ăăăăĄă€ă«ăźæŽæ°",
|
||||
"requiredAction.VERIFY_EMAIL": "EăĄăŒă«ăźçąșèȘ",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "ç§",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "ç§",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "ć",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "ć",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "æé",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "æé",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "æ„",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "æ„",
|
||||
"emailVerificationBodyCode": "æŹĄăźăłăŒăăć
„ćăăŠăĄăŒă«ăąăăŹăčăçąșèȘăăŠăă ăăă\n\n{0}\n\n.",
|
||||
"emailVerificationBodyCodeHtml": "<p>æŹĄăźăłăŒăăć
„ćăăŠăĄăŒă«ăąăăŹăčăçąșèȘăăŠăă ăăă</p><p><b>{0}</b></p>",
|
||||
},
|
||||
"lt": {
|
||||
"emailVerificationSubject": "El. paĆĄto patvirtinimas",
|
||||
"emailVerificationBody":
|
||||
"Paskyra {2} sukurta naudojant ĆĄÄŻ el. paĆĄto adresÄ
. Jei tai buvote JĆ«s, tuomet paspauskite ĆŸemiau esanÄiÄ
nuorodÄ
\n\n{0}\n\nĆ i nuoroda galioja {1} min.\n\nJei paskyros nekĆ«rÄte, tuomet ignuoruokite ĆĄÄŻ laiĆĄkÄ
. ",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Paskyra {2} sukurta naudojant ĆĄÄŻ el. paĆĄto adresÄ
. Jei tao buvote JĆ«s, tuomet paspauskite ĆŸemiau esanÄiÄ
nuorodÄ
</p><p><a href=LT"{0}">{0}</a></p><p>Ć i nuoroda galioja {1} min.</p><p>nJei paskyros nekĆ«rÄte, tuomet ignuoruokite ĆĄÄŻ laiĆĄkÄ
.</p>',
|
||||
"identityProviderLinkSubject": "SÄ
saja {0}",
|
||||
"identityProviderLinkBody":
|
||||
'KaĆŸas pageidauja susieti JĆ«sĆł "{1}" paskyrÄ
su "{0}" {2} naudotojo paskyrÄ
. Jei tai buvote JĆ«s, tuomet paspauskite ĆŸemiau esanÄiÄ
nuorodÄ
norÄdami susieti paskyras\n\n{3}\n\nĆ i nuoroda galioja {4} min.\n\nJei paskyrĆł susieti nenorite, tuomet ignoruokite ĆĄÄŻ laiĆĄkÄ
. Jei paskyras susiesite, tuomet prie {1} galÄsiste prisijungti per {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>ĆŸas pageidauja susieti JĆ«sĆł <b>{1}</b> paskyrÄ
su <b>{0}</b> {2} naudotojo paskyrÄ
. Jei tai buvote JĆ«s, tuomet paspauskite ĆŸemiau esanÄiÄ
nuorodÄ
norÄdami susieti paskyras</p><p><a href=LT"{3}">{3}</a></p><p>Ć i nuoroda galioja {4} min.</p><p>Jei paskyrĆł susieti nenorite, tuomet ignoruokite ĆĄÄŻ laiĆĄkÄ
. Jei paskyras susiesite, tuomet prie {1} galÄsiste prisijungti per {0}.</p>',
|
||||
"passwordResetSubject": "SlaptaĆŸodĆŸio atkĆ«rimas",
|
||||
"passwordResetBody":
|
||||
"KaĆŸkas pageidauja pakeisti JĆ«sĆł paskyros {2} slaptaĆŸodÄŻ. Jei tai buvote JĆ«s, tuomet paspauskite ĆŸemiau esanÄiÄ
nuorodÄ
slaptaĆŸodĆŸio pakeitimui.\n\n{0}\n\nĆ i nuoroda ir kodas galioja {1} min.\n\nJei nepageidajate keisti slaptaĆŸodĆŸio, tuomet ignoruokite ĆĄÄŻ laiĆĄkÄ
ir niekas nebus pakeista.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>KaĆŸkas pageidauja pakeisti JĆ«sĆł paskyros {2} slaptaĆŸodÄŻ. Jei tai buvote JĆ«s, tuomet paspauskite ĆŸemiau esanÄiÄ
nuorodÄ
slaptaĆŸodĆŸio pakeitimui.</p><p><a href=LT"{0}">{0}</a></p><p>Ć i nuoroda ir kodas galioja {1} min.</p><p>Jei nepageidajate keisti slaptaĆŸodĆŸio, tuomet ignoruokite ĆĄÄŻ laiĆĄkÄ
ir niekas nebus pakeista.</p>',
|
||||
"executeActionsSubject": "Atnaujinkite savo paskyrÄ
",
|
||||
"executeActionsBody":
|
||||
"Sistemos administratorius pageidauja, kad JĆ«s atnaujintumÄte savo {2} paskyrÄ
. Paspauskite ĆŸemiau esanÄiÄ
nuorodÄ
paskyros duomenĆł atnaujinimui.\n\n{0}\n\nĆ i nuoroda galioja {1} min.\n\nJei JĆ«s neasate tikri, kad tai administratoriaus pageidavimas, tuomet ignoruokite ĆĄÄŻ laiĆĄkÄ
ir niekas nebus pakeista.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Sistemos administratorius pageidauja, kad JĆ«s atnaujintumÄte savo {2} paskyrÄ
. Paspauskite ĆŸemiau esanÄiÄ
nuorodÄ
paskyros duomenĆł atnaujinimui.</p><p><a href=LT"{0}">{0}</a></p><p>Ć i nuoroda galioja {1} min.</p><p>Jei JĆ«s neasate tikri, kad tai administratoriaus pageidavimas, tuomet ignoruokite ĆĄÄŻ laiĆĄkÄ
ir niekas nebus pakeista.</p>',
|
||||
"eventLoginErrorSubject": "NesÄkmingas bandymas prisijungti prie jĆ«sĆł paskyros",
|
||||
"eventLoginErrorBody":
|
||||
"Bandymas prisijungti prie jĆ«sĆł paskyros {0} iĆĄ {1} nesÄkmingas. Jei tai nebuvote jĆ«s, tuomet susisiekite su administratoriumi",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Bandymas prisijungti prie jĆ«sĆł paskyros {0} iĆĄ {1} nesÄkmingas. Jei tai nebuvote jĆ«s, tuomet susisiekite su administratoriumi</p>",
|
||||
"eventRemoveTotpSubject": "OTP paĆĄalinimas",
|
||||
"eventRemoveTotpBody":
|
||||
"KaĆŸkas pageidauja atsieti TOPT JĆ«sĆł {1} paskyroje su {0}. Jei tai nebuvote JĆ«s, tuomet susisiekite su administratoriumi",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>KaĆŸkas pageidauja atsieti TOPT JĆ«sĆł <b>{1}</b> paskyroje su <b>{0}</b>. Jei tai nebuvote JĆ«s, tuomet susisiekite su administratoriumi</p>",
|
||||
"eventUpdatePasswordSubject": "SlaptaĆŸodĆŸio atnaujinimas",
|
||||
"eventUpdatePasswordBody": "{1} paskyroje {0} pakeisas jĆ«sĆł slaptaĆŸodis. Jei JĆ«s nekeitÄte, tuomet susisiekite su administratoriumi",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>{1} paskyroje {0} pakeisas jĆ«sĆł slaptaĆŸodis. Jei JĆ«s nekeitÄte, tuomet susisiekite su administratoriumi</p>",
|
||||
"eventUpdateTotpSubject": "OTP atnaujinimas",
|
||||
"eventUpdateTotpBody": "OTP JƫsƳ {1} paskyroje su {0} buvo atnaujintas. Jei tai nebuvote Jƫs, tuomet susisiekite su administratoriumi",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>OTP JƫsƳ {1} paskyroje su {0} buvo atnaujintas. Jei tai nebuvote Jƫs, tuomet susisiekite su administratoriumi</p>",
|
||||
},
|
||||
"nl": {
|
||||
"emailVerificationSubject": "Bevestig e-mailadres",
|
||||
"emailVerificationBody":
|
||||
"Iemand heeft een {2} account aangemaakt met dit e-mailadres. Als u dit was, klikt u op de onderstaande koppeling om uw e-mailadres te bevestigen \n\n{0}\n\nDeze koppeling zal binnen {3} vervallen.\n\nU kunt dit bericht negeren indien u dit account niet heeft aangemaakt.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Iemand heeft een {2} account aangemaakt met dit e-mailadres. Als u dit was, klikt u op de onderstaande koppeling om uw e-mailadres te bevestigen</p><p><a href="{0}">Koppeling naar e-mailadres bevestiging</a></p><p>Deze koppeling zal binnen {3} vervallen.</p<p>U kunt dit bericht negeren indien u dit account niet heeft aangemaakt.</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - SMTP testbericht",
|
||||
"emailTestBody": "Dit is een testbericht",
|
||||
"emailTestBodyHtml": "<p>Dit is een testbericht</p>",
|
||||
"identityProviderLinkSubject": "Koppel {0}",
|
||||
"identityProviderLinkBody":
|
||||
'Iemand wil uw "{1}" account koppelen met "{0}" account van gebruiker {2}. Als u dit was, klik dan op de onderstaande link om de accounts te koppelen\n\n{3}\n\nDeze link zal over {5} vervallen.\n\nAls u de accounts niet wilt koppelen, negeer dan dit bericht. Als u accounts koppelt, dan kunt u bij {1} inloggen via {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>Iemand wil uw "{1}" account koppelen met "{0}" account van gebruiker {2}. Als u dit was, klik dan op de onderstaande link om de accounts te koppelen</p><p><a href="{3}">Link om accounts te koppelen</a></p><p>Deze link zal over {5} vervallen.</p><p>Als u de accounts niet wilt koppelen, negeer dan dit bericht. Als u accounts koppelt, dan kunt u bij {1} inloggen via {0}.</p>',
|
||||
"passwordResetSubject": "Wijzig wachtwoord",
|
||||
"passwordResetBody":
|
||||
"Iemand verzocht de aanmeldgegevens van uw {2} account te wijzigen. Als u dit was, klik dan op de onderstaande koppeling om ze te wijzigen.\n\n{0}\n\nDe link en de code zullen binnen {3} vervallen.\n\nAls u uw aanmeldgegevens niet wilt wijzigen, negeer dan dit bericht en er zal niets gewijzigd worden.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>Iemand verzocht de aanmeldgegevens van uw {2} account te wijzigen. Als u dit was, klik dan op de onderstaande koppeling om ze te wijzigen.</p><p><a href="{0}">Wijzig aanmeldgegevens</a></p><p>De link en de code zullen binnen {3} vervallen.</p><p>Als u uw aanmeldgegevens niet wilt wijzigen, negeer dan dit bericht en er zal niets gewijzigd worden.</p>',
|
||||
"executeActionsSubject": "Wijzig uw account",
|
||||
"executeActionsBody":
|
||||
"Uw beheerder heeft u verzocht uw {2} account te wijzigen. Klik op de onderstaande koppeling om dit proces te starten. \n\n{0}\n\nDeze link zal over {4} vervallen. \n\nAls u niet over dit verzoek op de hoogte was, negeer dan dit bericht om uw account ongewijzigd te laten.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Uw beheerder heeft u verzocht uw {2} account te wijzigen. Klik op de onderstaande koppeling om dit proces te starten.</p><p><a href="{0}">Link naar account wijziging</a></p><p>Deze link zal over {4} vervallen.</p><p>Als u niet over dit verzoek op de hoogte was, negeer dan dit bericht om uw account ongewijzigd te laten.</p>',
|
||||
"eventLoginErrorSubject": "Inlogfout",
|
||||
"eventLoginErrorBody":
|
||||
"Er is een foutieve inlogpoging gedetecteerd op uw account om {0} vanuit {1}. Als u dit niet was, neem dan contact op met de beheerder.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Er is een foutieve inlogpoging gedetecteerd op uw account om {0} vanuit {1}. Als u dit niet was, neem dan contact op met de beheerder.</p>",
|
||||
"eventRemoveTotpSubject": "OTP verwijderd",
|
||||
"eventRemoveTotpBody": "OTP is verwijderd van uw account om {0} vanuit {1}. Als u dit niet was, neem dan contact op met uw beheerder.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>OTP is verwijderd van uw account om {0} vanuit {1}. Als u dit niet was, neem dan contact op met uw beheerder.</p>",
|
||||
"eventUpdatePasswordSubject": "Wachtwoord gewijzigd",
|
||||
"eventUpdatePasswordBody": "Uw wachtwoord is gewijzigd om {0} door {1}. Als u dit niet was, neem dan contact op met uw beheerder.",
|
||||
"eventUpdatePasswordBodyHtml": "<p>Uw wachtwoord is gewijzigd om {0} door {1}. Als u dit niet was, neem dan contact op met uw beheerder.</p>",
|
||||
"eventUpdateTotpSubject": "OTP gewijzigd",
|
||||
"eventUpdateTotpBody": "OTP is gewijzigd voor uw account om {0} door {1}. Als u dit niet was, neem dan contact op met uw beheerder.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>OTP is gewijzigd voor uw account om {0} door {1}. Als u dit niet was, neem dan contact op met uw beheerder.</p>",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "seconden",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "seconde",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "minuten",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "minuut",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "uur",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "uur",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "dagen",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "dag",
|
||||
},
|
||||
"no": {
|
||||
"emailVerificationSubject": "Bekreft e-postadresse",
|
||||
"emailVerificationBody":
|
||||
"Noen har opprettet en {2} konto med denne e-postadressen. Hvis dette var deg, klikk pÄ lenken nedenfor for Ä bekrefte e-postadressen din\n\n{0}\n\nDenne lenken vil utlÞpe om {1} minutter.\n\nHvis du ikke opprettet denne kontoen, vennligst ignorer denne meldingen.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Noen har opprettet en {2} konto med denne e-postadressen. Hvis dette var deg, klikk pÄ lenken nedenfor for Ä bekrefte e-postadressen din</p><p><a href="{0}">{0}</a></p><p>Denne lenken vil utlÞpe om {1} minutter.</p><p>Hvis du ikke opprettet denne kontoen, vennligst ignorer denne meldingen.</p>',
|
||||
"identityProviderLinkSubject": "Lenke {0}",
|
||||
"identityProviderLinkBody":
|
||||
"Noen vil koble din <b>{1}</b> konto med <b>{0}</b> konto til bruker {2}. Hvis dette var deg, klikk pÄ lenken nedenfor for Ä koble kontoene\n\n{3}\n\nDenne lenken vil utlÞpe om {4} minutter\n\nHvis du ikke vil koble kontoene, vennligst ignorer denne meldingen. Hvis du kobler kontoene sammen vil du kunne logge inn til {1} gjennom {0}.",
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>Noen vil koble din <b>{1}</b> konto med <b>{0}</b> konto til bruker {2}. Hvis dette var deg, klikk pÄ lenken nedenfor for Ä koble kontoene.</p><p><a href="{3}">{3}</a></p><p>Denne lenken vil utlÞpe om {4} minutter.</p><p>Hvis du ikke vil koble kontoene, vennligst ignorer denne meldingen. Hvis du kobler kontoene sammen vil du kunne logge inn til {1} gjennom {0}.</p>',
|
||||
"passwordResetSubject": "Tilbakestill passord",
|
||||
"passwordResetBody":
|
||||
"Noen har bedt om Ä endre innloggingsdetaljene til din konto {2}. Hvis dette var deg, klikk pÄ lenken nedenfor for Ä tilbakestille dem.\n\n{0}\n\nDenne lenken vil utlÞpe om {1} minutter.\n\nHvis du ikke vil tilbakestille din innloggingsdata, vennligst ignorer denne meldingen og ingenting vil bli endret.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>Noen har bedt om Ä endre innloggingsdetaljene til din konto {2}. Hvis dette var deg, klikk pÄ lenken nedenfor for Ä tilbakestille dem.</p><p><a href="{0}">{0}</a></p><p>Denne lenken vil utlÞpe om {1} minutter.</p><p>Hvis du ikke vil tilbakestille din innloggingsdata, vennligst ignorer denne meldingen og ingenting vil bli endret.</p>',
|
||||
"executeActionsSubject": "Oppdater kontoen din",
|
||||
"executeActionsBody":
|
||||
"Administrator har anmodet at du oppdaterer din {2} konto. Klikk pÄ lenken nedenfor for Ä starte denne prosessen\n\n{0}\n\nDenne lenken vil utlÞpe om {1} minutter.\n\nHvis du ikke var klar over at administrator har bedt om dette, vennligst ignorer denne meldingen og ingenting vil bli endret.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Administrator har anmodet at du oppdaterer din {2} konto. Klikk pÄ linken nedenfor for Ä starte denne prosessen.</p><p><a href="{0}">{0}</a></p><p>Denne lenken vil utlÞpe om {1} minutter.</p><p>Hvis du ikke var klar over at administrator har bedt om dette, ignorer denne meldingen og ingenting vil bli endret. </p>',
|
||||
"eventLoginErrorSubject": "Innlogging feilet",
|
||||
"eventLoginErrorBody":
|
||||
"Et mislykket innloggingsforsÞk ble oppdaget pÄ din konto pÄ {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Et mislykket innloggingsforsÞk ble oppdaget pÄ din konto pÄ {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.</p>",
|
||||
"eventRemoveTotpSubject": "Fjern engangskode",
|
||||
"eventRemoveTotpBody": "Engangskode ble fjernet fra kontoen din pÄ {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>Engangskode ble fjernet fra kontoen din pÄ {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.</p>",
|
||||
"eventUpdatePasswordSubject": "Oppdater passord",
|
||||
"eventUpdatePasswordBody": "Ditt passord ble endret i {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.",
|
||||
"eventUpdatePasswordBodyHtml": "<p>Ditt passord ble endret i {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator. </p>",
|
||||
"eventUpdateTotpSubject": "Oppdater engangskode",
|
||||
"eventUpdateTotpBody": "Engangskode ble oppdatert for kontoen din pÄ {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>Engangskode ble oppdatert for kontoen din pÄ {0} fra {1}. Hvis dette ikke var deg, vennligst kontakt administrator. </p>",
|
||||
},
|
||||
"pl": {
|
||||
"emailVerificationSubject": "Zweryfikuj email",
|
||||
"emailVerificationBody":
|
||||
"KtoĆ utworzyĆ juĆŒ konto {2} z tym adresem e-mail. JeĆli to Ty, kliknij poniĆŒszy link, aby zweryfikowaÄ swĂłj adres e-mail \n\n{0}\n\nLink ten wygaĆnie w ciÄ
gu {3}.\n\nJeĆli nie utworzyĆeĆ tego konta, po prostu zignoruj tÄ wiadomoĆÄ.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>KtoĆ utworzyĆ juĆŒ konto {2} z tym adresem e-mail. JeĆli to Ty, kliknij <a href="{0}">ten link</a> aby zweryfikowaÄ swĂłj adres e-mail</p><p>Link ten wygaĆnie w ciÄ
gu {3}</p><p>JeĆli nie utworzyĆeĆ tego konta, po prostu zignoruj tÄ wiadomoĆÄ.</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - wiadomoĆÄ testowa SMTP",
|
||||
"emailTestBody": "To jest wiadomoĆÄ testowa",
|
||||
"emailTestBodyHtml": "<p>To jest wiadomoĆÄ testowa</p>",
|
||||
"identityProviderLinkSubject": "Link {0}",
|
||||
"identityProviderLinkBody":
|
||||
'KtoĆ chce poĆÄ
czyÄ Twoje konto "{1}" z kontem "{0}" uĆŒytkownika {2}. JeĆli to Ty, kliknij poniĆŒszy link by poĆÄ
czyÄ konta\n\n{3}\n\nTen link wygaĆnie w ciÄ
gu {5}.\n\nJeĆli nie chcesz poĆÄ
czyÄ konta to zignoruj tÄ wiadomoĆÄ. JeĆli poĆÄ
czysz konta, bÄdziesz mĂłgĆ siÄ zalogowaÄ na {1} przez {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>KtoĆ chce poĆÄ
czyÄ Twoje konto <b>{1}</b> z kontem <b>{0}</b> uĆŒytkownika {2}. JeĆli to Ty, kliknij <a href="{3}">ten link</a> by poĆÄ
czyÄ konta.</p><p>Ten link wygaĆnie w ciÄ
gu {5}.</p><p>JeĆli nie chcesz poĆÄ
czyÄ konta to zignoruj tÄ wiadomoĆÄ. JeĆli poĆÄ
czysz konta, bÄdziesz mĂłgĆ siÄ zalogowaÄ na {1} przez {0}.</p>',
|
||||
"passwordResetSubject": "Zresetuj hasĆo",
|
||||
"passwordResetBody":
|
||||
"KtoĆ wĆaĆnie poprosiĆ o zmianÄ danych logowania Twojego konta {2}. JeĆli to Ty, kliknij poniĆŒszy link, aby je zresetowaÄ.\n\n{0}\n\nTen link i kod stracÄ
waĆŒnoĆÄ w ciÄ
gu {3}.\n\nJeĆli nie chcesz zresetowaÄ swoich danych logowania, po prostu zignoruj tÄ wiadomoĆÄ i nic siÄ nie zmieni.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>KtoĆ wĆaĆnie poprosiĆ o zmianÄ poĆwiadczeĆ Twojego konta {2}. JeĆli to Ty, kliknij poniĆŒszy link, aby je zresetowaÄ.</p><p><a href="{0}">Link do resetowania poĆwiadczeĆ</a></p><p>Ten link wygaĆnie w ciÄ
gu {3}.</p><p>JeĆli nie chcesz resetowaÄ swoich poĆwiadczeĆ, po prostu zignoruj tÄ wiadomoĆÄ i nic siÄ nie zmieni.</p>',
|
||||
"executeActionsSubject": "Zaktualizuj swoje konto",
|
||||
"executeActionsBody":
|
||||
"Administrator wĆaĆnie zaĆŒÄ
daĆ aktualizacji konta {2} poprzez wykonanie nastÄpujÄ
cych dziaĆaĆ: {3}. Kliknij poniĆŒszy link, aby rozpoczÄ
Ä ten proces.\n\n{0}\n\nTen link wygaĆnie w ciÄ
gu {4}.\n\nJeĆli nie masz pewnoĆci, ĆŒe administrator tego zaĆŒÄ
daĆ, po prostu zignoruj tÄ wiadomoĆÄ i nic siÄ nie zmieni.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Administrator wĆaĆnie zaĆŒÄ
daĆ aktualizacji konta {2} poprzez wykonanie nastÄpujÄ
cych dziaĆaĆ: {3}. Kliknij <a href="{0}">ten link</a>, aby rozpoczÄ
Ä proces.</p><p>Link ten wygaĆnie w ciÄ
gu {4}.</p><p>JeĆli nie masz pewnoĆci, ĆŒe administrator tego zaĆŒÄ
daĆ, po prostu zignoruj tÄ wiadomoĆÄ i nic siÄ nie zmieni.</p>',
|
||||
"eventLoginErrorSubject": "BĆÄ
d logowania",
|
||||
"eventLoginErrorBody":
|
||||
"Nieudana prĂłba logowania zostaĆa wykryta na Twoim koncie {0} z {1}. JeĆli to nie Ty, skontaktuj siÄ z administratorem.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Nieudana prĂłba logowania zostaĆa wykryta na Twoim koncie {0} z {1}. JeĆli to nie Ty, skontaktuj siÄ z administratorem.</p>",
|
||||
"eventRemoveTotpSubject": "UsuĆ hasĆo jednorazowe (OTP)",
|
||||
"eventRemoveTotpBody":
|
||||
"HasĆo jednorazowe (OTP) zostaĆo usuniÄte z Twojego konta w {0} z {1}. JeĆli to nie Ty, skontaktuj siÄ z administratorem.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>HasĆo jednorazowe (OTP) zostaĆo usuniÄte z Twojego konta w {0} z {1}. JeĆli to nie Ty, skontaktuj siÄ z administratorem.</p>",
|
||||
"eventUpdatePasswordSubject": "Aktualizuj hasĆo",
|
||||
"eventUpdatePasswordBody": "Twoje hasĆo zostaĆo zmienione {0} z {1}. JeĆli to nie Ty, skontaktuj siÄ z administratorem.",
|
||||
"eventUpdatePasswordBodyHtml": "<p>Twoje hasĆo zostaĆo zmienione {0} z {1}. JeĆli to nie Ty, skontaktuj siÄ z administratorem.</p>",
|
||||
"eventUpdateTotpSubject": "Aktualizuj hasĆo jednorazowe (OTP)",
|
||||
"eventUpdateTotpBody":
|
||||
"HasĆo jednorazowe (OTP) zostaĆo zaktualizowane na Twoim koncie {0} z {1}. JeĆli to nie Ty, skontaktuj siÄ z administratorem.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>HasĆo jednorazowe (OTP) zostaĆo zaktualizowane na Twoim koncie {0} z {1}. JeĆli to nie Ty, skontaktuj siÄ z administratorem.</p>",
|
||||
"requiredAction.CONFIGURE_TOTP": "Konfiguracja hasĆa jednorazowego (OTP)",
|
||||
"requiredAction.terms_and_conditions": "Regulamin",
|
||||
"requiredAction.UPDATE_PASSWORD": "Aktualizacja hasĆa",
|
||||
"requiredAction.UPDATE_PROFILE": "Aktualizacja profilu",
|
||||
"requiredAction.VERIFY_EMAIL": "Weryfikacja adresu e-mail",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "sekund",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "sekunda",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.2": "sekundy",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.3": "sekundy",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.4": "sekundy",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "minut",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "minuta",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.2": "minuty",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.3": "minuty",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.4": "minuty",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "godzin",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "godzina",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.2": "godziny",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.3": "godziny",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.4": "godziny",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "dni",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "dzieĆ",
|
||||
"emailVerificationBodyCode": "PotwierdĆș swĂłj adres e-mail wprowadzajÄ
c nastÄpujÄ
cy kod.\n\n{0}\n\n.",
|
||||
"emailVerificationBodyCodeHtml": "<p>PotwierdĆș swĂłj adres e-mail, wprowadzajÄ
c nastÄpujÄ
cy kod.</p><p><b>{0}</b></p>",
|
||||
},
|
||||
"pt-BR": {
|
||||
"emailVerificationSubject": "Verificação de e-mail",
|
||||
"emailVerificationBody":
|
||||
"AlguĂ©m criou uma conta {2} com este endereço de e-mail. Se foi vocĂȘ, clique no link abaixo para verificar o seu endereço de email\n\n{0}\n\nEste link irĂĄ expirar dentro de {3}.\n\nSe nĂŁo foi vocĂȘ que criou esta conta, basta ignorar esta mensagem.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>AlguĂ©m criou uma conta {2} com este endereço de e-mail. Se foi vocĂȘ, clique no link abaixo para verificar o seu endereço de email</p><p><a href="{0}">{0}</a></p><p>Este link irĂĄ expirar dentro de {3}.</p><p>Se nĂŁo foi vocĂȘ que criou esta conta, basta ignorar esta mensagem.</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - SMTP mensagem de teste",
|
||||
"emailTestBody": "Esta Ă© uma mensagem de teste",
|
||||
"emailTestBodyHtml": "<p>Esta Ă© uma mensagem de teste</p>",
|
||||
"identityProviderLinkSubject": "Vincular {0}",
|
||||
"identityProviderLinkBody":
|
||||
'AlguĂ©m quer vincular sua conta "{1}" com a conta "{0}" do usuĂĄrio {2} . Se foi vocĂȘ, clique no link abaixo para vincular as contas.\n\n{3}\n\nEste link irĂĄ expirar em {5}.\n\nSe vocĂȘ nĂŁo quer vincular a conta, apenas ignore esta mensagem. Se vocĂȘ vincular as contas, vocĂȘ serĂĄ capaz de logar em {1} atrĂĄvĂ©s de {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>AlguĂ©m quer vincular sua conta <b>{1}</b> com a conta <b>{0}</b> do usuĂĄrio {2} . Se foi vocĂȘ, clique no link abaixo para vincular as contas.</p><p><a href="{3}">{3}</a></p><p>Este link irĂĄ expirar em {5}.</p><p>Se vocĂȘ nĂŁo quer vincular a conta, apenas ignore esta mensagem. Se vocĂȘ vincular as contas, vocĂȘ serĂĄ capaz de logar em {1} atrĂĄvĂ©s de {0}.</p>',
|
||||
"passwordResetSubject": "Redefinição de senha",
|
||||
"passwordResetBody":
|
||||
"AlguĂ©m solicitou uma alteração de senha da sua conta {2}. Se foi vocĂȘ, clique no link abaixo para redefini-la.\n\n{0}\n\nEste link e cĂłdigo expiram em {3}.\n\nSe vocĂȘ nĂŁo deseja redefinir sua senha, apenas ignore esta mensagem e nada serĂĄ alterado.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>AlguĂ©m solicitou uma alteração de senha da sua conta {2}. Se foi vocĂȘ, clique no link abaixo para redefini-la.</p><p><a href="{0}">Link para redefinir a senha</a></p><p>Este link irĂĄ expirar em {3}.</p><p>Se vocĂȘ nĂŁo deseja redefinir sua senha, apenas ignore esta mensagem e nada serĂĄ alterado.</p>',
|
||||
"executeActionsSubject": "Atualização de conta",
|
||||
"executeActionsBody":
|
||||
"O administrador solicitou que vocĂȘ atualize sua conta {2} executando a(s) seguinte(s) ação(Ă”es): {3}. Clique no link abaixo para iniciar o processo.\n\n{0}\n\nEste link irĂĄ expirar em {4}.\n\nSe vocĂȘ nĂŁo tem conhecimento de que o administrador solicitou isso, basta ignorar esta mensagem e nada serĂĄ alterado.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>O administrador solicitou que vocĂȘ atualize sua conta {2} executando a(s) seguinte(s) ação(Ă”es): {3}. Clique no link abaixo para iniciar o processo.</p><p><a href="{0}">Link to account update</a></p><p>Este link irĂĄ expirar em {4}.</p><p>Se vocĂȘ nĂŁo tem conhecimento de que o administrador solicitou isso, basta ignorar esta mensagem e nada serĂĄ alterado.</p>',
|
||||
"eventLoginErrorSubject": "Erro de login",
|
||||
"eventLoginErrorBody":
|
||||
"Uma tentativa de login mal sucedida para a sua conta foi detectada em {0} de {1}. Se nĂŁo foi vocĂȘ, por favor, entre em contato com um administrador.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Uma tentativa de login mal sucedida para a sua conta foi detectada em {0} de {1}. Se nĂŁo foi vocĂȘ, por favor, entre em contato com um administrador.</p>",
|
||||
"eventRemoveTotpSubject": "Remover OTP",
|
||||
"eventRemoveTotpBody": "OTP foi removido da sua conta em {0} de {1}. Se nĂŁo foi vocĂȘ, por favor, entre em contato com um administrador.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>OTP foi removido da sua conta em {0} de {1}. Se nĂŁo foi vocĂȘ, por favor, entre em contato com um administrador.</p>",
|
||||
"eventUpdatePasswordSubject": "Atualização de senha",
|
||||
"eventUpdatePasswordBody": "Sua senha foi alterada em {0} de {1}. Se nĂŁo foi vocĂȘ, por favor, entre em contato com um administrador.",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>Sua senha foi alterada em {0} de {1}. Se nĂŁo foi vocĂȘ, por favor, entre em contato com um administrador.</p>",
|
||||
"eventUpdateTotpSubject": "Atualização OTP",
|
||||
"eventUpdateTotpBody":
|
||||
"OTP foi atualizado para a sua conta em {0} de {1}. Se nĂŁo foi vocĂȘ, por favor, entre em contato com um administrador.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>OTP foi atualizado para a sua conta em {0} de {1}. Se nĂŁo foi vocĂȘ, por favor, entre em contato com um administrador.</p>",
|
||||
"requiredAction.CONFIGURE_TOTP": "Configurar OTP",
|
||||
"requiredAction.terms_and_conditions": "Termos e CondiçÔes",
|
||||
"requiredAction.UPDATE_PASSWORD": "Atualizar Senha",
|
||||
"requiredAction.UPDATE_PROFILE": "Atualizar Perfil",
|
||||
"requiredAction.VERIFY_EMAIL": "Verificar E-mail",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "segundos",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "segundo",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "minutos",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "minuto",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "horas",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "hora",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "dias",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "dia",
|
||||
"emailVerificationBodyCode": "Verifique seu endereço de e-mail digitando o seguinte código.\n\n{0}\n\n.",
|
||||
"emailVerificationBodyCodeHtml": "<p>Verifique seu endereço de e-mail digitando o seguinte código.</p><p><b>{0}</b></p>",
|
||||
},
|
||||
"ru": {
|
||||
"emailVerificationSubject": "ĐĐŸĐŽŃĐČĐ”ŃĐ¶ĐŽĐ”ĐœĐžĐ” E-mail",
|
||||
"emailVerificationBody":
|
||||
"ĐŃĐŸ-ŃĐŸ ŃĐŸĐ·ĐŽĐ°Đ» ŃŃĐ”ŃĐœŃŃ Đ·Đ°ĐżĐžŃŃ {2} Ń ŃŃĐžĐŒ E-mail. ĐŃлО ŃŃĐŸ бŃлО ĐŃ, ĐœĐ°Đ¶ĐŒĐžŃĐ” ĐœĐ° ŃлДЎŃŃŃŃŃ ŃŃŃĐ»ĐșŃ ĐŽĐ»Ń ĐżĐŸĐŽŃĐČĐ”ŃĐ¶ĐŽĐ”ĐœĐžŃ ĐČаŃĐ”ĐłĐŸ email\n\n{0}\n\nĐŃа ŃŃŃĐ»Đșа ŃŃŃаŃĐ”Đ”Ń ŃĐ”ŃДз {1} ĐŒĐžĐœŃŃ.\n\nĐŃлО ĐŃ ĐœĐ” ŃĐŸĐ·ĐŽĐ°ĐČалО ŃŃĐ”ŃĐœŃŃ Đ·Đ°ĐżĐžŃŃ, ĐżŃĐŸŃŃĐŸ ĐżŃĐŸĐžĐłĐœĐŸŃĐžŃŃĐčŃĐ” ŃŃĐŸ пОŃŃĐŒĐŸ.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>ĐŃĐŸ-ŃĐŸ ŃĐŸĐ·ĐŽĐ°Đ» ŃŃĐ”ŃĐœŃŃ Đ·Đ°ĐżĐžŃŃ {2} Ń ŃŃĐžĐŒ E-mail. ĐŃлО ŃŃĐŸ бŃлО ĐŃ, ĐœĐ°Đ¶ĐŒĐžŃĐ” ĐżĐŸ ŃŃŃĐ»ĐșĐ” ĐŽĐ»Ń ĐżĐŸĐŽŃĐČĐ”ŃĐ¶ĐŽĐ”ĐœĐžŃ ĐČаŃĐ”ĐłĐŸ E-mail</p><p><a href="{0}">{0}</a></p><p>ĐŃа ŃŃŃĐ»Đșа ŃŃŃаŃĐ”Đ”Ń ŃĐ”ŃДз {1} ĐŒĐžĐœŃŃ.</p><p>ĐŃлО ĐŃ ĐœĐ” ŃĐŸĐ·ĐŽĐ°ĐČалО ŃŃĐ”ŃĐœŃŃ Đ·Đ°ĐżĐžŃŃ, ĐżŃĐŸŃŃĐŸ ĐżŃĐŸĐžĐłĐœĐŸŃĐžŃŃĐčŃĐ” ŃŃĐŸ пОŃŃĐŒĐŸ.</p>',
|
||||
"identityProviderLinkSubject": "ĐĄŃŃĐ»Đșа {0}",
|
||||
"identityProviderLinkBody":
|
||||
'ĐŃĐŸ-ŃĐŸ Ń
ĐŸŃĐ”Ń ŃĐČŃзаŃŃ ĐČаŃŃ ŃŃĐ”ŃĐœŃŃ Đ·Đ°ĐżĐžŃŃ "{1}" Ń "{0}" ŃŃĐ”ŃĐœĐŸĐč запОŃŃŃ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃĐ”Đ»Ń {2} . ĐŃлО ŃŃĐŸ бŃлО ĐŃ, ĐœĐ°Đ¶ĐŒĐžŃĐ” ĐżĐŸ ŃлДЎŃŃŃĐ”Đč ŃŃŃĐ»ĐșĐ”, ŃŃĐŸĐ±Ń ŃĐČŃзаŃŃ ŃŃĐ”ŃĐœŃĐ” запОŃĐž\n\n{3}\n\nĐŃа ŃŃŃĐ»Đșа ŃŃŃаŃĐ”Đ”Ń ŃĐ”ŃДз {4} ĐŒĐžĐœŃŃ.\n\nĐŃлО ŃŃĐŸ ĐœĐ” Ń
ĐŸŃĐžŃĐ” ĐŸĐ±ŃĐ”ĐŽĐžĐœŃŃŃ ŃŃĐ”ŃĐœŃĐ” запОŃĐž, ĐżŃĐŸŃŃĐŸ ĐżŃĐŸĐžĐłĐœĐŸŃĐžŃĐčŃĐ” ŃŃĐŸ пОŃŃĐŒĐŸ. ĐĐŸŃлД ĐŸĐ±ŃĐ”ĐŽĐžĐœĐ”ĐœĐžŃ ŃŃĐ”ŃĐœŃŃ
запОŃĐ”Đč ĐŃ ĐŒĐŸĐ¶Đ”ŃĐ” ĐČĐŸĐčŃĐž ĐČ {1} ŃĐ”ŃДз {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>ĐŃĐŸ-ŃĐŸ Ń
ĐŸŃĐ”Ń ŃĐČŃзаŃŃ ĐČаŃŃ ŃŃĐ”ŃĐœŃŃ Đ·Đ°ĐżĐžŃŃ <b>{1}</b> Ń <b>{0}</b> ŃŃĐ”ŃĐœĐŸĐč запОŃŃŃ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃĐ”Đ»Ń {2} . ĐŃлО ŃŃĐŸ бŃлО ĐŃ, ĐœĐ°Đ¶ĐŒĐžŃĐ” ĐżĐŸ ŃлДЎŃŃŃĐ”Đč ŃŃŃĐ»ĐșĐ”, ŃŃĐŸĐ±Ń ŃĐČŃзаŃŃ ŃŃĐ”ŃĐœŃĐ” запОŃĐž</p><p><a href="{3}">{3}</a></p><p>ĐŃа ŃŃŃĐ»Đșа ŃŃŃаŃĐ”Đ”Ń ŃĐ”ŃДз {4} ĐŒĐžĐœŃŃ.</p><p>ĐŃлО ŃŃĐŸ ĐœĐ” Ń
ĐŸŃĐžŃĐ” ĐŸĐ±ŃĐ”ĐŽĐžĐœŃŃŃ ŃŃĐ”ŃĐœŃĐ” запОŃĐž, ĐżŃĐŸŃŃĐŸ ĐżŃĐŸĐžĐłĐœĐŸŃĐžŃĐčŃĐ” ŃŃĐŸ пОŃŃĐŒĐŸ. ĐĐŸŃлД ĐŸĐ±ŃĐ”ĐŽĐžĐœĐ”ĐœĐžŃ ŃŃĐ”ŃĐœŃŃ
запОŃĐ”Đč ĐŃ ĐŒĐŸĐ¶Đ”ŃĐ” ĐČĐŸĐčŃĐž ĐČ {1} ŃĐ”ŃДз {0}.</p>',
|
||||
"passwordResetSubject": "ХбŃĐŸŃ ĐżĐ°ŃĐŸĐ»Ń",
|
||||
"passwordResetBody":
|
||||
"ĐŃĐŸ-ŃĐŸ ŃĐŸĐ»ŃĐșĐŸ ŃŃĐŸ запŃĐŸŃОл ĐžĐ·ĐŒĐ”ĐœĐ”ĐœĐžĐ” паŃĐŸĐ»Ń ĐŸŃ ĐаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž {2}. ĐŃлО ŃŃĐŸ бŃлО ĐŃ, ĐœĐ°Đ¶ĐŒĐžŃĐ” ĐœĐ° ŃлДЎŃŃŃŃŃ ŃŃŃĐ»ĐșŃ, ŃŃĐŸĐ±Ń ŃбŃĐŸŃĐžŃŃ Đ”ĐłĐŸ.\n\n{0}\n\nĐŃа ŃŃŃĐ»Đșа ŃŃŃаŃĐ”Đ”Ń ŃĐ”ŃДз {1} ĐŒĐžĐœŃŃ.\n\nĐŃлО ĐŃ ĐœĐ” Ń
ĐŸŃĐžŃĐ” ŃбŃаŃŃĐČаŃŃ ĐżĐ°ŃĐŸĐ»Ń, ĐżŃĐŸŃŃĐŸ ĐżŃĐŸĐžĐłĐœĐŸŃĐžŃŃĐčŃĐ” ŃŃĐŸ пОŃŃĐŒĐŸ.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>ĐŃĐŸ-ŃĐŸ ŃĐŸĐ»ŃĐșĐŸ ŃŃĐŸ запŃĐŸŃОл ĐžĐ·ĐŒĐ”ĐœĐ”ĐœĐžĐ” паŃĐŸĐ»Ń ĐŸŃ ĐаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž {2}. ĐŃлО ŃŃĐŸ бŃлО ĐŃ, ĐœĐ°Đ¶ĐŒĐžŃĐ” ĐœĐ° ŃлДЎŃŃŃŃŃ ŃŃŃĐ»ĐșŃ, ŃŃĐŸĐ±Ń ŃбŃĐŸŃĐžŃŃ Đ”ĐłĐŸ.</p><p><a href="{0}">{0}</a></p><p>ĐŃа ŃŃŃĐ»Đșа ŃŃŃаŃĐ”Đ”Ń ŃĐ”ŃДз {1} ĐŒĐžĐœŃŃ.</p><p>ĐŃлО ĐŃ ĐœĐ” Ń
ĐŸŃĐžŃĐ” ŃбŃаŃŃĐČаŃŃ ĐżĐ°ŃĐŸĐ»Ń, ĐżŃĐŸŃŃĐŸ ĐżŃĐŸĐžĐłĐœĐŸŃĐžŃŃĐčŃĐ” ŃŃĐŸ пОŃŃĐŒĐŸ Đž ĐœĐžŃĐ”ĐłĐŸ ĐœĐ” ĐžĐ·ĐŒĐ”ĐœĐžŃŃŃ.</p>',
|
||||
"executeActionsSubject": "ĐĐ±ĐœĐŸĐČĐ»Đ”ĐœĐžĐ” ĐаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž",
|
||||
"executeActionsBody":
|
||||
"ĐĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃ ĐżŃĐŸŃĐžŃ ĐĐ°Ń ĐŸĐ±ĐœĐŸĐČĐžŃŃ ĐŽĐ°ĐœĐœŃĐ” ĐаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž {2}. ĐĐ°Đ¶ĐŒĐžŃĐ” ĐżĐŸ ŃлДЎŃŃŃĐ”Đč ŃŃŃĐ»ĐșĐ” ŃŃĐŸĐ±Ń ĐœĐ°ŃаŃŃ ŃŃĐŸŃ ĐżŃĐŸŃĐ”ŃŃ.\n\n{0}\n\nĐŃа ŃŃŃĐ»Đșа ŃŃŃаŃĐ”Đ”Ń ŃĐ”ŃДз {1} ĐŒĐžĐœŃŃ.\n\nĐŃлО Ń ĐČĐ°Ń Đ”ŃŃŃ ĐżĐŸĐŽĐŸĐ·ŃĐ”ĐœĐžŃ, ŃŃĐŸ Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃ ĐœĐ” ĐŒĐŸĐł ŃЎДлаŃŃ ŃаĐșĐŸĐč запŃĐŸŃ, ĐżŃĐŸŃŃĐŸ ĐżŃĐŸĐžĐłĐœĐŸŃĐžŃŃĐčŃĐ” ŃŃĐŸ пОŃŃĐŒĐŸ.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>ĐĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃ ĐżŃĐŸŃĐžŃ ĐĐ°Ń ĐŸĐ±ĐœĐŸĐČĐžŃŃ ĐŽĐ°ĐœĐœŃĐ” ĐаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž {2}. ĐĐ°Đ¶ĐŒĐžŃĐ” ĐżĐŸ ŃлДЎŃŃŃĐ”Đč ŃŃŃĐ»ĐșĐ” ŃŃĐŸĐ±Ń ĐœĐ°ŃаŃŃ ŃŃĐŸŃ ĐżŃĐŸŃĐ”ŃŃ.</p><p><a href="{0}">{0}</a></p><p>ĐŃа ŃŃŃĐ»Đșа ŃŃŃаŃĐ”Đ”Ń ŃĐ”ŃДз {1} ĐŒĐžĐœŃŃ.</p><p>ĐŃлО Ń ĐČĐ°Ń Đ”ŃŃŃ ĐżĐŸĐŽĐŸĐ·ŃĐ”ĐœĐžŃ, ŃŃĐŸ Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃ ĐœĐ” ĐŒĐŸĐł ŃЎДлаŃŃ ŃаĐșĐŸĐč запŃĐŸŃ, ĐżŃĐŸŃŃĐŸ ĐżŃĐŸĐžĐłĐœĐŸŃĐžŃŃĐčŃĐ” ŃŃĐŸ пОŃŃĐŒĐŸ.</p>',
|
||||
"eventLoginErrorSubject": "ĐŃОбĐșа ĐČŃ
ĐŸĐŽĐ°",
|
||||
"eventLoginErrorBody":
|
||||
"ĐŃла заŃĐžĐșŃĐžŃĐŸĐČĐ°ĐœĐ° ĐœĐ”ŃЎаŃĐœĐ°Ń ĐżĐŸĐżŃŃĐșа ĐČŃ
ĐŸĐŽĐ° ĐČ ĐаŃŃ ŃŃĐ”ŃĐœŃŃ Đ·Đ°ĐżĐžŃŃ {0} Ń {1}. ĐŃлО ŃŃĐŸ бŃлО ĐœĐ” ĐŃ, ĐżĐŸĐ¶Đ°Đ»ŃĐčŃŃа, ŃĐČŃжОŃĐ”ŃŃ Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃĐŸĐŒ.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>ĐŃла заŃĐžĐșŃĐžŃĐŸĐČĐ°ĐœĐ° ĐœĐ”ŃЎаŃĐœĐ°Ń ĐżĐŸĐżŃŃĐșа ĐČŃ
ĐŸĐŽĐ° ĐČ ĐаŃŃ ŃŃĐ”ŃĐœŃŃ Đ·Đ°ĐżĐžŃŃ {0} Ń {1}. ĐŃлО ŃŃĐŸ бŃлО ĐœĐ” ĐŃ, ĐżĐŸĐ¶Đ°Đ»ŃĐčŃŃа, ŃĐČŃжОŃĐ”ŃŃ Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃĐŸĐŒ.</p>",
|
||||
"eventRemoveTotpSubject": "УЎалОŃŃ OTP",
|
||||
"eventRemoveTotpBody": "OTP бŃĐ» ŃĐŽĐ°Đ»Đ”Đœ Оз ĐČаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž {0} c {1}. ĐŃлО ŃŃĐŸ бŃлО ĐœĐ” ĐŃ, ĐżĐŸĐ¶Đ°Đ»ŃĐčŃŃа, ŃĐČŃжОŃĐ”ŃŃ Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃĐŸĐŒ.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>OTP бŃĐ» ŃĐŽĐ°Đ»Đ”Đœ Оз ĐČаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž {0} c {1}. ĐŃлО ŃŃĐŸ бŃлО ĐœĐ” ĐŃ, ĐżĐŸĐ¶Đ°Đ»ŃĐčŃŃа, ŃĐČŃжОŃĐ”ŃŃ Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃĐŸĐŒ.</p>",
|
||||
"eventUpdatePasswordSubject": "ĐĐ±ĐœĐŸĐČĐ»Đ”ĐœĐžĐ” паŃĐŸĐ»Ń",
|
||||
"eventUpdatePasswordBody": "ĐĐ°Ń ĐżĐ°ŃĐŸĐ»Ń Đ±ŃĐ» ĐžĐ·ĐŒĐ”ĐœĐ”Đœ ĐČ {0} Ń {1}. ĐŃлО ŃŃĐŸ бŃлО ĐœĐ” ĐŃ, ĐżĐŸĐ¶Đ°Đ»ŃĐčŃŃа, ŃĐČŃжОŃĐ”ŃŃ Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃĐŸĐŒ.",
|
||||
"eventUpdatePasswordBodyHtml": "<p>ĐĐ°Ń ĐżĐ°ŃĐŸĐ»Ń Đ±ŃĐ» ĐžĐ·ĐŒĐ”ĐœĐ”Đœ ĐČ {0} Ń {1}. ĐŃлО ŃŃĐŸ бŃлО ĐœĐ” ĐŃ, ĐżĐŸĐ¶Đ°Đ»ŃĐčŃŃа, ŃĐČŃжОŃĐ”ŃŃ Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃĐŸĐŒ.</p>",
|
||||
"eventUpdateTotpSubject": "ĐĐ±ĐœĐŸĐČĐ»Đ”ĐœĐžĐ” OTP",
|
||||
"eventUpdateTotpBody": "OTP бŃĐ» ĐŸĐ±ĐœĐŸĐČĐ»Đ”Đœ ĐČ ĐČаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž {0} Ń {1}. ĐŃлО ŃŃĐŸ бŃлО ĐœĐ” ĐŃ, ĐżĐŸĐ¶Đ°Đ»ŃĐčŃŃа, ŃĐČŃжОŃĐ”ŃŃ Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃĐŸĐŒ.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>OTP бŃĐ» ĐŸĐ±ĐœĐŸĐČĐ»Đ”Đœ ĐČ ĐČаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž {0} Ń {1}. ĐŃлО ŃŃĐŸ бŃлО ĐœĐ” ĐŃ, ĐżĐŸĐ¶Đ°Đ»ŃĐčŃŃа, ŃĐČŃжОŃĐ”ŃŃ Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃĐŸĐŒ.</p>",
|
||||
},
|
||||
"sk": {
|
||||
"emailVerificationSubject": "Overenie e-mailu",
|
||||
"emailVerificationBody":
|
||||
"Niekto vytvoril ĂșÄet {2} s touto e-mailovou adresou. Ak ste to vy, kliknite na niĆŸĆĄie uvedenĂœ odkaz a overte svoju e-mailovĂș adresu \n\n{0}\n\nTento odkaz uplynie do {1} minĂșt.\n\nAk ste tento ĂșÄet nevytvorili, ignorujte tĂșto sprĂĄvu.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Niekto vytvoril ĂșÄet {2} s touto e-mailovou adresou. Ak ste to vy, kliknite na niĆŸĆĄie uvedenĂœ odkaz na overenie svojej e-mailovej adresy.</p><p><a href="{0}"> Odkaz na overenie e-mailovej adresy </a></p><p>PlatnosĆ„ odkazu vyprĆĄĂ za {1} minĂșt.</p><p> Ak ste tento ĂșÄet nevytvorili, ignorujte tĂșto sprĂĄvu.</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - Testovacia sprĂĄva SMTP",
|
||||
"emailTestBody": "Toto je skĂșĆĄobnĂĄ sprĂĄva",
|
||||
"emailTestBodyHtml": "<p>Toto je skĂșĆĄobnĂĄ sprĂĄva</p>",
|
||||
"identityProviderLinkSubject": "Odkaz {0}",
|
||||
"identityProviderLinkBody":
|
||||
'Niekto chce prepojiĆ„ vĂĄĆĄ ĂșÄet "{1}" s ĂșÄtom {0}"pouĆŸĂvateÄŸa {2}. Ak ste to vy, kliknutĂm na odkaz niĆŸĆĄie prepojte ĂșÄty. \n\n{3}\n\nTento odkaz uplynie do {4} minĂșt.\n\nAk nechcete prepojiĆ„ ĂșÄet, jednoducho ignorujte tĂșto sprĂĄvu , Ak prepĂĄjate ĂșÄty, budete sa mĂŽcĆ„ prihlĂĄsiĆ„ do {1} aĆŸ {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>Niekto chce prepojiĆ„ vĂĄĆĄ ĂșÄet <b>{1}</b> s ĂșÄtom <b>{0}</b> pouĆŸĂvateÄŸa {2}. Ak ste to vy, kliknutĂm na odkaz niĆŸĆĄie prepojte ĂșÄty</p><p><a href="{3}">Odkaz na potvrdenie prepojenia ĂșÄtu </a></p><p> PlatnosĆ„ tohto odkazu vyprĆĄĂ v rĂĄmci {4} minĂșt.</p><p>Ak nechcete prepojiĆ„ ĂșÄet, ignorujte tĂșto sprĂĄvu. Ak prepojujete ĂșÄty, budete sa mĂŽcĆ„ prihlĂĄsiĆ„ do {1} aĆŸ {0}.</p>',
|
||||
"passwordResetSubject": "Obnovenie hesla",
|
||||
"passwordResetBody":
|
||||
"Niekto poĆŸiadal, aby ste zmenili svoje poverenia ĂșÄtu {2}. Ak ste to vy, kliknite na odkaz uvedenĂœ niĆŸĆĄie, aby ste ich vynulovali.\n\n{0}\n\nTento odkaz a kĂłd uplynie do {1} minĂșt.\n\nAk nechcete obnoviĆ„ svoje poverenia , ignorujte tĂșto sprĂĄvu a niÄ sa nezmenĂ.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>Niekto poĆŸiadal, aby ste zmenili svoje poverenia ĂșÄtu {2}. Ak ste to vy, kliknutĂm na odkaz niĆŸĆĄie ich resetujte.</p><p><a href="{0}">Odkaz na obnovenie poverenĂ </a></p><p>PlatnosĆ„ tohto odkazu vyprĆĄĂ v priebehu {1} minĂșt.</p><p>Ak nechcete obnoviĆ„ svoje poverenia, ignorujte tĂșto sprĂĄvu a niÄ sa nezmenĂ.</p>',
|
||||
"executeActionsSubject": "Aktualizujte svoj ĂșÄet",
|
||||
"executeActionsBody":
|
||||
"VĂĄĆĄ administrĂĄtor prĂĄve poĆŸiadal o aktualizĂĄciu vĂĄĆĄho ĂșÄtu {2} vykonanĂm nasledujĂșcich akciĂ: {3}. KliknutĂm na odkaz uvedenĂœ niĆŸĆĄie spustĂte tento proces.\n\n{0}\n\nTento odkaz vyprĆĄĂ za {1} minĂșty.\n\nAk si nie ste vedomĂœ, ĆŸe vĂĄĆĄ adminstrĂĄtor o toto poĆŸiadal, ignorujte tĂșto sprĂĄvu a niÄ bude zmenenĂ©.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>VĂĄĆĄ sprĂĄvca prĂĄve poĆŸiadal o aktualizĂĄciu vĂĄĆĄho ĂșÄtu {2} vykonanĂm nasledujĂșcich akciĂ: {3}. KliknutĂm na odkaz uvedenĂœ niĆŸĆĄie spustĂte tento proces.</p><p><a href="{0}"> Odkaz na aktualizĂĄciu ĂșÄtu </a></p><p> PlatnosĆ„ tohto odkazu uplynie do {1} minĂșty.</p><p> Ak si nie ste vedomĂ, ĆŸe vĂĄĆĄ adminstrĂĄtor o toto poĆŸiadal, ignorujte tĂșto sprĂĄvu a niÄ sa nezmenĂ.</p>',
|
||||
"eventLoginErrorSubject": "Chyba prihlĂĄsenia",
|
||||
"eventLoginErrorBody":
|
||||
"Bol zistenĂœ neĂșspeĆĄnĂœ pokus o prihlĂĄsenie do vĂĄĆĄho ĂșÄtu v {0} z {1}. Ak ste to neboli vy, obrĂĄĆ„te sa na administrĂĄtora.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Bol zistenĂœ neĂșspeĆĄnĂœ pokus o prihlĂĄsenie vĂĄĆĄho ĂșÄtu na {0} z {1}. Ak ste to neboli vy, kontaktujte administrĂĄtora.</p>",
|
||||
"eventRemoveTotpSubject": "OdstråniƄ TOTP",
|
||||
"eventRemoveTotpBody": "OTP bol odstrĂĄnenĂœ z vĂĄĆĄho ĂșÄtu dĆa {0} z {1}. Ak ste to neboli vy, obrĂĄĆ„te sa na administrĂĄtora.",
|
||||
"eventRemoveTotpBodyHtml": "<p>OTP bol odstrĂĄnenĂœ z vĂĄĆĄho ĂșÄtu dĆa {0} z {1}. Ak ste to neboli vy, kontaktujte administrĂĄtora.</p>",
|
||||
"eventUpdatePasswordSubject": "AktualizovaƄ heslo",
|
||||
"eventUpdatePasswordBody": "Vaƥe heslo bolo zmenené na {0} z {1}. Ak ste to neboli vy, obråƄte sa na administråtora.",
|
||||
"eventUpdatePasswordBodyHtml": "<p>Vaƥe heslo bolo zmenené na {0} z {1}. Ak ste to neboli vy, kontaktujte administråtora.</p>",
|
||||
"eventUpdateTotpSubject": "AktualizĂĄcia TOTP",
|
||||
"eventUpdateTotpBody": "TOTP bol aktualizovanĂœ pre vĂĄĆĄ ĂșÄet na {0} z {1}. Ak ste to neboli vy, obrĂĄĆ„te sa na administrĂĄtora.",
|
||||
"eventUpdateTotpBodyHtml": "<p>TOTP bol aktualizovanĂœ pre vĂĄĆĄ ĂșÄet dĆa {0} z {1}. Ak ste to neboli vy, kontaktujte administrĂĄtora.</p>",
|
||||
"requiredAction.CONFIGURE_TOTP": "KonfigurĂĄcia OTP",
|
||||
"requiredAction.terms_and_conditions": "Zmluvné podmienky",
|
||||
"requiredAction.UPDATE_PASSWORD": "AktualizovaƄ heslo",
|
||||
"requiredAction.UPDATE_PROFILE": "AktualizovaƄ profil",
|
||||
"requiredAction.VERIFY_EMAIL": "OveriƄ e-mail",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "sekundy",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "sekunda",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "minuty",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "minĂșta",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "hodiny",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "hodina",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "dni",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "deĆ ",
|
||||
},
|
||||
"sv": {
|
||||
"emailVerificationSubject": "Verifiera e-post",
|
||||
"emailVerificationBody":
|
||||
"NÄgon har skapat ett {2} konto med den hÀr e-postadressen. Om det var du, klicka dÄ pÄ lÀnken nedan för att verifiera din e-postadress\n\n{0}\n\nDen hÀr lÀnken kommer att upphöra inom {1} minuter.\n\nOm det inte var du som skapade det hÀr kontot, ignorera i sÄ fall det hÀr meddelandet.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>NÄgon har skapat ett {2} konto med den hÀr e-postadressen. Om det var du, klicka dÄ pÄ lÀnken nedan för att verifiera din e-postadress</p><p><a href="{0}">{0}</a></p><p>Den hÀr lÀnken kommer att upphöra inom {1} minuter.</p><p>Om det inte var du som skapade det hÀr kontot, ignorera i sÄ fall det hÀr meddelandet.</p>',
|
||||
"identityProviderLinkSubject": "LĂ€nk {0}",
|
||||
"identityProviderLinkBody":
|
||||
'NÄgon vill lÀnka ditt "{1}" konto med "{0}" kontot tillhörande anvÀndaren {2} . Om det var du, klicka dÄ pÄ lÀnken nedan för att lÀnka kontona\n\n{3}\n\nDen hÀr lÀnken kommer att upphöra inom {4} minuter.\n\nOm du inte vill lÀnka kontot, ignorera i sÄ fall det hÀr meddelandet. Om du lÀnkar kontona, sÄ kan du logga in till {1} genom {0}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>NÄgon vill lÀnka ditt <b>{1}</b> konto med <b>{0}</b> kontot tillhörande anvÀndaren {2} . Om det var du, klicka dÄ pÄ lÀnken nedan för att lÀnka kontona</p><p><a href="{3}">{3}</a></p><p>Den hÀr lÀnken kommer att upphöra inom {4} minuter.</p><p>Om du inte vill lÀnka kontot, ignorera i sÄ fall det hÀr meddelandet. Om du lÀnkar kontona, sÄ kan du logga in till {1} genom {0}.</p>',
|
||||
"passwordResetSubject": "Ă
terstÀll lösenord",
|
||||
"passwordResetBody":
|
||||
"NÄgon har precis bett om att Àndra anvÀndaruppgifter för ditt konto {2}. Om det var du, klicka dÄ pÄ lÀnken nedan för att ÄterstÀlla dem.\n\n{0}\n\nDen hÀr lÀnken och koden kommer att upphöra inom {1} minuter.\n\nOm du inte vill ÄterstÀlla dina kontouppgifter, ignorera i sÄ fall det hÀr meddelandet sÄ kommer inget att Àndras.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>NÄgon har precis bett om att Àndra anvÀndaruppgifter för ditt konto {2}. Om det var du, klicka dÄ pÄ lÀnken nedan för att ÄterstÀlla dem.</p><p><a href="{0}">{0}</a></p><p>Den hÀr lÀnken och koden kommer att upphöra inom {1} minuter.</p><p>Om du inte vill ÄterstÀlla dina kontouppgifter, ignorera i sÄ fall det hÀr meddelandet sÄ kommer inget att Àndras.</p>',
|
||||
"executeActionsSubject": "Uppdatera ditt konto",
|
||||
"executeActionsBody":
|
||||
"Din administratör har precis bett om att du skall uppdatera ditt {2} konto. Klicka pÄ lÀnken för att pÄbörja processen.\n\n{0}\n\nDen hÀr lÀnken kommer att upphöra inom {1} minuter.\n\nOm du Àr omedveten om att din administratör har bett om detta, ignorera i sÄ fall det hÀr meddelandet sÄ kommer inget att Àndras.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Din administratör har precis bett om att du skall uppdatera ditt {2} konto. Klicka pÄ lÀnken för att pÄbörja processen.</p><p><a href="{0}">{0}</a></p><p>Den hÀr lÀnken kommer att upphöra inom {1} minuter.</p><p>Om du Àr omedveten om att din administratör har bett om detta, ignorera i sÄ fall det hÀr meddelandet sÄ kommer inget att Àndras.</p>',
|
||||
"eventLoginErrorSubject": "Inloggningsfel",
|
||||
"eventLoginErrorBody":
|
||||
"Ett misslyckat inloggningsförsök har upptÀckts pÄ ditt konto pÄ {0} frÄn {1}. Om det inte var du, vÀnligen kontakta i sÄ fall en administratör.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>Ett misslyckat inloggningsförsök har upptÀckts pÄ ditt konto den {0} frÄn {1}. Om det inte var du, vÀnligen kontakta i sÄ fall en administratör.</p>",
|
||||
"eventRemoveTotpSubject": "Ta bort OTP",
|
||||
"eventRemoveTotpBody": "OTP togs bort frÄn ditt konto den {0} frÄn {1}. Om det inte var du, vÀnligen kontakta i sÄ fall en administratör.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>OTP togs bort frÄn ditt konto den {0} frÄn {1}. Om det inte var du, vÀnligen kontakta i sÄ fall en administratör.</p>",
|
||||
"eventUpdatePasswordSubject": "Uppdatera lösenord",
|
||||
"eventUpdatePasswordBody": "Ditt lösenord Àndrades den {0} frÄn {1}. Om det inte var du, vÀnligen kontakta i sÄ fall en administratör.",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>Ditt lösenord Àndrades den {0} frÄn {1}. Om det inte var du, vÀnligen kontakta i sÄ fall en administratör.</p>",
|
||||
"eventUpdateTotpSubject": "Uppdatera OTP",
|
||||
"eventUpdateTotpBody": "OTP uppdaterades för ditt konto den {0} frÄn {1}. Om det inte var du, vÀnligen kontakta i sÄ fall en administratör.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>OTP uppdaterades för ditt konto den {0} frÄn {1}. Om det inte var du, vÀnligen kontakta i sÄ fall en administratör.</p>",
|
||||
},
|
||||
"tr": {
|
||||
"emailVerificationSubject": "E-postayı doÄrula",
|
||||
"emailVerificationBody":
|
||||
"Birisi bu e-posta adresiyle bir {2} hesap oluĆturdu. Bu sizseniz, e-posta adresinizi doÄrulamak için aĆaÄıdaki baÄlantıya tıklayın\n\n{0}\n\nBu baÄlantı {3} içinde sona erecek.\n\nBu hesabı oluĆturmadıysanız, sadece bu iletiyi yoksayınız.",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>Birisi bu e-posta adresiyle bir {2} hesap oluĆturdu. Bu sizseniz, e-posta adresinizi doÄrulamak için aĆaÄıdaki baÄlantıyı tıklayın.</p><p><a href="{0}">E-posta adresi doÄrulama adresi</a></p><p>Bu baÄlantının sĂŒresi {3} içerisinde sona erecek.</p><p>Bu hesabı siz oluĆturmadıysanız, bu mesajı göz ardı edin.</p>',
|
||||
"emailTestSubject": "[KEYCLOAK] - SMTP test mesajı",
|
||||
"emailTestBody": "Bu bir test mesajı",
|
||||
"emailTestBodyHtml": "<p>Bu bir test mesajı</p>",
|
||||
"identityProviderLinkSubject": "Link {0}",
|
||||
"identityProviderLinkBody":
|
||||
'Birisi "{1}" hesabınızı "{0}" kullanıcı hesabı {2} ile baÄlamak istiyor. Bu sizseniz, hesapları baÄlamak için aĆaÄıdaki baÄlantıyı tıklayın:\n\n{3}\n\nBu baÄlantı {5} içinde sona erecek.\n\nHesabınızı baÄlamak istemiyorsanız bu mesajı göz ardı edin. Hesapları baÄlarsanız, {1} ile {0} arasında oturum açabilirsiniz.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>Birisi <b> {1} </ b> hesabınızı {2} kullanıcısı <b> {0} </ b> hesabına baÄlamak istiyor. Bu sizseniz, baÄlantı vermek için aĆaÄıdaki baÄlantıyı tıklayın</p><p><a href="{3}">Hesap baÄlantısını onaylamak için baÄlantı</a></p><p>Bu baÄlantının sĂŒresi {5} içerisinde sona erecek.</p><p>Hesabı baÄlamak istemiyorsanız, bu mesajı göz ardı edin. Hesapları baÄlarsanız, {1} ile {0} arasında oturum açabilirsiniz.</p>',
|
||||
"passwordResetSubject": "Ćifreyi sıfırla",
|
||||
"passwordResetBody":
|
||||
"Birisi, {2} hesabınızın kimlik bilgilerini deÄiĆtirmeyi istedi.Bu sizseniz, sıfırlamak için aĆaÄıdaki baÄlantıyı tıklayın.\n\n{0}\n\nBu baÄlantı ve kod {3} içinde sona erecek.\n\nFakat bilgilerinizi sıfırlamak istemiyorsanız, Sadece bu mesajı görmezden gelin ve hiçbir Ćey deÄiĆmeyecek.",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>Birisi, {2} hesabınızın kimlik bilgilerini deÄiĆtirmeyi istedi. Sizseniz, sıfırlamak için aĆaÄıdaki linke tıklayınız.</p><p><a href="{0}">Kimlik bilgilerini sıfırlamak için baÄlantı</a></p><p>Bu baÄlantının sĂŒresi {3} içerisinde sona erecek.</p><p>Kimlik bilgilerinizi sıfırlamak istemiyorsanız, bu mesajı göz ardı edin.</p>',
|
||||
"executeActionsSubject": "Hesabınızı GĂŒncelleyin",
|
||||
"executeActionsBody":
|
||||
"Yöneticiniz aĆaÄıdaki iĆlemleri gerçekleĆtirerek {2} hesabınızı gĂŒncelledi: {3}. Bu iĆlemi baĆlatmak için aĆaÄıdaki linke tıklayın.\n\n{0}\n\nBu baÄlantının sĂŒresi {4} içerisinde sona erecek.\n\nYöneticinizin bunu istediÄinden habersizseniz, bu mesajı göz ardı edin ve hiçbir Ćey deÄiĆmez.",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>Yöneticiniz aĆaÄıdaki iĆlemleri gerçekleĆtirerek {2} hesabınızı gĂŒncelledi: {3}. Bu iĆlemi baĆlatmak için aĆaÄıdaki linke tıklayın.</p><p><a href="{0}">Hesap gĂŒncelleme baÄlantısı</a></p><p>Bu baÄlantının sĂŒresi {4} içerisinde sona erecek.</p><p>Yöneticinizin bunu istediÄinden habersizseniz, bu mesajı göz ardı edin ve hiçbir Ćey deÄiĆmez.</p>',
|
||||
"eventLoginErrorSubject": "Girià hatası",
|
||||
"eventLoginErrorBody": "{1} 'den {0} tarihinde baĆarısız bir giriĆ denemesi yapıldı. Bu siz deÄilseniz, lĂŒtfen yöneticiyle iletiĆime geçin.",
|
||||
"eventLoginErrorBodyHtml":
|
||||
"<p>{1} 'den {0} tarihinde baĆarısız bir giriĆ denemesi yapıldı. Bu siz deÄilseniz, lĂŒtfen yöneticiyle iletiĆime geçin.</p>",
|
||||
"eventRemoveTotpSubject": "OTP'yi kaldır",
|
||||
"eventRemoveTotpBody": "OTP, {0} tarihinden {1} tarihinde hesabınızdan kaldırıldı. Bu siz deÄilseniz, lĂŒtfen yöneticiyle iletiĆime geçin.",
|
||||
"eventRemoveTotpBodyHtml":
|
||||
"<p>OTP, {0} tarihinden {1} tarihinde hesabınızdan kaldırıldı. Bu siz deÄilseniz, lĂŒtfen yöneticiyle iletiĆime geçin.</p>",
|
||||
"eventUpdatePasswordSubject": "Ćifreyi gĂŒncelle",
|
||||
"eventUpdatePasswordBody": "Ćifreniz {0} tarihinde {0} tarihinde deÄiĆtirildi. Bu siz deÄilseniz, lĂŒtfen yöneticiyle iletiĆime geçin.",
|
||||
"eventUpdatePasswordBodyHtml":
|
||||
"<p>Ćifreniz {0} tarihinde {0} tarihinde deÄiĆtirildi. Bu siz deÄilseniz, lĂŒtfen yöneticiyle iletiĆime geçin.</p>",
|
||||
"eventUpdateTotpSubject": "OTP'yi GĂŒncelle",
|
||||
"eventUpdateTotpBody": "OTP, {0} tarihinden {1} tarihinde hesabınız için gĂŒncellendi. Bu siz deÄilseniz, lĂŒtfen yöneticiyle iletiĆime geçin.",
|
||||
"eventUpdateTotpBodyHtml":
|
||||
"<p>OTP, {0} tarihinden {1} tarihinde hesabınız için gĂŒncellendi. Bu siz deÄilseniz, lĂŒtfen yöneticiyle iletiĆime geçin.</p>",
|
||||
"requiredAction.CONFIGURE_TOTP": "OTP'yi yapılandır",
|
||||
"requiredAction.terms_and_conditions": "Ćartlar ve KoĆullar",
|
||||
"requiredAction.UPDATE_PASSWORD": "Ćifre GĂŒncelleme",
|
||||
"requiredAction.UPDATE_PROFILE": "Profilleri gĂŒncelle",
|
||||
"requiredAction.VERIFY_EMAIL": "E-mail doÄrula",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds": "saniye",
|
||||
"linkExpirationFormatter.timePeriodUnit.seconds.1": "saniye",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes": "dakika",
|
||||
"linkExpirationFormatter.timePeriodUnit.minutes.1": "dakika",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours": "saat",
|
||||
"linkExpirationFormatter.timePeriodUnit.hours.1": "saat",
|
||||
"linkExpirationFormatter.timePeriodUnit.days": "gĂŒn",
|
||||
"linkExpirationFormatter.timePeriodUnit.days.1": "gĂŒn",
|
||||
"emailVerificationBodyCode": "LĂŒtfen aĆaÄıdaki kodu girerek e-posta adresinizi doÄrulayın.\n\n{0}\n\n.",
|
||||
"emailVerificationBodyCodeHtml": "<p>LĂŒtfen aĆaÄıdaki kodu girerek e-posta adresinizi doÄrulayın.</p><p><b>{0}</b></p>",
|
||||
},
|
||||
"zh-CN": {
|
||||
"emailVerificationSubject": "éȘèŻç”ćéźä»¶",
|
||||
"emailVerificationBody":
|
||||
"çšæ·äœżçšćœćç”ćéźä»¶æłšć {2} 莊æ·ăćŠæŻæŹäșșæäœïŒèŻ·çčć»ä»„äžéŸæ„ćźæéźçź±éȘèŻ\n\n{0}\n\nèżäžȘéŸæ„äŒćš {1} ćéćèżæ.\n\nćŠææšæČĄææłšćçšæ·ïŒèŻ·ćżœç„èżæĄæ¶æŻă",
|
||||
"emailVerificationBodyHtml":
|
||||
'<p>çšæ·äœżçšćœćç”ćéźä»¶æłšć {2} 莊æ·ăćŠæŻæŹäșșæäœïŒèŻ·çčć»ä»„äžéŸæ„ćźæéźçź±éȘèŻ</p><p><a href="{0}">{0}</a></p><p>èżäžȘéŸæ„äŒćš {1} ćéćèżæ.</p><p>ćŠææšæČĄææłšćçšæ·ïŒèŻ·ćżœç„èżæĄæ¶æŻă</p>',
|
||||
"identityProviderLinkSubject": "éŸæ„ {0}",
|
||||
"identityProviderLinkBody":
|
||||
'æçšæ·æłèŠć°èŽŠæ· "{1}" äžçšæ·{2}ç莊æ·"{0}" ćéŸæ„ . ćŠææŻæŹäșșæäœïŒèŻ·çčć»ä»„äžéŸæ„ćźæéŸæ„èŻ·æ±\n\n{3}\n\nèżäžȘéŸæ„äŒćš {4} ćéćèżæ.\n\nćŠéæŹäșșæäœïŒèŻ·ćżœç„èżæĄæ¶æŻăćŠææšéŸæ„莊æ·ïŒæšć°ćŻä»„éèż{0}ç»ćœèŽŠæ· {1}.',
|
||||
"identityProviderLinkBodyHtml":
|
||||
'<p>æçšæ·æłèŠć°èŽŠæ· <b>{1}</b> äžçšæ·{2} ç莊æ·<b>{0}</b> ćéŸæ„ . ćŠææŻæŹäșșæäœïŒèŻ·çčć»ä»„äžéŸæ„ćźæéŸæ„èŻ·æ±</p><p><a href="{3}">{3}</a></p><p>èżäžȘéŸæ„äŒćš {4} ćéćèżæă</p><p>ćŠéæŹäșșæäœïŒèŻ·ćżœç„èżæĄæ¶æŻăćŠææšéŸæ„莊æ·ïŒæšć°ćŻä»„éèż{0}ç»ćœèŽŠæ· {1}.</p>',
|
||||
"passwordResetSubject": "éçœźćŻç ",
|
||||
"passwordResetBody":
|
||||
"æçšæ·èŠæ±äżźæčèŽŠæ· {2} çćŻç .ćŠæŻæŹäșșæäœïŒèŻ·çčć»äžéąéŸæ„èżèĄéçœź.\n\n{0}\n\nèżäžȘéŸæ„äŒćš {1} ćéćèżæ.\n\nćŠææšäžæłéçœźæšçćŻç ïŒèŻ·ćżœç„èżæĄæ¶æŻïŒćŻç äžäŒæčćă",
|
||||
"passwordResetBodyHtml":
|
||||
'<p>æçšæ·èŠæ±äżźæčèŽŠæ· {2} çćŻç ćŠæŻæŹäșșæäœïŒèŻ·çčć»äžéąéŸæ„èżèĄéçœź.</p><p><a href="{0}">{0}</a></p><p>èżäžȘéŸæ„äŒćš {1} ćéćèżæ</p><p>ćŠææšäžæłéçœźæšçćŻç ïŒèŻ·ćżœç„èżæĄæ¶æŻïŒćŻç äžäŒæčćă</p>',
|
||||
"executeActionsSubject": "æŽæ°æšç莊æ·",
|
||||
"executeActionsBody":
|
||||
"æšç知çćèŠæ±æšæŽæ°èŽŠæ· {2}. çčć»ä»„äžéŸæ„ćŒć§æŽæ°\n\n{0}\n\nèżäžȘéŸæ„äŒćš {1} ćéć怱æ.\n\nćŠææšäžç„é知çćèŠæ±æŽæ°èŽŠæ·äżĄæŻïŒèŻ·ćżœç„èżæĄæ¶æŻă莊æ·äżĄæŻäžäŒäżźæčă",
|
||||
"executeActionsBodyHtml":
|
||||
'<p>æšç知çćèŠæ±æšæŽæ°èŽŠæ·{2}. çčć»ä»„äžéŸæ„ćŒć§æŽæ°.</p><p><a href="{0}">{0}</a></p><p>èżäžȘéŸæ„äŒćš {1} ćéć怱æ.</p><p>ćŠææšäžç„é知çćèŠæ±æŽæ°èŽŠæ·äżĄæŻïŒèŻ·ćżœç„èżæĄæ¶æŻă莊æ·äżĄæŻäžäŒäżźæčă</p>',
|
||||
"eventLoginErrorSubject": "ç»ćœéèŻŻ",
|
||||
"eventLoginErrorBody": "ćš{0} ç± {1}äœżçšæšç莊æ·ç»ćœć€±èŽ„. ćŠæèżäžæŻæšæŹäșșæäœïŒèŻ·è系知çć.",
|
||||
"eventLoginErrorBodyHtml": "<p>ćš{0} ç± {1}äœżçšæšç莊æ·ç»ćœć€±èŽ„. ćŠæèżäžæŻæšæŹäșșæäœïŒèŻ·è系知çć.</p>",
|
||||
"eventRemoveTotpSubject": "ć é€ OTP",
|
||||
"eventRemoveTotpBody": "OTPćš {0} ç±{1} 仿šç莊æ·äžć é€.ćŠæèżäžæŻæšæŹäșșæäœïŒèŻ·è系知çć",
|
||||
"eventRemoveTotpBodyHtml": "<p>OTPćš {0} ç±{1} 仿šç莊æ·äžć é€.ćŠæèżäžæŻæšæŹäșșæäœïŒèŻ·è系知çćă</p>",
|
||||
"eventUpdatePasswordSubject": "æŽæ°ćŻç ",
|
||||
"eventUpdatePasswordBody": "æšçćŻç ćš{0} ç± {1}æŽæč. ćŠéæŹäșșæäœïŒèŻ·è系知çć",
|
||||
"eventUpdatePasswordBodyHtml": "<p>æšçćŻç ćš{0} ç± {1}æŽæč. ćŠéæŹäșșæäœïŒèŻ·è系知çć</p>",
|
||||
"eventUpdateTotpSubject": "æŽæ° OTP",
|
||||
"eventUpdateTotpBody": "æšèŽŠæ·çOTP é
çœźćš{0} ç± {1}æŽæč. ćŠéæŹäșșæäœïŒèŻ·è系知çćă",
|
||||
"eventUpdateTotpBodyHtml": "<p>æšèŽŠæ·çOTP é
çœźćš{0} ç± {1}æŽæč. ćŠéæŹäșșæäœïŒèŻ·è系知çćă</p>",
|
||||
},
|
||||
};
|
||||
/* spell-checker: enable */
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,278 +0,0 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
export const kcMessages = {
|
||||
"ca": {
|
||||
"invalidPasswordHistoryMessage": "Contrasenya incorrecta: no pot ser igual a cap de les Ășltimes {0} contrasenyes.",
|
||||
"invalidPasswordMinDigitsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.",
|
||||
"invalidPasswordMinLengthMessage": "Contrasenya incorrecta: longitud mĂnima {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} lletres minĂșscules.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} carĂ cters especials.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} lletres majĂșscules.",
|
||||
"invalidPasswordNotUsernameMessage": "Contrasenya incorrecta: no pot ser igual al nom d'usuari.",
|
||||
"invalidPasswordRegexPatternMessage": "Contrasenya incorrecta: no compleix l'expressiĂł regular.",
|
||||
},
|
||||
"de": {
|
||||
"invalidPasswordMinLengthMessage": "UngĂŒltiges Passwort: muss mindestens {0} Zeichen beinhalten.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "UngĂŒltiges Passwort: muss mindestens {0} Kleinbuchstaben beinhalten.",
|
||||
"invalidPasswordMinDigitsMessage": "UngĂŒltiges Passwort: muss mindestens {0} Ziffern beinhalten.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "UngĂŒltiges Passwort: muss mindestens {0} GroĂbuchstaben beinhalten.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "UngĂŒltiges Passwort: muss mindestens {0} Sonderzeichen beinhalten.",
|
||||
"invalidPasswordNotUsernameMessage": "UngĂŒltiges Passwort: darf nicht identisch mit dem Benutzernamen sein.",
|
||||
"invalidPasswordNotEmailMessage": "UngĂŒltiges Passwort: darf nicht identisch mit der E-Mail-Adresse sein.",
|
||||
"invalidPasswordRegexPatternMessage": "UngĂŒltiges Passwort: stimmt nicht mit Regex-Muster ĂŒberein.",
|
||||
"invalidPasswordHistoryMessage": "UngĂŒltiges Passwort: darf nicht identisch mit einem der letzten {0} Passwörter sein.",
|
||||
"invalidPasswordBlacklistedMessage": "UngĂŒltiges Passwort: Passwort ist zu bekannt und auf der schwarzen Liste.",
|
||||
"invalidPasswordGenericMessage": "UngĂŒltiges Passwort: neues Passwort erfĂŒllt die Passwort-Anforderungen nicht.",
|
||||
},
|
||||
"en": {
|
||||
"invalidPasswordMinLengthMessage": "Invalid password: minimum length {0}.",
|
||||
"invalidPasswordMaxLengthMessage": "Invalid password: maximum length {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Invalid password: must contain at least {0} lower case characters.",
|
||||
"invalidPasswordMinDigitsMessage": "Invalid password: must contain at least {0} numerical digits.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Invalid password: must contain at least {0} upper case characters.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Invalid password: must contain at least {0} special characters.",
|
||||
"invalidPasswordNotUsernameMessage": "Invalid password: must not be equal to the username.",
|
||||
"invalidPasswordNotEmailMessage": "Invalid password: must not be equal to the email.",
|
||||
"invalidPasswordRegexPatternMessage": "Invalid password: fails to match regex pattern(s).",
|
||||
"invalidPasswordHistoryMessage": "Invalid password: must not be equal to any of last {0} passwords.",
|
||||
"invalidPasswordBlacklistedMessage": "Invalid password: password is blacklisted.",
|
||||
"invalidPasswordGenericMessage": "Invalid password: new password does not match password policies.",
|
||||
"ldapErrorInvalidCustomFilter": 'Custom configured LDAP filter does not start with "(" or does not end with ")".',
|
||||
"ldapErrorConnectionTimeoutNotNumber": "Connection Timeout must be a number",
|
||||
"ldapErrorReadTimeoutNotNumber": "Read Timeout must be a number",
|
||||
"ldapErrorMissingClientId": "Client ID needs to be provided in config when Realm Roles Mapping is not used.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType":
|
||||
"Not possible to preserve group inheritance and use UID membership type together.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "Can not set write only when LDAP provider mode is not WRITABLE",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "Can not set write-only and read-only together",
|
||||
"ldapErrorCantEnableStartTlsAndConnectionPooling": "Can not enable both StartTLS and connection pooling.",
|
||||
"ldapErrorCantEnableUnsyncedAndImportOff": "Can not disable Importing users when LDAP provider mode is UNSYNCED",
|
||||
"ldapErrorMissingGroupsPathGroup": "Groups path group does not exist - please create the group on specified path first",
|
||||
"clientRedirectURIsFragmentError": "Redirect URIs must not contain an URI fragment",
|
||||
"clientRootURLFragmentError": "Root URL must not contain an URL fragment",
|
||||
"clientRootURLIllegalSchemeError": "Root URL uses an illegal scheme",
|
||||
"clientBaseURLIllegalSchemeError": "Base URL uses an illegal scheme",
|
||||
"backchannelLogoutUrlIllegalSchemeError": "Backchannel logout URL uses an illegal scheme",
|
||||
"clientRedirectURIsIllegalSchemeError": "A redirect URI uses an illegal scheme",
|
||||
"clientBaseURLInvalid": "Base URL is not a valid URL",
|
||||
"clientRootURLInvalid": "Root URL is not a valid URL",
|
||||
"clientRedirectURIsInvalid": "A redirect URI is not a valid URI",
|
||||
"backchannelLogoutUrlIsInvalid": "Backchannel logout URL is not a valid URL",
|
||||
"pairwiseMalformedClientRedirectURI": "Client contained an invalid redirect URI.",
|
||||
"pairwiseClientRedirectURIsMissingHost": "Client redirect URIs must contain a valid host component.",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"Without a configured Sector Identifier URI, client redirect URIs must not contain multiple host components.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "Malformed Sector Identifier URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "Failed to get redirect URIs from the Sector Identifier URI.",
|
||||
"pairwiseRedirectURIsMismatch": "Client redirect URIs does not match redirect URIs fetched from the Sector Identifier URI.",
|
||||
"error-invalid-value": "Invalid value.",
|
||||
"error-invalid-blank": "Please specify value.",
|
||||
"error-empty": "Please specify value.",
|
||||
"error-invalid-length": "Attribute {0} must have a length between {1} and {2}.",
|
||||
"error-invalid-length-too-short": "Attribute {0} must have minimal length of {1}.",
|
||||
"error-invalid-length-too-long": "Attribute {0} must have maximal length of {2}.",
|
||||
"error-invalid-email": "Invalid email address.",
|
||||
"error-invalid-number": "Invalid number.",
|
||||
"error-number-out-of-range": "Attribute {0} must be a number between {1} and {2}.",
|
||||
"error-number-out-of-range-too-small": "Attribute {0} must have minimal value of {1}.",
|
||||
"error-number-out-of-range-too-big": "Attribute {0} must have maximal value of {2}.",
|
||||
"error-pattern-no-match": "Invalid value.",
|
||||
"error-invalid-uri": "Invalid URL.",
|
||||
"error-invalid-uri-scheme": "Invalid URL scheme.",
|
||||
"error-invalid-uri-fragment": "Invalid URL fragment.",
|
||||
"error-user-attribute-required": "Please specify attribute {0}.",
|
||||
"error-invalid-date": "Attribute {0} is invalid date.",
|
||||
"error-user-attribute-read-only": "Attribute {0} is read only.",
|
||||
"error-username-invalid-character": "{0} contains invalid character.",
|
||||
"error-person-name-invalid-character": "{0} contains invalid character.",
|
||||
},
|
||||
"es": {
|
||||
"invalidPasswordMinLengthMessage": "Contraseña incorrecta: longitud mĂnima {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Contraseña incorrecta: debe contener al menos {0} letras minĂșsculas.",
|
||||
"invalidPasswordMinDigitsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Contraseña incorrecta: debe contener al menos {0} letras mayĂșsculas.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres especiales.",
|
||||
"invalidPasswordNotUsernameMessage": "Contraseña incorrecta: no puede ser igual al nombre de usuario.",
|
||||
"invalidPasswordRegexPatternMessage": "Contraseña incorrecta: no cumple la expresión regular.",
|
||||
"invalidPasswordHistoryMessage": "Contraseña incorrecta: no puede ser igual a ninguna de las Ășltimas {0} contraseñas.",
|
||||
},
|
||||
"fr": {
|
||||
"invalidPasswordMinLengthMessage": "Mot de passe invalide : longueur minimale requise de {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Mot de passe invalide : doit contenir au moins {0} lettre(s) en minuscule.",
|
||||
"invalidPasswordMinDigitsMessage": "Mot de passe invalide : doit contenir au moins {0} chiffre(s).",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Mot de passe invalide : doit contenir au moins {0} lettre(s) en majuscule.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Mot de passe invalide : doit contenir au moins {0} caractÚre(s) spéciaux.",
|
||||
"invalidPasswordNotUsernameMessage": "Mot de passe invalide : ne doit pas ĂȘtre identique au nom d'utilisateur.",
|
||||
"invalidPasswordRegexPatternMessage": "Mot de passe invalide : ne valide pas l'expression rationnelle.",
|
||||
"invalidPasswordHistoryMessage": "Mot de passe invalide : ne doit pas ĂȘtre Ă©gal aux {0} derniers mot de passe.",
|
||||
},
|
||||
"it": {},
|
||||
"ja": {
|
||||
"invalidPasswordMinLengthMessage": "çĄćčăȘăăčăŻăŒă: æć°{0}ăźé·ăăćż
èŠă§ăă",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźć°æćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinDigitsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźæ°ćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźć€§æćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinSpecialCharsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźçčæźæćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordNotUsernameMessage": "çĄćčăȘăăčăŻăŒă: ăŠăŒă¶ăŒćăšćăăăčăŻăŒăăŻçŠæąăăăŠăăŸăă",
|
||||
"invalidPasswordRegexPatternMessage": "çĄćčăȘăăčăŻăŒă: æŁèŠèĄšçŸăăżăŒăłăšäžèŽăăŸăăă",
|
||||
"invalidPasswordHistoryMessage": "çĄćčăȘăăčăŻăŒă: æèżăź{0}ăăčăŻăŒăăźăăăăăšćăăăčăŻăŒăăŻçŠæąăăăŠăăŸăă",
|
||||
"invalidPasswordBlacklistedMessage": "çĄćčăȘăăčăŻăŒă: ăăčăŻăŒăăăă©ăăŻăȘăčăă«ć«ăŸăăŠăăŸăă",
|
||||
"invalidPasswordGenericMessage": "çĄćčăȘăăčăŻăŒă: æ°ăăăăčăŻăŒăăŻăăčăŻăŒăă»ăăȘă·ăŒăšäžèŽăăŸăăă",
|
||||
"ldapErrorInvalidCustomFilter": "LDAPăăŁă«ăżăŒăźă«ăčăżă èšćźăăă(ăăăéć§ăŸăăŻă)ăă§ç”äșăšăȘăŁăŠăăŸăăă",
|
||||
"ldapErrorConnectionTimeoutNotNumber": "æ„ç¶ăżă€ă ăąăŠăăŻæ°ćă§ăȘăăă°ăȘăăŸăă",
|
||||
"ldapErrorReadTimeoutNotNumber": "èȘăżćăăżă€ă ăąăŠăăŻæ°ćă§ăȘăăă°ăȘăăŸăă",
|
||||
"ldapErrorMissingClientId": "ăŹă«ă ăăŒă«ă»ăăăăłă°ăäœżçšăăȘăć ŽćăŻăăŻă©ă€ăąăłăIDăŻèšćźć
ă§æäŸăăăćż
èŠăăăăŸăă",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType":
|
||||
"ă°ă«ăŒăăźç¶æżăç¶æăăăăšăšăUIDăĄăłăăŒă·ăăă»ăżă€ăăäœżçšăăăăšăŻćæă«ă§ăăŸăăă",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "LDAPăăăă€ăăŒă»ăąăŒăăWRITABLEă§ăŻăȘăć ŽćăŻăwrite onlyăèšćźăăăăšăŻă§ăăŸăăă",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "write-onlyăšread-onlyăäžç·ă«èšćźăăăăšăŻă§ăăŸăăă",
|
||||
"ldapErrorCantEnableStartTlsAndConnectionPooling": "StartTLSăšæ„ç¶ăăŒăȘăłă°ăźäžĄæčăæćčă«ă§ăăŸăăă",
|
||||
"clientRedirectURIsFragmentError": "ăȘăă€ăŹăŻăURIă«URIăă©ă°ăĄăłăăć«ăăăăšăŻă§ăăŸăăă",
|
||||
"clientRootURLFragmentError": "ă«ăŒăURLă«URLăă©ă°ăĄăłăăć«ăăăăšăŻă§ăăŸăăă",
|
||||
"pairwiseMalformedClientRedirectURI": "ăŻă©ă€ăąăłăă«çĄćčăȘăȘăă€ăŹăŻăURIăć«ăŸăăŠăăŸăăă",
|
||||
"pairwiseClientRedirectURIsMissingHost": "ăŻă©ă€ăąăłăăźăȘăă€ăŹăŻăURIă«ăŻæćčăȘăăčăă»ăłăłăăŒăăłăăć«ăŸăăŠăăćż
èŠăăăăŸăă",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"èšćźăăăă»ăŹăŻăżăŒèć„ćURIăăȘăć ŽćăŻăăŻă©ă€ăąăłăăźăȘăă€ăŹăŻăURIăŻè€æ°ăźăăčăă»ăłăłăăŒăăłăăć«ăăăšăŻă§ăăŸăăă",
|
||||
"pairwiseMalformedSectorIdentifierURI": "äžæŁăȘă»ăŹăŻăżăŒèć„ćURIă§ăă",
|
||||
"pairwiseFailedToGetRedirectURIs": "ă»ăŻăżăŒèć„ćURIăăăȘăă€ăŹăŻăURIăććŸă§ăăŸăăă§ăăă",
|
||||
"pairwiseRedirectURIsMismatch": "ăŻă©ă€ăąăłăăźăȘăă€ăŹăŻăURIăŻăă»ăŻăżăŒèć„ćURIăăăă§ăăăăăăȘăă€ăŹăŻăURIăšäžèŽăăŸăăă",
|
||||
},
|
||||
"lt": {
|
||||
"invalidPasswordMinLengthMessage": "Per trumpas slaptaĆŸodis: maĆŸiausias ilgis {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} maĆŸÄ
jÄ
raidÄ.",
|
||||
"invalidPasswordMinDigitsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} skaitmenÄŻ.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} didĆŸiÄ
jÄ
raidÄ.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} specialĆł simbolÄŻ.",
|
||||
"invalidPasswordNotUsernameMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis negali sutapti su naudotojo vardu.",
|
||||
"invalidPasswordRegexPatternMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis netenkina regex taisyklÄs(iĆł).",
|
||||
"invalidPasswordHistoryMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis negali sutapti su prieĆĄ tai buvusiais {0} slaptaĆŸodĆŸiais.",
|
||||
"ldapErrorInvalidCustomFilter": 'Sukonfigƫruotas LDAP filtras neprasideda "(" ir nesibaigia ")" simboliais.',
|
||||
"ldapErrorMissingClientId": "Privaloma nurodyti kliento ID kai srities roliĆł susiejimas nÄra nenaudojamas.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "GrupiĆł paveldÄjimo ir UID narystÄs tipas kartu negali bĆ«ti naudojami.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "Negalima nustatyti raĆĄymo rÄĆŸimo kuomet LDAP teikÄjo rÄĆŸimas ne WRITABLE",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "Negalima nustatyti tik raĆĄyti ir tik skaityti kartu",
|
||||
"clientRedirectURIsFragmentError": "Nurodykite URI fragmentÄ
, kurio negali bƫti peradresuojamuose URI adresuose",
|
||||
"clientRootURLFragmentError": "Nurodykite URL fragmentÄ
, kurio negali bƫti ƥakniniame URL adrese",
|
||||
"pairwiseMalformedClientRedirectURI": "Klientas pateikÄ neteisingÄ
nukreipimo nuorodÄ
.",
|
||||
"pairwiseClientRedirectURIsMissingHost": "Kliento nukreipimo nuorodos privalo bƫti nurodytos su serverio vardo komponentu.",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"Kuomet nesukonfigĆ«ruotas sektoriaus identifikatoriaus URL, kliento nukreipimo nuorodos privalo talpinti ne daugiau kaip vienÄ
skirtingÄ
serverio vardo komponentÄ
.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "Neteisinga sektoriaus identifikatoriaus URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "Nepavyko gauti nukreipimo nuorodĆł iĆĄ sektoriaus identifikatoriaus URI.",
|
||||
"pairwiseRedirectURIsMismatch": "Kliento nukreipimo nuoroda neatitinka nukreipimo nuorodĆł iĆĄ sektoriaus identifikatoriaus URI.",
|
||||
},
|
||||
"nl": {
|
||||
"invalidPasswordMinLengthMessage": "Ongeldig wachtwoord: de minimale lengte is {0} karakters.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} kleine letters bevatten.",
|
||||
"invalidPasswordMinDigitsMessage": "Ongeldig wachtwoord: het moet minstens {0} getallen bevatten.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} hoofdletters bevatten.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} speciale karakters bevatten.",
|
||||
"invalidPasswordNotUsernameMessage": "Ongeldig wachtwoord: het mag niet overeenkomen met de gebruikersnaam.",
|
||||
"invalidPasswordRegexPatternMessage": "Ongeldig wachtwoord: het voldoet niet aan het door de beheerder ingestelde patroon.",
|
||||
"invalidPasswordHistoryMessage": "Ongeldig wachtwoord: het mag niet overeen komen met een van de laatste {0} wachtwoorden.",
|
||||
"invalidPasswordGenericMessage": "Ongeldig wachtwoord: het nieuwe wachtwoord voldoet niet aan het wachtwoordbeleid.",
|
||||
"ldapErrorInvalidCustomFilter": 'LDAP filter met aangepaste configuratie start niet met "(" of eindigt niet met ")".',
|
||||
"ldapErrorConnectionTimeoutNotNumber": "Verbindingstimeout moet een getal zijn",
|
||||
"ldapErrorReadTimeoutNotNumber": "Lees-timeout moet een getal zijn",
|
||||
"ldapErrorMissingClientId": "Client ID moet ingesteld zijn als Realm Roles Mapping niet gebruikt wordt.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "Kan groepsovererving niet behouden bij UID-lidmaatschapstype.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "Alleen-schrijven niet mogelijk als LDAP provider mode niet WRITABLE is",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "Alleen-schrijven en alleen-lezen mogen niet tegelijk ingesteld zijn",
|
||||
"clientRedirectURIsFragmentError": "Redirect URIs mogen geen URI fragment bevatten",
|
||||
"clientRootURLFragmentError": "Root URL mag geen URL fragment bevatten",
|
||||
"pairwiseMalformedClientRedirectURI": "Client heeft een ongeldige redirect URI.",
|
||||
"pairwiseClientRedirectURIsMissingHost": "Client redirect URIs moeten een geldige host-component bevatten.",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"Zonder een geconfigureerde Sector Identifier URI mogen client redirect URIs niet meerdere host componenten hebben.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "Onjuist notatie in Sector Identifier URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "Kon geen redirect URIs verkrijgen van de Sector Identifier URI.",
|
||||
"pairwiseRedirectURIsMismatch": "Client redirect URIs komen niet overeen met redict URIs ontvangen van de Sector Identifier URI.",
|
||||
},
|
||||
"no": {
|
||||
"invalidPasswordMinLengthMessage": "Ugyldig passord: minimum lengde {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Ugyldig passord: mÄ inneholde minst {0} smÄ bokstaver.",
|
||||
"invalidPasswordMinDigitsMessage": "Ugyldig passord: mÄ inneholde minst {0} sifre.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Ugyldig passord: mÄ inneholde minst {0} store bokstaver.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Ugyldig passord: mÄ inneholde minst {0} spesialtegn.",
|
||||
"invalidPasswordNotUsernameMessage": "Ugyldig passord: kan ikke vĂŠre likt brukernavn.",
|
||||
"invalidPasswordRegexPatternMessage": "Ugyldig passord: tilfredsstiller ikke kravene for passord-mĂžnster.",
|
||||
"invalidPasswordHistoryMessage": "Ugyldig passord: kan ikke vÊre likt noen av de {0} foregÄende passordene.",
|
||||
"ldapErrorInvalidCustomFilter": 'Tilpasset konfigurasjon av LDAP-filter starter ikke med "(" eller slutter ikke med ")".',
|
||||
"ldapErrorMissingClientId": "KlientID mÄ vÊre tilgjengelig i config nÄr sikkerhetsdomenerollemapping ikke brukes.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "Ikke mulig Ă„ bevare gruppearv og samtidig bruke UID medlemskapstype.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "Kan ikke sette write-only nÄr LDAP leverandÞr-modus ikke er WRITABLE",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "Kan ikke sette bÄde write-only og read-only",
|
||||
},
|
||||
"pl": {},
|
||||
"pt-BR": {
|
||||
"invalidPasswordMinLengthMessage": "Senha invĂĄlida: deve conter ao menos {0} caracteres.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Senha invĂĄlida: deve conter ao menos {0} caracteres minĂșsculos.",
|
||||
"invalidPasswordMinDigitsMessage": "Senha invålida: deve conter ao menos {0} digitos numéricos.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Senha invĂĄlida: deve conter ao menos {0} caracteres maiĂșsculos.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Senha invĂĄlida: deve conter ao menos {0} caracteres especiais.",
|
||||
"invalidPasswordNotUsernameMessage": "Senha invĂĄlida: nĂŁo deve ser igual ao nome de usuĂĄrio.",
|
||||
"invalidPasswordRegexPatternMessage": "Senha invålida: falha ao passar por padrÔes.",
|
||||
"invalidPasswordHistoryMessage": "Senha invĂĄlida: nĂŁo deve ser igual Ă s Ășltimas {0} senhas.",
|
||||
"ldapErrorInvalidCustomFilter": 'Filtro LDAP nĂŁo inicia com "(" ou nĂŁo termina com ")".',
|
||||
"ldapErrorMissingClientId": "ID do cliente precisa ser definido na configuração quando mapeamentos de Roles do Realm não é utilizado.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType":
|
||||
"NĂŁo Ă© possĂvel preservar herança de grupos e usar tipo de associação de UID ao mesmo tempo.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "NĂŁo Ă© possĂvel definir modo de somente escrita quando o provedor LDAP nĂŁo suporta escrita",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "NĂŁo Ă© possĂvel definir somente escrita e somente leitura ao mesmo tempo",
|
||||
"clientRedirectURIsFragmentError": "URIs de redirecionamento nĂŁo podem conter fragmentos",
|
||||
"clientRootURLFragmentError": "URL raiz nĂŁo pode conter fragmentos",
|
||||
},
|
||||
"ru": {
|
||||
"invalidPasswordMinLengthMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: ĐŽĐ»ĐžĐœĐ° паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶ĐœĐ° бŃŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ(а).",
|
||||
"invalidPasswordMinDigitsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžŃŃ(Ń).",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ(а) ĐČ ĐœĐžĐ¶ĐœĐ”ĐŒ ŃДгОŃŃŃĐ”.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»ĐŸĐČ(а) ĐČ ĐČĐ”ŃŃ
ĐœĐ”ĐŒ ŃДгОŃŃŃĐ”.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃпДŃŃĐžĐŒĐČĐŸĐ»ĐŸĐČ(а).",
|
||||
"invalidPasswordNotUsernameMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐČпаЎаŃŃ Ń ĐžĐŒĐ”ĐœĐ”ĐŒ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃДлŃ.",
|
||||
"invalidPasswordRegexPatternMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ĐżŃĐŸŃДл ĐżŃĐŸĐČĐ”ŃĐșŃ ĐżĐŸ ŃДгŃĐ»ŃŃĐœĐŸĐŒŃ ĐČŃŃĐ°Đ¶Đ”ĐœĐžŃ.",
|
||||
"invalidPasswordHistoryMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐČпаЎаŃŃ Ń ĐżĐŸŃĐ»Đ”ĐŽĐœĐžĐŒ(Đž) {0} паŃĐŸĐ»Đ”ĐŒ(ŃĐŒĐž).",
|
||||
"invalidPasswordGenericMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: ĐœĐŸĐČŃĐč паŃĐŸĐ»Ń ĐœĐ” ŃĐŸĐŸŃĐČĐ”ŃŃŃĐČŃĐ”Ń ĐżŃаĐČĐžĐ»Đ°ĐŒ паŃĐŸĐ»Ń.",
|
||||
"ldapErrorInvalidCustomFilter": 'ĐĄĐșĐŸĐœŃОгŃŃĐžŃĐŸĐČĐ°ĐœĐœŃĐč ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃĐ”Đ»Đ”ĐŒ ŃОлŃŃŃ LDAP ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ĐœĐ°ŃĐžĐœĐ°ŃŃŃŃ Ń "(" ОлО заĐșĐ°ĐœŃĐžĐČаŃŃŃŃ ĐœĐ° ")".',
|
||||
"ldapErrorMissingClientId": "Client ID ĐŽĐŸĐ»Đ¶Đ”Đœ бŃŃŃ ĐœĐ°ŃŃŃĐŸĐ”Đœ ĐČ ĐșĐŸĐœŃОгŃŃаŃОО, Đ”ŃлО ĐœĐ” ĐžŃĐżĐŸĐ»ŃĐ·ŃĐ”ŃŃŃ ŃĐŸĐżĐŸŃŃаĐČĐ»Đ”ĐœĐžĐ” ŃĐŸĐ»Đ”Đč ĐČ realm.",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "ĐĐ” ŃĐŽĐ°Đ»ĐŸŃŃ ŃĐœĐ°ŃĐ»Đ”ĐŽĐŸĐČаŃŃ ĐłŃŃĐżĐżŃ Đž ĐžŃĐżĐŸĐ»ŃĐ·ĐŸĐČаŃŃ ŃĐ»Đ”ĐœŃŃĐČĐŸ UID ŃОпа ĐČĐŒĐ”ŃŃĐ”.",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": 'ĐĐ”ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ ŃŃŃĐ°ĐœĐŸĐČĐžŃŃ ŃĐ”Đ¶ĐžĐŒ "ŃĐŸĐ»ŃĐșĐŸ ĐœĐ° запОŃŃ", ĐșĐŸĐłĐŽĐ° LDAP ĐżŃĐŸĐČаĐčĐŽĐ”Ń ĐœĐ” ĐČ ŃĐ”Đ¶ĐžĐŒĐ” WRITABLE',
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": 'ĐĐ”ĐČĐŸĐ·ĐŒĐŸĐ¶ĐœĐŸ ĐŸĐŽĐœĐŸĐČŃĐ”ĐŒĐ”ĐœĐœĐŸ ŃŃŃĐ°ĐœĐŸĐČĐžŃŃ ŃĐ”Đ¶ĐžĐŒŃ "ŃĐŸĐ»ŃĐșĐŸ ĐœĐ° ŃŃĐ”ĐœĐžĐ”" Đž "ŃĐŸĐ»ŃĐșĐŸ ĐœĐ° запОŃŃ"',
|
||||
"clientRedirectURIsFragmentError": "URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ŃŃĐ°ĐłĐŒĐ”ĐœŃ URI",
|
||||
"clientRootURLFragmentError": "ĐĐŸŃĐœĐ”ĐČĐŸĐč URL ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ŃŃĐ°ĐłĐŒĐ”ĐœŃ URL ",
|
||||
"pairwiseMalformedClientRedirectURI": "ĐĐ»ĐžĐ”ĐœŃ ŃĐŸĐŽĐ”ŃĐ¶ĐžŃ ĐœĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ.",
|
||||
"pairwiseClientRedirectURIsMissingHost": "URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐșĐ»ĐžĐ”ĐœŃа ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃ Ń
ĐŸŃŃа.",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"ĐДз ĐșĐŸĐœŃОгŃŃаŃОО ĐżĐŸ ŃаŃŃĐž ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа URI, URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐșĐ»ĐžĐ”ĐœŃа ĐœĐ” ĐŒĐŸĐ¶Đ”Ń ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ”ŃĐșĐŸĐ»ŃĐșĐŸ ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃĐŸĐČ Ń
ĐŸŃŃа.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "ĐŃĐșĐ°Đ¶Đ”ĐœĐœĐ°Ń ŃаŃŃŃ ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "ĐĐ” ŃĐŽĐ°Đ»ĐŸŃŃ ĐżĐŸĐ»ŃŃĐžŃŃ ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃŃ URI пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐžĐ· ŃаŃŃĐž ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа URI.",
|
||||
"pairwiseRedirectURIsMismatch": "ĐĐ»ĐžĐ”ĐœŃ URI пДŃДаЎŃĐ”ŃаŃОО ĐœĐ” ŃĐŸĐŸŃĐČĐ”ŃŃŃĐČŃĐ”Ń URI пДŃДаЎŃĐ”ŃаŃОО, ĐżĐŸĐ»ŃŃĐ”ĐœĐœĐŸĐč Оз ŃаŃŃĐž ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа URI.",
|
||||
},
|
||||
"zh-CN": {
|
||||
"invalidPasswordMinLengthMessage": "æ æçćŻç ïŒæçéżćșŠ {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "æ æçćŻç ïŒèłć°ć
ć« {0} ć°ććæŻ",
|
||||
"invalidPasswordMinDigitsMessage": "æ æçćŻç ïŒèłć°ć
ć« {0} äžȘæ°ć",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "æ æçćŻç ïŒæçéżćșŠ {0} 性ććæŻ",
|
||||
"invalidPasswordMinSpecialCharsMessage": "æ æçćŻç ïŒæçéżćșŠ {0} çčæźć珊",
|
||||
"invalidPasswordNotUsernameMessage": "æ æçćŻç ïŒ äžćŻä»„äžçšæ·ćçžć",
|
||||
"invalidPasswordRegexPatternMessage": "æ æçćŻç ïŒ æ æłäžæŁćèĄšèŸŸćŒćčé
",
|
||||
"invalidPasswordHistoryMessage": "æ æçćŻç ïŒäžèœäžæćäœżçšç {0} äžȘćŻç çžć",
|
||||
"ldapErrorInvalidCustomFilter": 'ćźć¶ç LDAPèżæ»€ćšäžæŻä»„ "(" ćŒć€Žæä»„ ")"ç»ć°Ÿ.',
|
||||
"ldapErrorConnectionTimeoutNotNumber": "Connection Timeout ćż
饻æŻäžȘæ°ć",
|
||||
"ldapErrorMissingClientId": "ćœćè§èČæ ć°æȘćŻçšæ¶ïŒćźąæ·ç«Ż ID éèŠæćźă",
|
||||
"ldapErrorCantPreserveGroupInheritanceWithUIDMembershipType": "æ æłćšäœżçšUIDæćç±»ćçćæ¶ç»Žæ€ç»ç»§æżć±æ§ă",
|
||||
"ldapErrorCantWriteOnlyForReadOnlyLdap": "ćœLDAPæäŸæčäžæŻćŻćæšĄćŒæ¶ïŒæ æłèźŸçœźćȘć",
|
||||
"ldapErrorCantWriteOnlyAndReadOnly": "æ æłćæ¶èźŸçœźćȘèŻ»ććȘć",
|
||||
"clientRedirectURIsFragmentError": "éćźćURLäžćșć
ć«URIçæź”",
|
||||
"clientRootURLFragmentError": "æ čURL äžćșć
ć« URL çæź”",
|
||||
"pairwiseMalformedClientRedirectURI": "ćźąæ·ç«Żć
ć«äžäžȘæ æçéćźćURL",
|
||||
"pairwiseClientRedirectURIsMissingHost": "ćźąæ·ç«ŻéćźćURLéèŠæäžäžȘææçäž»æș",
|
||||
"pairwiseClientRedirectURIsMultipleHosts":
|
||||
"Without a configured Sector Identifier URI, client redirect URIs must not contain multiple host components.",
|
||||
"pairwiseMalformedSectorIdentifierURI": "Malformed Sector Identifier URI.",
|
||||
"pairwiseFailedToGetRedirectURIs": "æ æłä»æćĄćšè·ćŸéćźćURL",
|
||||
"pairwiseRedirectURIsMismatch": "ćźąæ·ç«ŻçéćźćURIäžæćĄćšç«Żè·ćçURIé
çœźäžćčé
ă",
|
||||
},
|
||||
};
|
||||
/* spell-checker: enable */
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
137
src/lib/i18n/generated_messages/11.0.3/account/ca.ts
Normal file
137
src/lib/i18n/generated_messages/11.0.3/account/ca.ts
Normal file
@ -0,0 +1,137 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Desa",
|
||||
"doCancel": "Cancel·la",
|
||||
"doLogOutAllSessions": "Desconnecta de totes les sessions",
|
||||
"doRemove": "Elimina",
|
||||
"doAdd": "Afegeix",
|
||||
"doSignOut": "Desconnectar",
|
||||
"editAccountHtmlTitle": "Edita compte",
|
||||
"federatedIdentitiesHtmlTitle": "Identitats federades",
|
||||
"accountLogHtmlTitle": "Registre del compte",
|
||||
"changePasswordHtmlTitle": "Canvia contrasenya",
|
||||
"sessionsHtmlTitle": "Sessions",
|
||||
"accountManagementTitle": "GestiĂł de Compte Keycloak",
|
||||
"authenticatorTitle": "Autenticador",
|
||||
"applicationsHtmlTitle": "Aplicacions",
|
||||
"authenticatorCode": "Codi d'un sol Ășs",
|
||||
"email": "Email",
|
||||
"firstName": "Nom",
|
||||
"givenName": "Nom de pila",
|
||||
"fullName": "Nom complet",
|
||||
"lastName": "Cognoms",
|
||||
"familyName": "Cognom",
|
||||
"password": "Contrasenya",
|
||||
"passwordConfirm": "Confirma la contrasenya",
|
||||
"passwordNew": "Nova contrasenya",
|
||||
"username": "Usuari",
|
||||
"address": "Adreça",
|
||||
"street": "Carrer",
|
||||
"locality": "Ciutat o Municipi",
|
||||
"region": "Estat, ProvĂncia, o RegiĂł",
|
||||
"postal_code": "Postal code",
|
||||
"country": "PaĂs",
|
||||
"emailVerified": "Email verificat",
|
||||
"gssDelegationCredential": "GSS Delegation Credential",
|
||||
"role_admin": "Administrador",
|
||||
"role_realm-admin": "Administrador del domini",
|
||||
"role_create-realm": "Crear domini",
|
||||
"role_view-realm": "Veure domini",
|
||||
"role_view-users": "Veure usuaris",
|
||||
"role_view-applications": "Veure aplicacions",
|
||||
"role_view-clients": "Veure clients",
|
||||
"role_view-events": "Veure events",
|
||||
"role_view-identity-providers": "Veure proveĂŻdors d'identitat",
|
||||
"role_manage-realm": "Gestionar domini",
|
||||
"role_manage-users": "Gestinar usuaris",
|
||||
"role_manage-applications": "Gestionar aplicacions",
|
||||
"role_manage-identity-providers": "Gestionar proveĂŻdors d'identitat",
|
||||
"role_manage-clients": "Gestionar clients",
|
||||
"role_manage-events": "Gestionar events",
|
||||
"role_view-profile": "Veure perfil",
|
||||
"role_manage-account": "Gestionar compte",
|
||||
"role_read-token": "Llegir token",
|
||||
"role_offline-access": "Accés sense connexió",
|
||||
"client_account": "Compte",
|
||||
"client_security-admin-console": "Consola d'AdministraciĂł de Seguretat",
|
||||
"client_realm-management": "GestiĂł de domini",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Camps obligatoris",
|
||||
"allFieldsRequired": "Tots els camps obligatoris",
|
||||
"backToApplication": "« Torna a l'aplicaciĂł",
|
||||
"backTo": "Torna a {0}",
|
||||
"date": "Data",
|
||||
"event": "Event",
|
||||
"ip": "IP",
|
||||
"client": "Client",
|
||||
"clients": "Clients",
|
||||
"details": "Detalls",
|
||||
"started": "Iniciat",
|
||||
"lastAccess": "Ăltim accĂ©s",
|
||||
"expires": "Expira",
|
||||
"applications": "Aplicacions",
|
||||
"account": "Compte",
|
||||
"federatedIdentity": "Identitat federada",
|
||||
"authenticator": "Autenticador",
|
||||
"sessions": "Sessions",
|
||||
"log": "Registre",
|
||||
"application": "AplicaciĂł",
|
||||
"availablePermissions": "Permisos disponibles",
|
||||
"grantedPermissions": "Permisos concedits",
|
||||
"grantedPersonalInfo": "InformaciĂł personal concedida",
|
||||
"additionalGrants": "Permisos addicionals",
|
||||
"action": "AcciĂł",
|
||||
"inResource": "a",
|
||||
"fullAccess": "Accés total",
|
||||
"offlineToken": "Codi d'autoritzaciĂł offline",
|
||||
"revoke": "Revocar permĂs",
|
||||
"configureAuthenticators": "Autenticadors configurats",
|
||||
"mobile": "MĂČbil",
|
||||
"totpStep1":
|
||||
'Instal·la <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> o Google Authenticator al teu telĂšfon mĂČbil. Les dues aplicacions estan disponibles a <a href="https://play.google.com">Google Play</a> i en l\'App Store d\'Apple.',
|
||||
"totpStep2": "Obre l'aplicaciĂł i escaneja el codi o introdueix la clau.",
|
||||
"totpStep3": "Introdueix el codi Ășnic que et mostra l'aplicaciĂł d'autenticaciĂł i fes clic a Envia per finalitzar la configuraciĂł",
|
||||
"missingUsernameMessage": "Si us plau indica el teu usuari.",
|
||||
"missingFirstNameMessage": "Si us plau indica el nom.",
|
||||
"invalidEmailMessage": "Email no vĂ lid",
|
||||
"missingLastNameMessage": "Si us plau indica els teus cognoms.",
|
||||
"missingEmailMessage": "Si us plau indica l'email.",
|
||||
"missingPasswordMessage": "Si us plau indica la contrasenya.",
|
||||
"notMatchPasswordMessage": "Les contrasenyes no coincideixen.",
|
||||
"missingTotpMessage": "Si us plau indica el teu codi d'autenticaciĂł",
|
||||
"invalidPasswordExistingMessage": "La contrasenya actual no és correcta.",
|
||||
"invalidPasswordConfirmMessage": "La confirmaciĂł de contrasenya no coincideix.",
|
||||
"invalidTotpMessage": "El cĂłdigo de autenticaciĂłn no es vĂĄlido.",
|
||||
"usernameExistsMessage": "L'usuari ja existeix",
|
||||
"emailExistsMessage": "L'email ja existeix",
|
||||
"readOnlyUserMessage": "No pots actualitzar el teu usuari perquÚ el teu compte és de només lectura.",
|
||||
"readOnlyPasswordMessage": "No pots actualitzar la contrasenya perquÚ el teu compte és de només lectura.",
|
||||
"successTotpMessage": "AplicaciĂł d'autenticaciĂł mĂČbil configurada.",
|
||||
"successTotpRemovedMessage": "AplicaciĂł d'autenticaciĂł mĂČbil eliminada.",
|
||||
"successGrantRevokedMessage": "PermĂs revocat correctament",
|
||||
"accountUpdatedMessage": "El teu compte s'ha actualitzat.",
|
||||
"accountPasswordUpdatedMessage": "La contrasenya s'ha actualitzat.",
|
||||
"missingIdentityProviderMessage": "ProveĂŻdor d'identitat no indicat.",
|
||||
"invalidFederatedIdentityActionMessage": "AcciĂł no vĂ lida o no indicada.",
|
||||
"identityProviderNotFoundMessage": "No s'ha trobat un proveĂŻdor d'identitat.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Aquesta identitat ja no estĂ activa",
|
||||
"federatedIdentityRemovingLastProviderMessage": "No pots eliminar l'Ășltima identitat federada perquĂš no tens fixada una contrasenya.",
|
||||
"identityProviderRedirectErrorMessage": "Error en la redirecciĂł al proveĂŻdor d'identitat",
|
||||
"identityProviderRemovedMessage": "ProveĂŻdor d'identitat esborrat correctament.",
|
||||
"accountDisabledMessage": "El compte estĂ desactivada, contacteu amb l'administrador.",
|
||||
"accountTemporarilyDisabledMessage": "El compte està temporalment desactivat, contacta amb l'administrador o intenta-ho de nou més tard.",
|
||||
"invalidPasswordMinLengthMessage": "Contrasenya incorrecta: longitud mĂnima {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} lletres minĂșscules.",
|
||||
"invalidPasswordMinDigitsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} lletres majĂșscules.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Contrasenya incorrecta: ha de contenir almenys {0} carĂ cters especials.",
|
||||
"invalidPasswordNotUsernameMessage": "Contrasenya incorrecta: no pot ser igual al nom d'usuari.",
|
||||
"invalidPasswordRegexPatternMessage": "Contrasenya incorrecta: no compleix l'expressiĂł regular.",
|
||||
"invalidPasswordHistoryMessage": "Contrasenya incorrecta: no pot ser igual a cap de les Ășltimes {0} contrasenyes."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
156
src/lib/i18n/generated_messages/11.0.3/account/cs.ts
Normal file
156
src/lib/i18n/generated_messages/11.0.3/account/cs.ts
Normal file
@ -0,0 +1,156 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "UloĆŸit",
|
||||
"doCancel": "ZruĆĄit",
|
||||
"doLogOutAllSessions": "OdhlĂĄsit vĆĄechny relace",
|
||||
"doRemove": "Odstranit",
|
||||
"doAdd": "PĆidat",
|
||||
"doSignOut": "OdhlĂĄsit se",
|
||||
"editAccountHtmlTitle": "Upravit ĂșÄet",
|
||||
"federatedIdentitiesHtmlTitle": "Propojené identity",
|
||||
"accountLogHtmlTitle": "Log ĂșÄtu",
|
||||
"changePasswordHtmlTitle": "ZmÄnit heslo",
|
||||
"sessionsHtmlTitle": "Relace",
|
||||
"accountManagementTitle": "SprĂĄva ĂșÄtĆŻ Keycloak",
|
||||
"authenticatorTitle": "AutentizĂĄtor",
|
||||
"applicationsHtmlTitle": "Aplikace",
|
||||
"authenticatorCode": "JednorĂĄzovĂœ kĂłd",
|
||||
"email": "E-mail",
|
||||
"firstName": "PrvnĂ kĆestnĂ jmĂ©no",
|
||||
"givenName": "KĆestnĂ jmĂ©na",
|
||||
"fullName": "Celé jméno",
|
||||
"lastName": "PĆĂjmenĂ",
|
||||
"familyName": "Rodinné jméno",
|
||||
"password": "Heslo",
|
||||
"passwordConfirm": "Nové heslo (znovu)",
|
||||
"passwordNew": "Nové heslo",
|
||||
"username": "UĆŸivatelskĂ© jmĂ©no",
|
||||
"address": "Adresa",
|
||||
"street": "Ulice",
|
||||
"locality": "MÄsto nebo lokalita",
|
||||
"region": "Kraj",
|
||||
"postal_code": "PSÄ",
|
||||
"country": "StĂĄt",
|
||||
"emailVerified": "E-mail ovÄĆen",
|
||||
"gssDelegationCredential": "GSS delegovanĂ© oprĂĄvnÄnĂ",
|
||||
"role_admin": "SprĂĄvce",
|
||||
"role_realm-admin": "SprĂĄvce realmu",
|
||||
"role_create-realm": "VytvoĆit realm",
|
||||
"role_view-realm": "Zobrazit realm",
|
||||
"role_view-users": "Zobrazit uĆŸivatele",
|
||||
"role_view-applications": "Zobrazit aplikace",
|
||||
"role_view-clients": "Zobrazit klienty",
|
||||
"role_view-events": "Zobrazit udĂĄlosti",
|
||||
"role_view-identity-providers": "Zobrazit poskytovatele identity",
|
||||
"role_manage-realm": "Spravovat realm",
|
||||
"role_manage-users": "Spravovat uĆŸivatele",
|
||||
"role_manage-applications": "Spravovat aplikace",
|
||||
"role_manage-identity-providers": "Spravovat poskytovatele identity",
|
||||
"role_manage-clients": "Spravovat klienty",
|
||||
"role_manage-events": "Spravovat udĂĄlosti",
|
||||
"role_view-profile": "Zobrazit profil",
|
||||
"role_manage-account": "Spravovat ĂșÄet",
|
||||
"role_manage-account-links": "Spravovat odkazy na ĂșÄet",
|
||||
"role_read-token": "ÄĂst token",
|
||||
"role_offline-access": "PĆĂstup offline",
|
||||
"role_uma_authorization": "ZĂskĂĄnĂ oprĂĄvnÄnĂ",
|
||||
"client_account": "ĂÄet",
|
||||
"client_security-admin-console": "AdministrĂĄtorskĂĄ bezpeÄnostnĂ konzole",
|
||||
"client_admin-cli": "Administråtorské CLI",
|
||||
"client_realm-management": "SprĂĄva realmĆŻ",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "PoĆŸadovanĂĄ pole",
|
||||
"allFieldsRequired": "VĆĄechna pole vyĆŸadovanĂĄ",
|
||||
"backToApplication": "« ZpÄt na aplikaci",
|
||||
"backTo": "ZpÄt na {0}",
|
||||
"date": "Datum",
|
||||
"event": "UdĂĄlost",
|
||||
"ip": "IP",
|
||||
"client": "Klient",
|
||||
"clients": "Klienti",
|
||||
"details": "Podrobnosti",
|
||||
"started": "ZahĂĄjeno",
|
||||
"lastAccess": "PoslednĂ pĆĂstup",
|
||||
"expires": "VyprĆĄĂ",
|
||||
"applications": "Aplikace",
|
||||
"account": "ĂÄet",
|
||||
"federatedIdentity": "PropojenĂĄ identita",
|
||||
"authenticator": "AutentizĂĄtor",
|
||||
"sessions": "Relace",
|
||||
"log": "Log",
|
||||
"application": "Aplikace",
|
||||
"availablePermissions": "DostupnĂĄ oprĂĄvnÄnĂ",
|
||||
"grantedPermissions": "UdÄlenĂ© oprĂĄvnÄnĂ",
|
||||
"grantedPersonalInfo": "Poskytnuté osobnà informace",
|
||||
"additionalGrants": "DodateÄnĂ© oprĂĄvnÄnĂ",
|
||||
"action": "Akce",
|
||||
"inResource": "v",
|
||||
"fullAccess": "ĂplnĂœ pĆĂstup",
|
||||
"offlineToken": "Offline Token",
|
||||
"revoke": "ZruĆĄit oprĂĄvnÄnĂ",
|
||||
"configureAuthenticators": "Konfigurované autentizåtory",
|
||||
"mobile": "MobilnĂ",
|
||||
"totpStep1": "Nainstalujte jednu z nĂĄsledujĂcĂch aplikacĂ",
|
||||
"totpStep2": "OtevĆete aplikaci a naskenujte ÄĂĄrovĂœ kĂłd",
|
||||
"totpStep3": "Zadejte jednorĂĄzovĂœ kĂłd poskytnutĂœ aplikacĂ a klepnutĂm na tlaÄĂtko UloĆŸit dokonÄete nastavenĂ.",
|
||||
"totpManualStep2": "OtevĆete aplikaci a zadejte klĂÄ",
|
||||
"totpManualStep3": "PouĆŸijte nĂĄsledujĂcĂ hodnoty konfigurace, pokud aplikace umoĆŸĆuje jejich nastavenĂ",
|
||||
"totpUnableToScan": "Nelze skenovat?",
|
||||
"totpScanBarcode": "Skenovat ÄĂĄrovĂœ kĂłd?",
|
||||
"totp.totp": "ZaloĆŸeno na Äase",
|
||||
"totp.hotp": "ZaloĆŸeno na ÄĂtaÄi",
|
||||
"totpType": "Typ",
|
||||
"totpAlgorithm": "Algoritmus",
|
||||
"totpDigits": "ÄĂslice",
|
||||
"totpInterval": "Interval",
|
||||
"totpCounter": "ÄĂtaÄ",
|
||||
"missingUsernameMessage": "Zadejte uĆŸivatelskĂ© jmĂ©no.",
|
||||
"missingFirstNameMessage": "Zadejte prosĂm kĆestnĂ jmĂ©no.",
|
||||
"invalidEmailMessage": "NeplatnĂĄ e-mailovĂĄ adresa.",
|
||||
"missingLastNameMessage": "Zadejte prosĂm pĆĂjmenĂ.",
|
||||
"missingEmailMessage": "Zadejte prosĂm e-mail.",
|
||||
"missingPasswordMessage": "Zadejte prosĂm heslo.",
|
||||
"notMatchPasswordMessage": "Hesla se neshodujĂ.",
|
||||
"missingTotpMessage": "Zadejte prosĂm kĂłd autentizĂĄtoru.",
|
||||
"invalidPasswordExistingMessage": "NeplatnĂ© stĂĄvajĂcĂ heslo.",
|
||||
"invalidPasswordConfirmMessage": "NovĂĄ hesla se neshodujĂ.",
|
||||
"invalidTotpMessage": "NeplatnĂœ kĂłd autentizĂĄtoru.",
|
||||
"usernameExistsMessage": "UĆŸivatelskĂ© jmĂ©no jiĆŸ existuje.",
|
||||
"emailExistsMessage": "E-mail jiĆŸ existuje.",
|
||||
"readOnlyUserMessage": "NemĆŻĆŸete svĆŻj ĂșÄet aktualizovat, protoĆŸe je pouze pro ÄtenĂ.",
|
||||
"readOnlyUsernameMessage": "NemĆŻĆŸete aktualizovat svĂ© uĆŸivatelskĂ© jmĂ©no, protoĆŸe je pouze pro ÄtenĂ.",
|
||||
"readOnlyPasswordMessage": "NemĆŻĆŸete aktualizovat svĂ© heslo, protoĆŸe vĂĄĆĄ ĂșÄet je jen pro ÄtenĂ.",
|
||||
"successTotpMessage": "OvÄĆenĂ pomocĂ OTP ĂșspÄĆĄnÄ konfigurovĂĄno.",
|
||||
"successTotpRemovedMessage": "OvÄĆenĂ pomocĂ OTP ĂșspÄĆĄnÄ odstranÄno.",
|
||||
"successGrantRevokedMessage": "OprĂĄvnÄnĂ bylo ĂșspÄĆĄnÄ zruĆĄeno.",
|
||||
"accountUpdatedMessage": "VĂĄĆĄ ĂșÄet byl aktualizovĂĄn.",
|
||||
"accountPasswordUpdatedMessage": "VaĆĄe heslo bylo aktualizovĂĄno.",
|
||||
"missingIdentityProviderMessage": "ChybÄjĂcĂ poskytovatel identity.",
|
||||
"invalidFederatedIdentityActionMessage": "NeplatnĂĄ nebo chybÄjĂcĂ akce.",
|
||||
"identityProviderNotFoundMessage": "Poskytovatel identity nenalezen.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Tato identita jiĆŸ nenĂ aktivnĂ.",
|
||||
"federatedIdentityRemovingLastProviderMessage": "NemĆŻĆŸete odstranit poslednĂ propojenou identitu, protoĆŸe nemĂĄte heslo.",
|
||||
"identityProviderRedirectErrorMessage": "NepodaĆilo se pĆesmÄrovat na poskytovatele identity.",
|
||||
"identityProviderRemovedMessage": "Poskytovatel identity byl ĂșspÄĆĄnÄ odstranÄn.",
|
||||
"identityProviderAlreadyLinkedMessage": "PropojenĂĄ identita vrĂĄcenĂĄ uĆŸivatelem {0} je jiĆŸ propojena s jinĂœm uĆŸivatelem.",
|
||||
"staleCodeAccountMessage": "Platnost vyprĆĄela. Zkuste to jeĆĄtÄ jednou.",
|
||||
"consentDenied": "Souhlas byl zamĂtnut.",
|
||||
"accountDisabledMessage": "ĂÄet je zakĂĄzĂĄn, kontaktujte sprĂĄvce.",
|
||||
"accountTemporarilyDisabledMessage": "ĂÄet je doÄasnÄ zakĂĄzĂĄn, kontaktujte sprĂĄvce nebo zkuste to pozdÄji.",
|
||||
"invalidPasswordMinLengthMessage": "NeplatnĂ© heslo: musĂ obsahovat minimĂĄlnÄ {0} malĂœch znakĆŻ.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "NeplatnĂ© heslo: musĂ obsahovat minimĂĄlnÄ {0} malĂ© znaky.",
|
||||
"invalidPasswordMinDigitsMessage": "NeplatnĂ© heslo: musĂ obsahovat nejmĂ©nÄ {0} ÄĂslic.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "NeplatnĂ© heslo: musĂ obsahovat nejmĂ©nÄ {0} velkĂœch pĂsmenen.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "NeplatnĂ© heslo: musĂ obsahovat nejmĂ©nÄ {0} speciĂĄlnĂch znakĆŻ.",
|
||||
"invalidPasswordNotUsernameMessage": "NeplatnĂ© heslo: nesmĂ bĂœt totoĆŸnĂ© s uĆŸivatelskĂœm jmĂ©nem.",
|
||||
"invalidPasswordRegexPatternMessage": "NeplatnĂ© heslo: neshoduje se zadanĂœm regulĂĄrnĂm vĂœrazem.",
|
||||
"invalidPasswordHistoryMessage": "NeplatnĂ© heslo: NesmĂ se opakovat ĆŸĂĄdnĂ© z poslednĂch {0} hesel.",
|
||||
"invalidPasswordBlacklistedMessage": "NeplatnĂ© heslo: heslo je na ÄernĂ© listinÄ.",
|
||||
"invalidPasswordGenericMessage": "NeplatnĂ© heslo: novĂ© heslo neodpovĂdĂĄ pravidlĆŻm hesla."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
156
src/lib/i18n/generated_messages/11.0.3/account/de.ts
Normal file
156
src/lib/i18n/generated_messages/11.0.3/account/de.ts
Normal file
@ -0,0 +1,156 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Speichern",
|
||||
"doCancel": "Abbrechen",
|
||||
"doLogOutAllSessions": "Alle Sitzungen abmelden",
|
||||
"doRemove": "Entfernen",
|
||||
"doAdd": "HinzufĂŒgen",
|
||||
"doSignOut": "Abmelden",
|
||||
"editAccountHtmlTitle": "Benutzerkonto bearbeiten",
|
||||
"federatedIdentitiesHtmlTitle": "Föderierte IdentitÀten",
|
||||
"accountLogHtmlTitle": "Benutzerkonto Log",
|
||||
"changePasswordHtmlTitle": "Passwort Ăndern",
|
||||
"sessionsHtmlTitle": "Sitzungen",
|
||||
"accountManagementTitle": "Keycloak Benutzerkontoverwaltung",
|
||||
"authenticatorTitle": "Mehrfachauthentifizierung",
|
||||
"applicationsHtmlTitle": "Applikationen",
|
||||
"authenticatorCode": "One-time Code",
|
||||
"email": "E-Mail",
|
||||
"firstName": "Vorname",
|
||||
"givenName": "Vorname",
|
||||
"fullName": "Voller Name",
|
||||
"lastName": "Nachname",
|
||||
"familyName": "Nachname",
|
||||
"password": "Passwort",
|
||||
"passwordConfirm": "Passwort bestÀtigen",
|
||||
"passwordNew": "Neues Passwort",
|
||||
"username": "Benutzername",
|
||||
"address": "Adresse",
|
||||
"street": "StraĂe",
|
||||
"region": "Staat, Provinz, Region",
|
||||
"postal_code": "PLZ",
|
||||
"locality": "Stadt oder Ortschaft",
|
||||
"country": "Land",
|
||||
"emailVerified": "E-Mail verifiziert",
|
||||
"gssDelegationCredential": "GSS delegierte Berechtigung",
|
||||
"role_admin": "Admin",
|
||||
"role_realm-admin": "Realm Admin",
|
||||
"role_create-realm": "Realm erstellen",
|
||||
"role_view-realm": "Realm ansehen",
|
||||
"role_view-users": "Benutzer ansehen",
|
||||
"role_view-applications": "Applikationen ansehen",
|
||||
"role_view-clients": "Clients ansehen",
|
||||
"role_view-events": "Events ansehen",
|
||||
"role_view-identity-providers": "Identity Provider ansehen",
|
||||
"role_manage-realm": "Realm verwalten",
|
||||
"role_manage-users": "Benutzer verwalten",
|
||||
"role_manage-applications": "Applikationen verwalten",
|
||||
"role_manage-identity-providers": "Identity Provider verwalten",
|
||||
"role_manage-clients": "Clients verwalten",
|
||||
"role_manage-events": "Events verwalten",
|
||||
"role_view-profile": "Profile ansehen",
|
||||
"role_manage-account": "Profile verwalten",
|
||||
"role_manage-account-links": "Profil-Links verwalten",
|
||||
"role_read-token": "Token lesen",
|
||||
"role_offline-access": "Offline-Zugriff",
|
||||
"role_uma_authorization": "Berechtigungen einholen",
|
||||
"client_account": "Clientkonto",
|
||||
"client_security-admin-console": "Security Adminkonsole",
|
||||
"client_realm-management": "Realm-Management",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Erforderliche Felder",
|
||||
"allFieldsRequired": "Alle Felder sind erforderlich",
|
||||
"backToApplication": "« ZurĂŒck zur Applikation",
|
||||
"backTo": "ZurĂŒck zu {0}",
|
||||
"date": "Datum",
|
||||
"event": "Ereignis",
|
||||
"ip": "IP",
|
||||
"client": "Client",
|
||||
"clients": "Clients",
|
||||
"details": "Details",
|
||||
"started": "Startdatum",
|
||||
"lastAccess": "Letzter Zugriff",
|
||||
"expires": "Ablaufdatum",
|
||||
"applications": "Applikationen",
|
||||
"account": "Benutzerkonto",
|
||||
"federatedIdentity": "Föderierte IdentitÀt",
|
||||
"authenticator": "Mehrfachauthentifizierung",
|
||||
"sessions": "Sitzungen",
|
||||
"log": "Log",
|
||||
"application": "Applikation",
|
||||
"availablePermissions": "verfĂŒgbare Berechtigungen",
|
||||
"grantedPermissions": "gewÀhrte Berechtigungen",
|
||||
"grantedPersonalInfo": "gewÀhrte persönliche Informationen",
|
||||
"additionalGrants": "zusÀtzliche Berechtigungen",
|
||||
"action": "Aktion",
|
||||
"inResource": "in",
|
||||
"fullAccess": "Vollzugriff",
|
||||
"offlineToken": "Offline-Token",
|
||||
"revoke": "Berechtigung widerrufen",
|
||||
"configureAuthenticators": "Mehrfachauthentifizierung konfigurieren",
|
||||
"mobile": "Mobil",
|
||||
"totpStep1": "Installieren Sie eine der folgenden Applikationen auf Ihrem Smartphone:",
|
||||
"totpStep2": "Ăffnen Sie die Applikation und scannen Sie den Barcode.",
|
||||
"totpStep3": "Geben Sie den von der Applikation generierten One-time Code ein und klicken Sie auf Speichern.",
|
||||
"totpManualStep2": "Ăffnen Sie die Applikation und geben Sie den folgenden SchlĂŒssel ein.",
|
||||
"totpManualStep3": "Verwenden Sie die folgenden Konfigurationswerte, falls Sie diese fĂŒr die Applikation anpassen können:",
|
||||
"totpUnableToScan": "Sie können den Barcode nicht scannen?",
|
||||
"totpScanBarcode": "Barcode scannen?",
|
||||
"totp.totp": "zeitbasiert (time-based)",
|
||||
"totp.hotp": "zÀhlerbasiert (counter-based)",
|
||||
"totpType": "Typ",
|
||||
"totpAlgorithm": "Algorithmus",
|
||||
"totpDigits": "Ziffern",
|
||||
"totpInterval": "Intervall",
|
||||
"totpCounter": "ZĂ€hler",
|
||||
"missingUsernameMessage": "Bitte geben Sie einen Benutzernamen ein.",
|
||||
"missingFirstNameMessage": "Bitte geben Sie einen Vornamen ein.",
|
||||
"invalidEmailMessage": "UngĂŒltige E-Mail Adresse.",
|
||||
"missingLastNameMessage": "Bitte geben Sie einen Nachnamen ein.",
|
||||
"missingEmailMessage": "Bitte geben Sie eine E-Mail Adresse ein.",
|
||||
"missingPasswordMessage": "Bitte geben Sie ein Passwort ein.",
|
||||
"notMatchPasswordMessage": "Die Passwörter sind nicht identisch.",
|
||||
"missingTotpMessage": "Bitte geben Sie den One-time Code ein.",
|
||||
"invalidPasswordExistingMessage": "Das aktuelle Passwort ist ungĂŒltig.",
|
||||
"invalidPasswordConfirmMessage": "Die PasswortbestÀtigung ist nicht identisch.",
|
||||
"invalidTotpMessage": "UngĂŒltiger One-time Code.",
|
||||
"usernameExistsMessage": "Der Benutzername existiert bereits.",
|
||||
"emailExistsMessage": "Die E-Mail-Adresse existiert bereits.",
|
||||
"readOnlyUserMessage": "Sie können Ihr Benutzerkonto nicht Ă€ndern, da es schreibgeschĂŒtzt ist.",
|
||||
"readOnlyUsernameMessage": "Sie können Ihren Benutzernamen nicht Ă€ndern, da er schreibgeschĂŒtzt ist.",
|
||||
"readOnlyPasswordMessage": "Sie können Ihr Passwort nicht Ă€ndern, da es schreibgeschĂŒtzt ist.",
|
||||
"successTotpMessage": "Mehrfachauthentifizierung erfolgreich konfiguriert.",
|
||||
"successTotpRemovedMessage": "Mehrfachauthentifizierung erfolgreich entfernt.",
|
||||
"successGrantRevokedMessage": "Berechtigung erfolgreich widerrufen.",
|
||||
"accountUpdatedMessage": "Ihr Benutzerkonto wurde aktualisiert.",
|
||||
"accountPasswordUpdatedMessage": "Ihr Passwort wurde aktualisiert.",
|
||||
"missingIdentityProviderMessage": "Identity Provider nicht angegeben.",
|
||||
"invalidFederatedIdentityActionMessage": "UngĂŒltige oder fehlende Aktion.",
|
||||
"identityProviderNotFoundMessage": "Angegebener Identity Provider nicht gefunden.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Diese IdentitÀt ist nicht mehr aktiv.",
|
||||
"federatedIdentityRemovingLastProviderMessage": "Sie können den letzten Eintrag nicht entfernen, da Sie kein Passwort haben.",
|
||||
"identityProviderRedirectErrorMessage": "Fehler bei der Weiterleitung zum Identity Provider.",
|
||||
"identityProviderRemovedMessage": "Identity Provider erfolgreich entfernt.",
|
||||
"identityProviderAlreadyLinkedMessage": "Die föderierte IdentitÀt von {0} ist bereits einem anderen Benutzer zugewiesen.",
|
||||
"staleCodeAccountMessage": "Diese Seite ist nicht mehr gĂŒltig, bitte versuchen Sie es noch einmal.",
|
||||
"consentDenied": "EinverstÀndnis verweigert.",
|
||||
"accountDisabledMessage": "Ihr Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin.",
|
||||
"accountTemporarilyDisabledMessage":
|
||||
"Ihr Benutzerkonto ist temporÀr gesperrt, bitte kontaktieren Sie den Admin oder versuchen Sie es spÀter noch einmal.",
|
||||
"invalidPasswordMinLengthMessage": "UngĂŒltiges Passwort: Es muss mindestens {0} Zeichen lang sein.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "UngĂŒltiges Passwort: Es muss mindestens {0} Kleinbuchstaben beinhalten.",
|
||||
"invalidPasswordMinDigitsMessage": "UngĂŒltiges Passwort: Es muss mindestens {0} Zahl(en) beinhalten.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "UngĂŒltiges Passwort: Es muss mindestens {0} GroĂbuchstaben beinhalten.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "UngĂŒltiges Passwort: Es muss mindestens {0} Sonderzeichen beinhalten.",
|
||||
"invalidPasswordNotUsernameMessage": "UngĂŒltiges Passwort: Es darf nicht gleich sein wie der Benutzername.",
|
||||
"invalidPasswordRegexPatternMessage": "UngĂŒltiges Passwort: Es entspricht nicht dem Regex-Muster.",
|
||||
"invalidPasswordHistoryMessage": "UngĂŒltiges Passwort: Es darf nicht einem der letzten {0} Passwörter entsprechen.",
|
||||
"invalidPasswordBlacklistedMessage": "UngĂŒltiges Passwort: Das Passwort steht auf der Blocklist (schwarzen Liste).",
|
||||
"invalidPasswordGenericMessge": "UngĂŒltiges Passwort: Das neue Passwort verletzt die Passwort-Richtlinien."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
325
src/lib/i18n/generated_messages/11.0.3/account/en.ts
Normal file
325
src/lib/i18n/generated_messages/11.0.3/account/en.ts
Normal file
@ -0,0 +1,325 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Save",
|
||||
"doCancel": "Cancel",
|
||||
"doLogOutAllSessions": "Log out all sessions",
|
||||
"doRemove": "Remove",
|
||||
"doAdd": "Add",
|
||||
"doSignOut": "Sign Out",
|
||||
"doLogIn": "Log In",
|
||||
"doLink": "Link",
|
||||
"editAccountHtmlTitle": "Edit Account",
|
||||
"personalInfoHtmlTitle": "Personal Info",
|
||||
"federatedIdentitiesHtmlTitle": "Federated Identities",
|
||||
"accountLogHtmlTitle": "Account Log",
|
||||
"changePasswordHtmlTitle": "Change Password",
|
||||
"deviceActivityHtmlTitle": "Device Activity",
|
||||
"sessionsHtmlTitle": "Sessions",
|
||||
"accountManagementTitle": "Keycloak Account Management",
|
||||
"authenticatorTitle": "Authenticator",
|
||||
"applicationsHtmlTitle": "Applications",
|
||||
"linkedAccountsHtmlTitle": "Linked Accounts",
|
||||
"accountManagementWelcomeMessage": "Welcome to Keycloak Account Management",
|
||||
"personalInfoIntroMessage": "Manage your basic information",
|
||||
"accountSecurityTitle": "Account Security",
|
||||
"accountSecurityIntroMessage": "Control your password and account access",
|
||||
"applicationsIntroMessage": "Track and manage your app permission to access your account",
|
||||
"resourceIntroMessage": "Share your resources among team members",
|
||||
"passwordLastUpdateMessage": "Your password was updated at",
|
||||
"updatePasswordTitle": "Update Password",
|
||||
"updatePasswordMessageTitle": "Make sure you choose a strong password",
|
||||
"updatePasswordMessage":
|
||||
"A strong password contains a mix of numbers, letters, and symbols. It is hard to guess, does not resemble a real word, and is only used for this account.",
|
||||
"personalSubTitle": "Your Personal Info",
|
||||
"personalSubMessage": "Manage this basic information: your first name, last name and email",
|
||||
"authenticatorCode": "One-time code",
|
||||
"email": "Email",
|
||||
"firstName": "First name",
|
||||
"givenName": "Given name",
|
||||
"fullName": "Full name",
|
||||
"lastName": "Last name",
|
||||
"familyName": "Family name",
|
||||
"password": "Password",
|
||||
"currentPassword": "Current Password",
|
||||
"passwordConfirm": "Confirmation",
|
||||
"passwordNew": "New Password",
|
||||
"username": "Username",
|
||||
"address": "Address",
|
||||
"street": "Street",
|
||||
"locality": "City or Locality",
|
||||
"region": "State, Province, or Region",
|
||||
"postal_code": "Zip or Postal code",
|
||||
"country": "Country",
|
||||
"emailVerified": "Email verified",
|
||||
"gssDelegationCredential": "GSS Delegation Credential",
|
||||
"profileScopeConsentText": "User profile",
|
||||
"emailScopeConsentText": "Email address",
|
||||
"addressScopeConsentText": "Address",
|
||||
"phoneScopeConsentText": "Phone number",
|
||||
"offlineAccessScopeConsentText": "Offline Access",
|
||||
"samlRoleListScopeConsentText": "My Roles",
|
||||
"rolesScopeConsentText": "User roles",
|
||||
"role_admin": "Admin",
|
||||
"role_realm-admin": "Realm Admin",
|
||||
"role_create-realm": "Create realm",
|
||||
"role_view-realm": "View realm",
|
||||
"role_view-users": "View users",
|
||||
"role_view-applications": "View applications",
|
||||
"role_view-clients": "View clients",
|
||||
"role_view-events": "View events",
|
||||
"role_view-identity-providers": "View identity providers",
|
||||
"role_view-consent": "View consents",
|
||||
"role_manage-realm": "Manage realm",
|
||||
"role_manage-users": "Manage users",
|
||||
"role_manage-applications": "Manage applications",
|
||||
"role_manage-identity-providers": "Manage identity providers",
|
||||
"role_manage-clients": "Manage clients",
|
||||
"role_manage-events": "Manage events",
|
||||
"role_view-profile": "View profile",
|
||||
"role_manage-account": "Manage account",
|
||||
"role_manage-account-links": "Manage account links",
|
||||
"role_manage-consent": "Manage consents",
|
||||
"role_read-token": "Read token",
|
||||
"role_offline-access": "Offline access",
|
||||
"role_uma_authorization": "Obtain permissions",
|
||||
"client_account": "Account",
|
||||
"client_account-console": "Account Console",
|
||||
"client_security-admin-console": "Security Admin Console",
|
||||
"client_admin-cli": "Admin CLI",
|
||||
"client_realm-management": "Realm Management",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Required fields",
|
||||
"allFieldsRequired": "All fields required",
|
||||
"backToApplication": "« Back to application",
|
||||
"backTo": "Back to {0}",
|
||||
"date": "Date",
|
||||
"event": "Event",
|
||||
"ip": "IP",
|
||||
"client": "Client",
|
||||
"clients": "Clients",
|
||||
"details": "Details",
|
||||
"started": "Started",
|
||||
"lastAccess": "Last Access",
|
||||
"expires": "Expires",
|
||||
"applications": "Applications",
|
||||
"account": "Account",
|
||||
"federatedIdentity": "Federated Identity",
|
||||
"authenticator": "Authenticator",
|
||||
"device-activity": "Device Activity",
|
||||
"sessions": "Sessions",
|
||||
"log": "Log",
|
||||
"application": "Application",
|
||||
"availableRoles": "Available Roles",
|
||||
"grantedPermissions": "Granted Permissions",
|
||||
"grantedPersonalInfo": "Granted Personal Info",
|
||||
"additionalGrants": "Additional Grants",
|
||||
"action": "Action",
|
||||
"inResource": "in",
|
||||
"fullAccess": "Full Access",
|
||||
"offlineToken": "Offline Token",
|
||||
"revoke": "Revoke Grant",
|
||||
"configureAuthenticators": "Configured Authenticators",
|
||||
"mobile": "Mobile",
|
||||
"totpStep1": "Install one of the following applications on your mobile:",
|
||||
"totpStep2": "Open the application and scan the barcode:",
|
||||
"totpStep3": "Enter the one-time code provided by the application and click Save to finish the setup.",
|
||||
"totpStep3DeviceName": "Provide a Device Name to help you manage your OTP devices.",
|
||||
"totpManualStep2": "Open the application and enter the key:",
|
||||
"totpManualStep3": "Use the following configuration values if the application allows setting them:",
|
||||
"totpUnableToScan": "Unable to scan?",
|
||||
"totpScanBarcode": "Scan barcode?",
|
||||
"totp.totp": "Time-based",
|
||||
"totp.hotp": "Counter-based",
|
||||
"totpType": "Type",
|
||||
"totpAlgorithm": "Algorithm",
|
||||
"totpDigits": "Digits",
|
||||
"totpInterval": "Interval",
|
||||
"totpCounter": "Counter",
|
||||
"totpDeviceName": "Device Name",
|
||||
"missingUsernameMessage": "Please specify username.",
|
||||
"missingFirstNameMessage": "Please specify first name.",
|
||||
"invalidEmailMessage": "Invalid email address.",
|
||||
"missingLastNameMessage": "Please specify last name.",
|
||||
"missingEmailMessage": "Please specify email.",
|
||||
"missingPasswordMessage": "Please specify password.",
|
||||
"notMatchPasswordMessage": "Passwords don't match.",
|
||||
"invalidUserMessage": "Invalid user",
|
||||
"missingTotpMessage": "Please specify authenticator code.",
|
||||
"missingTotpDeviceNameMessage": "Please specify device name.",
|
||||
"invalidPasswordExistingMessage": "Invalid existing password.",
|
||||
"invalidPasswordConfirmMessage": "Password confirmation doesn't match.",
|
||||
"invalidTotpMessage": "Invalid authenticator code.",
|
||||
"usernameExistsMessage": "Username already exists.",
|
||||
"emailExistsMessage": "Email already exists.",
|
||||
"readOnlyUserMessage": "You can't update your account as it is read-only.",
|
||||
"readOnlyUsernameMessage": "You can't update your username as it is read-only.",
|
||||
"readOnlyPasswordMessage": "You can't update your password as your account is read-only.",
|
||||
"successTotpMessage": "Mobile authenticator configured.",
|
||||
"successTotpRemovedMessage": "Mobile authenticator removed.",
|
||||
"successGrantRevokedMessage": "Grant revoked successfully.",
|
||||
"accountUpdatedMessage": "Your account has been updated.",
|
||||
"accountPasswordUpdatedMessage": "Your password has been updated.",
|
||||
"missingIdentityProviderMessage": "Identity provider not specified.",
|
||||
"invalidFederatedIdentityActionMessage": "Invalid or missing action.",
|
||||
"identityProviderNotFoundMessage": "Specified identity provider not found.",
|
||||
"federatedIdentityLinkNotActiveMessage": "This identity is not active anymore.",
|
||||
"federatedIdentityRemovingLastProviderMessage": "You can't remove last federated identity as you don't have a password.",
|
||||
"identityProviderRedirectErrorMessage": "Failed to redirect to identity provider.",
|
||||
"identityProviderRemovedMessage": "Identity provider removed successfully.",
|
||||
"identityProviderAlreadyLinkedMessage": "Federated identity returned by {0} is already linked to another user.",
|
||||
"staleCodeAccountMessage": "The page expired. Please try one more time.",
|
||||
"consentDenied": "Consent denied.",
|
||||
"accountDisabledMessage": "Account is disabled, contact your administrator.",
|
||||
"accountTemporarilyDisabledMessage": "Account is temporarily disabled, contact your administrator or try again later.",
|
||||
"invalidPasswordMinLengthMessage": "Invalid password: minimum length {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Invalid password: must contain at least {0} lower case characters.",
|
||||
"invalidPasswordMinDigitsMessage": "Invalid password: must contain at least {0} numerical digits.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Invalid password: must contain at least {0} upper case characters.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Invalid password: must contain at least {0} special characters.",
|
||||
"invalidPasswordNotUsernameMessage": "Invalid password: must not be equal to the username.",
|
||||
"invalidPasswordRegexPatternMessage": "Invalid password: fails to match regex pattern(s).",
|
||||
"invalidPasswordHistoryMessage": "Invalid password: must not be equal to any of last {0} passwords.",
|
||||
"invalidPasswordBlacklistedMessage": "Invalid password: password is blacklisted.",
|
||||
"invalidPasswordGenericMessage": "Invalid password: new password doesn't match password policies.",
|
||||
"myResources": "My Resources",
|
||||
"myResourcesSub": "My resources",
|
||||
"doDeny": "Deny",
|
||||
"doRevoke": "Revoke",
|
||||
"doApprove": "Approve",
|
||||
"doRemoveSharing": "Remove Sharing",
|
||||
"doRemoveRequest": "Remove Request",
|
||||
"peopleAccessResource": "People with access to this resource",
|
||||
"resourceManagedPolicies": "Permissions granting access to this resource",
|
||||
"resourceNoPermissionsGrantingAccess": "No permissions granting access to this resource",
|
||||
"anyAction": "Any action",
|
||||
"description": "Description",
|
||||
"name": "Name",
|
||||
"scopes": "Scopes",
|
||||
"resource": "Resource",
|
||||
"user": "User",
|
||||
"peopleSharingThisResource": "People sharing this resource",
|
||||
"shareWithOthers": "Share with others",
|
||||
"needMyApproval": "Need my approval",
|
||||
"requestsWaitingApproval": "Your requests waiting approval",
|
||||
"icon": "Icon",
|
||||
"requestor": "Requestor",
|
||||
"owner": "Owner",
|
||||
"resourcesSharedWithMe": "Resources shared with me",
|
||||
"permissionRequestion": "Permission Requestion",
|
||||
"permission": "Permission",
|
||||
"shares": "share(s)",
|
||||
"notBeingShared": "This resource is not being shared.",
|
||||
"notHaveAnyResource": "You don't have any resources",
|
||||
"noResourcesSharedWithYou": "There are no resources shared with you",
|
||||
"havePermissionRequestsWaitingForApproval": "You have {0} permission request(s) waiting for approval.",
|
||||
"clickHereForDetails": "Click here for details.",
|
||||
"resourceIsNotBeingShared": "The resource is not being shared",
|
||||
"locale_ca": "CatalĂ ",
|
||||
"locale_cs": "ÄeĆĄtina",
|
||||
"locale_de": "Deutsch",
|
||||
"locale_en": "English",
|
||||
"locale_es": "Español",
|
||||
"locale_fr": "Français",
|
||||
"locale_it": "Italian",
|
||||
"locale_ja": "æ„æŹèȘ",
|
||||
"locale_nl": "Nederlands",
|
||||
"locale_no": "Norsk",
|
||||
"locale_lt": "LietuviĆł",
|
||||
"locale_pt-BR": "PortuguĂȘs (Brasil)",
|
||||
"locale_ru": "Đ ŃŃŃĐșĐžĐč",
|
||||
"locale_sk": "SlovenÄina",
|
||||
"locale_sv": "Svenska",
|
||||
"locale_tr": "Turkish",
|
||||
"locale_zh-CN": "äžæçźäœ",
|
||||
"applicaitonName": "Name",
|
||||
"applicationType": "Application Type",
|
||||
"applicationInUse": "In-use app only",
|
||||
"clearAllFilter": "Clear all filters",
|
||||
"activeFilters": "Active filters",
|
||||
"filterByName": "Filter By Name ...",
|
||||
"allApps": "All applications",
|
||||
"internalApps": "Internal applications",
|
||||
"thirdpartyApps": "Third-Party applications",
|
||||
"appResults": "Results",
|
||||
"clientNotFoundMessage": "Client not found.",
|
||||
"authorizedProvider": "Authorized Provider",
|
||||
"authorizedProviderMessage": "Authorized Providers linked with your account",
|
||||
"identityProvider": "Identity Provider",
|
||||
"identityProviderMessage": "To link your account with identity providers you have configured",
|
||||
"socialLogin": "Social Login",
|
||||
"userDefined": "User Defined",
|
||||
"removeAccess": "Remove Access",
|
||||
"removeAccessMessage": "You will need to grant access again, if you want to use this app account.",
|
||||
"authenticatorStatusMessage": "Two-factor authentication is currently",
|
||||
"authenticatorFinishSetUpTitle": "Your Two-Factor Authentication",
|
||||
"authenticatorFinishSetUpMessage":
|
||||
"Each time you sign in to your Keycloak account, you will be asked to provide a two-factor authentication code.",
|
||||
"authenticatorSubTitle": "Set Up Two-Factor Authentication",
|
||||
"authenticatorSubMessage": "To enhance the security of your account, enable at least one of the available two-factor authentication methods.",
|
||||
"authenticatorMobileTitle": "Mobile Authenticator",
|
||||
"authenticatorMobileMessage": "Use mobile Authenticator to get Verification codes as the two-factor authentication.",
|
||||
"authenticatorMobileFinishSetUpMessage": "The authenticator has been bound to your phone.",
|
||||
"authenticatorActionSetup": "Set up",
|
||||
"authenticatorSMSTitle": "SMS Code",
|
||||
"authenticatorSMSMessage": "Keycloak will send the Verification code to your phone as the two-factor authentication.",
|
||||
"authenticatorSMSFinishSetUpMessage": "Text messages are sent to",
|
||||
"authenticatorDefaultStatus": "Default",
|
||||
"authenticatorChangePhone": "Change Phone Number",
|
||||
"authenticatorBackupCodesTitle": "Backup Codes",
|
||||
"authenticatorBackupCodesMessage": "Get your 8-digit backup codes",
|
||||
"authenticatorBackupCodesFinishSetUpMessage": "12 backup codes were generated at this time. Each one can be used once.",
|
||||
"authenticatorMobileSetupTitle": "Mobile Authenticator Setup",
|
||||
"smscodeIntroMessage": "Enter your phone number and a verification code will be sent to your phone.",
|
||||
"mobileSetupStep1": "Install an authenticator application on your phone. The applications listed here are supported.",
|
||||
"mobileSetupStep2": "Open the application and scan the barcode:",
|
||||
"mobileSetupStep3": "Enter the one-time code provided by the application and click Save to finish the setup.",
|
||||
"scanBarCode": "Want to scan the barcode?",
|
||||
"enterBarCode": "Enter the one-time code",
|
||||
"doCopy": "Copy",
|
||||
"doFinish": "Finish",
|
||||
"authenticatorSMSCodeSetupTitle": "SMS Code Setup",
|
||||
"chooseYourCountry": "Choose your country",
|
||||
"enterYourPhoneNumber": "Enter your phone number",
|
||||
"sendVerficationCode": "Send Verification Code",
|
||||
"enterYourVerficationCode": "Enter your verification code",
|
||||
"authenticatorBackupCodesSetupTitle": "Backup Codes Setup",
|
||||
"backupcodesIntroMessage":
|
||||
"If you lose access to your phone, you can still log into your account through backup codes. Keep them somewhere safe and accessible.",
|
||||
"realmName": "Realm",
|
||||
"doDownload": "Download",
|
||||
"doPrint": "Print",
|
||||
"backupCodesTips-1": "Each backup code can be used once.",
|
||||
"backupCodesTips-2": "These codes were generated on",
|
||||
"generateNewBackupCodes": "Generate New Backup Codes",
|
||||
"backupCodesTips-3": "When you generate new backup codes, the current codes will not work anymore.",
|
||||
"backtoAuthenticatorPage": "Back to Authenticator Page",
|
||||
"resources": "Resources",
|
||||
"sharedwithMe": "Shared with Me",
|
||||
"share": "Share",
|
||||
"sharedwith": "Shared with",
|
||||
"accessPermissions": "Access Permissions",
|
||||
"permissionRequests": "Permission Requests",
|
||||
"approve": "Approve",
|
||||
"approveAll": "Approve all",
|
||||
"people": "people",
|
||||
"perPage": "per page",
|
||||
"currentPage": "Current Page",
|
||||
"sharetheResource": "Share the resource",
|
||||
"group": "Group",
|
||||
"selectPermission": "Select Permission",
|
||||
"addPeople": "Add people to share your resource with",
|
||||
"addTeam": "Add team to share your resource with",
|
||||
"myPermissions": "My Permissions",
|
||||
"waitingforApproval": "Waiting for approval",
|
||||
"anyPermission": "Any Permission",
|
||||
"openshift.scope.user_info": "User information",
|
||||
"openshift.scope.user_check-access": "User access information",
|
||||
"openshift.scope.user_full": "Full Access",
|
||||
"openshift.scope.list-projects": "List projects"
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
137
src/lib/i18n/generated_messages/11.0.3/account/es.ts
Normal file
137
src/lib/i18n/generated_messages/11.0.3/account/es.ts
Normal file
@ -0,0 +1,137 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Guardar",
|
||||
"doCancel": "Cancelar",
|
||||
"doLogOutAllSessions": "Desconectar de todas las sesiones",
|
||||
"doRemove": "Eliminar",
|
||||
"doAdd": "Añadir",
|
||||
"doSignOut": "Desconectar",
|
||||
"editAccountHtmlTitle": "Editar cuenta",
|
||||
"federatedIdentitiesHtmlTitle": "Identidades federadas",
|
||||
"accountLogHtmlTitle": "Registro de la cuenta",
|
||||
"changePasswordHtmlTitle": "Cambiar contraseña",
|
||||
"sessionsHtmlTitle": "Sesiones",
|
||||
"accountManagementTitle": "GestiĂłn de Cuenta Keycloak",
|
||||
"authenticatorTitle": "Autenticador",
|
||||
"applicationsHtmlTitle": "Aplicaciones",
|
||||
"authenticatorCode": "CĂłdigo de un solo uso",
|
||||
"email": "Email",
|
||||
"firstName": "Nombre",
|
||||
"givenName": "Nombre de pila",
|
||||
"fullName": "Nombre completo",
|
||||
"lastName": "Apellidos",
|
||||
"familyName": "Apellido",
|
||||
"password": "Contraseña",
|
||||
"passwordConfirm": "Confirma la contraseña",
|
||||
"passwordNew": "Nueva contraseña",
|
||||
"username": "Usuario",
|
||||
"address": "DirecciĂłn",
|
||||
"street": "Calle",
|
||||
"locality": "Ciudad o Municipio",
|
||||
"region": "Estado, Provincia, o RegiĂłn",
|
||||
"postal_code": "CĂłdigo Postal",
|
||||
"country": "PaĂs",
|
||||
"emailVerified": "Email verificado",
|
||||
"gssDelegationCredential": "GSS Delegation Credential",
|
||||
"role_admin": "Administrador",
|
||||
"role_realm-admin": "Administrador del dominio",
|
||||
"role_create-realm": "Crear dominio",
|
||||
"role_view-realm": "Ver dominio",
|
||||
"role_view-users": "Ver usuarios",
|
||||
"role_view-applications": "Ver aplicaciones",
|
||||
"role_view-clients": "Ver clientes",
|
||||
"role_view-events": "Ver eventos",
|
||||
"role_view-identity-providers": "Ver proveedores de identidad",
|
||||
"role_manage-realm": "Gestionar dominio",
|
||||
"role_manage-users": "Gestionar usuarios",
|
||||
"role_manage-applications": "Gestionar aplicaciones",
|
||||
"role_manage-identity-providers": "Gestionar proveedores de identidad",
|
||||
"role_manage-clients": "Gestionar clientes",
|
||||
"role_manage-events": "Gestionar eventos",
|
||||
"role_view-profile": "Ver perfil",
|
||||
"role_manage-account": "Gestionar cuenta",
|
||||
"role_read-token": "Leer token",
|
||||
"role_offline-access": "Acceso sin conexiĂłn",
|
||||
"client_account": "Cuenta",
|
||||
"client_security-admin-console": "Consola de AdministraciĂłn de Seguridad",
|
||||
"client_realm-management": "GestiĂłn de dominio",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Campos obligatorios",
|
||||
"allFieldsRequired": "Todos los campos obligatorios",
|
||||
"backToApplication": "« Volver a la aplicaciĂłn",
|
||||
"backTo": "Volver a {0}",
|
||||
"date": "Fecha",
|
||||
"event": "Evento",
|
||||
"ip": "IP",
|
||||
"client": "Cliente",
|
||||
"clients": "Clientes",
|
||||
"details": "Detalles",
|
||||
"started": "Iniciado",
|
||||
"lastAccess": "Ăltimo acceso",
|
||||
"expires": "Expira",
|
||||
"applications": "Aplicaciones",
|
||||
"account": "Cuenta",
|
||||
"federatedIdentity": "Identidad federada",
|
||||
"authenticator": "Autenticador",
|
||||
"sessions": "Sesiones",
|
||||
"log": "Regisro",
|
||||
"application": "AplicaciĂłn",
|
||||
"availablePermissions": "Permisos disponibles",
|
||||
"grantedPermissions": "Permisos concedidos",
|
||||
"grantedPersonalInfo": "InformaciĂłn personal concedida",
|
||||
"additionalGrants": "Permisos adicionales",
|
||||
"action": "AcciĂłn",
|
||||
"inResource": "en",
|
||||
"fullAccess": "Acceso total",
|
||||
"offlineToken": "CĂłdigo de autorizaciĂłn offline",
|
||||
"revoke": "Revocar permiso",
|
||||
"configureAuthenticators": "Autenticadores configurados",
|
||||
"mobile": "MĂłvil",
|
||||
"totpStep1":
|
||||
'Instala <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> o Google Authenticator en tu teléfono móvil. Ambas aplicaciones estån disponibles en <a href="https://play.google.com">Google Play</a> y en la App Store de Apple.',
|
||||
"totpStep2": "Abre la aplicaciĂłn y escanea el cĂłdigo o introduce la clave.",
|
||||
"totpStep3": "Introduce el cĂłdigo Ășnico que te muestra la aplicaciĂłn de autenticaciĂłn y haz clic en Enviar para finalizar la configuraciĂłn",
|
||||
"missingUsernameMessage": "Por favor indica tu usuario.",
|
||||
"missingFirstNameMessage": "Por favor indica el nombre.",
|
||||
"invalidEmailMessage": "Email no vĂĄlido",
|
||||
"missingLastNameMessage": "Por favor indica tus apellidos.",
|
||||
"missingEmailMessage": "Por favor indica el email.",
|
||||
"missingPasswordMessage": "Por favor indica tu contraseña.",
|
||||
"notMatchPasswordMessage": "Las contraseñas no coinciden.",
|
||||
"missingTotpMessage": "Por favor indica tu cĂłdigo de autenticaciĂłn",
|
||||
"invalidPasswordExistingMessage": "La contraseña actual no es correcta.",
|
||||
"invalidPasswordConfirmMessage": "La confirmación de contraseña no coincide.",
|
||||
"invalidTotpMessage": "El cĂłdigo de autenticaciĂłn no es vĂĄlido.",
|
||||
"usernameExistsMessage": "El usuario ya existe",
|
||||
"emailExistsMessage": "El email ya existe",
|
||||
"readOnlyUserMessage": "No puedes actualizar tu usuario porque tu cuenta es de solo lectura.",
|
||||
"readOnlyPasswordMessage": "No puedes actualizar tu contraseña porque tu cuenta es de solo lectura.",
|
||||
"successTotpMessage": "AplicaciĂłn de autenticaciĂłn mĂłvil configurada.",
|
||||
"successTotpRemovedMessage": "AplicaciĂłn de autenticaciĂłn mĂłvil eliminada.",
|
||||
"successGrantRevokedMessage": "Permiso revocado correctamente",
|
||||
"accountUpdatedMessage": "Tu cuenta se ha actualizado.",
|
||||
"accountPasswordUpdatedMessage": "Tu contraseña se ha actualizado.",
|
||||
"missingIdentityProviderMessage": "Proveedor de identidad no indicado.",
|
||||
"invalidFederatedIdentityActionMessage": "AcciĂłn no vĂĄlida o no indicada.",
|
||||
"identityProviderNotFoundMessage": "No se encontrĂł un proveedor de identidad.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Esta identidad ya no estĂĄ activa",
|
||||
"federatedIdentityRemovingLastProviderMessage": "No puedes eliminar la Ășltima identidad federada porque no tienes fijada una contraseña.",
|
||||
"identityProviderRedirectErrorMessage": "Error en la redirecciĂłn al proveedor de identidad",
|
||||
"identityProviderRemovedMessage": "Proveedor de identidad borrado correctamente.",
|
||||
"accountDisabledMessage": "La cuenta estĂĄ desactivada, contacta con el administrador.",
|
||||
"accountTemporarilyDisabledMessage": "La cuenta estå temporalmente desactivada, contacta con el administrador o inténtalo de nuevo mås tarde.",
|
||||
"invalidPasswordMinLengthMessage": "Contraseña incorrecta: longitud mĂnima {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Contraseña incorrecta: debe contener al menos {0} letras minĂșsculas.",
|
||||
"invalidPasswordMinDigitsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres numéricos.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Contraseña incorrecta: debe contener al menos {0} letras mayĂșsculas.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Contraseña incorrecta: debe contener al menos {0} caracteres especiales.",
|
||||
"invalidPasswordNotUsernameMessage": "Contraseña incorrecta: no puede ser igual al nombre de usuario.",
|
||||
"invalidPasswordRegexPatternMessage": "Contraseña incorrecta: no cumple la expresión regular.",
|
||||
"invalidPasswordHistoryMessage": "Contraseña incorrecta: no puede ser igual a ninguna de las Ășltimas {0} contraseñas."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
150
src/lib/i18n/generated_messages/11.0.3/account/fr.ts
Normal file
150
src/lib/i18n/generated_messages/11.0.3/account/fr.ts
Normal file
@ -0,0 +1,150 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Sauvegarder",
|
||||
"doCancel": "Annuler",
|
||||
"doLogOutAllSessions": "Déconnexion de toutes les sessions",
|
||||
"doRemove": "Supprimer",
|
||||
"doAdd": "Ajouter",
|
||||
"doSignOut": "Déconnexion",
|
||||
"editAccountHtmlTitle": "Ădition du compte",
|
||||
"federatedIdentitiesHtmlTitle": "Identités fédérées",
|
||||
"accountLogHtmlTitle": "AccĂšs au compte",
|
||||
"changePasswordHtmlTitle": "Changer de mot de passe",
|
||||
"sessionsHtmlTitle": "Sessions",
|
||||
"accountManagementTitle": "Gestion du compte Keycloak",
|
||||
"authenticatorTitle": "Authentification",
|
||||
"applicationsHtmlTitle": "Applications",
|
||||
"authenticatorCode": "Mot de passe unique",
|
||||
"email": "Courriel",
|
||||
"firstName": "Prénom",
|
||||
"givenName": "Prénom",
|
||||
"fullName": "Nom complet",
|
||||
"lastName": "Nom",
|
||||
"familyName": "Nom de famille",
|
||||
"password": "Mot de passe",
|
||||
"passwordConfirm": "Confirmation",
|
||||
"passwordNew": "Nouveau mot de passe",
|
||||
"username": "Compte",
|
||||
"address": "Adresse",
|
||||
"street": "Rue",
|
||||
"locality": "Ville ou Localité",
|
||||
"region": "Ătat, Province ou RĂ©gion",
|
||||
"postal_code": "Code Postal",
|
||||
"country": "Pays",
|
||||
"emailVerified": "Courriel vérifié",
|
||||
"gssDelegationCredential": "Accréditation de délégation GSS",
|
||||
"role_admin": "Administrateur",
|
||||
"role_realm-admin": "Administrateur du domaine",
|
||||
"role_create-realm": "Créer un domaine",
|
||||
"role_view-realm": "Voir un domaine",
|
||||
"role_view-users": "Voir les utilisateurs",
|
||||
"role_view-applications": "Voir les applications",
|
||||
"role_view-clients": "Voir les clients",
|
||||
"role_view-events": "Voir les événements",
|
||||
"role_view-identity-providers": "Voir les fournisseurs d'identités",
|
||||
"role_manage-realm": "Gérer le domaine",
|
||||
"role_manage-users": "Gérer les utilisateurs",
|
||||
"role_manage-applications": "Gérer les applications",
|
||||
"role_manage-identity-providers": "Gérer les fournisseurs d'identités",
|
||||
"role_manage-clients": "Gérer les clients",
|
||||
"role_manage-events": "Gérer les événements",
|
||||
"role_view-profile": "Voir le profil",
|
||||
"role_manage-account": "Gérer le compte",
|
||||
"role_read-token": "Lire le jeton d'authentification",
|
||||
"role_offline-access": "AccĂšs hors-ligne",
|
||||
"client_account": "Compte",
|
||||
"client_security-admin-console": "Console d'administration de la sécurité",
|
||||
"client_admin-cli": "Admin CLI",
|
||||
"client_realm-management": "Gestion du domaine",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Champs obligatoires",
|
||||
"allFieldsRequired": "Tous les champs sont obligatoires",
|
||||
"backToApplication": "« Revenir Ă l'application",
|
||||
"backTo": "Revenir Ă {0}",
|
||||
"date": "Date",
|
||||
"event": "Evénement",
|
||||
"ip": "IP",
|
||||
"client": "Client",
|
||||
"clients": "Clients",
|
||||
"details": "Détails",
|
||||
"started": "Début",
|
||||
"lastAccess": "Dernier accĂšs",
|
||||
"expires": "Expiration",
|
||||
"applications": "Applications",
|
||||
"account": "Compte",
|
||||
"federatedIdentity": "Identité fédérée",
|
||||
"authenticator": "Authentification",
|
||||
"sessions": "Sessions",
|
||||
"log": "Connexion",
|
||||
"application": "Application",
|
||||
"availablePermissions": "Permissions disponibles",
|
||||
"grantedPermissions": "Permissions accordées",
|
||||
"grantedPersonalInfo": "Informations personnelles accordées",
|
||||
"additionalGrants": "Droits additionnels",
|
||||
"action": "Action",
|
||||
"inResource": "dans",
|
||||
"fullAccess": "AccĂšs complet",
|
||||
"offlineToken": "Jeton d'authentification hors-ligne",
|
||||
"revoke": "Révoquer un droit",
|
||||
"configureAuthenticators": "Authentifications configurées.",
|
||||
"mobile": "Téléphone mobile",
|
||||
"totpStep1": "Installez une des applications suivantes sur votre mobile",
|
||||
"totpStep2": "Ouvrez l'application et scannez le code-barres ou entrez la clef.",
|
||||
"totpStep3": "Entrez le code Ă usage unique fourni par l'application et cliquez sur Sauvegarder pour terminer.",
|
||||
"totpManualStep2": "Ouvrez l'application et entrez la clef",
|
||||
"totpManualStep3": "Utilisez les valeurs de configuration suivante si l'application les autorise",
|
||||
"totpUnableToScan": "Impossible de scanner ?",
|
||||
"totpScanBarcode": "Scanner le code-barres ?",
|
||||
"totp.totp": "Basé sur le temps",
|
||||
"totp.hotp": "Basé sur un compteur",
|
||||
"totpType": "Type",
|
||||
"totpAlgorithm": "Algorithme",
|
||||
"totpDigits": "Chiffres",
|
||||
"totpInterval": "Intervalle",
|
||||
"totpCounter": "Compteur",
|
||||
"missingUsernameMessage": "Veuillez entrer votre nom d'utilisateur.",
|
||||
"missingFirstNameMessage": "Veuillez entrer votre prénom.",
|
||||
"invalidEmailMessage": "Courriel invalide.",
|
||||
"missingLastNameMessage": "Veuillez entrer votre nom.",
|
||||
"missingEmailMessage": "Veuillez entrer votre courriel.",
|
||||
"missingPasswordMessage": "Veuillez entrer votre mot de passe.",
|
||||
"notMatchPasswordMessage": "Les mots de passe ne sont pas identiques",
|
||||
"missingTotpMessage": "Veuillez entrer le code d'authentification.",
|
||||
"invalidPasswordExistingMessage": "Mot de passe existant invalide.",
|
||||
"invalidPasswordConfirmMessage": "Le mot de passe de confirmation ne correspond pas.",
|
||||
"invalidTotpMessage": "Le code d'authentification est invalide.",
|
||||
"usernameExistsMessage": "Le nom d'utilisateur existe déjà .",
|
||||
"emailExistsMessage": "Le courriel existe déjà .",
|
||||
"readOnlyUserMessage": "Vous ne pouvez pas mettre Ă jour votre compte car il est en lecture seule.",
|
||||
"readOnlyPasswordMessage": "Vous ne pouvez pas mettre Ă jour votre mot de passe car votre compte est en lecture seule.",
|
||||
"successTotpMessage": "L'authentification via téléphone mobile est configurée.",
|
||||
"successTotpRemovedMessage": "L'authentification via téléphone mobile est supprimée.",
|
||||
"successGrantRevokedMessage": "Droit révoqué avec succÚs.",
|
||||
"accountUpdatedMessage": "Votre compte a été mis à jour.",
|
||||
"accountPasswordUpdatedMessage": "Votre mot de passe a été mis à jour.",
|
||||
"missingIdentityProviderMessage": "Le fournisseur d'identité n'est pas spécifié.",
|
||||
"invalidFederatedIdentityActionMessage": "Action manquante ou invalide.",
|
||||
"identityProviderNotFoundMessage": "Le fournisseur d'identité spécifié n'est pas trouvé.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Cette identité n'est plus active dorénavant.",
|
||||
"federatedIdentityRemovingLastProviderMessage":
|
||||
"Vous ne pouvez pas supprimer votre derniÚre fédération d'identité sans avoir de mot de passe spécifié.",
|
||||
"identityProviderRedirectErrorMessage": "Erreur de redirection vers le fournisseur d'identité.",
|
||||
"identityProviderRemovedMessage": "Le fournisseur d'identité a été supprimé correctement.",
|
||||
"identityProviderAlreadyLinkedMessage": "Le fournisseur d'identité retourné par {0} est déjà lié à un autre utilisateur.",
|
||||
"accountDisabledMessage": "Ce compte est désactivé, veuillez contacter votre administrateur.",
|
||||
"accountTemporarilyDisabledMessage": "Ce compte est temporairement désactivé, veuillez contacter votre administrateur ou réessayez plus tard.",
|
||||
"invalidPasswordMinLengthMessage": "Mot de passe invalide: longueur minimale {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Mot de passe invalide: doit contenir au moins {0} lettre(s) en minuscule.",
|
||||
"invalidPasswordMinDigitsMessage": "Mot de passe invalide: doit contenir au moins {0} chiffre(s).",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Mot de passe invalide: doit contenir au moins {0} lettre(s) en majuscule.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Mot de passe invalide: doit contenir au moins {0} caractÚre(s) spéciaux.",
|
||||
"invalidPasswordNotUsernameMessage": "Mot de passe invalide: ne doit pas ĂȘtre identique au nom d'utilisateur.",
|
||||
"invalidPasswordRegexPatternMessage": "Mot de passe invalide: ne valide pas l'expression rationnelle.",
|
||||
"invalidPasswordHistoryMessage": "Mot de passe invalide: ne doit pas ĂȘtre Ă©gal aux {0} derniers mots de passe."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
310
src/lib/i18n/generated_messages/11.0.3/account/it.ts
Normal file
310
src/lib/i18n/generated_messages/11.0.3/account/it.ts
Normal file
@ -0,0 +1,310 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Salva",
|
||||
"doCancel": "Annulla",
|
||||
"doLogOutAllSessions": "Effettua il logout da tutte le sessioni",
|
||||
"doRemove": "Elimina",
|
||||
"doAdd": "Aggiungi",
|
||||
"doSignOut": "Esci",
|
||||
"doLogIn": "Log In",
|
||||
"doLink": "Link",
|
||||
"editAccountHtmlTitle": "Modifica Account",
|
||||
"personalInfoHtmlTitle": "Informazioni personali",
|
||||
"federatedIdentitiesHtmlTitle": "IdentitĂ federate",
|
||||
"accountLogHtmlTitle": "Log dell'account",
|
||||
"changePasswordHtmlTitle": "Cambia password",
|
||||
"deviceActivityHtmlTitle": "AttivitĂ dei dispositivi",
|
||||
"sessionsHtmlTitle": "Sessioni",
|
||||
"accountManagementTitle": "Gestione degli account di Keycloak",
|
||||
"authenticatorTitle": "Autenticatore",
|
||||
"applicationsHtmlTitle": "Applicazioni",
|
||||
"linkedAccountsHtmlTitle": "Account collegati",
|
||||
"accountManagementWelcomeMessage": "Benvenuto nella gestione degli account di Keycloak",
|
||||
"personalInfoIntroMessage": "Gestisci le tue informazioni di base",
|
||||
"accountSecurityTitle": "Sicurezza dell'account",
|
||||
"accountSecurityIntroMessage": "Controlla la tua password e gli accessi dell'account",
|
||||
"applicationsIntroMessage": "Traccia e gestisci i permessi delle applicazioni nell'accesso al tuo account",
|
||||
"resourceIntroMessage": "Condividi le tue risorse tra i membri del team",
|
||||
"passwordLastUpdateMessage": "La tua password Ăš stata aggiornata il",
|
||||
"updatePasswordTitle": "Aggiornamento password",
|
||||
"updatePasswordMessageTitle": "Assicurati di scegliere una password robusta",
|
||||
"updatePasswordMessage":
|
||||
"Una password robusta contiene un misto di numeri, lettere, e simboli. Ă difficile da indovinare, non assomiglia a una parola reale, ed Ăš utilizzata solo per questo account.",
|
||||
"personalSubTitle": "Le tue informazioni personali",
|
||||
"personalSubMessage": "Gestisce queste informazioni di base: il tuo nome, cognome, e indirizzo email",
|
||||
"authenticatorCode": "Codice monouso",
|
||||
"email": "Email",
|
||||
"firstName": "Nome",
|
||||
"givenName": "Nome",
|
||||
"fullName": "Nome completo",
|
||||
"lastName": "Cognome",
|
||||
"familyName": "Cognome",
|
||||
"password": "Password",
|
||||
"currentPassword": "Password attuale",
|
||||
"passwordConfirm": "Conferma password",
|
||||
"passwordNew": "Nuova password",
|
||||
"username": "Username",
|
||||
"address": "Indirizzo",
|
||||
"street": "Via",
|
||||
"locality": "CittĂ o localitĂ ",
|
||||
"region": "Stato, Provincia, o Regione",
|
||||
"postal_code": "CAP",
|
||||
"country": "Paese",
|
||||
"emailVerified": "Email verificata",
|
||||
"gssDelegationCredential": "Credenziali delega GSS",
|
||||
"profileScopeConsentText": "Profilo utente",
|
||||
"emailScopeConsentText": "Indirizzo email",
|
||||
"addressScopeConsentText": "Indirizzo",
|
||||
"phoneScopeConsentText": "Numero di telefono",
|
||||
"offlineAccessScopeConsentText": "Accesso offline",
|
||||
"samlRoleListScopeConsentText": "I miei ruoli",
|
||||
"rolesScopeConsentText": "Ruoli utente",
|
||||
"role_admin": "Admin",
|
||||
"role_realm-admin": "Realm admin",
|
||||
"role_create-realm": "Crea realm",
|
||||
"role_view-realm": "Visualizza realm",
|
||||
"role_view-users": "Visualizza utenti",
|
||||
"role_view-applications": "Visualizza applicazioni",
|
||||
"role_view-clients": "Visualizza client",
|
||||
"role_view-events": "Visualizza eventi",
|
||||
"role_view-identity-providers": "Visualizza identity provider",
|
||||
"role_view-consent": "Visualizza consensi",
|
||||
"role_manage-realm": "Gestisci realm",
|
||||
"role_manage-users": "Gestisci utenti",
|
||||
"role_manage-applications": "Gestisci applicazioni",
|
||||
"role_manage-identity-providers": "Gestisci identity provider",
|
||||
"role_manage-clients": "Gestisci client",
|
||||
"role_manage-events": "Gestisci eventi",
|
||||
"role_view-profile": "Visualizza profilo",
|
||||
"role_manage-account": "Gestisci account",
|
||||
"role_manage-account-links": "Gestisci i link dell'account",
|
||||
"role_manage-consent": "Gestisci consensi",
|
||||
"role_read-token": "Leggi token",
|
||||
"role_offline-access": "Accesso offline",
|
||||
"role_uma_authorization": "Ottieni permessi",
|
||||
"client_account": "Account",
|
||||
"client_account-console": "Console account",
|
||||
"client_security-admin-console": "Console di amministrazione di sicurezza",
|
||||
"client_admin-cli": "Admin CLI",
|
||||
"client_realm-management": "Gestione realm",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Campi obbligatori",
|
||||
"allFieldsRequired": "Tutti campi obbligatori",
|
||||
"backToApplication": "« Torna all'applicazione",
|
||||
"backTo": "Torna a {0}",
|
||||
"date": "Data",
|
||||
"event": "Evento",
|
||||
"ip": "IP",
|
||||
"client": "Client",
|
||||
"clients": "Client",
|
||||
"details": "Dettagli",
|
||||
"started": "Iniziato",
|
||||
"lastAccess": "Ultimo accesso",
|
||||
"expires": "Scade",
|
||||
"applications": "Applicazioni",
|
||||
"account": "Account",
|
||||
"federatedIdentity": "IdentitĂ federate",
|
||||
"authenticator": "Autenticatore",
|
||||
"device-activity": "AttivitĂ dei dispositivi",
|
||||
"sessions": "Sessioni",
|
||||
"log": "Log",
|
||||
"application": "Applicazione",
|
||||
"availablePermissions": "Autorizzazioni disponibili",
|
||||
"grantedPermissions": "Autorizzazioni concesse",
|
||||
"grantedPersonalInfo": "Informazioni personali concesse",
|
||||
"additionalGrants": "Ulteriori concessioni",
|
||||
"action": "Azione",
|
||||
"inResource": "in",
|
||||
"fullAccess": "Accesso completo",
|
||||
"offlineToken": "Token offline",
|
||||
"revoke": "Revoca concessione",
|
||||
"configureAuthenticators": "Autenticatori configurati",
|
||||
"mobile": "Dispositivo mobile",
|
||||
"totpStep1": "Installa una delle seguenti applicazioni sul tuo dispositivo mobile",
|
||||
"totpStep2": "Apri l'applicazione e scansiona il codice QR",
|
||||
"totpStep3": "Scrivi il codice monouso fornito dall'applicazione e clicca Salva per completare il setup.",
|
||||
"totpStep3DeviceName": "Fornisci il nome del dispositivo per aiutarti a gestire i dispositivi di autenticazione.",
|
||||
"totpManualStep2": "Apri l'applicazione e scrivi la chiave",
|
||||
"totpManualStep3": "Usa le seguenti impostazioni se l'applicazione lo consente",
|
||||
"totpUnableToScan": "Non riesci a scansionare il codice QR?",
|
||||
"totpScanBarcode": "Vuoi scansionare il codice QR?",
|
||||
"totp.totp": "Basato sull'ora",
|
||||
"totp.hotp": "Basato sul contatore",
|
||||
"totpType": "Tipo",
|
||||
"totpAlgorithm": "Algoritmo",
|
||||
"totpDigits": "Cifre",
|
||||
"totpInterval": "Intervallo",
|
||||
"totpCounter": "Contatore",
|
||||
"totpDeviceName": "Nome dispositivo",
|
||||
"missingUsernameMessage": "Inserisci lo username.",
|
||||
"missingFirstNameMessage": "Inserisci il nome.",
|
||||
"invalidEmailMessage": "Indirizzo email non valido.",
|
||||
"missingLastNameMessage": "Inserisci il cognome.",
|
||||
"missingEmailMessage": "Inserisci l'indirizzo email.",
|
||||
"missingPasswordMessage": "Inserisci la password.",
|
||||
"notMatchPasswordMessage": "Le password non coincidono.",
|
||||
"invalidUserMessage": "Utente non valido",
|
||||
"missingTotpMessage": "Inserisci il codice di autenticazione.",
|
||||
"missingTotpDeviceNameMessage": "Inserisci il nome del dispositivo di autenticazione.",
|
||||
"invalidPasswordExistingMessage": "Password esistente non valida.",
|
||||
"invalidPasswordConfirmMessage": "La password di conferma non coincide.",
|
||||
"invalidTotpMessage": "Codice di autenticazione non valido.",
|
||||
"usernameExistsMessage": "Username giĂ esistente.",
|
||||
"emailExistsMessage": "Email giĂ esistente.",
|
||||
"readOnlyUserMessage": "Non puoi aggiornare il tuo account poiché Ú in modalità sola lettura.",
|
||||
"readOnlyUsernameMessage": "Non puoi aggiornare il tuo nome utente poiché Ú in modalità sola lettura.",
|
||||
"readOnlyPasswordMessage": "Non puoi aggiornare il tuo account poiché Ú in modalità sola lettura.",
|
||||
"successTotpMessage": "Autenticatore mobile configurato.",
|
||||
"successTotpRemovedMessage": "Autenticatore mobile eliminato.",
|
||||
"successGrantRevokedMessage": "Concessione revocata con successo.",
|
||||
"accountUpdatedMessage": "Il tuo account Ăš stato aggiornato.",
|
||||
"accountPasswordUpdatedMessage": "La tua password Ăš stata aggiornata.",
|
||||
"missingIdentityProviderMessage": "Identity provider non specificato.",
|
||||
"invalidFederatedIdentityActionMessage": "Azione non valida o mancante.",
|
||||
"identityProviderNotFoundMessage": "L'identity provider specificato non Ăš stato trovato.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Questo identity non Ăš piĂč attivo.",
|
||||
"federatedIdentityRemovingLastProviderMessage": "Non puoi rimuovere l'ultima identitĂ federata poichĂ© non hai piĂč la password.",
|
||||
"identityProviderRedirectErrorMessage": "Il reindirizzamento all'identity provider Ăš fallito.",
|
||||
"identityProviderRemovedMessage": "Identity provider eliminato correttamente.",
|
||||
"identityProviderAlreadyLinkedMessage": "L'identitĂ federata restituita da {0} Ăš giĂ collegata ad un altro utente.",
|
||||
"staleCodeAccountMessage": "La pagina Ăš scaduta. Prova di nuovo.",
|
||||
"consentDenied": "Consenso negato.",
|
||||
"accountDisabledMessage": "Account disabilitato, contatta l'amministratore.",
|
||||
"accountTemporarilyDisabledMessage": "L'account Ăš temporaneamente disabilitato, contatta l'amministratore o riprova piĂč tardi.",
|
||||
"invalidPasswordMinLengthMessage": "Password non valida: lunghezza minima {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Password non valida: deve contenere almeno {0} caratteri minuscoli.",
|
||||
"invalidPasswordMinDigitsMessage": "Password non valida: deve contenere almeno {0} numeri.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Password non valida: deve contenere almeno {0} caratteri maiuscoli.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Password non valida: deve contenere almeno {0} caratteri speciali.",
|
||||
"invalidPasswordNotUsernameMessage": "Password non valida: non deve essere uguale allo username.",
|
||||
"invalidPasswordRegexPatternMessage": "Password non valida: fallito il match con una o piĂč espressioni regolari.",
|
||||
"invalidPasswordHistoryMessage": "Password non valida: non deve essere uguale a una delle ultime {0} password.",
|
||||
"invalidPasswordBlacklistedMessage": "Password non valida: la password non Ăš consentita.",
|
||||
"invalidPasswordGenericMessage": "Password non valida: la nuova password non rispetta le indicazioni previste.",
|
||||
"myResources": "Le mie risorse",
|
||||
"myResourcesSub": "Le mie risorse",
|
||||
"doDeny": "Nega",
|
||||
"doRevoke": "Revoca",
|
||||
"doApprove": "Approva",
|
||||
"doRemoveSharing": "Rimuovi condivisione",
|
||||
"doRemoveRequest": "Rimuovi richiesta",
|
||||
"peopleAccessResource": "Persone che hanno accesso a questa risorsa",
|
||||
"resourceManagedPolicies": "Permessi che danno accesso a questa risorsa",
|
||||
"resourceNoPermissionsGrantingAccess": "Nessun permesso dĂ accesso a questa risorsa",
|
||||
"anyAction": "Qualsiasi azione",
|
||||
"description": "Descrizione",
|
||||
"name": "Nome",
|
||||
"scopes": "Ambito",
|
||||
"resource": "Risorsa",
|
||||
"user": "Utente",
|
||||
"peopleSharingThisResource": "Persone che condividono questa risorsa",
|
||||
"shareWithOthers": "Condividi con altri",
|
||||
"needMyApproval": "Richiede la mia approvazione",
|
||||
"requestsWaitingApproval": "La tua richiesta Ăš in attesa di approvazione",
|
||||
"icon": "Icona",
|
||||
"requestor": "Richiedente",
|
||||
"owner": "Proprietario",
|
||||
"resourcesSharedWithMe": "Risorse condivise con me",
|
||||
"permissionRequestion": "Richiesta di permesso",
|
||||
"permission": "Permesso",
|
||||
"shares": "condivisioni",
|
||||
"notBeingShared": "Questa risorsa non Ăš in condivisione.",
|
||||
"notHaveAnyResource": "Non hai nessuna risorsa",
|
||||
"noResourcesSharedWithYou": "Non ci sono risorse condivise con te",
|
||||
"havePermissionRequestsWaitingForApproval": "Hai {0} richiesta(e) di permesso in attesa di approvazione.",
|
||||
"clickHereForDetails": "Clicca qui per i dettagli.",
|
||||
"resourceIsNotBeingShared": "La risorsa non Ăš in condivisione",
|
||||
"locale_it": "Italiano",
|
||||
"applicaitonName": "Nome",
|
||||
"applicationType": "Tipo applicazione",
|
||||
"applicationInUse": "In-use app only",
|
||||
"clearAllFilter": "Azzera tutti i filtri",
|
||||
"activeFilters": "Filtri attivi",
|
||||
"filterByName": "Filtra per nome ...",
|
||||
"allApps": "Tutte le applicazioni",
|
||||
"internalApps": "Applicazioni interne",
|
||||
"thirdpartyApps": "Applicazioni di terze parti",
|
||||
"appResults": "Risultati",
|
||||
"clientNotFoundMessage": "Client non trovato.",
|
||||
"authorizedProvider": "Provider autorizzato",
|
||||
"authorizedProviderMessage": "Provider autorizzati collegati al tuo account",
|
||||
"identityProvider": "Identity provider",
|
||||
"identityProviderMessage": "Collegare il tuo account con gli identity provider che hai configurato",
|
||||
"socialLogin": "Social Login",
|
||||
"userDefined": "Definito dall'utente",
|
||||
"removeAccess": "Rimuovi accesso",
|
||||
"removeAccessMessage": "Devi concedere di nuovo l'accesso, se vuoi utilizzare l'account di questa applicazione.",
|
||||
"authenticatorStatusMessage": "L'autenticazione a due fattori Ăš attualmente",
|
||||
"authenticatorFinishSetUpTitle": "La tua autenticazione a due fattori",
|
||||
"authenticatorFinishSetUpMessage":
|
||||
"Ogni volta che effettui l'accesso al tuo account Keycloak, ti verrĂ richiesto di fornire il tuo codice di autenticazione a due fattori.",
|
||||
"authenticatorSubTitle": "Imposta l'autenticazione a due fattori",
|
||||
"authenticatorSubMessage":
|
||||
"Per incrementare la sicurezza del tuo account, attiva almeno uno dei metodi disponibili per l'autenticazione a due fattori.",
|
||||
"authenticatorMobileTitle": "Autenticatore mobile",
|
||||
"authenticatorMobileMessage": "Utilizza l'autenticatore mobile per ottenere i codici di verifica per l'autenticazione a due fattori.",
|
||||
"authenticatorMobileFinishSetUpMessage": "L'autenticatore Ăš stato collegato al tuo telefono.",
|
||||
"authenticatorActionSetup": "Set up",
|
||||
"authenticatorSMSTitle": "Codice SMS",
|
||||
"authenticatorSMSMessage": "Keycloak invierĂ il codice di verifica al tuo telefono per l'autenticazione a due fattori.",
|
||||
"authenticatorSMSFinishSetUpMessage": "I messaggi di testo vengono inviati a",
|
||||
"authenticatorDefaultStatus": "Default",
|
||||
"authenticatorChangePhone": "Cambia numero di telefono",
|
||||
"authenticatorBackupCodesTitle": "Codici di backup",
|
||||
"authenticatorBackupCodesMessage": "Ottieni i tuoi codici di backup a otto cifre",
|
||||
"authenticatorBackupCodesFinishSetUpMessage": "Sono stati generati dodici codici di backup. Ognuno puĂČ essere usato una sola volta.",
|
||||
"authenticatorMobileSetupTitle": "Setup autenticatore mobile",
|
||||
"smscodeIntroMessage": "Inserisci il tuo numero di telefono e ti verrĂ inviato un codice di verifica.",
|
||||
"mobileSetupStep1": "Installa un'applicazione di autenticazione sul tuo telefono. Sono supportate le applicazioni qui elencate.",
|
||||
"mobileSetupStep2": "Apri l'applicazione e scansiona il codice QR:",
|
||||
"mobileSetupStep3": "Inserisci il codice monouso fornito dall'applicazione e clicca Salva per completare il setup.",
|
||||
"scanBarCode": "Vuoi scansionare il codice QR?",
|
||||
"enterBarCode": "Inserisci il codice monouso",
|
||||
"doCopy": "Copia",
|
||||
"doFinish": "Termina",
|
||||
"authenticatorSMSCodeSetupTitle": "Setup codice SMS",
|
||||
"chooseYourCountry": "Scegli la tua nazione",
|
||||
"enterYourPhoneNumber": "Inserisci il tuo numero di telefono",
|
||||
"sendVerficationCode": "Invia il codice di verifica",
|
||||
"enterYourVerficationCode": "Inserisci il codice di verifica",
|
||||
"authenticatorBackupCodesSetupTitle": "Setup backup codici",
|
||||
"backupcodesIntroMessage":
|
||||
"Se non disponi piĂč del tuo telefono, puoi comunque accedere al tuo account attraverso i codici di backup. Conservali in un posto sicuro e accessibile.",
|
||||
"realmName": "Realm",
|
||||
"doDownload": "Download",
|
||||
"doPrint": "Stampa",
|
||||
"backupCodesTips-1": "Ogni codice di backup puĂČ essere usato una sola volta.",
|
||||
"backupCodesTips-2": "Questi codici sono stati generati il",
|
||||
"generateNewBackupCodes": "Genera dei nuovi codici di backup",
|
||||
"backupCodesTips-3": "Quando generi dei nuovi codici di backup, quelli attuali non funzioneranno piĂč.",
|
||||
"backtoAuthenticatorPage": "Torna alla pagina dell'autenticatore",
|
||||
"resources": "Risorse",
|
||||
"sharedwithMe": "Condiviso con me",
|
||||
"share": "Condiviso",
|
||||
"sharedwith": "Condiviso con",
|
||||
"accessPermissions": "Permessi di accesso",
|
||||
"permissionRequests": "Richieste di permesso",
|
||||
"approve": "Approva",
|
||||
"approveAll": "Approva tutti",
|
||||
"people": "persone",
|
||||
"perPage": "per pagina",
|
||||
"currentPage": "Pagina corrente",
|
||||
"sharetheResource": "Condividi la risorsa",
|
||||
"group": "Gruppo",
|
||||
"selectPermission": "Seleziona permessi",
|
||||
"addPeople": "Aggiungi persone con le quali condividere la tua risorsa",
|
||||
"addTeam": "Aggiungi gruppi con i quali condividere la tua risorsa",
|
||||
"myPermissions": "Miei permessi",
|
||||
"waitingforApproval": "Attesa dell'approvazione",
|
||||
"anyPermission": "Qualsiasi permesso",
|
||||
"openshift.scope.user_info": "Informazioni utente",
|
||||
"openshift.scope.user_check-access": "Informazioni per l'accesso dell'utente",
|
||||
"openshift.scope.user_full": "Accesso completo",
|
||||
"openshift.scope.list-projects": "Elenca progetti"
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
324
src/lib/i18n/generated_messages/11.0.3/account/ja.ts
Normal file
324
src/lib/i18n/generated_messages/11.0.3/account/ja.ts
Normal file
@ -0,0 +1,324 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "äżć",
|
||||
"doCancel": "ăăŁăłă»ă«",
|
||||
"doLogOutAllSessions": "ć
šă»ăă·ă§ăłăăăă°ăąăŠă",
|
||||
"doRemove": "ćé€",
|
||||
"doAdd": "èżœć ",
|
||||
"doSignOut": "ă”ă€ăłăąăŠă",
|
||||
"doLogIn": "ăă°ă€ăł",
|
||||
"doLink": "ăȘăłăŻ",
|
||||
"editAccountHtmlTitle": "ăąă«ăŠăłăăźç·šé",
|
||||
"personalInfoHtmlTitle": "ćäșșæ
ć ±",
|
||||
"federatedIdentitiesHtmlTitle": "éŁæșæžăżăąă€ăăłăăŁăăŁăŒ",
|
||||
"accountLogHtmlTitle": "ăąă«ăŠăłăăă°",
|
||||
"changePasswordHtmlTitle": "ăăčăŻăŒă〿Ž",
|
||||
"deviceActivityHtmlTitle": "ăăă€ăčă»ăąăŻăăŁăăăŁăŒ",
|
||||
"sessionsHtmlTitle": "ă»ăă·ă§ăł",
|
||||
"accountManagementTitle": "Keycloakăąă«ăŠăłă知ç",
|
||||
"authenticatorTitle": "ăȘăŒă»ăłăăŁă±ăŒăżăŒ",
|
||||
"applicationsHtmlTitle": "ăąăăȘă±ăŒă·ă§ăł",
|
||||
"linkedAccountsHtmlTitle": "ăȘăłăŻăăăăąă«ăŠăłă",
|
||||
"accountManagementWelcomeMessage": "Keycloakăąă«ăŠăłă知çăžăăăă",
|
||||
"personalInfoIntroMessage": "ćșæŹæ
ć ±ă知çăă",
|
||||
"accountSecurityTitle": "ăąă«ăŠăłăă»ă»ăă„ăȘăăŁăŒ",
|
||||
"accountSecurityIntroMessage": "ăăčăŻăŒăăšăąă«ăŠăłăă»ăąăŻă»ăčăć¶ćŸĄăă",
|
||||
"applicationsIntroMessage": "ăąă«ăŠăłăăžăąăŻă»ăčăăăăă«ăąăăȘăźăăŒăăă·ă§ăłăèżœè·ĄăăŠçźĄçăă",
|
||||
"resourceIntroMessage": "ăăŒă ăĄăłăăŒéă§ăȘăœăŒăčăć
±æăă",
|
||||
"passwordLastUpdateMessage": "ăăčăŻăŒăăŻæŽæ°ăăăŸăă",
|
||||
"updatePasswordTitle": "ăăčăŻăŒăăźæŽæ°",
|
||||
"updatePasswordMessageTitle": "ćŒ·ćăȘăăčăŻăŒăăéžæăăŠăă ăă",
|
||||
"updatePasswordMessage":
|
||||
"ćŒ·ćăȘăăčăŻăŒăăŻăæ°ćăæćăèšć·ăć«ăżăŸăăæšæžŹăéŁăăăćźćšăăèšèă«äŒŒăŠăăăăăăźăąă«ăŠăłăă ăă§äœżçšăăăŠăăŸăă",
|
||||
"personalSubTitle": "ćäșșæ
ć ±",
|
||||
"personalSubMessage": "ăăźćșæŹæ
ć ±ă知çăăŠăă ăăïŒćăć§ăăĄăŒă«",
|
||||
"authenticatorCode": "ăŻăłăżă€ă ăłăŒă",
|
||||
"email": "EăĄăŒă«",
|
||||
"firstName": "ć",
|
||||
"givenName": "ć",
|
||||
"fullName": "æ°ć",
|
||||
"lastName": "ć§",
|
||||
"familyName": "ć§",
|
||||
"password": "ăăčăŻăŒă",
|
||||
"currentPassword": "çŸćšăźăăčăŻăŒă",
|
||||
"passwordConfirm": "æ°ăăăăčăŻăŒăïŒçąșèȘïŒ",
|
||||
"passwordNew": "æ°ăăăăčăŻăŒă",
|
||||
"username": "ăŠăŒă¶ăŒć",
|
||||
"address": "äœæ",
|
||||
"street": "çȘć°",
|
||||
"locality": "ćžćșçșæ",
|
||||
"region": "éœéćșç",
|
||||
"postal_code": "é”äŸżçȘć·",
|
||||
"country": "ćœ",
|
||||
"emailVerified": "çąșèȘæžăżEăĄăŒă«",
|
||||
"gssDelegationCredential": "GSSć§èČăŻăŹăăłă·ăŁă«",
|
||||
"profileScopeConsentText": "ăŠăŒă¶ăŒă»ăăăăĄă€ă«",
|
||||
"emailScopeConsentText": "ăĄăŒă«ăąăăŹăč",
|
||||
"addressScopeConsentText": "ăąăăŹăč",
|
||||
"phoneScopeConsentText": "é»è©±çȘć·",
|
||||
"offlineAccessScopeConsentText": "ăȘăă©ă€ăłă»ăąăŻă»ăč",
|
||||
"samlRoleListScopeConsentText": "ăăŒă«",
|
||||
"rolesScopeConsentText": "ăŠăŒă¶ăŒăăŒă«",
|
||||
"role_admin": "知çè
",
|
||||
"role_realm-admin": "ăŹă«ă 知çè
",
|
||||
"role_create-realm": "ăŹă«ă ăźäœæ",
|
||||
"role_view-realm": "ăŹă«ă ăźćç
§",
|
||||
"role_view-users": "ăŠăŒă¶ăŒăźćç
§",
|
||||
"role_view-applications": "ăąăăȘă±ăŒă·ă§ăłăźćç
§",
|
||||
"role_view-clients": "ăŻă©ă€ăąăłăăźćç
§",
|
||||
"role_view-events": "ă€ăăłăăźćç
§",
|
||||
"role_view-identity-providers": "ăąă€ăăłăăŁăăŁăŒă»ăăăă€ăăŒăźćç
§",
|
||||
"role_view-consent": "ćæăźćç
§",
|
||||
"role_manage-realm": "ăŹă«ă ăźçźĄç",
|
||||
"role_manage-users": "ăŠăŒă¶ăŒăźçźĄç",
|
||||
"role_manage-applications": "ăąăăȘă±ăŒă·ă§ăłăźçźĄç",
|
||||
"role_manage-identity-providers": "ăąă€ăăłăăŁăăŁăŒă»ăăăă€ăăŒăźçźĄç",
|
||||
"role_manage-clients": "ăŻă©ă€ăąăłăăźçźĄç",
|
||||
"role_manage-events": "ă€ăăłăăźçźĄç",
|
||||
"role_view-profile": "ăăăăĄă€ă«ăźćç
§",
|
||||
"role_manage-account": "ăąă«ăŠăłăăźçźĄç",
|
||||
"role_manage-account-links": "ăąă«ăŠăłăăȘăłăŻăźçźĄç",
|
||||
"role_manage-consent": "ćæăźçźĄç",
|
||||
"role_read-token": "ăăŒăŻăłăźćç
§",
|
||||
"role_offline-access": "ăȘăă©ă€ăłă»ăąăŻă»ăč",
|
||||
"role_uma_authorization": "ăăŒăăă·ă§ăłăźććŸ",
|
||||
"client_account": "ăąă«ăŠăłă",
|
||||
"client_account-console": "ăąă«ăŠăłăă»ăłăłăœăŒă«",
|
||||
"client_security-admin-console": "ă»ăă„ăȘăăŁăŒçźĄçăłăłăœăŒă«",
|
||||
"client_admin-cli": "知çCLI",
|
||||
"client_realm-management": "ăŹă«ă 知ç",
|
||||
"client_broker": "ăăăŒă«ăŒ",
|
||||
"requiredFields": "ćż
é ",
|
||||
"allFieldsRequired": "ć
šăŠăźć
„ćé
çźăćż
é ",
|
||||
"backToApplication": "« ăąăăȘă±ăŒă·ă§ăłă«æ»ă",
|
||||
"backTo": "{0}ă«æ»ă",
|
||||
"date": "æ„ä»",
|
||||
"event": "ă€ăăłă",
|
||||
"ip": "IP",
|
||||
"client": "ăŻă©ă€ăąăłă",
|
||||
"clients": "ăŻă©ă€ăąăłă",
|
||||
"details": "è©łçŽ°",
|
||||
"started": "éć§",
|
||||
"lastAccess": "æç”ăąăŻă»ăč",
|
||||
"expires": "æćčæé",
|
||||
"applications": "ăąăăȘă±ăŒă·ă§ăł",
|
||||
"account": "ăąă«ăŠăłă",
|
||||
"federatedIdentity": "éŁæșæžăżăąă€ăăłăăŁăăŁăŒ",
|
||||
"authenticator": "ăȘăŒă»ăłăăŁă±ăŒăżăŒ",
|
||||
"device-activity": "ăăă€ăčă»ăąăŻăăŁăăăŁăŒ",
|
||||
"sessions": "ă»ăă·ă§ăł",
|
||||
"log": "ăă°",
|
||||
"application": "ăąăăȘă±ăŒă·ă§ăł",
|
||||
"availableRoles": "ć©çšćŻèœăȘăăŒă«",
|
||||
"grantedPermissions": "èš±ćŻăăăăăŒăăă·ă§ăł",
|
||||
"grantedPersonalInfo": "èš±ćŻăăăćäșșæ
ć ±",
|
||||
"additionalGrants": "èżœć ăźèš±ćŻ",
|
||||
"action": "ăąăŻă·ă§ăł",
|
||||
"inResource": "in",
|
||||
"fullAccess": "ăă«ăąăŻă»ăč",
|
||||
"offlineToken": "ăȘăă©ă€ăłă»ăăŒăŻăł",
|
||||
"revoke": "èš±ćŻăźćăæ¶ă",
|
||||
"configureAuthenticators": "èšćźæžăżăźăȘăŒă»ăłăăŁă±ăŒăżăŒ",
|
||||
"mobile": "ăąăă€ă«",
|
||||
"totpStep1": "ăąăă€ă«ă«ä»„äžăźăąăăȘă±ăŒă·ă§ăłăźăăăăăă€ăłăčăăŒă«ăăŠăă ăăă",
|
||||
"totpStep2": "ăąăăȘă±ăŒă·ă§ăłăéăăăăŒăłăŒăăăčăăŁăłăăŠăă ăăă",
|
||||
"totpStep3": "ăąăăȘă±ăŒă·ă§ăłă§æäŸăăăăŻăłăżă€ă ăłăŒăăć
„ćăăŠäżćăăŻăȘăăŻăăă»ăăăąăăăćźäșăăŠăă ăăă",
|
||||
"totpStep3DeviceName": "OTPăăă€ăčăźçźĄçă«ćœčç«ă€ăăăȘăăă€ăčćăæćźăăŠăă ăăă",
|
||||
"totpManualStep2": "ăąăăȘă±ăŒă·ă§ăłăéăăăăŒăć
„ćăăŠăă ăăă",
|
||||
"totpManualStep3": "ăąăăȘă±ăŒă·ă§ăłăèšćźă§ăăć ŽćăŻăæŹĄăźèšćźć€ăäœżçšăăŠăă ăăă",
|
||||
"totpUnableToScan": "ăčăăŁăłă§ăăŸăăăïŒ",
|
||||
"totpScanBarcode": "ăăŒăłăŒăăăčăăŁăłăăŸăăïŒ",
|
||||
"totp.totp": "æéăăŒăč",
|
||||
"totp.hotp": "ă«ăŠăłăżăŒăăŒăč",
|
||||
"totpType": "ăżă€ă",
|
||||
"totpAlgorithm": "ăąă«ăŽăȘășă ",
|
||||
"totpDigits": "æ°ć",
|
||||
"totpInterval": "éé",
|
||||
"totpCounter": "ă«ăŠăłăżăŒ",
|
||||
"totpDeviceName": "ăăă€ăčć",
|
||||
"missingUsernameMessage": "ăŠăŒă¶ăŒćăć
„ćăăŠăă ăăă",
|
||||
"missingFirstNameMessage": "ćăć
„ćăăŠăă ăăă",
|
||||
"invalidEmailMessage": "çĄćčăȘăĄăŒă«ăąăăŹăčă§ăă",
|
||||
"missingLastNameMessage": "ć§ăć
„ćăăŠăă ăăă",
|
||||
"missingEmailMessage": "EăĄăŒă«ăć
„ćăăŠăă ăăă",
|
||||
"missingPasswordMessage": "ăăčăŻăŒăăć
„ćăăŠăă ăăă",
|
||||
"notMatchPasswordMessage": "ăăčăŻăŒăăäžèŽăăŠăăŸăăă",
|
||||
"invalidUserMessage": "çĄćčăȘăŠăŒă¶ăŒă§ăă",
|
||||
"missingTotpMessage": "ăȘăŒă»ăłăăŁă±ăŒăżăŒă»ăłăŒăăć
„ćăăŠăă ăăă",
|
||||
"missingTotpDeviceNameMessage": "ăăă€ăčćăæćźăăŠăă ăăă",
|
||||
"invalidPasswordExistingMessage": "æąćăźăăčăŻăŒăăäžæŁă§ăă",
|
||||
"invalidPasswordConfirmMessage": "æ°ăăăăčăŻăŒăïŒçąșèȘïŒăšäžèŽăăŠăăŸăăă",
|
||||
"invalidTotpMessage": "çĄćčăȘăȘăŒă»ăłăăŁă±ăŒăżăŒă»ăłăŒăă§ăă",
|
||||
"usernameExistsMessage": "æąă«ććšăăăŠăŒă¶ăŒćă§ăă",
|
||||
"emailExistsMessage": "æąă«ććšăăEăĄăŒă«ă§ăă",
|
||||
"readOnlyUserMessage": "èȘăżćăć°çšăźăăăăąă«ăŠăłăăæŽæ°ăăăăšăŻă§ăăŸăăă",
|
||||
"readOnlyUsernameMessage": "èȘăżćăć°çšăźăăăăŠăŒă¶ăŒćăæŽæ°ăăăăšăŻă§ăăŸăăă",
|
||||
"readOnlyPasswordMessage": "èȘăżćăć°çšăźăăăăăčăŻăŒăăæŽæ°ăăăăšăŻă§ăăŸăăă",
|
||||
"successTotpMessage": "ăąăă€ă«ă»ăȘăŒă»ăłăăŁă±ăŒăżăŒăèšćźăăăŸăăă",
|
||||
"successTotpRemovedMessage": "ăąăă€ă«ă»ăȘăŒă»ăłăăŁă±ăŒăżăŒăćé€ăăăŸăăă",
|
||||
"successGrantRevokedMessage": "èš±ćŻăæŁćžžă«ćăæ¶ăăăăŸăăă",
|
||||
"accountUpdatedMessage": "ăąă«ăŠăłăăæŽæ°ăăăŸăăă",
|
||||
"accountPasswordUpdatedMessage": "ăăčăŻăŒăăæŽæ°ăăăŸăăă",
|
||||
"missingIdentityProviderMessage": "ăąă€ăăłăăŁăăŁăŒă»ăăăă€ăăŒăæćźăăăŠăăŸăăă",
|
||||
"invalidFederatedIdentityActionMessage": "çĄćčăŸăăŻććšăăȘăăąăŻă·ă§ăłă§ăă",
|
||||
"identityProviderNotFoundMessage": "æćźăăăăąă€ăăłăăŁăăŁăŒă»ăăăă€ăăŒăèŠă€ăăăŸăăă",
|
||||
"federatedIdentityLinkNotActiveMessage": "ăăźăąă€ăăłăăŁăăŁăŒăŻæćčă§ăŻăăăŸăăă",
|
||||
"federatedIdentityRemovingLastProviderMessage": "ăăčăŻăŒăăăȘăăăăæćŸăźéŁæșæžăżăąă€ăăłăăŁăăŁăŒăćé€ă§ăăŸăăă",
|
||||
"identityProviderRedirectErrorMessage": "ăąă€ăăłăăŁăăŁăŒă»ăăăă€ăăŒăžăźăȘăă€ăŹăŻăă«ć€±æăăŸăăă",
|
||||
"identityProviderRemovedMessage": "ăąă€ăăłăăŁăăŁăŒă»ăăăă€ăăŒăæŁćžžă«ćé€ăăăŸăăă",
|
||||
"identityProviderAlreadyLinkedMessage": "{0}ăăèżăăăéŁæșæžăżăąă€ăăłăăŁăăŁăŒăŻæąă«ä»ăźăŠăŒă¶ăŒă«éąéŁä»ăăăăŠăăŸăă",
|
||||
"staleCodeAccountMessage": "æćčæéćăă§ăăććșŠă詊ăăă ăăă",
|
||||
"consentDenied": "ćæăæćŠăăăŸăăă",
|
||||
"accountDisabledMessage": "ăąă«ăŠăłăăçĄćčă§ăă知çè
ă«éŁç”ĄăăŠăă ăăă",
|
||||
"accountTemporarilyDisabledMessage": "ăąă«ăŠăłăăäžæçă«çĄćčă§ăă知çè
ă«éŁç”Ąăăăăăă°ăăæéăăăăŠăăććșŠă詊ăăă ăăă",
|
||||
"invalidPasswordMinLengthMessage": "çĄćčăȘăăčăŻăŒă: æć°{0}ăźé·ăăćż
èŠă§ăă",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźć°æćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinDigitsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźæ°ćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "çĄćčăȘăăčăŻăŒă:ć°ăȘăăšă{0}æćăźć€§æćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordMinSpecialCharsMessage": "çĄćčăȘăăčăŻăŒă: ć°ăȘăăšă{0}æćăźçčæźæćăć«ăćż
èŠăăăăŸăă",
|
||||
"invalidPasswordNotUsernameMessage": "çĄćčăȘăăčăŻăŒă: ăŠăŒă¶ăŒćăšćăăăčăŻăŒăăŻçŠæąăăăŠăăŸăă",
|
||||
"invalidPasswordRegexPatternMessage": "çĄćčăȘăăčăŻăŒă: æŁèŠèĄšçŸăăżăŒăłăšäžèŽăăŸăăă",
|
||||
"invalidPasswordHistoryMessage": "çĄćčăȘăăčăŻăŒă: æèżăź{0}ăăčăŻăŒăăźăăăăăšćăăăčăŻăŒăăŻçŠæąăăăŠăăŸăă",
|
||||
"invalidPasswordBlacklistedMessage": "çĄćčăȘăăčăŻăŒă: ăăčăŻăŒăăăă©ăăŻăȘăčăă«ć«ăŸăăŠăăŸăă",
|
||||
"invalidPasswordGenericMessage": "çĄćčăȘăăčăŻăŒă: æ°ăăăăčăŻăŒăăŻăăčăŻăŒăă»ăăȘă·ăŒăšäžèŽăăŸăăă",
|
||||
"myResources": "ăă€ăȘăœăŒăč",
|
||||
"myResourcesSub": "ăă€ăȘăœăŒăč",
|
||||
"doDeny": "æćŠ",
|
||||
"doRevoke": "ćăæ¶ă",
|
||||
"doApprove": "æżèȘ",
|
||||
"doRemoveSharing": "ć
±æăźćé€",
|
||||
"doRemoveRequest": "èŠæ±ăźćé€",
|
||||
"peopleAccessResource": "ăăźăȘăœăŒăčă«ăąăŻă»ăčă§ăăäșș",
|
||||
"resourceManagedPolicies": "ăăźăȘăœăŒăčăžăźăąăŻă»ăčăèš±ćŻăăăăŒăăă·ă§ăł",
|
||||
"resourceNoPermissionsGrantingAccess": "ăăźăȘăœăŒăčăžăźăąăŻă»ăčăèš±ćŻăăæš©éăŻăăăŸăă",
|
||||
"anyAction": "ä»»æăźăąăŻă·ă§ăł",
|
||||
"description": "èȘŹæ",
|
||||
"name": "ćć",
|
||||
"scopes": "ăčăłăŒă",
|
||||
"resource": "ăȘăœăŒăč",
|
||||
"user": "ăŠăŒă¶ăŒ",
|
||||
"peopleSharingThisResource": "ăăźăȘăœăŒăčăć
±æăăŠăăäșș",
|
||||
"shareWithOthers": "ä»äșșăšć
±æ",
|
||||
"needMyApproval": "æżèȘăćż
èŠ",
|
||||
"requestsWaitingApproval": "æżèȘćŸ
ăĄăźèŠæ±",
|
||||
"icon": "ăąă€ăłăł",
|
||||
"requestor": "èŠæ±è
",
|
||||
"owner": "ăȘăŒăăŒ",
|
||||
"resourcesSharedWithMe": "ć
±æăăŠăăăȘăœăŒăč",
|
||||
"permissionRequestion": "ăăŒăăă·ă§ăłăźèŠæ±",
|
||||
"permission": "ăăŒăăă·ă§ăł",
|
||||
"shares": "ć
±æïŒè€æ°ïŒ",
|
||||
"notBeingShared": "ăăźăȘăœăŒăčăŻć
±æăăăŠăăŸăăă",
|
||||
"notHaveAnyResource": "ăȘăœăŒăčăăăăŸăăă",
|
||||
"noResourcesSharedWithYou": "ć
±æăăŠăăăȘăœăŒăčăŻăăăŸăă",
|
||||
"havePermissionRequestsWaitingForApproval": "æżèȘăćŸ
ăŁăŠăă{0}ćăźăăŒăăă·ă§ăłăźèŠæ±ăăăăŸăă",
|
||||
"clickHereForDetails": "è©łçŽ°ăŻăăĄăăăŻăȘăăŻăăŠăă ăăă",
|
||||
"resourceIsNotBeingShared": "ăȘăœăŒăčăŻć
±æăăăŠăăŸăăă",
|
||||
"locale_ca": "CatalĂ ",
|
||||
"locale_de": "Deutsch",
|
||||
"locale_en": "English",
|
||||
"locale_es": "Español",
|
||||
"locale_fr": "Français",
|
||||
"locale_it": "Italian",
|
||||
"locale_ja": "æ„æŹèȘ",
|
||||
"locale_nl": "Nederlands",
|
||||
"locale_no": "Norsk",
|
||||
"locale_lt": "LietuviĆł",
|
||||
"locale_pt-BR": "PortuguĂȘs (Brasil)",
|
||||
"locale_ru": "Đ ŃŃŃĐșĐžĐč",
|
||||
"locale_sk": "SlovenÄina",
|
||||
"locale_sv": "Svenska",
|
||||
"locale_tr": "Turkish",
|
||||
"locale_zh-CN": "äžæçźäœ",
|
||||
"applicaitonName": "ćć",
|
||||
"applicationType": "ăąăăȘă±ăŒă·ă§ăłă»ăżă€ă",
|
||||
"applicationInUse": "äœżçšäžăźăąăăȘă±ăŒă·ă§ăłăźăż",
|
||||
"clearAllFilter": "ăăčăŠăźăăŁă«ăżăŒăăŻăȘăą",
|
||||
"activeFilters": "ăąăŻăăŁăăȘăăŁă«ăżăŒ",
|
||||
"filterByName": "ććă§ăăŁă«ăżăȘăłă°...",
|
||||
"allApps": "ăăčăŠăźăąăăȘă±ăŒă·ă§ăł",
|
||||
"internalApps": "ć
éšăąăăȘă±ăŒă·ă§ăł",
|
||||
"thirdpartyApps": "ă”ăŒăăăŒăăŁăŒăźăąăăȘă±ăŒă·ă§ăł",
|
||||
"appResults": "ç”æ",
|
||||
"clientNotFoundMessage": "ăŻă©ă€ăąăłăăèŠă€ăăăŸăăă",
|
||||
"authorizedProvider": "èȘćŻæžăżăăăă€ăăŒ",
|
||||
"authorizedProviderMessage": "ăąă«ăŠăłăă«ăȘăłăŻăăăèȘćŻæžăżăăăă€ăăŒ",
|
||||
"identityProvider": "ăąă€ăăłăăŁăăŁăŒă»ăăăă€ăăŒ",
|
||||
"identityProviderMessage": "ăąă«ăŠăłăăšèšćźăăăąă€ăăłăăŁăăŁăŒă»ăăăă€ăăŒăăȘăłăŻăăă«ăŻ",
|
||||
"socialLogin": "ăœăŒă·ăŁă«ă»ăă°ă€ăł",
|
||||
"userDefined": "ăŠăŒă¶ăŒćźçŸ©",
|
||||
"removeAccess": "ăąăŻă»ăčæš©ăźćé€",
|
||||
"removeAccessMessage": "ăăźăąăăȘă»ăąă«ăŠăłăăäœżçšăăć ŽćăŻăăąăŻă»ăčæš©ăććșŠä»äžăăćż
èŠăăăăŸăă",
|
||||
"authenticatorStatusMessage": "2èŠçŽ èȘ蚌ăŻçŸćš",
|
||||
"authenticatorFinishSetUpTitle": "ăăȘăăź2èŠçŽ èȘ蚌",
|
||||
"authenticatorFinishSetUpMessage": "Keycloakăąă«ăŠăłăă«ă”ă€ăłă€ăłăăăăłă«ă2èŠçŽ èȘ蚌ăłăŒăăć
„ćăăăăă«æ±ăăăăŸăă",
|
||||
"authenticatorSubTitle": "2èŠçŽ èȘ蚌ăèšćźăă",
|
||||
"authenticatorSubMessage": "ăąă«ăŠăłăăźă»ăă„ăȘăăŁăŒăćŒ·ćăăă«ăŻăć©çšćŻèœăȘ2èŠçŽ èȘèšŒăźæčćŒăźăăĄć°ăȘăăšă1ă€ăæćčă«ăăŸăă",
|
||||
"authenticatorMobileTitle": "ăąăă€ă«ă»ăȘăŒă»ăłăăŁă±ăŒăżăŒ",
|
||||
"authenticatorMobileMessage": "ăąăă€ă«ă»ăȘăŒă»ăłăăŁă±ăŒăżăŒăäœżçšăăŠă2èŠçŽ èȘ蚌ăšăăŠçąșèȘăłăŒăăććŸăăŸăă",
|
||||
"authenticatorMobileFinishSetUpMessage": "ăȘăŒă»ăłăăŁă±ăŒăżăŒăŻăăȘăăźæș枯é»è©±ă«ăă€ăłăăăăŠăăŸăă",
|
||||
"authenticatorActionSetup": "ă»ăăăąăă",
|
||||
"authenticatorSMSTitle": "SMSăłăŒă",
|
||||
"authenticatorSMSMessage": "KeycloakăŻă2èŠçŽ èȘ蚌ăšăăŠçąșèȘăłăŒăăæș枯é»è©±ă«é俥ăăŸăă",
|
||||
"authenticatorSMSFinishSetUpMessage": "ăăăčăă»ăĄăă»ăŒăžăæŹĄăźé»è©±çȘć·ćźă«é俥ăăăŸăïŒ",
|
||||
"authenticatorDefaultStatus": "ăăă©ă«ă",
|
||||
"authenticatorChangePhone": "é»è©±çȘć·ăźć€æŽ",
|
||||
"authenticatorBackupCodesTitle": "ăăăŻăąăăă»ăłăŒă",
|
||||
"authenticatorBackupCodesMessage": "8æĄăźăăăŻăąăăă»ăłăŒăăźć
„æ",
|
||||
"authenticatorBackupCodesFinishSetUpMessage": "ăăźæçčă§12ćăźăăăŻăąăăă»ăłăŒăăçæăăăŸăăăăăăăäžćșŠă ăäœżçšă§ăăŸăă",
|
||||
"authenticatorMobileSetupTitle": "ăąăă€ă«ă»ăȘăŒă»ăłăăŁă±ăŒăżăŒăźă»ăăăąăă",
|
||||
"smscodeIntroMessage": "é»è©±çȘć·ăć
„ćăăăšăçąșèȘăłăŒăăăăȘăăźé»è©±ă«é俥ăăăŸăă",
|
||||
"mobileSetupStep1":
|
||||
"æș枯é»è©±ă«ăȘăŒă»ăłăăŁă±ăŒăżăŒă»ăąăăȘă±ăŒă·ă§ăłăă€ăłăčăăŒă«ăăŸăăăăă«ăȘăčăăăăŠăăăąăăȘă±ăŒă·ă§ăłăă”ăăŒăăăăŠăăŸăă",
|
||||
"mobileSetupStep2": "ăąăăȘă±ăŒă·ă§ăłăéăăăăŒăłăŒăăăčăăŁăłăăŠăă ăăă",
|
||||
"mobileSetupStep3": "ăąăăȘă±ăŒă·ă§ăłăăæäŸăăăăŻăłăżă€ă ăłăŒăăć
„ćăăäżćăăŻăȘăăŻăăŠă»ăăăąăăăç”äșăăŸăă",
|
||||
"scanBarCode": "ăăŒăłăŒăăăčăăŁăłăăŸăăïŒ",
|
||||
"enterBarCode": "ăŻăłăżă€ă ăłăŒăăć
„ćăăŠăă ăă",
|
||||
"doCopy": "ăłăăŒ",
|
||||
"doFinish": "ç”äș",
|
||||
"authenticatorSMSCodeSetupTitle": "SMSăłăŒăăźă»ăăăąăă",
|
||||
"chooseYourCountry": "ćœăéžăă§ăă ăă",
|
||||
"enterYourPhoneNumber": "é»è©±çȘć·ăć
„ćăăŠăă ăă",
|
||||
"sendVerficationCode": "çąșèȘăłăŒăăźé俥",
|
||||
"enterYourVerficationCode": "çąșèȘăłăŒăăć
„ćăăŠăă ăă",
|
||||
"authenticatorBackupCodesSetupTitle": "ăăăŻăąăăă»ăłăŒăăźă»ăăăąăă",
|
||||
"backupcodesIntroMessage":
|
||||
"æș枯é»è©±ă«ăąăŻă»ăčă§ăăȘăć Žćă§ăăăăăŻăąăăă»ăłăŒăăäœżçšăăŠăąă«ăŠăłăă«ăă°ă€ăłă§ăăŸăăă©ăăćźć
šă§ăąăŻă»ăčćŻèœăȘć Žæă«äżçźĄăăŠăă ăăă",
|
||||
"realmName": "ăŹă«ă ",
|
||||
"doDownload": "ăăŠăłăăŒă",
|
||||
"doPrint": "ć°ć·",
|
||||
"backupCodesTips-1": "ćăăăŻăąăăă»ăłăŒăăŻ1ćäœżçšă§ăăŸăă",
|
||||
"backupCodesTips-2": "ăăăăźăłăŒăăŻăăźæ„ă«çæăăăŸăăïŒ",
|
||||
"generateNewBackupCodes": "æ°ăăăăăŻăąăăă»ăłăŒăăçæăă",
|
||||
"backupCodesTips-3": "æ°ăăăăăŻăąăăă»ăłăŒăăçæăăăšăçŸćšăźăłăŒăăŻæ©èœăăȘăăȘăăŸăă",
|
||||
"backtoAuthenticatorPage": "ăȘăŒă»ăłăăŁă±ăŒăżăŒă»ăăŒăžă«æ»ă",
|
||||
"resources": "ăȘăœăŒăč",
|
||||
"sharedwithMe": "ç§ăšć
±æ",
|
||||
"share": "ć
±æ",
|
||||
"sharedwith": "ć
±æ",
|
||||
"accessPermissions": "ăąăŻă»ăčă»ăăŒăăă·ă§ăł",
|
||||
"permissionRequests": "ăăŒăăă·ă§ăłăźèŠæ±",
|
||||
"approve": "æżèȘ",
|
||||
"approveAll": "ăăčăŠæżèȘ",
|
||||
"people": "äșș",
|
||||
"perPage": "1ăăŒăžăăă",
|
||||
"currentPage": "çŸćšăźăăŒăž",
|
||||
"sharetheResource": "ăȘăœăŒăčăźć
±æ",
|
||||
"group": "ă°ă«ăŒă",
|
||||
"selectPermission": "ăăŒăăă·ă§ăłăéžæ",
|
||||
"addPeople": "ăăȘăăźăȘăœăŒăčăć
±æăăäșșăèżœć ",
|
||||
"addTeam": "ăăȘăăźăȘăœăŒăčăć
±æăăăăŒă ăèżœć ",
|
||||
"myPermissions": "ç§ăźăăŒăăă·ă§ăł",
|
||||
"waitingforApproval": "æżèȘćŸ
ăĄ",
|
||||
"anyPermission": "ä»»æăźăăŒăăă·ă§ăł",
|
||||
"openshift.scope.user_info": "ăŠăŒă¶ăŒæ
ć ±",
|
||||
"openshift.scope.user_check-access": "ăŠăŒă¶ăŒăąăŻă»ăčæ
ć ±",
|
||||
"openshift.scope.user_full": "ăă«ăąăŻă»ăč",
|
||||
"openshift.scope.list-projects": "ăăăžă§ăŻăăźäžèŠ§èĄšç€ș"
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
143
src/lib/i18n/generated_messages/11.0.3/account/lt.ts
Normal file
143
src/lib/i18n/generated_messages/11.0.3/account/lt.ts
Normal file
@ -0,0 +1,143 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Saugoti",
|
||||
"doCancel": "AtĆĄaukti",
|
||||
"doLogOutAllSessions": "Atjungti visas sesijas",
|
||||
"doRemove": "Ć alinti",
|
||||
"doAdd": "PridÄti",
|
||||
"doSignOut": "Atsijungti",
|
||||
"editAccountHtmlTitle": "Redaguoti paskyrÄ
",
|
||||
"federatedIdentitiesHtmlTitle": "Susietos paskyros",
|
||||
"accountLogHtmlTitle": "Paskyros ĆŸurnalas",
|
||||
"changePasswordHtmlTitle": "Keisti slaptaĆŸodÄŻ",
|
||||
"sessionsHtmlTitle": "Prisijungimo sesijos",
|
||||
"accountManagementTitle": "Keycloak NaudotojĆł Administravimas",
|
||||
"authenticatorTitle": "Autentifikatorius",
|
||||
"applicationsHtmlTitle": "Programos",
|
||||
"authenticatorCode": "Vienkartinis kodas",
|
||||
"email": "El. paĆĄtas",
|
||||
"firstName": "Vardas",
|
||||
"givenName": "PavardÄ",
|
||||
"fullName": "Pilnas vardas",
|
||||
"lastName": "PavardÄ",
|
||||
"familyName": "PavardÄ",
|
||||
"password": "SlaptaĆŸodis",
|
||||
"passwordConfirm": "Pakartotas slaptaĆŸodis",
|
||||
"passwordNew": "Naujas slaptaĆŸodis",
|
||||
"username": "Naudotojo vardas",
|
||||
"address": "Adresas",
|
||||
"street": "GatvÄ",
|
||||
"locality": "Miestas arba vietovÄ",
|
||||
"region": "Rajonas",
|
||||
"postal_code": "PaĆĄto kodas",
|
||||
"country": "Ć alis",
|
||||
"emailVerified": "El. paĆĄto adresas patvirtintas",
|
||||
"gssDelegationCredential": "GSS prisijungimo duomenĆł delegavimas",
|
||||
"role_admin": "Administratorius",
|
||||
"role_realm-admin": "Srities administravimas",
|
||||
"role_create-realm": "Kurti sritÄŻ",
|
||||
"role_view-realm": "PerĆŸiĆ«rÄti sritÄŻ",
|
||||
"role_view-users": "PerĆŸiĆ«rÄti naudotojus",
|
||||
"role_view-applications": "PerĆŸiĆ«rÄti programas",
|
||||
"role_view-clients": "PerĆŸiĆ«rÄti klientines programas",
|
||||
"role_view-events": "PerĆŸiĆ«rÄti ÄŻvykiĆł ĆŸurnalÄ
",
|
||||
"role_view-identity-providers": "PerĆŸiĆ«rÄti tapatybÄs teikÄjus",
|
||||
"role_manage-realm": "Valdyti sritis",
|
||||
"role_manage-users": "Valdyti naudotojus",
|
||||
"role_manage-applications": "Valdyti programas",
|
||||
"role_manage-identity-providers": "Valdyti tapatybÄs teikÄjus",
|
||||
"role_manage-clients": "Valdyti programas",
|
||||
"role_manage-events": "Valdyti ÄŻvykius",
|
||||
"role_view-profile": "PerĆŸiĆ«rÄti paskyrÄ
",
|
||||
"role_manage-account": "Valdyti paskyrÄ
",
|
||||
"role_read-token": "Skaityti prieigos rakĆĄÄ
",
|
||||
"role_offline-access": "Darbas neprisijungus",
|
||||
"role_uma_authorization": "Äźgauti UMA autorizavimo teises",
|
||||
"client_account": "Paskyra",
|
||||
"client_security-admin-console": "Saugumo administravimo konsolÄ",
|
||||
"client_admin-cli": "Administravimo CLI",
|
||||
"client_realm-management": "Srities valdymas",
|
||||
"client_broker": "Tarpininkas",
|
||||
"requiredFields": "Privalomi laukai",
|
||||
"allFieldsRequired": "Visi laukai yra privalomi",
|
||||
"backToApplication": "« GrÄŻĆŸti ÄŻ programÄ
",
|
||||
"backTo": "Atgal ÄŻ {0}",
|
||||
"date": "Data",
|
||||
"event": "Äźvykis",
|
||||
"ip": "IP",
|
||||
"client": "Klientas",
|
||||
"clients": "Klientai",
|
||||
"details": "Detaliau",
|
||||
"started": "Sukƫrimo laikas",
|
||||
"lastAccess": "VÄliausia prieiga",
|
||||
"expires": "Galioja iki",
|
||||
"applications": "Programos",
|
||||
"account": "Paskyra",
|
||||
"federatedIdentity": "Susieta tapatybÄ",
|
||||
"authenticator": "Autentifikatorius",
|
||||
"sessions": "Sesijos",
|
||||
"log": "Äźvykiai",
|
||||
"application": "Programa",
|
||||
"availablePermissions": "Galimos teisÄs",
|
||||
"grantedPermissions": "Äźgalintos teisÄs",
|
||||
"grantedPersonalInfo": "Äźgalinta asmeninÄ informacija",
|
||||
"additionalGrants": "Papildomi ÄŻgaliojimai",
|
||||
"action": "Veiksmas",
|
||||
"inResource": "yra",
|
||||
"fullAccess": "Pilna prieiga",
|
||||
"offlineToken": "ReĆŸimo neprisijungus raktas (token)",
|
||||
"revoke": "AtĆĄaukti ÄŻgaliojimÄ
",
|
||||
"configureAuthenticators": "Sukonfigƫruotas autentifikatorius",
|
||||
"mobile": "Mobilus",
|
||||
"totpStep1":
|
||||
'Äźdiekite <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> arba Google Authenticator savo ÄŻrenginyje. ProgramÄlÄs prieinamos <a href="https://play.google.com">Google Play</a> ir Apple App Store.',
|
||||
"totpStep2": "Atidarykite programÄlÄ ir nuskenuokite barkodÄ
arba ÄŻveskite kodÄ
.",
|
||||
"totpStep3": "Äźveskite programÄlÄje sugeneruotÄ
vienÄ
kartÄ
galiojantÄŻ kodÄ
ir paspauskite Saugoti norÄdami prisijungti.",
|
||||
"missingUsernameMessage": "PraĆĄome ÄŻvesti naudotojo vardÄ
.",
|
||||
"missingFirstNameMessage": "PraĆĄome ÄŻvesti vardÄ
.",
|
||||
"invalidEmailMessage": "Neteisingas el. paĆĄto adresas.",
|
||||
"missingLastNameMessage": "PraĆĄome ÄŻvesti pavardÄ.",
|
||||
"missingEmailMessage": "PraĆĄome ÄŻvesti el. paĆĄto adresÄ
.",
|
||||
"missingPasswordMessage": "PraĆĄome ÄŻvesti slaptaĆŸodÄŻ.",
|
||||
"notMatchPasswordMessage": "SlaptaĆŸodĆŸiai nesutampa.",
|
||||
"missingTotpMessage": "PraĆĄome ÄŻvesti autentifikacijos kodÄ
.",
|
||||
"invalidPasswordExistingMessage": "Neteisingas dabartinis slaptaĆŸodis.",
|
||||
"invalidPasswordConfirmMessage": "Pakartotas slaptaĆŸodis nesutampa.",
|
||||
"invalidTotpMessage": "Neteisingas autentifikacijos kodas.",
|
||||
"usernameExistsMessage": "Toks naudotojas jau egzistuoja.",
|
||||
"emailExistsMessage": "El. paĆĄto adresas jau egzistuoja.",
|
||||
"readOnlyUserMessage": "Tik skaitymui sukonfigĆ«ruotos paskyros duomenĆł atnaujinti neleidĆŸiama.",
|
||||
"readOnlyPasswordMessage": "Tik skaitymui sukonfigĆ«ruotos paskyros slaptaĆŸodĆŸio atnaujinti neleidĆŸiama.",
|
||||
"successTotpMessage": "Mobilus autentifikatorius sukonfigƫruotas.",
|
||||
"successTotpRemovedMessage": "Mobilus autentifikatorius paĆĄalintas.",
|
||||
"successGrantRevokedMessage": "Äźgalinimas paĆĄalintas sÄkmingai.",
|
||||
"accountUpdatedMessage": "JĆ«sĆł paskyros duomenys sÄkmingai atnaujinti.",
|
||||
"accountPasswordUpdatedMessage": "JĆ«sĆł paskyros slaptaĆŸodis pakeistas.",
|
||||
"missingIdentityProviderMessage": "Nenurodytas tapatybÄs teikÄjas.",
|
||||
"invalidFederatedIdentityActionMessage": "Neteisingas arba neĆŸinomas veiksmas.",
|
||||
"identityProviderNotFoundMessage": "Nurodytas tapatybÄs teikÄjas nerastas.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Nurodyta susieta tapatybÄ neaktyvi.",
|
||||
"federatedIdentityRemovingLastProviderMessage":
|
||||
"JĆ«s negalite paĆĄalinti paskutinio tapatybÄs teikÄjo sÄ
sajos, nes JĆ«s neturite nusistatÄ paskyros slaptaĆŸodĆŸio.",
|
||||
"identityProviderRedirectErrorMessage": "Klaida nukreipiant ÄŻ tapatybÄs teikÄjo puslapÄŻ.",
|
||||
"identityProviderRemovedMessage": "TapatybÄs teikÄjas sÄkmingai paĆĄalintas.",
|
||||
"identityProviderAlreadyLinkedMessage": "Susieta tapatybÄ iĆĄ {0} jau susieta su kita paskyra.",
|
||||
"staleCodeAccountMessage": "Puslapio galiojimas baigÄsi. Bandykite dar kartÄ
.",
|
||||
"consentDenied": "Prieiga draudĆŸiama.",
|
||||
"accountDisabledMessage": "Paskyros galiojimas sustabdytas, kreipkitÄs ÄŻ administratoriĆł.",
|
||||
"accountTemporarilyDisabledMessage": "Paskyros galiojimas laikinai sustabdytas. KreipkitÄs ÄŻ administratoriĆł arba pabandykite vÄliau.",
|
||||
"invalidPasswordMinLengthMessage": "Per trumpas slaptaĆŸodis: maĆŸiausias ilgis {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} maĆŸÄ
jÄ
raidÄ.",
|
||||
"invalidPasswordMinDigitsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} skaitmenÄŻ.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} didĆŸiÄ
jÄ
raidÄ.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Neteisingas slaptaĆŸodis: privaloma ÄŻvesti {0} specialĆł simbolÄŻ.",
|
||||
"invalidPasswordNotUsernameMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis negali sutapti su naudotojo vardu.",
|
||||
"invalidPasswordRegexPatternMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis netenkina regex taisyklÄs(iĆł).",
|
||||
"invalidPasswordHistoryMessage": "Neteisingas slaptaĆŸodis: slaptaĆŸodis negali sutapti su prieĆĄ tai buvusiais {0} slaptaĆŸodĆŸiais."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
143
src/lib/i18n/generated_messages/11.0.3/account/nl.ts
Normal file
143
src/lib/i18n/generated_messages/11.0.3/account/nl.ts
Normal file
@ -0,0 +1,143 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Opslaan",
|
||||
"doCancel": "Annuleer",
|
||||
"doLogOutAllSessions": "Alle sessies uitloggen",
|
||||
"doRemove": "Verwijder",
|
||||
"doAdd": "Voeg toe",
|
||||
"doSignOut": "Afmelden",
|
||||
"editAccountHtmlTitle": "Bewerk account",
|
||||
"federatedIdentitiesHtmlTitle": "Federated Identities",
|
||||
"accountLogHtmlTitle": "Account log",
|
||||
"changePasswordHtmlTitle": "Verander wachtwoord",
|
||||
"sessionsHtmlTitle": "Sessies",
|
||||
"accountManagementTitle": "Keycloak Accountbeheer",
|
||||
"authenticatorTitle": "Authenticator",
|
||||
"applicationsHtmlTitle": "Toepassingen",
|
||||
"authenticatorCode": "Eenmalige code",
|
||||
"email": "E-mailadres",
|
||||
"firstName": "Voornaam",
|
||||
"givenName": "Voornaam",
|
||||
"fullName": "Volledige naam",
|
||||
"lastName": "Achternaam",
|
||||
"familyName": "Achternaam",
|
||||
"password": "Wachtwoord",
|
||||
"passwordConfirm": "Bevestiging",
|
||||
"passwordNew": "Nieuw Wachtwoord",
|
||||
"username": "Gebruikersnaam",
|
||||
"address": "Adres",
|
||||
"street": "Straat",
|
||||
"locality": "Stad of plaats",
|
||||
"region": "Staat, provincie of regio",
|
||||
"postal_code": "Postcode",
|
||||
"country": "Land",
|
||||
"emailVerified": "E-mailadres geverifieerd",
|
||||
"gssDelegationCredential": "GSS gedelegeerde aanmeldgegevens",
|
||||
"role_admin": "Beheer",
|
||||
"role_realm-admin": "Realmbeheer",
|
||||
"role_create-realm": "Creëer realm",
|
||||
"role_view-realm": "Bekijk realm",
|
||||
"role_view-users": "Bekijk gebruikers",
|
||||
"role_view-applications": "Bekijk toepassingen",
|
||||
"role_view-clients": "Bekijk clients",
|
||||
"role_view-events": "Bekijk gebeurtenissen",
|
||||
"role_view-identity-providers": "Bekijk identity providers",
|
||||
"role_manage-realm": "Beheer realm",
|
||||
"role_manage-users": "Beheer gebruikers",
|
||||
"role_manage-applications": "Beheer toepassingen",
|
||||
"role_manage-identity-providers": "Beheer identity providers",
|
||||
"role_manage-clients": "Beheer clients",
|
||||
"role_manage-events": "Beheer gebeurtenissen",
|
||||
"role_view-profile": "Bekijk profiel",
|
||||
"role_manage-account": "Beheer account",
|
||||
"role_manage-account-links": "Beheer accountkoppelingen",
|
||||
"role_read-token": "Lees token",
|
||||
"role_offline-access": "Offline toegang",
|
||||
"role_uma_authorization": "Verkrijg UMA rechten",
|
||||
"client_account": "Account",
|
||||
"client_security-admin-console": "Console Veligheidsbeheer",
|
||||
"client_admin-cli": "Beheer CLI",
|
||||
"client_realm-management": "Realmbeheer",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Verplichte velden",
|
||||
"allFieldsRequired": "Alle velden verplicht",
|
||||
"backToApplication": "« Terug naar toepassing",
|
||||
"backTo": "Terug naar {0}",
|
||||
"date": "Datum",
|
||||
"event": "Gebeurtenis",
|
||||
"ip": "IP",
|
||||
"client": "Client",
|
||||
"clients": "Clients",
|
||||
"details": "Details",
|
||||
"started": "Gestart",
|
||||
"lastAccess": "Laatste toegang",
|
||||
"expires": "Vervalt",
|
||||
"applications": "Toepassingen",
|
||||
"account": "Account",
|
||||
"federatedIdentity": "Federated Identity",
|
||||
"authenticator": "Authenticator",
|
||||
"sessions": "Sessies",
|
||||
"log": "Log",
|
||||
"application": "Toepassing",
|
||||
"availablePermissions": "Beschikbare rechten",
|
||||
"grantedPermissions": "Gegunde rechten",
|
||||
"grantedPersonalInfo": "Gegunde Persoonsgegevens",
|
||||
"additionalGrants": "Verdere vergunningen",
|
||||
"action": "Actie",
|
||||
"inResource": "in",
|
||||
"fullAccess": "Volledige toegang",
|
||||
"offlineToken": "Offline Token",
|
||||
"revoke": "Vergunning intrekken",
|
||||
"configureAuthenticators": "Ingestelde authenticators",
|
||||
"mobile": "Mobiel nummer",
|
||||
"totpStep1": "Installeer een van de onderstaande applicaties op uw mobiele apparaat:",
|
||||
"totpStep2": "Open de toepassing en scan de QR-code of voer de sleutel in.",
|
||||
"totpStep3": "Voer de door de toepassing gegeven eenmalige code in en klik op Opslaan om de configuratie af te ronden.",
|
||||
"missingUsernameMessage": "Gebruikersnaam ontbreekt.",
|
||||
"missingFirstNameMessage": "Voornaam onbreekt.",
|
||||
"invalidEmailMessage": "Ongeldig e-mailadres.",
|
||||
"missingLastNameMessage": "Achternaam ontbreekt.",
|
||||
"missingEmailMessage": "E-mailadres ontbreekt.",
|
||||
"missingPasswordMessage": "Wachtwoord ontbreekt.",
|
||||
"notMatchPasswordMessage": "Wachtwoorden komen niet overeen.",
|
||||
"missingTotpMessage": "Authenticatiecode ontbreekt.",
|
||||
"invalidPasswordExistingMessage": "Ongeldig bestaand wachtwoord.",
|
||||
"invalidPasswordConfirmMessage": "Wachtwoordbevestiging komt niet overeen.",
|
||||
"invalidTotpMessage": "Ongeldige authenticatiecode.",
|
||||
"emailExistsMessage": "E-mailadres bestaat reeds.",
|
||||
"readOnlyUserMessage": "U kunt uw account niet bijwerken aangezien het account alleen-lezen is.",
|
||||
"readOnlyPasswordMessage": "U kunt uw wachtwoord niet wijzigen omdat uw account alleen-lezen is.",
|
||||
"successTotpMessage": "Mobiele authenticator geconfigureerd.",
|
||||
"successTotpRemovedMessage": "Mobiele authenticator verwijderd.",
|
||||
"successGrantRevokedMessage": "Vergunning succesvol ingetrokken",
|
||||
"accountUpdatedMessage": "Uw account is gewijzigd.",
|
||||
"accountPasswordUpdatedMessage": "Uw wachtwoord is gewijzigd.",
|
||||
"missingIdentityProviderMessage": "Geen identity provider aangegeven.",
|
||||
"invalidFederatedIdentityActionMessage": "Ongeldige of ontbrekende actie op federated identity.",
|
||||
"identityProviderNotFoundMessage": "Gespecificeerde identity provider niet gevonden.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Deze federated identity is niet langer geldig.",
|
||||
"federatedIdentityRemovingLastProviderMessage":
|
||||
"U kunt de laatste federated identity provider niet verwijderen aangezien u dan niet langer zou kunnen inloggen.",
|
||||
"identityProviderRedirectErrorMessage": "Kon niet herverwijzen naar identity provider.",
|
||||
"identityProviderRemovedMessage": "Identity provider met succes verwijderd.",
|
||||
"identityProviderAlreadyLinkedMessage": "Door {0} teruggegeven federated identity is al gekoppeld aan een andere gebruiker.",
|
||||
"staleCodeAccountMessage": "De pagina is verlopen. Probeer het nogmaals.",
|
||||
"consentDenied": "Toestemming geweigerd",
|
||||
"accountDisabledMessage": "Account is gedeactiveerd. Contacteer de beheerder.",
|
||||
"accountTemporarilyDisabledMessage": "Account is tijdelijk deactiveerd, neem contact op met de beheerder of probeer het later opnieuw.",
|
||||
"invalidPasswordMinLengthMessage": "Ongeldig wachtwoord: de minimale lengte is {0} karakters.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} kleine letters bevatten.",
|
||||
"invalidPasswordMinDigitsMessage": "Ongeldig wachtwoord: het moet minstens {0} getallen bevatten.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} hoofdletters bevatten.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Ongeldig wachtwoord: het moet minstens {0} speciale karakters bevatten.",
|
||||
"invalidPasswordNotUsernameMessage": "Ongeldig wachtwoord: het mag niet overeenkomen met de gebruikersnaam.",
|
||||
"invalidPasswordRegexPatternMessage": "Ongeldig wachtwoord: het voldoet niet aan het door de beheerder ingestelde patroon.",
|
||||
"invalidPasswordHistoryMessage": "Ongeldig wachtwoord: het mag niet overeen komen met een van de laatste {0} wachtwoorden.",
|
||||
"invalidPasswordGenericMessage": "Ongeldig wachtwoord: het nieuwe wachtwoord voldoet niet aan het wachtwoordbeleid."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
153
src/lib/i18n/generated_messages/11.0.3/account/no.ts
Normal file
153
src/lib/i18n/generated_messages/11.0.3/account/no.ts
Normal file
@ -0,0 +1,153 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Lagre",
|
||||
"doCancel": "Avbryt",
|
||||
"doLogOutAllSessions": "Logg ut av alle sesjoner",
|
||||
"doRemove": "Fjern",
|
||||
"doAdd": "Legg til",
|
||||
"doSignOut": "Logg ut",
|
||||
"editAccountHtmlTitle": "Rediger konto",
|
||||
"federatedIdentitiesHtmlTitle": "Federerte identiteter",
|
||||
"accountLogHtmlTitle": "Kontologg",
|
||||
"changePasswordHtmlTitle": "Endre passord",
|
||||
"sessionsHtmlTitle": "Sesjoner",
|
||||
"accountManagementTitle": "Keycloak kontoadministrasjon",
|
||||
"authenticatorTitle": "Autentikator",
|
||||
"applicationsHtmlTitle": "Applikasjoner",
|
||||
"authenticatorCode": "Engangskode",
|
||||
"email": "E-post",
|
||||
"firstName": "Fornavn",
|
||||
"givenName": "Fornavn",
|
||||
"fullName": "Fullt navn",
|
||||
"lastName": "Etternavn",
|
||||
"familyName": "Etternavn",
|
||||
"password": "Passord",
|
||||
"passwordConfirm": "Bekreftelse",
|
||||
"passwordNew": "Nytt passord",
|
||||
"username": "Brukernavn",
|
||||
"address": "Adresse",
|
||||
"street": "Gate-/veinavn + husnummer",
|
||||
"locality": "By",
|
||||
"region": "Fylke",
|
||||
"postal_code": "Postnummer",
|
||||
"country": "Land",
|
||||
"emailVerified": "E-post bekreftet",
|
||||
"gssDelegationCredential": "GSS legitimasjonsdelegering",
|
||||
"role_admin": "Administrator",
|
||||
"role_realm-admin": "Administrator for sikkerhetsdomene",
|
||||
"role_create-realm": "Opprette sikkerhetsdomene",
|
||||
"role_view-realm": "Se sikkerhetsdomene",
|
||||
"role_view-users": "Se brukere",
|
||||
"role_view-applications": "Se applikasjoner",
|
||||
"role_view-clients": "Se klienter",
|
||||
"role_view-events": "Se hendelser",
|
||||
"role_view-identity-providers": "Se identitetsleverandĂžrer",
|
||||
"role_manage-realm": "Administrere sikkerhetsdomene",
|
||||
"role_manage-users": "Administrere brukere",
|
||||
"role_manage-applications": "Administrere applikasjoner",
|
||||
"role_manage-identity-providers": "Administrere identitetsleverandĂžrer",
|
||||
"role_manage-clients": "Administrere klienter",
|
||||
"role_manage-events": "Administrere hendelser",
|
||||
"role_view-profile": "Se profil",
|
||||
"role_manage-account": "Administrere konto",
|
||||
"role_read-token": "Lese token",
|
||||
"role_offline-access": "Frakoblet tilgang",
|
||||
"role_uma_authorization": "Skaffe tillatelser",
|
||||
"client_account": "Konto",
|
||||
"client_security-admin-console": "Sikkerhetsadministrasjonskonsoll",
|
||||
"client_admin-cli": "Kommandolinje-grensesnitt for administrator",
|
||||
"client_realm-management": "Sikkerhetsdomene-administrasjon",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Obligatoriske felt",
|
||||
"allFieldsRequired": "Alle felt mÄ fylles ut",
|
||||
"backToApplication": "« Tilbake til applikasjonen",
|
||||
"backTo": "Tilbake til {0}",
|
||||
"date": "Dato",
|
||||
"event": "Hendelse",
|
||||
"ip": "IP",
|
||||
"client": "Klient",
|
||||
"clients": "Klienter",
|
||||
"details": "Detaljer",
|
||||
"started": "Startet",
|
||||
"lastAccess": "Sist benyttet",
|
||||
"expires": "UtlĂžper",
|
||||
"applications": "Applikasjoner",
|
||||
"account": "Konto",
|
||||
"federatedIdentity": "Federert identitet",
|
||||
"authenticator": "Autentikator",
|
||||
"sessions": "Sesjoner",
|
||||
"log": "Logg",
|
||||
"application": "Applikasjon",
|
||||
"availablePermissions": "Tilgjengelige rettigheter",
|
||||
"grantedPermissions": "Innvilgede rettigheter",
|
||||
"grantedPersonalInfo": "Innvilget personlig informasjon",
|
||||
"additionalGrants": "Ekstra rettigheter",
|
||||
"action": "Handling",
|
||||
"inResource": "i",
|
||||
"fullAccess": "Full tilgang",
|
||||
"offlineToken": "Offline token",
|
||||
"revoke": "Opphev rettighet",
|
||||
"configureAuthenticators": "Konfigurerte autentikatorer",
|
||||
"mobile": "Mobiltelefon",
|
||||
"totpStep1": "Installer ett av fÞlgende programmer pÄ mobilen din.",
|
||||
"totpStep2": "Ă
pne applikasjonen og skann strekkoden eller skriv inn koden.",
|
||||
"totpStep3": "Skriv inn engangskoden gitt av applikasjonen og klikk Lagre for Ă„ fullfĂžre.",
|
||||
"missingUsernameMessage": "Vennligst oppgi brukernavn.",
|
||||
"missingFirstNameMessage": "Vennligst oppgi fornavn.",
|
||||
"invalidEmailMessage": "Ugyldig e-postadresse.",
|
||||
"missingLastNameMessage": "Vennligst oppgi etternavn.",
|
||||
"missingEmailMessage": "Vennligst oppgi e-postadresse.",
|
||||
"missingPasswordMessage": "Vennligst oppgi passord.",
|
||||
"notMatchPasswordMessage": "Passordene er ikke like.",
|
||||
"missingTotpMessage": "Vennligst oppgi engangskode.",
|
||||
"invalidPasswordExistingMessage": "Ugyldig eksisterende passord.",
|
||||
"invalidPasswordConfirmMessage": "Passordene er ikke like.",
|
||||
"invalidTotpMessage": "Ugyldig engangskode.",
|
||||
"usernameExistsMessage": "Brukernavnet finnes allerede.",
|
||||
"emailExistsMessage": "E-postadressen finnes allerede.",
|
||||
"readOnlyUserMessage": "Du kan ikke oppdatere kontoen din ettersom den er skrivebeskyttet.",
|
||||
"readOnlyPasswordMessage": "Du kan ikke oppdatere passordet ditt ettersom kontoen din er skrivebeskyttet.",
|
||||
"successTotpMessage": "Autentikator for mobiltelefon er konfigurert.",
|
||||
"successTotpRemovedMessage": "Autentikator for mobiltelefon er fjernet.",
|
||||
"successGrantRevokedMessage": "Vellykket oppheving av rettighet.",
|
||||
"accountUpdatedMessage": "Kontoen din har blitt oppdatert.",
|
||||
"accountPasswordUpdatedMessage": "Ditt passord har blitt oppdatert.",
|
||||
"missingIdentityProviderMessage": "IdentitetsleverandĂžr er ikke spesifisert.",
|
||||
"invalidFederatedIdentityActionMessage": "Ugyldig eller manglende handling.",
|
||||
"identityProviderNotFoundMessage": "Spesifisert identitetsleverandĂžr ikke funnet.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Denne identiteten er ikke lenger aktiv.",
|
||||
"federatedIdentityRemovingLastProviderMessage": "Du kan ikke fjerne siste federerte identitet ettersom du ikke har et passord.",
|
||||
"identityProviderRedirectErrorMessage": "Redirect til identitetsleverandĂžr feilet.",
|
||||
"identityProviderRemovedMessage": "Fjerning av identitetsleverandĂžr var vellykket.",
|
||||
"identityProviderAlreadyLinkedMessage": "Federert identitet returnert av {0} er allerede koblet til en annen bruker.",
|
||||
"staleCodeAccountMessage": "Siden har utlĂžpt. Vennligst prĂžv en gang til.",
|
||||
"consentDenied": "Samtykke avslÄtt.",
|
||||
"accountDisabledMessage": "Konto er deaktivert, kontakt administrator.",
|
||||
"accountTemporarilyDisabledMessage": "Konto er midlertidig deaktivert, kontakt administrator eller prĂžv igjen senere.",
|
||||
"invalidPasswordMinLengthMessage": "Ugyldig passord: minimum lengde {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Ugyldig passord: mÄ inneholde minimum {0} smÄ bokstaver.",
|
||||
"invalidPasswordMinDigitsMessage": "Ugyldig passord: mÄ inneholde minimum {0} sifre.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Ugyldig passord: mÄ inneholde minimum {0} store bokstaver.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Ugyldig passord: mÄ inneholde minimum {0} spesialtegn.",
|
||||
"invalidPasswordNotUsernameMessage": "Ugyldig passord: kan ikke vĂŠre likt brukernavn.",
|
||||
"invalidPasswordRegexPatternMessage": "Ugyldig passord: tilfredsstiller ikke kravene for passord-mĂžnster.",
|
||||
"invalidPasswordHistoryMessage": "Ugyldig passord: kan ikke vÊre likt noen av de {0} foregÄende passordene.",
|
||||
"locale_ca": "CatalĂ ",
|
||||
"locale_de": "Deutsch",
|
||||
"locale_en": "English",
|
||||
"locale_es": "Español",
|
||||
"locale_fr": "Français",
|
||||
"locale_it": "Italian",
|
||||
"locale_ja": "æ„æŹèȘ",
|
||||
"locale_no": "Norsk",
|
||||
"locale_nl": "Nederlands",
|
||||
"locale_pt-BR": "PortuguĂȘs (Brasil)",
|
||||
"locale_ru": "Đ ŃŃŃĐșĐžĐč",
|
||||
"locale_zh-CN": "äžæçźäœ"
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
8
src/lib/i18n/generated_messages/11.0.3/account/pl.ts
Normal file
8
src/lib/i18n/generated_messages/11.0.3/account/pl.ts
Normal file
@ -0,0 +1,8 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
140
src/lib/i18n/generated_messages/11.0.3/account/pt-BR.ts
Normal file
140
src/lib/i18n/generated_messages/11.0.3/account/pt-BR.ts
Normal file
@ -0,0 +1,140 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Salvar",
|
||||
"doCancel": "Cancelar",
|
||||
"doLogOutAllSessions": "Sair de todas as sessÔes",
|
||||
"doRemove": "Remover",
|
||||
"doAdd": "Adicionar",
|
||||
"doSignOut": "Sair",
|
||||
"editAccountHtmlTitle": "Editar Conta",
|
||||
"federatedIdentitiesHtmlTitle": "Identidades Federadas",
|
||||
"accountLogHtmlTitle": "Log da conta",
|
||||
"changePasswordHtmlTitle": "Alterar senha",
|
||||
"sessionsHtmlTitle": "SessÔes",
|
||||
"accountManagementTitle": "Gerenciamento de Conta",
|
||||
"authenticatorTitle": "Autenticator",
|
||||
"applicationsHtmlTitle": "Aplicativos",
|
||||
"authenticatorCode": "CĂłdigo autenticador",
|
||||
"email": "E-mail",
|
||||
"firstName": "Primeiro nome",
|
||||
"givenName": "Primeiro nome",
|
||||
"fullName": "Nome completo",
|
||||
"lastName": "Sobrenome",
|
||||
"familyName": "Sobrenome",
|
||||
"password": "Senha",
|
||||
"passwordConfirm": "Confirmação",
|
||||
"passwordNew": "Nova senha",
|
||||
"username": "Nome de usĂșario",
|
||||
"address": "Endereço",
|
||||
"street": "Logradouro",
|
||||
"locality": "Cidade ou Localidade",
|
||||
"region": "Estado",
|
||||
"postal_code": "CEP",
|
||||
"country": "PaĂs",
|
||||
"emailVerified": "E-mail verificado",
|
||||
"gssDelegationCredential": "GSS Delegação de Credencial",
|
||||
"role_admin": "Admin",
|
||||
"role_realm-admin": "Realm Admin",
|
||||
"role_create-realm": "Cria realm",
|
||||
"role_view-realm": "Visualiza realm",
|
||||
"role_view-users": "Visualiza usuĂĄrios",
|
||||
"role_view-applications": "Visualiza aplicaçÔes",
|
||||
"role_view-clients": "Visualiza clientes",
|
||||
"role_view-events": "Visualiza eventos",
|
||||
"role_view-identity-providers": "Visualiza provedores de identidade",
|
||||
"role_manage-realm": "Gerencia realm",
|
||||
"role_manage-users": "Gerencia usuĂĄrios",
|
||||
"role_manage-applications": "Gerencia aplicaçÔes",
|
||||
"role_manage-identity-providers": "Gerencia provedores de identidade",
|
||||
"role_manage-clients": "Gerencia clientes",
|
||||
"role_manage-events": "Gerencia eventos",
|
||||
"role_view-profile": "Visualiza perfil",
|
||||
"role_manage-account": "Gerencia conta",
|
||||
"role_read-token": "LĂȘ token",
|
||||
"role_offline-access": "Acesso Offline",
|
||||
"role_uma_authorization": "Obter permissÔes",
|
||||
"client_account": "Conta",
|
||||
"client_security-admin-console": "Console de Administração de Segurança",
|
||||
"client_admin-cli": "Admin CLI",
|
||||
"client_realm-management": "Gerenciamento de Realm",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Campos obrigatĂłrios",
|
||||
"allFieldsRequired": "Todos os campos sĂŁo obrigatĂłrios",
|
||||
"backToApplication": "« Voltar para aplicação",
|
||||
"backTo": "Voltar para {0}",
|
||||
"date": "Data",
|
||||
"event": "Evento",
|
||||
"ip": "IP",
|
||||
"client": "Cliente",
|
||||
"clients": "Clientes",
|
||||
"details": "Detalhes",
|
||||
"started": "Iniciado",
|
||||
"lastAccess": "Ăltimo acesso",
|
||||
"expires": "Expira",
|
||||
"applications": "Aplicativos",
|
||||
"account": "Conta",
|
||||
"federatedIdentity": "Identidade Federada",
|
||||
"authenticator": "Autenticador",
|
||||
"sessions": "SessÔes",
|
||||
"log": "Log",
|
||||
"application": "Aplicativo",
|
||||
"availablePermissions": "PermissĂ”es DisponĂveis",
|
||||
"grantedPermissions": "PermissÔes Concedidas",
|
||||
"grantedPersonalInfo": "InformaçÔes Pessoais Concedidas",
|
||||
"additionalGrants": "ConcessÔes Adicionais",
|
||||
"action": "Ação",
|
||||
"inResource": "em",
|
||||
"fullAccess": "Acesso Completo",
|
||||
"offlineToken": "Offline Token",
|
||||
"revoke": "Revogar ConcessÔes",
|
||||
"configureAuthenticators": "Autenticadores Configurados",
|
||||
"mobile": "Mobile",
|
||||
"totpStep1":
|
||||
'Instalar <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> ou Google Authenticator em seu dispositivo. Ambas aplicaçÔes estĂŁo disponĂveis no <a href="https://play.google.com">Google Play</a> e na Apple App Store.',
|
||||
"totpStep2": "Abra o aplicativo e escaneie o cĂłdigo de barras ou entre com o cĂłdigo.",
|
||||
"totpStep3": "Digite o código fornecido pelo aplicativo e clique em Salvar para concluir a configuração.",
|
||||
"missingUsernameMessage": "Por favor, especifique o nome de usuĂĄrio.",
|
||||
"missingFirstNameMessage": "Por favor, informe o primeiro nome.",
|
||||
"invalidEmailMessage": "E-mail invĂĄlido.",
|
||||
"missingLastNameMessage": "Por favor, informe o sobrenome.",
|
||||
"missingEmailMessage": "Por favor, informe o e-mail.",
|
||||
"missingPasswordMessage": "Por favor, informe a senha.",
|
||||
"notMatchPasswordMessage": "As senhas nĂŁo coincidem.",
|
||||
"missingTotpMessage": "Por favor, informe o cĂłdigo autenticador.",
|
||||
"invalidPasswordExistingMessage": "Senha atual invĂĄlida.",
|
||||
"invalidPasswordConfirmMessage": "A senha de confirmação não coincide.",
|
||||
"invalidTotpMessage": "CĂłdigo autenticador invĂĄlido.",
|
||||
"usernameExistsMessage": "Este nome de usuĂĄrio jĂĄ existe.",
|
||||
"emailExistsMessage": "Este e-mail jĂĄ existe.",
|
||||
"readOnlyUserMessage": "VocĂȘ nĂŁo pode atualizar sua conta, uma vez que Ă© apenas de leitura",
|
||||
"readOnlyPasswordMessage": "VocĂȘ nĂŁo pode atualizar sua senha, sua conta Ă© somente leitura",
|
||||
"successTotpMessage": "Autenticador mobile configurado.",
|
||||
"successTotpRemovedMessage": "Autenticador mobile removido.",
|
||||
"successGrantRevokedMessage": "ConcessÔes revogadas com sucesso.",
|
||||
"accountUpdatedMessage": "Sua conta foi atualizada",
|
||||
"accountPasswordUpdatedMessage": "Sua senha foi atualizada",
|
||||
"missingIdentityProviderMessage": "Provedor de identidade nĂŁo especificado",
|
||||
"invalidFederatedIdentityActionMessage": "Ação invålida ou ausente",
|
||||
"identityProviderNotFoundMessage": "O provedor de identidade especificado nĂŁo foi encontrado",
|
||||
"federatedIdentityLinkNotActiveMessage": "Esta identidade nĂŁo estĂĄ mais em atividade",
|
||||
"federatedIdentityRemovingLastProviderMessage": "VocĂȘ nĂŁo pode remover a Ășltima identidade federada como vocĂȘ nĂŁo tem senha",
|
||||
"identityProviderRedirectErrorMessage": "Falha ao redirecionar para o provedor de identidade",
|
||||
"identityProviderRemovedMessage": "Provedor de identidade removido com sucesso",
|
||||
"identityProviderAlreadyLinkedMessage": "Identidade federada retornado por {0} jĂĄ estĂĄ ligado a outro usuĂĄrio.",
|
||||
"accountDisabledMessage": "Conta desativada, contate o administrador",
|
||||
"accountTemporarilyDisabledMessage": "A conta estĂĄ temporariamente indisponĂvel, contate o administrador ou tente novamente mais tarde",
|
||||
"invalidPasswordMinLengthMessage": "Senha invĂĄlida: comprimento mĂnimo {0}",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Senha invĂĄlida: deve conter pelo menos {0} caractere(s) minĂșsculo",
|
||||
"invalidPasswordMinDigitsMessage": "Senha invĂĄlida: deve conter pelo menos {0} nĂșmero(s)",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Senha invĂĄlida: deve conter pelo menos {0} caractere(s) maiĂșsculo",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Senha invĂĄlida: deve conter pelo menos {0} caractere(s) especial",
|
||||
"invalidPasswordNotUsernameMessage": "Senha invĂĄlida: nĂŁo deve ser igual ao nome de usuĂĄrio",
|
||||
"invalidPasswordRegexPatternMessage": "Senha invĂĄlida: nĂŁo corresponde ao padrĂŁo da expressĂŁo regular.",
|
||||
"invalidPasswordHistoryMessage": "Senha invĂĄlida: nĂŁo pode ser igual a qualquer uma das {0} Ășltimas senhas."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
143
src/lib/i18n/generated_messages/11.0.3/account/ru.ts
Normal file
143
src/lib/i18n/generated_messages/11.0.3/account/ru.ts
Normal file
@ -0,0 +1,143 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "ĐĄĐŸŃ
ŃĐ°ĐœĐžŃŃ",
|
||||
"doCancel": "ĐŃĐŒĐ”ĐœĐ°",
|
||||
"doLogOutAllSessions": "ĐŃĐčŃĐž Оз ĐČŃĐ”Ń
ŃĐ”ŃŃĐžĐč",
|
||||
"doRemove": "УЎалОŃŃ",
|
||||
"doAdd": "ĐĐŸĐ±Đ°ĐČĐžŃŃ",
|
||||
"doSignOut": "ĐŃŃ
ĐŸĐŽ",
|
||||
"editAccountHtmlTitle": "ĐĐ·ĐŒĐ”ĐœĐ”ĐœĐžĐ” ŃŃĐ”ŃĐœĐŸĐč запОŃĐž",
|
||||
"federatedIdentitiesHtmlTitle": "ЀДЎДŃаŃĐžĐČĐœŃĐ” ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃŃ",
|
||||
"accountLogHtmlTitle": "ĐĐŸĐł ŃŃĐ”ŃĐœĐŸĐč запОŃĐž",
|
||||
"changePasswordHtmlTitle": "ĐĄĐŒĐ”ĐœĐ° паŃĐŸĐ»Ń",
|
||||
"sessionsHtmlTitle": "ĐĄĐ”ŃŃОО",
|
||||
"accountManagementTitle": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” ŃŃĐ”ŃĐœĐŸĐč запОŃŃŃ",
|
||||
"authenticatorTitle": "ĐŃŃĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ",
|
||||
"applicationsHtmlTitle": "ĐŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ",
|
||||
"authenticatorCode": "ĐĐŽĐœĐŸŃĐ°Đ·ĐŸĐČŃĐč ĐșĐŸĐŽ",
|
||||
"email": "E-mail",
|
||||
"firstName": "ĐĐŒŃ",
|
||||
"givenName": "ĐĐŒŃ",
|
||||
"fullName": "ĐĐŸĐ»ĐœĐŸĐ” ĐžĐŒŃ",
|
||||
"lastName": "Đ€Đ°ĐŒĐžĐ»ĐžŃ",
|
||||
"familyName": "Đ€Đ°ĐŒĐžĐ»ĐžŃ",
|
||||
"password": "ĐаŃĐŸĐ»Ń",
|
||||
"passwordConfirm": "ĐĐŸĐŽŃĐČĐ”ŃĐ¶ĐŽĐ”ĐœĐžĐ” паŃĐŸĐ»Ń",
|
||||
"passwordNew": "ĐĐŸĐČŃĐč паŃĐŸĐ»Ń",
|
||||
"username": "ĐĐŒŃ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃДлŃ",
|
||||
"address": "ĐĐŽŃĐ”Ń",
|
||||
"street": "УлОŃа",
|
||||
"locality": "ĐĐŸŃĐŸĐŽ",
|
||||
"region": "Đ Đ”ĐłĐžĐŸĐœ",
|
||||
"postal_code": "ĐĐŸŃŃĐŸĐČŃĐč ĐžĐœĐŽĐ”ĐșŃ",
|
||||
"country": "ĐĄŃŃĐ°ĐœĐ°",
|
||||
"emailVerified": "E-mail ĐżĐŸĐŽŃĐČĐ”ŃĐ¶ĐŽĐ”Đœ",
|
||||
"gssDelegationCredential": "ĐДлДгОŃĐŸĐČĐ°ĐœĐžĐ” ŃŃĐ”ŃĐœŃŃ
ĐŽĐ°ĐœĐœŃŃ
ŃĐ”ŃДз GSS",
|
||||
"role_admin": "ĐĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃ",
|
||||
"role_realm-admin": "ĐĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃ realm",
|
||||
"role_create-realm": "ĐĄĐŸĐ·ĐŽĐ°ŃŃ realm",
|
||||
"role_view-realm": "ĐŃĐŸŃĐŒĐŸŃŃ realm",
|
||||
"role_view-users": "ĐŃĐŸŃĐŒĐŸŃŃ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃДлДĐč",
|
||||
"role_view-applications": "ĐŃĐŸŃĐŒĐŸŃŃ ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč",
|
||||
"role_view-clients": "ĐŃĐŸŃĐŒĐŸŃŃ ĐșĐ»ĐžĐ”ĐœŃĐŸĐČ",
|
||||
"role_view-events": "ĐŃĐŸŃĐŒĐŸŃŃ ŃĐŸĐ±ŃŃĐžĐč",
|
||||
"role_view-identity-providers": "ĐŃĐŸŃĐŒĐŸŃŃ ĐżŃĐŸĐČаĐčĐŽĐ”ŃĐŸĐČ ŃŃĐ”ŃĐœŃŃ
запОŃĐ”Đč",
|
||||
"role_manage-realm": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” realm",
|
||||
"role_manage-users": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃДлŃĐŒĐž",
|
||||
"role_manage-applications": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃĐŒĐž",
|
||||
"role_manage-identity-providers": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” ĐżŃĐŸĐČаĐčĐŽĐ”ŃĐ°ĐŒĐž ŃŃĐ”ŃĐœŃŃ
запОŃĐ”Đč",
|
||||
"role_manage-clients": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” ĐșĐ»ĐžĐ”ĐœŃĐ°ĐŒĐž",
|
||||
"role_manage-events": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” ŃĐŸĐ±ŃŃĐžŃĐŒĐž",
|
||||
"role_view-profile": "ĐŃĐŸŃĐŒĐŸŃŃ ĐżŃĐŸŃОлŃ",
|
||||
"role_manage-account": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” ŃŃĐ”ŃĐœĐŸĐč запОŃŃŃ",
|
||||
"role_read-token": "ЧŃĐ”ĐœĐžĐ” ŃĐŸĐșĐ”ĐœĐ°",
|
||||
"role_offline-access": "ĐĐŸŃŃŃĐż ĐŸŃŃлаĐčĐœ",
|
||||
"role_uma_authorization": "ĐĐŸĐ»ŃŃĐ”ĐœĐžĐ” ŃазŃĐ”ŃĐ”ĐœĐžĐč",
|
||||
"client_account": "ĐŁŃĐ”ŃĐœĐ°Ń Đ·Đ°ĐżĐžŃŃ",
|
||||
"client_security-admin-console": "ĐĐŸĐœŃĐŸĐ»Ń Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃа Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃĐž",
|
||||
"client_admin-cli": "ĐĐŸĐŒĐ°ĐœĐŽĐœŃĐč ĐžĐœŃĐ”ŃŃĐ”ĐčŃ Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃа",
|
||||
"client_realm-management": "ĐŁĐżŃаĐČĐ»Đ”ĐœĐžĐ” Realm",
|
||||
"client_broker": "ĐŃĐŸĐșĐ”Ń",
|
||||
"requiredFields": "ĐбŃзаŃДлŃĐœŃĐ” ĐżĐŸĐ»Ń",
|
||||
"allFieldsRequired": "ĐŃĐ” ĐżĐŸĐ»Ń ĐŸĐ±ŃзаŃДлŃĐœŃ",
|
||||
"backToApplication": "« ĐазаЎ ĐČ ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”",
|
||||
"backTo": "ĐазаЎ ĐČ {0}",
|
||||
"date": "ĐаŃа",
|
||||
"event": "ĐĄĐŸĐ±ŃŃОД",
|
||||
"ip": "IP",
|
||||
"client": "ĐĐ»ĐžĐ”ĐœŃ",
|
||||
"clients": "ĐĐ»ĐžĐ”ĐœŃŃ",
|
||||
"details": "ĐĐ”ŃалО",
|
||||
"started": "ĐаŃаŃа",
|
||||
"lastAccess": "ĐĐŸŃĐ»Đ”ĐŽĐœĐžĐč ĐŽĐŸŃŃŃĐż",
|
||||
"expires": "ĐŃŃĐ”ĐșаДŃ",
|
||||
"applications": "ĐŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ",
|
||||
"account": "ĐŁŃĐ”ŃĐœĐ°Ń Đ·Đ°ĐżĐžŃŃ",
|
||||
"federatedIdentity": "ЀДЎДŃаŃĐžĐČĐœŃĐč ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ",
|
||||
"authenticator": "ĐŃŃĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ",
|
||||
"sessions": "ĐĄĐ”ŃŃОО",
|
||||
"log": "ĐŃŃĐœĐ°Đ»",
|
||||
"application": "ĐŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”",
|
||||
"availablePermissions": "ĐĐŸŃŃŃĐżĐœŃĐ” ŃазŃĐ”ŃĐ”ĐœĐžŃ",
|
||||
"grantedPermissions": "ĐĄĐŸĐłĐ»Đ°ŃĐŸĐČĐ°ĐœĐœŃĐ” ŃазŃĐ”ŃĐ”ĐœĐžŃ",
|
||||
"grantedPersonalInfo": "ĐĄĐŸĐłĐ»Đ°ŃĐŸĐČĐ°ĐœĐœĐ°Ń ĐżĐ”ŃŃĐŸĐœĐ°Đ»ŃĐœĐ°Ń ĐžĐœŃĐŸŃĐŒĐ°ŃĐžŃ",
|
||||
"additionalGrants": "ĐĐŸĐżĐŸĐ»ĐœĐžŃДлŃĐœŃĐ” ŃĐŸĐłĐ»Đ°ŃĐŸĐČĐ°ĐœĐžŃ",
|
||||
"action": "ĐĐ”ĐčŃŃĐČОД",
|
||||
"inResource": "ĐČ",
|
||||
"fullAccess": "ĐĐŸĐ»ĐœŃĐč ĐŽĐŸŃŃŃĐż",
|
||||
"offlineToken": "ĐŃŃлаĐčĐœ ŃĐŸĐșĐ”Đœ",
|
||||
"revoke": "ĐŃĐŸĐ·ĐČаŃŃ ŃĐŸĐłĐ»Đ°ŃĐŸĐČĐ°ĐœĐžĐ”",
|
||||
"configureAuthenticators": "ĐĄĐșĐŸĐœŃОгŃŃĐžŃĐŸĐČĐ°ĐœĐœŃĐ” аŃŃĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃŃ",
|
||||
"mobile": "ĐĐŸĐ±ĐžĐ»ŃĐœĐŸĐ” ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”",
|
||||
"totpStep1":
|
||||
'ĐŁŃŃĐ°ĐœĐŸĐČĐžŃĐ” <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> ОлО Google Authenticator. Đба ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžŃ ĐŽĐŸŃŃŃĐżĐœŃ ĐœĐ° <a href="https://play.google.com">Google Play</a> Đž ĐČ Apple App Store.',
|
||||
"totpStep2": "ĐŃĐșŃĐŸĐčŃĐ” ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ” Đž ĐżŃĐŸŃĐșĐ°ĐœĐžŃŃĐčŃĐ” баŃĐșĐŸĐŽ, Đ»ĐžĐ±ĐŸ ĐČĐČДЎОŃĐ” ĐșĐ»ŃŃ.",
|
||||
"totpStep3": "ĐĐČДЎОŃĐ” ĐŸĐŽĐœĐŸŃĐ°Đ·ĐŸĐČŃĐč ĐșĐŸĐŽ, ĐČŃĐŽĐ°ĐœĐœŃĐč ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐ”ĐŒ, Đž ĐœĐ°Đ¶ĐŒĐžŃĐ” ŃĐŸŃ
ŃĐ°ĐœĐžŃŃ ĐŽĐ»Ń Đ·Đ°ĐČĐ”ŃŃĐ”ĐœĐžŃ ŃŃŃĐ°ĐœĐŸĐČĐșĐž.",
|
||||
"missingUsernameMessage": "ĐĐČДЎОŃĐ” ĐžĐŒŃ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃДлŃ.",
|
||||
"missingFirstNameMessage": "ĐĐČДЎОŃĐ” ĐžĐŒŃ.",
|
||||
"invalidEmailMessage": "ĐĐČДЎОŃĐ” ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč E-mail.",
|
||||
"missingLastNameMessage": "ĐĐČДЎОŃĐ” ŃĐ°ĐŒĐžĐ»ĐžŃ.",
|
||||
"missingEmailMessage": "ĐĐČДЎОŃĐ” E-mail.",
|
||||
"missingPasswordMessage": "ĐĐČДЎОŃĐ” паŃĐŸĐ»Ń.",
|
||||
"notMatchPasswordMessage": "ĐаŃĐŸĐ»Đž ĐœĐ” ŃĐŸĐČпаЎаŃŃ.",
|
||||
"missingTotpMessage": "ĐĐČДЎОŃĐ” ĐșĐŸĐŽ аŃŃĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа.",
|
||||
"invalidPasswordExistingMessage": "ĐĄŃŃĐ”ŃŃĐČŃŃŃĐžĐč паŃĐŸĐ»Ń ĐœĐ”ĐČĐ”ŃĐœŃĐč.",
|
||||
"invalidPasswordConfirmMessage": "ĐĐŸĐŽŃĐČĐ”ŃĐ¶ĐŽĐ”ĐœĐžĐ” паŃĐŸĐ»Ń ĐœĐ” ŃĐŸĐČпаЎаДŃ.",
|
||||
"invalidTotpMessage": "ĐĐ”ĐČĐ”ŃĐœŃĐč ĐșĐŸĐŽ аŃŃĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃа.",
|
||||
"usernameExistsMessage": "ĐĐŒŃ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃĐ”Đ»Ń ŃжД ŃŃŃĐ”ŃŃĐČŃĐ”Ń.",
|
||||
"emailExistsMessage": "E-mail ŃжД ŃŃŃĐ”ŃŃĐČŃĐ”Ń.",
|
||||
"readOnlyUserMessage": "ĐŃ ĐœĐ” ĐŒĐŸĐ¶Đ”ŃĐ” ĐŸĐ±ĐœĐŸĐČĐžŃŃ ĐžĐœŃĐŸŃĐŒĐ°ŃĐžŃ ĐČаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž, Ń.Đș. ĐŸĐœĐ° ĐŽĐŸŃŃŃĐżĐœĐ° ŃĐŸĐ»ŃĐșĐŸ ĐŽĐ»Ń ŃŃĐ”ĐœĐžŃ.",
|
||||
"readOnlyPasswordMessage": "ĐŃ ĐœĐ” ĐŒĐŸĐ¶Đ”ŃĐ” ĐŸĐ±ĐœĐŸĐČĐžŃŃ ĐżĐ°ŃĐŸĐ»Ń ĐČаŃĐ”Đč ŃŃĐ”ŃĐœĐŸĐč запОŃĐž, Ń.Đș. ĐŸĐœ ĐŽĐŸŃŃŃĐżĐ”Đœ ŃĐŸĐ»ŃĐșĐŸ ĐŽĐ»Ń ŃŃĐ”ĐœĐžŃ.",
|
||||
"successTotpMessage": "ĐŃŃĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ ĐČ ĐŒĐŸĐ±ĐžĐ»ŃĐœĐŸĐŒ ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž ŃĐșĐŸĐœŃОгŃŃĐžŃĐŸĐČĐ°Đœ.",
|
||||
"successTotpRemovedMessage": "ĐŃŃĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ ĐČ ĐŒĐŸĐ±ĐžĐ»ŃĐœĐŸĐŒ ĐżŃĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐž ŃĐŽĐ°Đ»Đ”Đœ.",
|
||||
"successGrantRevokedMessage": "ĐĄĐŸĐłĐ»Đ°ŃĐŸĐČĐ°ĐœĐžĐ” ĐŸŃĐŸĐ·ĐČĐ°ĐœĐŸ ŃŃпДŃĐœĐŸ.",
|
||||
"accountUpdatedMessage": "ĐаŃа ŃŃĐ”ŃĐœĐ°Ń Đ·Đ°ĐżĐžŃŃ ĐŸĐ±ĐœĐŸĐČĐ»Đ”ĐœĐ°.",
|
||||
"accountPasswordUpdatedMessage": "ĐĐ°Ń ĐżĐ°ŃĐŸĐ»Ń ĐŸĐ±ĐœĐŸĐČĐ»Đ”Đœ.",
|
||||
"missingIdentityProviderMessage": "ĐŃĐŸĐČаĐčĐŽĐ”Ń ŃŃĐ”ŃĐœŃŃ
запОŃĐ”Đč ĐœĐ” Đ·Đ°ĐŽĐ°Đœ.",
|
||||
"invalidFederatedIdentityActionMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœĐŸĐ” ОлО ĐœĐ”ĐŽĐŸĐżŃŃŃĐžĐŒĐŸĐ” ĐŽĐ”ĐčŃŃĐČОД.",
|
||||
"identityProviderNotFoundMessage": "ĐĐ°ĐŽĐ°ĐœĐœŃĐč ĐżŃĐŸĐČаĐčĐŽĐ”Ń ŃŃĐ”ŃĐœŃŃ
запОŃĐ”Đč ĐœĐ” ĐœĐ°ĐčĐŽĐ”Đœ.",
|
||||
"federatedIdentityLinkNotActiveMessage": "ĐĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ Đ±ĐŸĐ»ŃŃĐ” ĐœĐ” аĐșŃĐžĐČĐ”Đœ.",
|
||||
"federatedIdentityRemovingLastProviderMessage": "ĐŃ ĐœĐ” ĐŒĐŸĐ¶Đ”ŃĐ” ŃЎалОŃŃ ĐżĐŸŃĐ»Đ”ĐŽĐœĐžĐč ŃДЎДŃаŃĐžĐČĐœŃĐč ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ, Ń.Đș. ĐŃ ĐœĐ” ĐžĐŒĐ”Đ”ŃĐ” паŃĐŸĐ»Ń.",
|
||||
"identityProviderRedirectErrorMessage": "ĐŃОбĐșа пДŃĐ”ĐœĐ°ĐżŃаĐČĐ»Đ”ĐœĐžŃ ĐČ ĐżŃĐŸĐČаĐčĐŽĐ”Ń ŃŃĐ”ŃĐœŃŃ
запОŃĐ”Đč.",
|
||||
"identityProviderRemovedMessage": "ĐŃĐŸĐČаĐčĐŽĐ”Ń ŃŃĐ”ŃĐœŃŃ
запОŃĐ”Đč ŃŃпДŃĐœĐŸ ŃĐŽĐ°Đ»Đ”Đœ.",
|
||||
"identityProviderAlreadyLinkedMessage": "ЀДЎДŃаŃĐžĐČĐœŃĐč ĐžĐŽĐ”ĐœŃĐžŃĐžĐșаŃĐŸŃ, ĐČĐŸĐ·ĐČŃаŃĐ”ĐœĐœŃĐč {0} ŃжД ĐžŃĐżĐŸĐ»ŃĐ·ŃĐ”ŃŃŃ ĐŽŃŃĐłĐžĐŒ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃĐ”Đ»Đ”ĐŒ.",
|
||||
"staleCodeAccountMessage": "ĐĄŃŃĐ°ĐœĐžŃа ŃŃŃаŃДла. ĐĐŸĐżŃĐŸĐ±ŃĐčŃĐ” Đ”ŃĐ” Ńаз.",
|
||||
"consentDenied": "Đ ŃĐŸĐłĐ»Đ°ŃĐŸĐČĐ°ĐœĐžĐž ĐŸŃĐșĐ°Đ·Đ°ĐœĐŸ.",
|
||||
"accountDisabledMessage": "ĐŁŃĐ”ŃĐœĐ°Ń Đ·Đ°ĐżĐžŃŃ Đ·Đ°Đ±Đ»ĐŸĐșĐžŃĐŸĐČĐ°ĐœĐ°, ĐŸĐ±ŃаŃĐžŃĐ”ŃŃ Đș Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃŃ.",
|
||||
"accountTemporarilyDisabledMessage": "ĐŁŃĐ”ŃĐœĐ°Ń Đ·Đ°ĐżĐžŃŃ ĐČŃĐ”ĐŒĐ”ĐœĐœĐŸ Đ·Đ°Đ±Đ»ĐŸĐșĐžŃĐŸĐČĐ°ĐœĐ°, ĐŸĐ±ŃаŃĐžŃĐ”ŃŃ Đș Đ°ĐŽĐŒĐžĐœĐžŃŃŃаŃĐŸŃŃ ĐžĐ»Đž ĐżĐŸĐżŃĐŸĐ±ŃĐčŃĐ” ĐżĐŸĐ·Đ¶Đ”.",
|
||||
"invalidPasswordMinLengthMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: ĐŽĐ»ĐžĐœĐ° паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶ĐœĐ° бŃŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»Đ°(ĐŸĐČ).",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»Đ°(ĐŸĐČ) ĐČ ĐœĐžĐ¶ĐœĐ”ĐŒ ŃДгОŃŃŃĐ”.",
|
||||
"invalidPasswordMinDigitsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžŃŃ(Ń).",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃĐžĐŒĐČĐŸĐ»Đ°(ĐŸĐČ) ĐČ ĐČĐ”ŃŃ
ĐœĐ”ĐŒ ŃДгОŃŃŃĐ”.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐŽĐ”ŃжаŃŃ ĐœĐ” ĐŒĐ”ĐœĐ”Đ” {0} ŃпДŃŃĐžĐŒĐČĐŸĐ»Đ°(ĐŸĐČ).",
|
||||
"invalidPasswordNotUsernameMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐČпаЎаŃŃ Ń ĐžĐŒĐ”ĐœĐ”ĐŒ ĐżĐŸĐ»ŃĐ·ĐŸĐČаŃДлŃ.",
|
||||
"invalidPasswordRegexPatternMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ŃĐŽĐŸĐČлДŃĐČĐŸŃŃĐ”Ń ŃДгŃĐ»ŃŃĐœĐŸĐŒŃ ĐČŃŃĐ°Đ¶Đ”ĐœĐžŃ.",
|
||||
"invalidPasswordHistoryMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: паŃĐŸĐ»Ń ĐœĐ” ĐŽĐŸĐ»Đ¶Đ”Đœ ŃĐŸĐČпаЎаŃŃ Ń ĐżĐŸŃĐ»Đ”ĐŽĐœĐžĐŒ(Đž) {0} паŃĐŸĐ»ŃĐŒĐž.",
|
||||
"invalidPasswordGenericMessage": "ĐĐ”ĐșĐŸŃŃĐ”ĐșŃĐœŃĐč паŃĐŸĐ»Ń: ĐœĐŸĐČŃĐč паŃĐŸĐ»Ń ĐœĐ” ŃĐŸĐŸŃĐČĐ”ŃŃŃĐČŃĐ”Ń ĐżŃаĐČĐžĐ»Đ°ĐŒ паŃĐŸĐ»Ń."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
180
src/lib/i18n/generated_messages/11.0.3/account/sk.ts
Normal file
180
src/lib/i18n/generated_messages/11.0.3/account/sk.ts
Normal file
@ -0,0 +1,180 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "UloĆŸiĆ„",
|
||||
"doCancel": "ZruƥiƄ",
|
||||
"doLogOutAllSessions": "OdhlĂĄsenie vĆĄetkĂœch relĂĄciĂ",
|
||||
"doRemove": "OdstråniƄ",
|
||||
"doAdd": "PridaƄ",
|
||||
"doSignOut": "OdhlåsiƄ",
|
||||
"editAccountHtmlTitle": "UpraviĆ„ ĂșÄet",
|
||||
"federatedIdentitiesHtmlTitle": "PrepojenĂĄ identita",
|
||||
"accountLogHtmlTitle": "DennĂk zmien uĆŸĂvateÄŸskĂœch ĂșÄtov",
|
||||
"changePasswordHtmlTitle": "Zmena hesla",
|
||||
"sessionsHtmlTitle": "RelĂĄcie",
|
||||
"accountManagementTitle": "SprĂĄva ĂșÄtu Keycloak",
|
||||
"authenticatorTitle": "AutentifikĂĄtor",
|
||||
"applicationsHtmlTitle": "AplikĂĄcie",
|
||||
"authenticatorCode": "JednorĂĄzovĂœ kĂłd",
|
||||
"email": "E-mail",
|
||||
"firstName": "Meno",
|
||||
"givenName": "Meno pri narodenĂ",
|
||||
"fullName": "Celé meno",
|
||||
"lastName": "Priezvisko",
|
||||
"familyName": "Rodné meno",
|
||||
"password": "Heslo",
|
||||
"passwordConfirm": "Potrvrdenie hesla",
|
||||
"passwordNew": "Nové heslo",
|
||||
"username": "Meno pouĆŸĂvateÄŸa",
|
||||
"address": "Adresa",
|
||||
"street": "Ulica",
|
||||
"locality": "Mesto alebo lokalita",
|
||||
"region": "Kraj",
|
||||
"postal_code": "PSÄ",
|
||||
"country": "Ć tĂĄt",
|
||||
"emailVerified": "E-mail overenĂœ",
|
||||
"gssDelegationCredential": "GSS delegované opråvnenie",
|
||||
"role_admin": "AdministrĂĄtor",
|
||||
"role_realm-admin": "AdministrĂĄtor realmu",
|
||||
"role_create-realm": "VytvoriƄ realm",
|
||||
"role_view-realm": "ZobraziƄ realm",
|
||||
"role_view-users": "ZobraziĆ„ pouĆŸĂvateÄŸov",
|
||||
"role_view-applications": "ZobraziƄ aplikåcie",
|
||||
"role_view-clients": "ZobraziƄ klientov",
|
||||
"role_view-events": "ZobraziƄ udalosti",
|
||||
"role_view-identity-providers": "ZobraziĆ„ klientov poskytovateÄŸov identity",
|
||||
"role_manage-realm": "SpravovaƄ realm",
|
||||
"role_manage-users": "SpravovaĆ„ pouĆŸĂvateÄŸov",
|
||||
"role_manage-applications": "SpravovaƄ aplikåcie",
|
||||
"role_manage-identity-providers": "SpravovaĆ„ poskytovateÄŸov identity",
|
||||
"role_manage-clients": "SpravovaƄ klientov",
|
||||
"role_manage-events": "SpravovaƄ udalosti",
|
||||
"role_view-profile": "ZobraziƄ profil",
|
||||
"role_manage-account": "SpravovaĆ„ ĂșÄet",
|
||||
"role_manage-account-links": "SpravovaĆ„ odkazy na ĂșÄet",
|
||||
"role_read-token": "ÄĂtaĆ„ token",
|
||||
"role_offline-access": "Offline prĂstup",
|
||||
"role_uma_authorization": "AutorizĂĄcia pouĆŸĂvateÄŸom riadenĂ©ho prĂstupu",
|
||||
"client_account": "ĂÄet klienta",
|
||||
"client_security-admin-console": "BezpeÄnostnĂĄ administrĂĄtorskĂĄ konzola",
|
||||
"client_admin-cli": "SpravovaƄ CLI klienta",
|
||||
"client_realm-management": "SpravovaƄ realmy klienta",
|
||||
"client_broker": "Broker",
|
||||
"requiredFields": "Povinné polia",
|
||||
"allFieldsRequired": "VĆĄetky poĆŸadovanĂ© polia",
|
||||
"backToApplication": "« SpÀƄ na aplikĂĄciu",
|
||||
"backTo": "SpÀƄ na {0}",
|
||||
"date": "DĂĄtum",
|
||||
"event": "UdalosƄ",
|
||||
"ip": "IP",
|
||||
"client": "Klient",
|
||||
"clients": "Klienti",
|
||||
"details": "Podrobnosti",
|
||||
"started": "ZaÄĂname",
|
||||
"lastAccess": "PoslednĂœ prĂstup",
|
||||
"expires": "VyprĆĄĂ",
|
||||
"applications": "AplikĂĄcie",
|
||||
"account": "ĂÄet",
|
||||
"federatedIdentity": "PrepojenĂĄ identita",
|
||||
"authenticator": "AutentifikĂĄtor",
|
||||
"sessions": "RelĂĄcie",
|
||||
"log": "DennĂk",
|
||||
"application": "AplikĂĄcia",
|
||||
"availablePermissions": "Dostupné opråvnenia",
|
||||
"grantedPermissions": "Pridelené opråvnenia",
|
||||
"grantedPersonalInfo": "Poskytnuté osobné informåcie",
|
||||
"additionalGrants": "DodatoÄnĂ© oprĂĄvnenia",
|
||||
"action": "Akcia",
|
||||
"inResource": "v",
|
||||
"fullAccess": "ĂplnĂœ prĂstup",
|
||||
"offlineToken": "Offline token",
|
||||
"revoke": "ZruƥiƄ opråvnenie",
|
||||
"configureAuthenticators": "Nakonfigurované autentifikåtory",
|
||||
"mobile": "MobilnĂœ",
|
||||
"totpStep1":
|
||||
'NainĆĄtalujte vo svojom zariadenĂ <a href="https://freeotp.github.io/" target="_blank"> FreeOTP </a> alebo Google Authenticator. Obidve aplikĂĄcie sĂș k dispozĂcii v <a href="https://play.google.com"> Google Play </a> a Apple App Store.',
|
||||
"totpStep2": "Otvorte aplikĂĄciu a naskenujte ÄiarovĂœ kĂłd alebo zadajte kÄŸĂșÄ.",
|
||||
"totpStep3": "Zadajte jednorazovĂœ kĂłd poskytnutĂœ aplikĂĄciou a kliknutĂm na tlaÄidlo UloĆŸiĆ„ dokonÄĂte nastavenie.",
|
||||
"totpManualStep2": "Otvorte aplikĂĄciu a zadajte kÄŸĂșÄ",
|
||||
"totpManualStep3": "PouĆŸite nasledujĂșce hodnoty konfigurĂĄcie, ak aplikĂĄcia umoĆŸĆuje ich nastavenie",
|
||||
"totpUnableToScan": "NemoĆŸno skenovaĆ„?",
|
||||
"totpScanBarcode": "Skenovanie ÄiarovĂ©ho kĂłdu?",
|
||||
"totp.totp": "ZaloĆŸenĂ© na Äase",
|
||||
"totp.hotp": "ZaloĆŸenĂ© na poÄĂtadle",
|
||||
"totpType": "Typ",
|
||||
"totpAlgorithm": "Algoritmus",
|
||||
"totpDigits": "ÄĂslica",
|
||||
"totpInterval": "Interval",
|
||||
"totpCounter": "PoÄĂtadlo",
|
||||
"missingUsernameMessage": "Zadajte pouĆŸĂvateÄŸskĂ© meno.",
|
||||
"missingFirstNameMessage": "Zadajte meno.",
|
||||
"invalidEmailMessage": "NeplatnĂĄ e-mailovĂĄ adresa.",
|
||||
"missingLastNameMessage": "Zadajte priezvisko.",
|
||||
"missingEmailMessage": "Zadajte e-mail.",
|
||||
"missingPasswordMessage": "Zadajte heslo, prosĂm.",
|
||||
"notMatchPasswordMessage": "HeslĂĄ sa nezhodujĂș.",
|
||||
"missingTotpMessage": "Zadajte jednorazovĂœ kĂłd, prosĂm",
|
||||
"invalidPasswordExistingMessage": "NeplatnĂ© existujĂșce heslo.",
|
||||
"invalidPasswordConfirmMessage": "Potvrdenie hesla sa nezhoduje.",
|
||||
"invalidTotpMessage": "NeplatnĂœ jednorazovĂœ kĂłd.",
|
||||
"usernameExistsMessage": "UĆŸĂvateÄŸskĂ© meno uĆŸ existuje.",
|
||||
"emailExistsMessage": "E-mail uĆŸ existuje.",
|
||||
"readOnlyUserMessage": "VĂĄĆĄ ĂșÄet nemĂŽĆŸete aktualizovaĆ„, pretoĆŸe je iba na ÄĂtanie.",
|
||||
"readOnlyUsernameMessage": "NemĂŽĆŸete aktualizovaĆ„ svoje pouĆŸĂvateÄŸskĂ© meno, pretoĆŸe je iba na ÄĂtanie.",
|
||||
"readOnlyPasswordMessage": "Heslo nemĂŽĆŸete aktualizovaĆ„, pretoĆŸe vĂĄĆĄ ĂșÄet je iba na ÄĂtanie.",
|
||||
"successTotpMessage": "Konfiguråcia mobilného autentifikåtora.",
|
||||
"successTotpRemovedMessage": "MobilnĂœ autentifikĂĄtor bol odstrĂĄnenĂœ.",
|
||||
"successGrantRevokedMessage": "OprĂĄvnenie bolo ĂșspeĆĄne zruĆĄenĂ©.",
|
||||
"accountUpdatedMessage": "VĂĄĆĄ ĂșÄet bol aktualizovanĂœ.",
|
||||
"accountPasswordUpdatedMessage": "Vaƥe heslo bolo aktualizované.",
|
||||
"missingIdentityProviderMessage": "PoskytovateÄŸ identity nie je zadanĂœ.",
|
||||
"invalidFederatedIdentityActionMessage": "NeplatnĂĄ alebo chĂœbajĂșca akcia.",
|
||||
"identityProviderNotFoundMessage": "ZadanĂœ poskytovateÄŸ identity nenĂĄjdenĂœ.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Identita uĆŸ nie je aktĂvna.",
|
||||
"federatedIdentityRemovingLastProviderMessage": "NemĂŽĆŸete odstrĂĄniĆ„ poslednĂș spojenĂș identitu, pretoĆŸe nemĂĄte heslo.",
|
||||
"identityProviderRedirectErrorMessage": "Nepodarilo sa presmerovaĆ„ na poskytovateÄŸa identity.",
|
||||
"identityProviderRemovedMessage": "PoskytovateÄŸ identity bol ĂșspeĆĄne odstrĂĄnenĂœ.",
|
||||
"identityProviderAlreadyLinkedMessage": "SpojenĂĄ identita vrĂĄtenĂĄ {0} je uĆŸ prepojenĂĄ s inĂœm pouĆŸĂvateÄŸom.",
|
||||
"staleCodeAccountMessage": "PlatnosĆ„ vyprĆĄala. SkĂșste eĆĄte raz.",
|
||||
"consentDenied": "SĂșhlas bol zamietnutĂœ.",
|
||||
"accountDisabledMessage": "ĂÄet je zakĂĄzanĂœ, kontaktujte sprĂĄvcu.",
|
||||
"accountTemporarilyDisabledMessage": "ĂÄet je doÄasne zakĂĄzanĂœ, kontaktujte administrĂĄtora alebo skĂșste neskĂŽr.",
|
||||
"invalidPasswordMinLengthMessage": "NeplatnĂ© heslo: minimĂĄlna dÄșĆŸka {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "NeplatnĂ© heslo: musĂ obsahovaĆ„ minimĂĄlne {0} malĂ© pĂsmenĂĄ.",
|
||||
"invalidPasswordMinDigitsMessage": "NeplatnĂ© heslo: musĂ obsahovaĆ„ aspoĆ {0} ÄĂslic.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "NeplatnĂ© heslo: musĂ obsahovaĆ„ aspoĆ {0} veÄŸkĂ© pĂsmenĂĄ.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "NeplatnĂ© heslo: musĂ obsahovaĆ„ aspoĆ {0} ĆĄpeciĂĄlne znaky.",
|
||||
"invalidPasswordNotUsernameMessage": "NeplatnĂ© heslo: nesmie byĆ„ rovnakĂ© ako pouĆŸĂvateÄŸskĂ© meno.",
|
||||
"invalidPasswordRegexPatternMessage": "NeplatnĂ© heslo: nezodpovedĂĄ regulĂĄrnemu vĂœrazu.",
|
||||
"invalidPasswordHistoryMessage": "NeplatnĂ© heslo: nesmie sa rovnaĆ„ ĆŸiadnemu z poslednĂœch {0} hesiel.",
|
||||
"invalidPasswordBlacklistedMessage": "NeplatnĂ© heslo: heslo je na Äiernej listine.",
|
||||
"invalidPasswordGenericMessage": "Neplatné heslo: nové heslo nezodpovedå pravidlåm hesiel.",
|
||||
"myResources": "Moje Zdroje",
|
||||
"myResourcesSub": "Moje zdroje",
|
||||
"doDeny": "ZakåzaƄ",
|
||||
"doRevoke": "OdvolaƄ",
|
||||
"doApprove": "SchvåliƄ",
|
||||
"doRemoveSharing": "OdstrĂĄnenie zdieÄŸania",
|
||||
"doRemoveRequest": "OdstrĂĄniĆ„ poĆŸiadavku",
|
||||
"peopleAccessResource": "Äœudia s prĂstupom k tomuto zdroju",
|
||||
"name": "NĂĄzov",
|
||||
"scopes": "Rozsahy",
|
||||
"resource": "Zdroj",
|
||||
"user": "PouĆŸĂvateÄŸ",
|
||||
"peopleSharingThisResource": "Äœudia zdieÄŸajĂșci tento zdroj",
|
||||
"shareWithOthers": "ZdieÄŸaĆ„ s ostatnĂœmi",
|
||||
"needMyApproval": "Potrebuje mĂŽj sĂșhlas",
|
||||
"requestsWaitingApproval": "VaĆĄe poĆŸiadavky ÄakajĂș na schvĂĄlenie",
|
||||
"icon": "Ikona",
|
||||
"requestor": "ĆœiadateÄŸ",
|
||||
"owner": "VlastnĂk",
|
||||
"resourcesSharedWithMe": "Zdroje zdieÄŸanĂ© so mnou",
|
||||
"permissionRequestion": "Ćœiadosti o povolenie",
|
||||
"permission": "OprĂĄvnenie",
|
||||
"shares": "podiel (y)"
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
139
src/lib/i18n/generated_messages/11.0.3/account/sv.ts
Normal file
139
src/lib/i18n/generated_messages/11.0.3/account/sv.ts
Normal file
@ -0,0 +1,139 @@
|
||||
//This code was automatically generated by running dist/bin/generate-i18n-messages.js
|
||||
//PLEASE DO NOT EDIT MANUALLY
|
||||
|
||||
/* spell-checker: disable */
|
||||
const messages = {
|
||||
"doSave": "Spara",
|
||||
"doCancel": "Avbryt",
|
||||
"doLogOutAllSessions": "Logga ut frÄn samtliga sessioner",
|
||||
"doRemove": "Ta bort",
|
||||
"doAdd": "LĂ€gg till",
|
||||
"doSignOut": "Logga ut",
|
||||
"editAccountHtmlTitle": "Redigera konto",
|
||||
"federatedIdentitiesHtmlTitle": "Federerade identiteter",
|
||||
"accountLogHtmlTitle": "Kontologg",
|
||||
"changePasswordHtmlTitle": "Byt lösenord",
|
||||
"sessionsHtmlTitle": "Sessioner",
|
||||
"accountManagementTitle": "Kontohantering för Keycloak",
|
||||
"authenticatorTitle": "Autentiserare",
|
||||
"applicationsHtmlTitle": "Applikationer",
|
||||
"authenticatorCode": "EngÄngskod",
|
||||
"email": "E-post",
|
||||
"firstName": "Förnamn",
|
||||
"lastName": "Efternamn",
|
||||
"password": "Lösenord",
|
||||
"passwordConfirm": "BekrÀftelse",
|
||||
"passwordNew": "Nytt lösenord",
|
||||
"username": "AnvÀndarnamn",
|
||||
"address": "Adress",
|
||||
"street": "Gata",
|
||||
"locality": "Postort",
|
||||
"region": "Stat, Provins eller Region",
|
||||
"postal_code": "Postnummer",
|
||||
"country": "Land",
|
||||
"emailVerified": "E-post verifierad",
|
||||
"gssDelegationCredential": "GSS Delegation Credential",
|
||||
"role_admin": "Administratör",
|
||||
"role_realm-admin": "Realm-administratör",
|
||||
"role_create-realm": "Skapa realm",
|
||||
"role_view-realm": "Visa realm",
|
||||
"role_view-users": "Visa anvÀndare",
|
||||
"role_view-applications": "Visa applikationer",
|
||||
"role_view-clients": "Visa klienter",
|
||||
"role_view-events": "Visa event",
|
||||
"role_view-identity-providers": "Visa identitetsleverantörer",
|
||||
"role_manage-realm": "Hantera realm",
|
||||
"role_manage-users": "Hantera anvÀndare",
|
||||
"role_manage-applications": "Hantera applikationer",
|
||||
"role_manage-identity-providers": "Hantera identitetsleverantörer",
|
||||
"role_manage-clients": "Hantera klienter",
|
||||
"role_manage-events": "Hantera event",
|
||||
"role_view-profile": "Visa profil",
|
||||
"role_manage-account": "Hantera konto",
|
||||
"role_read-token": "LĂ€s element",
|
||||
"role_offline-access": "Ă
tkomst offline",
|
||||
"role_uma_authorization": "ErhÄll tillstÄnd",
|
||||
"client_account": "Konto",
|
||||
"client_security-admin-console": "SÀkerhetsadministratörskonsol",
|
||||
"client_admin-cli": "Administratörs-CLI",
|
||||
"client_realm-management": "Realmhantering",
|
||||
"requiredFields": "Obligatoriska fÀlt",
|
||||
"allFieldsRequired": "Samtliga fÀlt krÀvs",
|
||||
"backToApplication": "« Tillbaka till applikationen",
|
||||
"backTo": "Tillbaka till {0}",
|
||||
"date": "Datum",
|
||||
"event": "Event",
|
||||
"ip": "IP",
|
||||
"client": "Klient",
|
||||
"clients": "Klienter",
|
||||
"details": "Detaljer",
|
||||
"started": "Startade",
|
||||
"lastAccess": "Senast Ätkomst",
|
||||
"expires": "Upphör",
|
||||
"applications": "Applikationer",
|
||||
"account": "Konto",
|
||||
"federatedIdentity": "Federerad identitet",
|
||||
"authenticator": "Autentiserare",
|
||||
"sessions": "Sessioner",
|
||||
"log": "Logg",
|
||||
"application": "Applikation",
|
||||
"availablePermissions": "TillgÀngliga rÀttigheter",
|
||||
"grantedPermissions": "Beviljade rÀttigheter",
|
||||
"grantedPersonalInfo": "Medgiven personlig information",
|
||||
"additionalGrants": "Ytterligare medgivanden",
|
||||
"action": "Ă
tgÀrd",
|
||||
"inResource": "i",
|
||||
"fullAccess": "FullstÀndig Ätkomst",
|
||||
"offlineToken": "Offline token",
|
||||
"revoke": "UpphÀv rÀttighet",
|
||||
"configureAuthenticators": "Konfigurerade autentiserare",
|
||||
"mobile": "Mobil",
|
||||
"totpStep1":
|
||||
'Installera <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> eller Google Authenticator pÄ din enhet. BÄda applikationerna finns tillgÀngliga pÄ <a href="https://play.google.com">Google Play</a> och Apple App Store.',
|
||||
"totpStep2": "Ăppna applikationen och skanna streckkoden eller skriv i nyckeln.",
|
||||
"totpStep3": "Fyll i engÄngskoden som tillhandahÄlls av applikationen och klicka pÄ Spara för att avsluta instÀllningarna.",
|
||||
"missingUsernameMessage": "VÀnligen ange anvÀndarnamn.",
|
||||
"missingFirstNameMessage": "VÀnligen ange förnamn.",
|
||||
"invalidEmailMessage": "Ogiltig e-postadress.",
|
||||
"missingLastNameMessage": "VĂ€nligen ange efternamn.",
|
||||
"missingEmailMessage": "VĂ€nligen ange e-post.",
|
||||
"missingPasswordMessage": "VÀnligen ange lösenord.",
|
||||
"notMatchPasswordMessage": "Lösenorden matchar inte.",
|
||||
"missingTotpMessage": "VĂ€nligen ange autentiseringskoden.",
|
||||
"invalidPasswordExistingMessage": "Det nuvarande lösenordet Àr ogiltigt.",
|
||||
"invalidPasswordConfirmMessage": "LösenordsbekrÀftelsen matchar inte.",
|
||||
"invalidTotpMessage": "Autentiseringskoden Àr ogiltig.",
|
||||
"usernameExistsMessage": "AnvÀndarnamnet finns redan.",
|
||||
"emailExistsMessage": "E-posten finns redan.",
|
||||
"readOnlyUserMessage": "Du kan inte uppdatera ditt konto eftersom det Àr skrivskyddat.",
|
||||
"readOnlyPasswordMessage": "Du kan inte uppdatera ditt lösenord eftersom ditt konto Àr skrivskyddat.",
|
||||
"successTotpMessage": "Mobilautentiseraren Àr instÀlld.",
|
||||
"successTotpRemovedMessage": "Mobilautentiseraren Àr borttagen.",
|
||||
"successGrantRevokedMessage": "UpphÀvandet av rÀttigheten lyckades.",
|
||||
"accountUpdatedMessage": "Ditt konto har uppdaterats.",
|
||||
"accountPasswordUpdatedMessage": "Ditt lösenord har uppdaterats.",
|
||||
"missingIdentityProviderMessage": "Identitetsleverantör Àr inte angiven.",
|
||||
"invalidFederatedIdentityActionMessage": "Ă
tgÀrden Àr ogiltig eller saknas.",
|
||||
"identityProviderNotFoundMessage": "Angiven identitetsleverantör hittas inte.",
|
||||
"federatedIdentityLinkNotActiveMessage": "Den hÀr identiteten Àr inte lÀngre aktiv.",
|
||||
"federatedIdentityRemovingLastProviderMessage": "Du kan inte ta bort senaste federerade identiteten eftersom du inte har ett lösenord.",
|
||||
"identityProviderRedirectErrorMessage": "Misslyckades med att omdirigera till identitetsleverantör.",
|
||||
"identityProviderRemovedMessage": "Borttagningen av identitetsleverantören lyckades.",
|
||||
"identityProviderAlreadyLinkedMessage": "Den federerade identiteten som returnerades av {0} Àr redan lÀnkad till en annan anvÀndare.",
|
||||
"staleCodeAccountMessage": "Sidan har upphört att gÀlla. VÀnligen försök igen.",
|
||||
"consentDenied": "Samtycket förnekades.",
|
||||
"accountDisabledMessage": "Kontot Àr inaktiverat, kontakta administratör.",
|
||||
"accountTemporarilyDisabledMessage": "Kontot Àr tillfÀlligt inaktiverat, kontakta administratör eller försök igen senare.",
|
||||
"invalidPasswordMinLengthMessage": "Ogiltigt lösenord. Minsta lÀngd Àr {0}.",
|
||||
"invalidPasswordMinLowerCaseCharsMessage": "Ogiltigt lösenord: mÄste innehÄlla minst {0} smÄ bokstÀver.",
|
||||
"invalidPasswordMinDigitsMessage": "Ogiltigt lösenord: mÄste innehÄlla minst {0} siffror.",
|
||||
"invalidPasswordMinUpperCaseCharsMessage": "Ogiltigt lösenord: mÄste innehÄlla minst {0} stora bokstÀver.",
|
||||
"invalidPasswordMinSpecialCharsMessage": "Ogiltigt lösenord: mÄste innehÄlla minst {0} specialtecken.",
|
||||
"invalidPasswordNotUsernameMessage": "Ogiltigt lösenord: FÄr inte vara samma som anvÀndarnamnet.",
|
||||
"invalidPasswordRegexPatternMessage": "Ogiltigt lösenord: matchar inte kravet för lösenordsmönster.",
|
||||
"invalidPasswordHistoryMessage": "Ogiltigt lösenord: FÄr inte vara samma som de senaste {0} lösenorden.",
|
||||
"invalidPasswordGenericMessage": "Ogiltigt lösenord: Det nya lösenordet stÀmmer inte med lösenordspolicyn."
|
||||
};
|
||||
|
||||
export default messages;
|
||||
/* spell-checker: enable */
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user