@asafarim/shared-i18n 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +170 -168
  2. package/demo/index.html +13 -0
  3. package/demo/node_modules/.bin/tsc +21 -0
  4. package/demo/node_modules/.bin/tsserver +21 -0
  5. package/demo/node_modules/.bin/vite +21 -0
  6. package/demo/package.json +24 -0
  7. package/demo/public/favicon.svg +4 -0
  8. package/demo/public/logo.svg +24 -0
  9. package/demo/src/App.tsx +112 -0
  10. package/demo/src/components/GetStartedSection.tsx +56 -0
  11. package/demo/src/components/KeyTable.tsx +29 -0
  12. package/demo/src/components/LanguageBar.tsx +19 -0
  13. package/demo/src/components/LanguageSwitcherDemo.module.css +113 -0
  14. package/demo/src/components/LanguageSwitcherDemo.tsx +184 -0
  15. package/demo/src/components/OverviewSection.tsx +43 -0
  16. package/demo/src/components/Panel.tsx +15 -0
  17. package/demo/src/components/StatusCard.tsx +109 -0
  18. package/demo/src/index.css +569 -0
  19. package/demo/src/locales/en/demo.json +85 -0
  20. package/demo/src/locales/fr/demo.json +85 -0
  21. package/demo/src/locales/nl/demo.json +85 -0
  22. package/demo/src/main.tsx +24 -0
  23. package/demo/tsconfig.json +18 -0
  24. package/demo/tsconfig.node.json +10 -0
  25. package/demo/vite-env.d.ts +7 -0
  26. package/demo/vite.config.ts +11 -0
  27. package/dist/components/LanguageSwitcher.d.ts +20 -0
  28. package/dist/components/LanguageSwitcher.d.ts.map +1 -0
  29. package/dist/components/LanguageSwitcher.js +72 -0
  30. package/dist/components/LanguageSwitcher.module.css +205 -0
  31. package/dist/config/i18n.d.ts +46 -0
  32. package/dist/config/i18n.d.ts.map +1 -0
  33. package/dist/config/i18n.js +66 -0
  34. package/dist/hooks/useLanguage.d.ts +12 -0
  35. package/dist/hooks/useLanguage.d.ts.map +1 -0
  36. package/dist/hooks/useLanguage.js +61 -0
  37. package/dist/index.d.ts +9 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +10 -0
  40. package/dist/locales/en/common.json +68 -0
  41. package/{locales → dist/locales}/en/identity-portal.json +69 -69
  42. package/dist/locales/nl/common.json +68 -0
  43. package/{locales → dist/locales}/nl/identity-portal.json +69 -69
  44. package/dist/tsconfig.tsbuildinfo +1 -0
  45. package/dist/utils/languageIcons.d.ts +4 -0
  46. package/dist/utils/languageIcons.d.ts.map +1 -0
  47. package/dist/utils/languageIcons.js +12 -0
  48. package/dist/utils/languageUtils.d.ts +45 -0
  49. package/dist/utils/languageUtils.d.ts.map +1 -0
  50. package/dist/utils/languageUtils.js +144 -0
  51. package/package.json +34 -22
  52. package/LICENSE +0 -23
  53. package/config/i18n.ts +0 -89
  54. package/hooks/useLanguage.ts +0 -80
  55. package/index.ts +0 -21
  56. package/locales/en/common.json +0 -66
  57. package/locales/en/web.json +0 -343
  58. package/locales/nl/common.json +0 -66
  59. package/locales/nl/web.json +0 -343
  60. package/tsconfig.json +0 -32
  61. package/utils/languageUtils.ts +0 -141
@@ -0,0 +1,12 @@
1
+ import type { SupportedLanguage } from '../config/i18n.js';
2
+ export interface UseLanguageReturn {
3
+ language: SupportedLanguage;
4
+ changeLanguage: (lang: SupportedLanguage) => Promise<void>;
5
+ isChanging: boolean;
6
+ }
7
+ /**
8
+ * Hook for managing language preferences
9
+ * Handles both frontend (cookie) and backend (API) synchronization
10
+ */
11
+ export declare const useLanguage: () => UseLanguageReturn;
12
+ //# sourceMappingURL=useLanguage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLanguage.d.ts","sourceRoot":"","sources":["../../hooks/useLanguage.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,cAAc,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,QAAO,iBA2D9B,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { useCallback, useEffect, useState } from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import { setLanguageCookie, updateUserLanguagePreference, fetchUserLanguagePreference, isSupportedLanguage } from '../utils/languageUtils.js';
4
+ /**
5
+ * Hook for managing language preferences
6
+ * Handles both frontend (cookie) and backend (API) synchronization
7
+ */
8
+ export const useLanguage = () => {
9
+ const { i18n } = useTranslation();
10
+ const [isChanging, setIsChanging] = useState(false);
11
+ // Safely get current language with fallback
12
+ const currentLanguage = (i18n?.language && isSupportedLanguage(i18n.language)
13
+ ? i18n.language
14
+ : 'en');
15
+ // Sync with backend on mount (for authenticated users)
16
+ useEffect(() => {
17
+ const syncLanguageWithBackend = async () => {
18
+ if (!i18n?.changeLanguage)
19
+ return;
20
+ const backendLang = await fetchUserLanguagePreference();
21
+ if (backendLang && backendLang !== currentLanguage) {
22
+ await i18n.changeLanguage(backendLang);
23
+ setLanguageCookie(backendLang);
24
+ }
25
+ };
26
+ syncLanguageWithBackend();
27
+ }, []); // Only run once on mount
28
+ const changeLanguage = useCallback(async (lang) => {
29
+ if (lang === currentLanguage)
30
+ return;
31
+ setIsChanging(true);
32
+ try {
33
+ // Check if i18n is properly initialized
34
+ if (!i18n || typeof i18n.changeLanguage !== 'function') {
35
+ console.error('i18n is not properly initialized');
36
+ // Still update cookie even if i18n fails
37
+ setLanguageCookie(lang);
38
+ return;
39
+ }
40
+ // Update i18next
41
+ await i18n.changeLanguage(lang);
42
+ // Update cookie immediately
43
+ setLanguageCookie(lang);
44
+ // Update backend (fire and forget for better UX)
45
+ updateUserLanguagePreference(lang).catch(err => {
46
+ console.warn('Failed to sync language preference with backend:', err);
47
+ });
48
+ }
49
+ catch (error) {
50
+ console.error('Failed to change language:', error);
51
+ }
52
+ finally {
53
+ setIsChanging(false);
54
+ }
55
+ }, [currentLanguage]);
56
+ return {
57
+ language: currentLanguage,
58
+ changeLanguage,
59
+ isChanging
60
+ };
61
+ };
@@ -0,0 +1,9 @@
1
+ export { initI18n, SUPPORTED_LANGUAGES, LANGUAGE_NAMES, DEFAULT_LANGUAGE, LANGUAGE_COOKIE_NAME } from './config/i18n.js';
2
+ export type { SupportedLanguage, I18nConfig } from './config/i18n.js';
3
+ export { useLanguage } from './hooks/useLanguage.js';
4
+ export type { UseLanguageReturn } from './hooks/useLanguage.js';
5
+ export { getLanguageFromCookie, setLanguageCookie, isSupportedLanguage, getBrowserLanguage, getInitialLanguage, updateUserLanguagePreference, fetchUserLanguagePreference } from './utils/languageUtils.js';
6
+ export { LanguageSwitcher } from './components/LanguageSwitcher.js';
7
+ export type { LanguageSwitcherProps } from './components/LanguageSwitcher.js';
8
+ export { useTranslation, Trans, Translation } from 'react-i18next';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACzH,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAG9E,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ // Main exports
2
+ export { initI18n, SUPPORTED_LANGUAGES, LANGUAGE_NAMES, DEFAULT_LANGUAGE, LANGUAGE_COOKIE_NAME } from './config/i18n.js';
3
+ // Hooks
4
+ export { useLanguage } from './hooks/useLanguage.js';
5
+ // Utils
6
+ export { getLanguageFromCookie, setLanguageCookie, isSupportedLanguage, getBrowserLanguage, getInitialLanguage, updateUserLanguagePreference, fetchUserLanguagePreference } from './utils/languageUtils.js';
7
+ // Components
8
+ export { LanguageSwitcher } from './components/LanguageSwitcher.js';
9
+ // Re-export react-i18next for convenience
10
+ export { useTranslation, Trans, Translation } from 'react-i18next';
@@ -0,0 +1,68 @@
1
+ {
2
+ "welcome": "Welcome",
3
+ "language": "Language",
4
+ "settings": "Settings",
5
+ "profile": "Profile",
6
+ "logout": "Logout",
7
+ "login": "Login",
8
+ "register": "Register",
9
+ "email": "Email",
10
+ "password": "Password",
11
+ "confirmPassword": "Confirm Password",
12
+ "forgotPassword": "Forgot Password?",
13
+ "rememberMe": "Remember Me",
14
+ "submit": "Submit",
15
+ "cancel": "Cancel",
16
+ "save": "Save",
17
+ "delete": "Delete",
18
+ "edit": "Edit",
19
+ "close": "Close",
20
+ "search": "Search",
21
+ "loading": "Loading...",
22
+ "error": "Error",
23
+ "success": "Success",
24
+ "warning": "Warning",
25
+ "info": "Information",
26
+ "yes": "Yes",
27
+ "no": "No",
28
+ "back": "Back",
29
+ "next": "Next",
30
+ "previous": "Previous",
31
+ "home": "Home",
32
+ "about": "About",
33
+ "contact": "Contact",
34
+ "services": "Services",
35
+ "blog": "Blog",
36
+ "careers": "Careers",
37
+ "privacy": "Privacy Policy",
38
+ "terms": "Terms of Service",
39
+ "copyright": " ASafariM. All rights reserved.",
40
+ "languageChanged": "Language changed successfully",
41
+ "preferencesSaved": "Preferences saved successfully",
42
+ "apps": {
43
+ "appName": {
44
+ "web": "ASafariM web",
45
+ "blog": "Blog & documentation",
46
+ "ai": "AI Tools",
47
+ "core": "Core App",
48
+ "jobs": "Job Applications",
49
+ "identity": "Identity Portal",
50
+ "testora": "Testora",
51
+ "taskmanagement": "Task Management",
52
+ "smartops": "SmartOps",
53
+ "studynotes": "Study notes"
54
+ },
55
+ "description": {
56
+ "web": "ASafariM web portal",
57
+ "blog": "Documentation and blog",
58
+ "ai": "AI-powered tools and services",
59
+ "core": "Core application features",
60
+ "jobs": "Job application tracking",
61
+ "identity": "User management and authentication",
62
+ "testora": "Test Automation System - Testora",
63
+ "taskmanagement": "Task Management",
64
+ "smartops": "SmartOps",
65
+ "studynotes": "Study notes"
66
+ }
67
+ }
68
+ }
@@ -1,69 +1,69 @@
1
- {
2
- "toast": {
3
- "notAuthorized": "You do not have permission to access this page",
4
- "notAdmin": "You do not have permission to access this page",
5
- "loading": "Loading..."
6
- },
7
- "admin-area": {
8
- "dashboard": {
9
- "title": "Admin Dashboard",
10
- "description": "Manage Identity Portal entities",
11
- "actions": {
12
- "open": "Open"
13
- },
14
- "user-management": {
15
- "title": "User Management",
16
- "description": "Manage platform users and their permissions.",
17
- "icon": "👥",
18
- "link": "/admin-area/users"
19
- },
20
- "role-management": {
21
- "title": "Role Management",
22
- "description": "Define and update system roles and privileges.",
23
- "icon": "🛡️",
24
- "link": "/admin-area/roles"
25
- }
26
- }
27
- },
28
- "navbar": {
29
- "admin-area": "Admin Area",
30
- "me": "My Profile",
31
- "contact": "Contact",
32
- "about": "About",
33
- "auth": {
34
- "notSignedIn": "Not signed in!",
35
- "signIn": "Sign In",
36
- "signOut": "Sign Out",
37
- "welcome": "Welcome, {{userName}}!"
38
- }
39
- },
40
- "dashboard": {
41
- "title": "Dashboard",
42
- "description": "Manage Identity Portal entities",
43
- "actions": {
44
- "title": "Actions",
45
- "open": "Open",
46
- "editProfile": "Edit profile",
47
- "changePassword": "Change password",
48
- "manageUsers": "Manage users"
49
- },
50
- "user-management": {
51
- "title": "User Management",
52
- "description": "Manage platform users and their permissions.",
53
- "icon": "👥",
54
- "link": "/admin-area/users",
55
- "email": "Email",
56
- "username": "Username"
57
- },
58
- "role-management": {
59
- "title": "Role Management",
60
- "description": "Define and update system roles and privileges.",
61
- "icon": "🛡️",
62
- "link": "/admin-area/roles"
63
- },
64
- "access": {
65
- "title": "Access",
66
- "roles": "Roles"
67
- }
68
- }
69
- }
1
+ {
2
+ "toast": {
3
+ "notAuthorized": "You do not have permission to access this page",
4
+ "notAdmin": "You do not have permission to access this page",
5
+ "loading": "Loading..."
6
+ },
7
+ "admin-area": {
8
+ "dashboard": {
9
+ "title": "Admin Dashboard",
10
+ "description": "Manage Identity Portal entities",
11
+ "actions": {
12
+ "open": "Open"
13
+ },
14
+ "user-management": {
15
+ "title": "User Management",
16
+ "description": "Manage platform users and their permissions.",
17
+ "icon": "👥",
18
+ "link": "/admin-area/users"
19
+ },
20
+ "role-management": {
21
+ "title": "Role Management",
22
+ "description": "Define and update system roles and privileges.",
23
+ "icon": "🛡️",
24
+ "link": "/admin-area/roles"
25
+ }
26
+ }
27
+ },
28
+ "navbar": {
29
+ "admin-area": "Admin Area",
30
+ "me": "My Profile",
31
+ "contact": "Contact",
32
+ "about": "About",
33
+ "auth": {
34
+ "notSignedIn": "Not signed in!",
35
+ "signIn": "Sign In",
36
+ "signOut": "Sign Out",
37
+ "welcome": "Welcome, {{userName}}!"
38
+ }
39
+ },
40
+ "dashboard": {
41
+ "title": "Dashboard",
42
+ "description": "Manage Identity Portal entities",
43
+ "actions": {
44
+ "title": "Actions",
45
+ "open": "Open",
46
+ "editProfile": "Edit profile",
47
+ "changePassword": "Change password",
48
+ "manageUsers": "Manage users"
49
+ },
50
+ "user-management": {
51
+ "title": "User Management",
52
+ "description": "Manage platform users and their permissions.",
53
+ "icon": "👥",
54
+ "link": "/admin-area/users",
55
+ "email": "Email",
56
+ "username": "Username"
57
+ },
58
+ "role-management": {
59
+ "title": "Role Management",
60
+ "description": "Define and update system roles and privileges.",
61
+ "icon": "🛡️",
62
+ "link": "/admin-area/roles"
63
+ },
64
+ "access": {
65
+ "title": "Access",
66
+ "roles": "Roles"
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "welcome": "Welkom",
3
+ "language": "Taal",
4
+ "settings": "Instellingen",
5
+ "profile": "Profiel",
6
+ "logout": "Uitloggen",
7
+ "login": "Inloggen",
8
+ "register": "Registreren",
9
+ "email": "E-mail",
10
+ "password": "Wachtwoord",
11
+ "confirmPassword": "Bevestig wachtwoord",
12
+ "forgotPassword": "Wachtwoord vergeten?",
13
+ "rememberMe": "Onthoud mij",
14
+ "submit": "Verzenden",
15
+ "cancel": "Annuleren",
16
+ "save": "Opslaan",
17
+ "delete": "Verwijderen",
18
+ "edit": "Bewerken",
19
+ "close": "Sluiten",
20
+ "search": "Zoeken",
21
+ "loading": "Laden...",
22
+ "error": "Fout",
23
+ "success": "Succes",
24
+ "warning": "Waarschuwing",
25
+ "info": "Informatie",
26
+ "yes": "Ja",
27
+ "no": "Nee",
28
+ "back": "Terug",
29
+ "next": "Volgende",
30
+ "previous": "Vorige",
31
+ "home": "Home",
32
+ "about": "Over ons",
33
+ "contact": "Contact",
34
+ "services": "Diensten",
35
+ "blog": "Blog",
36
+ "careers": "Carrières",
37
+ "privacy": "Privacybeleid",
38
+ "terms": "Algemene voorwaarden",
39
+ "copyright": " {{year}} ASafariM. Alle rechten voorbehouden.",
40
+ "languageChanged": "Taal succesvol gewijzigd",
41
+ "preferencesSaved": "Voorkeuren succesvol opgeslagen",
42
+ "apps": {
43
+ "appName": {
44
+ "web": "ASafariM web",
45
+ "blog": "Blog & documentatie",
46
+ "ai": "AI hulpmiddelen",
47
+ "core": "Core applicatie",
48
+ "jobs": "Vacaturebeheer",
49
+ "identity": "Identiteitsportaal",
50
+ "testora": "Testora",
51
+ "taskmanagement": "Taakbeheer",
52
+ "smartops": "SmartOps",
53
+ "studynotes": "Studie notities"
54
+ },
55
+ "description": {
56
+ "web": "ASafariM webportaal",
57
+ "blog": "Documentatie en blog",
58
+ "ai": "AI-hulpmiddelen en diensten",
59
+ "core": "Kernfunctionaliteiten van de applicatie",
60
+ "jobs": "Sollicitatiebeheer",
61
+ "identity": "Gebruikersbeheer en authenticatie",
62
+ "testora": "Testautomatiseringssysteem - Testora",
63
+ "taskmanagement": "Taakbeheer",
64
+ "smartops": "SmartOps",
65
+ "studynotes": "Studie notities"
66
+ }
67
+ }
68
+ }
@@ -1,69 +1,69 @@
1
- {
2
- "toast": {
3
- "notAuthorized": "U heeft geen toegang tot deze pagina",
4
- "notAdmin": "U heeft geen toegang tot deze pagina",
5
- "loading": "Laden..."
6
- },
7
- "admin-area": {
8
- "dashboard": {
9
- "title": "Beheer Dashboard",
10
- "description": "Beheer entiteiten van het Identity Portal",
11
- "actions": {
12
- "open": "Openen"
13
- },
14
- "user-management": {
15
- "title": "Gebruikersbeheer",
16
- "description": "Beheer platformgebruikers en hun rechten.",
17
- "icon": "👥",
18
- "link": "/admin-area/users"
19
- },
20
- "role-management": {
21
- "title": "Rollenbeheer",
22
- "description": "Beheer systeemrollen en bevoegdheden.",
23
- "icon": "🛡️",
24
- "link": "/admin-area/roles"
25
- }
26
- }
27
- },
28
- "navbar": {
29
- "admin-area": "Beheer",
30
- "me": "Mijn profiel",
31
- "contact": "Contact",
32
- "about": "Over",
33
- "auth": {
34
- "notSignedIn": "Niet ingelogd!",
35
- "signIn": "Inloggen",
36
- "signOut": "Uitloggen",
37
- "welcome": "Welkom, {{userName}}!"
38
- }
39
- },
40
- "dashboard": {
41
- "title": "Dashboard",
42
- "description": "Beheer entiteiten van het Identity Portal",
43
- "user-management": {
44
- "title": "Gebruikersbeheer",
45
- "description": "Beheer platformgebruikers en hun rechten.",
46
- "icon": "👥",
47
- "link": "/admin-area/users",
48
- "email": "E-mail",
49
- "username": "Gebruikersnaam"
50
- },
51
- "role-management": {
52
- "title": "Rollenbeheer",
53
- "description": "Beheer systeemrollen en bevoegdheden.",
54
- "icon": "🛡️",
55
- "link": "/admin-area/roles"
56
- },
57
- "actions": {
58
- "title": "Acties",
59
- "open": "Openen",
60
- "editProfile": "Profiel bewerken",
61
- "changePassword": "Wachtwoord wijzigen",
62
- "manageUsers": "Gebruikers beheren"
63
- },
64
- "access": {
65
- "title": "Toegang",
66
- "roles": "Rollen"
67
- }
68
- }
69
- }
1
+ {
2
+ "toast": {
3
+ "notAuthorized": "U heeft geen toegang tot deze pagina",
4
+ "notAdmin": "U heeft geen toegang tot deze pagina",
5
+ "loading": "Laden..."
6
+ },
7
+ "admin-area": {
8
+ "dashboard": {
9
+ "title": "Beheer Dashboard",
10
+ "description": "Beheer entiteiten van het Identity Portal",
11
+ "actions": {
12
+ "open": "Openen"
13
+ },
14
+ "user-management": {
15
+ "title": "Gebruikersbeheer",
16
+ "description": "Beheer platformgebruikers en hun rechten.",
17
+ "icon": "👥",
18
+ "link": "/admin-area/users"
19
+ },
20
+ "role-management": {
21
+ "title": "Rollenbeheer",
22
+ "description": "Beheer systeemrollen en bevoegdheden.",
23
+ "icon": "🛡️",
24
+ "link": "/admin-area/roles"
25
+ }
26
+ }
27
+ },
28
+ "navbar": {
29
+ "admin-area": "Beheer",
30
+ "me": "Mijn profiel",
31
+ "contact": "Contact",
32
+ "about": "Over",
33
+ "auth": {
34
+ "notSignedIn": "Niet ingelogd!",
35
+ "signIn": "Inloggen",
36
+ "signOut": "Uitloggen",
37
+ "welcome": "Welkom, {{userName}}!"
38
+ }
39
+ },
40
+ "dashboard": {
41
+ "title": "Dashboard",
42
+ "description": "Beheer entiteiten van het Identity Portal",
43
+ "user-management": {
44
+ "title": "Gebruikersbeheer",
45
+ "description": "Beheer platformgebruikers en hun rechten.",
46
+ "icon": "👥",
47
+ "link": "/admin-area/users",
48
+ "email": "E-mail",
49
+ "username": "Gebruikersnaam"
50
+ },
51
+ "role-management": {
52
+ "title": "Rollenbeheer",
53
+ "description": "Beheer systeemrollen en bevoegdheden.",
54
+ "icon": "🛡️",
55
+ "link": "/admin-area/roles"
56
+ },
57
+ "actions": {
58
+ "title": "Acties",
59
+ "open": "Openen",
60
+ "editProfile": "Profiel bewerken",
61
+ "changePassword": "Wachtwoord wijzigen",
62
+ "manageUsers": "Gebruikers beheren"
63
+ },
64
+ "access": {
65
+ "title": "Toegang",
66
+ "roles": "Rollen"
67
+ }
68
+ }
69
+ }