diff --git a/dmp-frontend/package.json b/dmp-frontend/package.json index 6e5223876..bcbe95966 100644 --- a/dmp-frontend/package.json +++ b/dmp-frontend/package.json @@ -13,13 +13,13 @@ }, "private": true, "dependencies": { - "@angular/animations": "^18.0.1", - "@angular/common": "^18.0.1", - "@angular/compiler": "^18.0.1", - "@angular/core": "^18.0.1", - "@angular/forms": "^18.0.1", - "@angular/material-moment-adapter": "^18.0.1", - "@angular/platform-browser": "^18.0.1", + "@angular/animations": "^18.0.2", + "@angular/common": "^18.0.2", + "@angular/compiler": "^18.0.2", + "@angular/core": "^18.0.2", + "@angular/forms": "^18.0.2", + "@angular/material-moment-adapter": "^18.0.2", + "@angular/platform-browser": "^18.0.2", "@kolkov/angular-editor": "^2.1.0", "@ngx-translate/core": "^15.0.0", "@ngx-translate/http-loader": "^8.0.0", @@ -33,6 +33,8 @@ "keycloak-js": "^24.0.5", "moment": "^2.30.1", "moment-timezone": "^0.5.45", + "@mat-datetimepicker/core": "^13.0.2", + "@mat-datetimepicker/moment": "^13.0.2", "ng-dialog-animation": "^9.0.4", "ng2-dragula": "^5.1.0", "ngx-colors": "^3.6.0", @@ -44,25 +46,25 @@ "rxjs": "^7.4.0", "tinymce": "^6.7.0", "ts-simple-nameof": "^1.3.1", - "tslib": "^2.6.2", + "tslib": "^2.6.3", "zone.js": "~0.14.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^18.0.2", - "@angular/cdk": "^18.0.1", - "@angular/cli": "18.0.2", - "@angular/compiler-cli": "^18.0.1", - "@angular/language-service": "^18.0.1", - "@angular/material": "^18.0.1", - "@angular/platform-browser-dynamic": "^18.0.1", - "@angular/router": "^18.0.1", + "@angular-devkit/build-angular": "^18.0.3", + "@angular/cdk": "^18.0.2", + "@angular/cli": "18.0.3", + "@angular/compiler-cli": "^18.0.2", + "@angular/language-service": "^18.0.2", + "@angular/material": "^18.0.2", + "@angular/platform-browser-dynamic": "^18.0.2", + "@angular/router": "^18.0.2", "@types/dragula": "^3.7.5", "@types/file-saver": "^2.0.7", "@types/moment-timezone": "^0.5.13", - "@types/node": "^20.14.1", + "@types/node": "^20.14.2", "codelyzer": "^6.0.2", "ts-node": "~10.9.2", "tslint": "~6.1.0", "typescript": "^5.4.5" } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/app-routing.module.ts b/dmp-frontend/src/app/app-routing.module.ts index e48784c9e..19d4aa6dd 100644 --- a/dmp-frontend/src/app/app-routing.module.ts +++ b/dmp-frontend/src/app/app-routing.module.ts @@ -383,7 +383,9 @@ const tenantEnrichedRoutes: Routes = [ path: 't/:tenant_code', data: { breadcrumb: true, - hideItem: true + ...BreadcrumbService.generateRouteDataConfiguration({ + skipNavigation: true, + }) }, children: [ ...appRoutes diff --git a/dmp-frontend/src/app/app.component.ts b/dmp-frontend/src/app/app.component.ts index 1bda3c6c6..6bbdc01c0 100644 --- a/dmp-frontend/src/app/app.component.ts +++ b/dmp-frontend/src/app/app.component.ts @@ -24,6 +24,7 @@ import { TenantConfigurationType } from './core/common/enum/tenant-configuration import { CssColorsTenantConfiguration, TenantConfiguration } from './core/model/tenant-configuaration/tenant-configuration'; import { nameof } from 'ts-simple-nameof'; import { TenantHandlingService } from './core/services/tenant/tenant-handling.service'; +import { BreadcrumbService } from './ui/misc/breadcrumb/breadcrumb.service'; declare const gapi: any; @@ -63,7 +64,8 @@ export class AppComponent implements OnInit, AfterViewInit { private matomoService: MatomoService, private tenantConfigurationService: TenantConfigurationService, private sidenavService: SideNavService, - private tenantHandlingService: TenantHandlingService + private tenantHandlingService: TenantHandlingService, + private breadcrumbService: BreadcrumbService ) { this.initializeServices(); this.matomoService.init(); @@ -186,6 +188,12 @@ export class AppComponent implements OnInit, AfterViewInit { filter(event => event instanceof NavigationEnd) ) .subscribe((event: NavigationStart) => { + + this.breadcrumbService.addExcludedParam('t', true); + + if (this.authentication.getSelectedTenantName() && this.authentication.getSelectedTenantName() !== '') + this.breadcrumbService.addIdResolvedValue(this.authentication.selectedTenant(), this.authentication.getSelectedTenantName()); + const enrichedUrl = this.tenantHandlingService.getUrlEnrichedWithTenantCode(event.url, this.authentication.selectedTenant() ?? 'default'); if (event.url != enrichedUrl) { this.router.navigateByUrl(enrichedUrl); @@ -262,11 +270,6 @@ export class AppComponent implements OnInit, AfterViewInit { this.router.navigate(['/plans'], { queryParams: { /*refresh : Math.random() ,returnUrl: this.state.url*/ } }); } - // ----------- UNCOMMENT TO ADD AGAIN GRANTS -------- - // goToGrants() { - // this.router.navigate(['/grants'], { queryParams: { /*refresh : Math.random() ,returnUrl: this.state.url*/ } }); - // } - initializeServices() { this.translate.setDefaultLang(this.language.getDefaultLanguagesCode()); this.authentication.currentAccountIsAuthenticated() && this.authentication.getUserProfileCulture() ? this.cultureService.cultureSelected(this.authentication.getUserProfileCulture()) : this.cultureService.cultureSelected(this.configurationService.defaultCulture); diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index 662863e8f..8912dd361 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -4,7 +4,7 @@ import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MAT_MOMENT_DATE_FORMATS, MatMomentDateModule } from '@angular/material-moment-adapter'; import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; -import { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatFormFieldDefaultOptions } from '@angular/material/form-field'; +import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; import { BrowserModule, Title } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { AppRoutingModule } from '@app/app-routing.module'; @@ -12,16 +12,19 @@ import { AppComponent } from '@app/app.component'; import { CoreServiceModule } from '@app/core/core-service.module'; import { NotificationModule } from '@app/library/notification/notification.module'; import { LoginModule } from '@app/ui/auth/login/login.module'; -// import { BreadcrumbModule } from '@app/ui/misc/breadcrumb/breadcrumb.module'; import { ReloadHelperComponent } from '@app/ui/misc/reload-helper/reload-helper.component'; import { NavbarModule } from '@app/ui/navbar/navbar.module'; import { SidebarModule } from '@app/ui/sidebar/sidebar.module'; import { MomentUtcDateAdapter } from '@common/date/moment-utc-date-adapter'; +import { MomentUtcDateTimeAdapter } from '@common/date/moment-utc-date-time.adapter'; import { BaseHttpParams } from '@common/http/base-http-params'; import { CommonHttpModule } from '@common/http/common-http.module'; import { InterceptorType } from '@common/http/interceptors/interceptor-type'; import { CommonUiModule } from '@common/ui/common-ui.module'; +import { DatetimeAdapter } from '@mat-datetimepicker/core'; import { TranslateCompiler, TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { CoreNotificationServiceModule } from '@notification-service/services/core-service.module'; +import { CoreAnnotationServiceModule } from 'annotation-service/services/core-service.module'; import { KeycloakAngularModule, KeycloakService } from 'keycloak-angular'; import { DragulaModule } from 'ng2-dragula'; import { CookieService } from 'ngx-cookie-service'; @@ -34,14 +37,12 @@ import { CultureService } from './core/services/culture/culture-service'; import { LanguageHttpService } from './core/services/language/language.http.service'; import { LanguageService } from './core/services/language/language.service'; import { TranslateServerLoader } from './core/services/language/server.loader'; -import { MatomoService } from './core/services/matomo/matomo-service'; -import { GuidedTourModule } from './library/guided-tour/guided-tour.module'; -import { OpenDMPCustomTranslationCompiler } from './utilities/translate/opendmp-custom-translation-compiler'; -import { CoreAnnotationServiceModule } from 'annotation-service/services/core-service.module'; -import { CoreNotificationServiceModule } from '@notification-service/services/core-service.module'; -import { DepositOauth2DialogModule } from './ui/misc/deposit-oauth2-dialog/deposit-oauth2-dialog.module'; import { AnalyticsService } from './core/services/matomo/analytics-service'; +import { MatomoService } from './core/services/matomo/matomo-service'; import { TenantHandlingService } from './core/services/tenant/tenant-handling.service'; +import { GuidedTourModule } from './library/guided-tour/guided-tour.module'; +import { DepositOauth2DialogModule } from './ui/misc/deposit-oauth2-dialog/deposit-oauth2-dialog.module'; +import { OpenDMPCustomTranslationCompiler } from './utilities/translate/opendmp-custom-translation-compiler'; // AoT requires an exported function for factories export function HttpLoaderFactory(languageHttpService: LanguageHttpService) { @@ -78,12 +79,7 @@ const cookieConfig: NgcCookieConsentConfig = { type: 'info' }; -const appearance: MatFormFieldDefaultOptions = { - appearance: 'outline' - // appearance: 'standard' -}; - -export function InstallationConfigurationFactory(appConfig: ConfigurationService, keycloak: KeycloakService, authService: AuthService, languageService: LanguageService, tenantHandlingService:TenantHandlingService) { +export function InstallationConfigurationFactory(appConfig: ConfigurationService, keycloak: KeycloakService, authService: AuthService, languageService: LanguageService, tenantHandlingService: TenantHandlingService) { return () => appConfig.loadConfiguration().then(() => { return languageService.loadAvailableLanguages().toPromise(); }).then(x => keycloak.init({ @@ -145,7 +141,6 @@ export function InstallationConfigurationFactory(appConfig: ConfigurationService LoginModule, //Ui NotificationModule, - // BreadcrumbModule, ReactiveFormsModule, FormsModule, NavbarModule, @@ -156,35 +151,39 @@ export function InstallationConfigurationFactory(appConfig: ConfigurationService DragulaModule.forRoot(), NgxMatomoModule.forRoot({ mode: MatomoInitializationMode.AUTO_DEFERRED, - })], providers: [ - ConfigurationService, - { - provide: APP_INITIALIZER, - useFactory: InstallationConfigurationFactory, - deps: [ConfigurationService, KeycloakService, AuthService, LanguageService, TenantHandlingService], - multi: true - }, - { - provide: MAT_DATE_LOCALE, - deps: [CultureService], - useFactory: (cultureService) => cultureService.getCurrentCulture().name - }, - { provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS }, - { provide: DateAdapter, useClass: MomentUtcDateAdapter }, - { - provide: LOCALE_ID, - deps: [CultureService], - useFactory: (cultureService) => cultureService.getCurrentCulture().name - }, - { - provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, - useValue: appearance - }, - Title, - CookieService, - MatomoService, - AnalyticsService, - provideHttpClient(withInterceptorsFromDi()) - ] + })], + providers: [ + ConfigurationService, + { + provide: APP_INITIALIZER, + useFactory: InstallationConfigurationFactory, + deps: [ConfigurationService, KeycloakService, AuthService, LanguageService, TenantHandlingService], + multi: true + }, + { + provide: MAT_DATE_LOCALE, + deps: [CultureService], + useFactory: (cultureService) => cultureService.getCurrentCulture().name + }, + { provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS }, + { provide: DateAdapter, useClass: MomentUtcDateAdapter }, + { provide: DatetimeAdapter, useClass: MomentUtcDateTimeAdapter }, + { + provide: LOCALE_ID, + deps: [CultureService, ConfigurationService], + useFactory: (cultureService, installationConfigurationService) => cultureService.getCurrentCulture(installationConfigurationService).name + }, + { + provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, + useValue: { + appearance: 'outline' + } + }, + Title, + CookieService, + MatomoService, + AnalyticsService, + provideHttpClient(withInterceptorsFromDi()) + ] }) export class AppModule { } diff --git a/dmp-frontend/src/app/core/core-service.module.ts b/dmp-frontend/src/app/core/core-service.module.ts index afbb087dc..2dc0783a6 100644 --- a/dmp-frontend/src/app/core/core-service.module.ts +++ b/dmp-frontend/src/app/core/core-service.module.ts @@ -46,6 +46,7 @@ import { StorageFileService } from './services/storage-file/storage-file.service import { TenantConfigurationService } from './services/tenant-configuration/tenant-configuration.service'; import { DefaultUserLocaleService } from './services/default-user-locale/default-user-locale.service'; import { TenantHandlingService } from './services/tenant/tenant-handling.service'; +import { RouterUtilsService } from './services/router/router-utils.service'; // // // This is shared module that provides all the services. Its imported only once on the AppModule. @@ -111,7 +112,8 @@ export class CoreServiceModule { VisibilityRulesService, TenantConfigurationService, StorageFileService, - TenantHandlingService + TenantHandlingService, + RouterUtilsService ], }; } diff --git a/dmp-frontend/src/app/core/formatting.module.ts b/dmp-frontend/src/app/core/formatting.module.ts index 467b7980a..461cbefea 100644 --- a/dmp-frontend/src/app/core/formatting.module.ts +++ b/dmp-frontend/src/app/core/formatting.module.ts @@ -1,18 +1,17 @@ import { DatePipe } from '@angular/common'; import { NgModule } from '@angular/core'; -import { DateFormatPipe } from './pipes/date-format.pipe'; -import { DateTimeFormatPipe } from './pipes/date-time-format.pipe'; +import { ColumnClassPipe } from "@app/core/pipes/column-class.pipe"; +import { FieldValuePipe } from "@app/core/pipes/field-value.pipe"; +import { PipeService } from '@common/formatting/pipe.service'; +import { AppTitleCaseFormatPipe } from '@common/formatting/pipes/app-title-case-format.pipe'; +import { CultureInfoDisplayPipe } from './pipes/culture-info-display.pipe'; +import { DataTableDateTimeFormatPipe, DateTimeFormatPipe } from './pipes/date-time-format.pipe'; +import { JsonParserPipe } from './pipes/json-parser.pipe'; import { NgForLimitPipe } from './pipes/ng-for-limit.pipe'; +import { RemoveHtmlTagsPipe } from './pipes/remove-html-tags.pipe'; import { SumarizeTextPipe } from './pipes/sumarize-text.pipe'; import { TimezoneInfoDisplayPipe } from './pipes/timezone-info-display.pipe'; import { EnumUtils } from './services/utilities/enum-utils.service'; -import { JsonParserPipe } from './pipes/json-parser.pipe'; -import { DateTimeCultureFormatPipe } from './pipes/date-time-culture-format.pipe'; -import {FieldValuePipe} from "@app/core/pipes/field-value.pipe"; -import {ColumnClassPipe} from "@app/core/pipes/column-class.pipe"; -import { PipeService } from '@common/formatting/pipe.service'; -import { AppTitleCaseFormatPipe } from '@common/formatting/pipes/app-title-case-format.pipe'; -import { RemoveHtmlTagsPipe } from './pipes/remove-html-tags.pipe'; // // @@ -27,9 +26,9 @@ import { RemoveHtmlTagsPipe } from './pipes/remove-html-tags.pipe'; SumarizeTextPipe, RemoveHtmlTagsPipe, TimezoneInfoDisplayPipe, - DateFormatPipe, + CultureInfoDisplayPipe, DateTimeFormatPipe, - DateTimeCultureFormatPipe, + DataTableDateTimeFormatPipe, JsonParserPipe, FieldValuePipe, ColumnClassPipe, @@ -40,9 +39,9 @@ import { RemoveHtmlTagsPipe } from './pipes/remove-html-tags.pipe'; SumarizeTextPipe, RemoveHtmlTagsPipe, TimezoneInfoDisplayPipe, - DateFormatPipe, + CultureInfoDisplayPipe, DateTimeFormatPipe, - DateTimeCultureFormatPipe, + DataTableDateTimeFormatPipe, JsonParserPipe, FieldValuePipe, ColumnClassPipe, @@ -56,9 +55,9 @@ import { RemoveHtmlTagsPipe } from './pipes/remove-html-tags.pipe'; SumarizeTextPipe, RemoveHtmlTagsPipe, TimezoneInfoDisplayPipe, - DateFormatPipe, + CultureInfoDisplayPipe, DateTimeFormatPipe, - DateTimeCultureFormatPipe, + DataTableDateTimeFormatPipe, JsonParserPipe, FieldValuePipe, ColumnClassPipe, diff --git a/dmp-frontend/src/app/core/model/culture-info.ts b/dmp-frontend/src/app/core/model/culture-info.ts deleted file mode 100644 index 77ae0a475..000000000 --- a/dmp-frontend/src/app/core/model/culture-info.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface CultureInfo { - name: string; - displayName: string; - nativeName: string; -} diff --git a/dmp-frontend/src/app/core/pipes/culture-info-display.pipe.ts b/dmp-frontend/src/app/core/pipes/culture-info-display.pipe.ts new file mode 100644 index 000000000..5810fe59f --- /dev/null +++ b/dmp-frontend/src/app/core/pipes/culture-info-display.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { CultureInfo } from '../services/culture/culture-service'; + +@Pipe({ name: 'cultureInfoDisplay' }) +export class CultureInfoDisplayPipe implements PipeTransform { + constructor() { } + + public transform(value: CultureInfo): any { + return value.displayName + ' [' + value.name + ']'; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/core/pipes/date-format.pipe.ts b/dmp-frontend/src/app/core/pipes/date-format.pipe.ts deleted file mode 100644 index 4054022d5..000000000 --- a/dmp-frontend/src/app/core/pipes/date-format.pipe.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { DatePipe } from '@angular/common'; -import { Pipe, PipeTransform } from '@angular/core'; -import moment from 'moment'; -import 'moment-timezone'; - -@Pipe({ - name: 'dateFormatter' -}) -export class DateFormatPipe implements PipeTransform { - - constructor(private datePipe: DatePipe) { - - } - - transform(value: any, format?: string, locale?: string): string | null { - // using timezone set in timezoneService by default. can be overwritten with pipe arguments - const timezoneToUse = moment(value).tz('UTC').format('Z'); - return this.datePipe.transform(value, format, timezoneToUse, locale); - } -} diff --git a/dmp-frontend/src/app/core/pipes/date-time-culture-format.pipe.ts b/dmp-frontend/src/app/core/pipes/date-time-culture-format.pipe.ts deleted file mode 100644 index 967c699fa..000000000 --- a/dmp-frontend/src/app/core/pipes/date-time-culture-format.pipe.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { DatePipe, registerLocaleData } from '@angular/common'; -import localeEl from '@angular/common/locales/el'; -import localeDe from '@angular/common/locales/de'; -import localeEs from '@angular/common/locales/es'; -import localeSk from '@angular/common/locales/sk'; -import localeTr from '@angular/common/locales/tr'; -import localeSr from '@angular/common/locales/sr'; -import localePt from '@angular/common/locales/pt'; -import { Pipe, PipeTransform } from '@angular/core'; -import { LangChangeEvent, TranslateService } from '@ngx-translate/core'; -import 'moment-timezone'; -import { CultureInfo } from '../model/culture-info'; -import { LanguageService } from '../services/language/language.service'; - -const availableCultures: CultureInfo[] = require('../../../assets/localization/available-cultures.json'); - -@Pipe({ - name: 'dateTimeCultureFormatter', - pure: false -}) -export class DateTimeCultureFormatPipe implements PipeTransform { - private cultureValues = new Map(); // cultures by name - private cache; - - constructor(private datePipe: DatePipe, - private translate: TranslateService, - private languageService: LanguageService) { - - if (availableCultures) { - this.cultureValues = new Map(); - availableCultures.forEach(culture => { - this.cultureValues.set(culture.name, culture); - }); - } - - this.translate.onLangChange.subscribe(($event: LangChangeEvent) => { - (this).locale = $event.lang; - this.cache = null; - }); - } - - transform(value: any, format?: string, timezone?: string): string | null { - if (!this.cache) { - const cultureName = this.languageService.getCurrentLanguage(); - let locale: string; - switch (cultureName) { - case 'en': { - locale = this.cultureValues.get('en-US').name; - break; - } - case 'gr': { - locale = this.cultureValues.get('el-GR').name; - registerLocaleData(localeEl); - break; - } - case 'es': { - locale = this.cultureValues.get('es-ES').name; - registerLocaleData(localeEs); - break; - } - case 'de': { - locale = this.cultureValues.get('de-DE').name; - registerLocaleData(localeDe); - break; - } - case 'tr': { - locale = this.cultureValues.get('tr-TR').name; - registerLocaleData(localeTr); - break; - } - case 'sk': { - locale = this.cultureValues.get('sk-SK').name; - registerLocaleData(localeSk); - break; - } - case 'sr': { - locale = this.cultureValues.get('sr-Latn-RS').name; - registerLocaleData(localeSr); - break; - } - case 'pt': { - locale = this.cultureValues.get('pt-PT').name; - registerLocaleData(localePt); - break; - } - default: { - locale = this.cultureValues.get('en-US').name; - break; - } - } - this.cache = this.datePipe.transform(value, format, timezone, locale); - } - return this.cache; - } -} diff --git a/dmp-frontend/src/app/core/pipes/date-time-format.pipe.ts b/dmp-frontend/src/app/core/pipes/date-time-format.pipe.ts index 6f7acb187..fb5928690 100644 --- a/dmp-frontend/src/app/core/pipes/date-time-format.pipe.ts +++ b/dmp-frontend/src/app/core/pipes/date-time-format.pipe.ts @@ -2,6 +2,7 @@ import { DatePipe } from '@angular/common'; import { Pipe, PipeTransform } from '@angular/core'; import moment from 'moment'; import 'moment-timezone'; +import { CultureService } from '../services/culture/culture-service'; import { TimezoneService } from '../services/timezone/timezone-service'; @Pipe({ @@ -9,13 +10,40 @@ import { TimezoneService } from '../services/timezone/timezone-service'; }) export class DateTimeFormatPipe implements PipeTransform { - constructor(private datePipe: DatePipe, private timezoneService: TimezoneService) { + constructor(private datePipe: DatePipe, private timezoneService: TimezoneService, private cultureService: CultureService) { } transform(value: any, format?: string, timezone?: string, locale?: string): string | null { + // using timezone set in timezoneService by default. can be overwritten with pipe arguments const timezoneToUse = timezone ? timezone : moment(value).tz(this.timezoneService.getCurrentTimezone()).format('Z'); - return this.datePipe.transform(value, format, timezoneToUse, locale); + let localeToUse = locale ? locale : this.cultureService.getCurrentCulture().name; + + return this.datePipe.transform(value, format, timezoneToUse, localeToUse); + } +} + + +@Pipe({ + name: 'dataTableDateTimeFormatter' +}) +// This is only used for the DataTable Column definition. +// It's a hacky way to apply format to the pipe because it only supports passing a pipe instance and calls transform in it without params. +export class DataTableDateTimeFormatPipe extends DateTimeFormatPipe implements PipeTransform { + + format: string; + + constructor(private _datePipe: DatePipe, private _timezoneService: TimezoneService, private _cultureService: CultureService) { + super(_datePipe, _timezoneService, _cultureService); + } + + public withFormat(format: string): DataTableDateTimeFormatPipe { + this.format = format; + return this; + } + + transform(value: any): string | null { + return super.transform(value, this.format); } } diff --git a/dmp-frontend/src/app/core/pipes/field-value.pipe.ts b/dmp-frontend/src/app/core/pipes/field-value.pipe.ts index 7e5542b12..d030144fa 100644 --- a/dmp-frontend/src/app/core/pipes/field-value.pipe.ts +++ b/dmp-frontend/src/app/core/pipes/field-value.pipe.ts @@ -1,23 +1,24 @@ -import { DatePipe } from "@angular/common"; import { Pipe, PipeTransform } from "@angular/core"; +import { Guid } from "@common/types/guid"; +import { TranslateService } from "@ngx-translate/core"; +import { Observable, map, of } from "rxjs"; +import { nameof } from "ts-simple-nameof"; import { DescriptionTemplateFieldType } from "../common/enum/description-template-field-type"; import { DescriptionTemplateField, DescriptionTemplateLabelAndMultiplicityData, DescriptionTemplateRadioBoxData, DescriptionTemplateReferenceTypeData, DescriptionTemplateSelectData } from "../model/description-template/description-template"; import { DescriptionFieldPersist } from "../model/description/description"; -import { Observable, map, of } from "rxjs"; -import { Guid } from "@common/types/guid"; -import { DmpService } from "../services/dmp/dmp.service"; -import { DescriptionService } from "../services/description/description.service"; -import { StorageFileService } from "../services/storage-file/storage-file.service"; -import { nameof } from "ts-simple-nameof"; import { StorageFile } from "../model/storage-file/storage-file"; -import { TranslateService } from "@ngx-translate/core"; +import { DescriptionService } from "../services/description/description.service"; +import { DmpService } from "../services/dmp/dmp.service"; +import { StorageFileService } from "../services/storage-file/storage-file.service"; +import { DateTimeFormatPipe } from "./date-time-format.pipe"; @Pipe({ name: 'fieldValue' }) export class FieldValuePipe implements PipeTransform { - constructor(private date: DatePipe, + constructor( + private dateTimeFormatPipe: DateTimeFormatPipe, private dmpService: DmpService, private storageFileService: StorageFileService, private descriptionService: DescriptionService, @@ -39,7 +40,7 @@ export class FieldValuePipe implements PipeTransform { break; } case DescriptionTemplateFieldType.DATE_PICKER: - return of(this.date.transform(controlValue.dateValue, 'dd/MM/yyyy')); + return of(this.dateTimeFormatPipe.transform(controlValue.dateValue, 'dd/MM/yyyy')); case DescriptionTemplateFieldType.FREE_TEXT: return of(controlValue.textValue); case DescriptionTemplateFieldType.SELECT: { @@ -76,18 +77,18 @@ export class FieldValuePipe implements PipeTransform { case DescriptionTemplateFieldType.INTERNAL_ENTRIES_DMPS: { const data = field.data; if (!data?.multipleSelect && controlValue.textValue && controlValue.textValue.length > 0) { - return this.dmpService.query(this.dmpService.buildAutocompleteLookup(null, null, [Guid.parse(controlValue.textValue)])).pipe(map(x => x.items?.map(y=> y.label).join(','))); + return this.dmpService.query(this.dmpService.buildAutocompleteLookup(null, null, [Guid.parse(controlValue.textValue)])).pipe(map(x => x.items?.map(y => y.label).join(','))); } else if (data?.multipleSelect && controlValue.references && controlValue.textListValue && controlValue.textListValue.length > 0) { - return this.dmpService.query(this.dmpService.buildAutocompleteLookup(null, null, controlValue.textListValue.map(x => Guid.parse(x)))).pipe(map(x => x.items?.map(y=> y.label).join(','))); + return this.dmpService.query(this.dmpService.buildAutocompleteLookup(null, null, controlValue.textListValue.map(x => Guid.parse(x)))).pipe(map(x => x.items?.map(y => y.label).join(','))); } break; } case DescriptionTemplateFieldType.INTERNAL_ENTRIES_DESCRIPTIONS: const data = field.data; if (!data?.multipleSelect && controlValue.textValue && controlValue.textValue.length > 0) { - return this.descriptionService.query(this.descriptionService.buildAutocompleteLookup(null, null, [Guid.parse(controlValue.textValue)])).pipe(map(x => x.items?.map(y=> y.label).join(','))); + return this.descriptionService.query(this.descriptionService.buildAutocompleteLookup(null, null, [Guid.parse(controlValue.textValue)])).pipe(map(x => x.items?.map(y => y.label).join(','))); } else if (data?.multipleSelect && controlValue.references && controlValue.textListValue && controlValue.textListValue.length > 0) { - return this.descriptionService.query(this.descriptionService.buildAutocompleteLookup(null, null, controlValue.textListValue.map(x => Guid.parse(x)))).pipe(map(x => x.items?.map(y=> y.label).join(','))); + return this.descriptionService.query(this.descriptionService.buildAutocompleteLookup(null, null, controlValue.textListValue.map(x => Guid.parse(x)))).pipe(map(x => x.items?.map(y => y.label).join(','))); } break; case DescriptionTemplateFieldType.UPLOAD: { diff --git a/dmp-frontend/src/app/core/query/default-user-locale.lookup.ts b/dmp-frontend/src/app/core/query/default-user-locale.lookup.ts index 3856cd544..87cef1af9 100644 --- a/dmp-frontend/src/app/core/query/default-user-locale.lookup.ts +++ b/dmp-frontend/src/app/core/query/default-user-locale.lookup.ts @@ -1,5 +1,4 @@ import { Lookup } from "@common/model/lookup"; -import { CultureInfo } from "../model/culture-info"; export class DefaultUserLocaleTimezoneLookup extends Lookup { like: string; diff --git a/dmp-frontend/src/app/core/services/configuration/configuration.service.ts b/dmp-frontend/src/app/core/services/configuration/configuration.service.ts index a26e4464b..a7f632a42 100644 --- a/dmp-frontend/src/app/core/services/configuration/configuration.service.ts +++ b/dmp-frontend/src/app/core/services/configuration/configuration.service.ts @@ -36,12 +36,7 @@ export class ConfigurationService extends BaseComponent { private _defaultCulture: string; get defaultCulture(): string { - return this._defaultCulture; - } - - private _defaultBlueprintId: Guid; - get defaultBlueprintId(): Guid { - return this._defaultBlueprintId; + return this._defaultCulture || 'en'; } private _defaultTimezone: string; @@ -49,6 +44,11 @@ export class ConfigurationService extends BaseComponent { return this._defaultTimezone || 'UTC'; } + private _defaultBlueprintId: Guid; + get defaultBlueprintId(): Guid { + return this._defaultBlueprintId; + } + private _logging: Logging; get logging(): Logging { return this._logging; diff --git a/dmp-frontend/src/app/core/services/culture/culture-service.ts b/dmp-frontend/src/app/core/services/culture/culture-service.ts index 8ffed0732..cbe594c39 100644 --- a/dmp-frontend/src/app/core/services/culture/culture-service.ts +++ b/dmp-frontend/src/app/core/services/culture/culture-service.ts @@ -1,12 +1,17 @@ import { registerLocaleData } from '@angular/common'; import { Injectable } from '@angular/core'; import { Observable, Subject } from 'rxjs'; -import { CultureInfo } from '../../model/culture-info'; +import { ConfigurationService } from '../configuration/configuration.service'; import { LoggingService } from '../logging/logging-service'; import { TypeUtils } from '../utilities/type-utils.service'; const availableCultures: CultureInfo[] = require('../../../../assets/localization/available-cultures.json'); +export interface CultureInfo { + name: string; + displayName: string; +} + @Injectable() export class CultureService { @@ -57,41 +62,263 @@ export class CultureService { // Set angular locale based on user selection. // This is a very hacky way to map cultures with angular cultures, since there is no mapping. We first try to // use the culture with the specialization (ex en-US), and if not exists we import the base culture (first part). - // let locale = newCulture.name; - // const base = import( - // /* webpackExclude: /\.d\.ts$/ */ - // /* webpackMode: "lazy-once" */ - // /* webpackChunkName: "i18n-base" */ - // `@angular/common/locales/${locale}.mjs`)//.then(m => m[basePkg]); - - // const extra = import( - // /* webpackExclude: /\.d\.ts$/ */ - // /* webpackMode: "lazy-once" */ - // /* webpackChunkName: "i18n-extra" */ - // `@angular/common/locales/extra/${locale.split('-')[0]}.mjs`)//.then(m => m[extraPkg]); - - - // import(`/node_modules/ @angular/common/locales/${locale}.mjs`).catch(reason => { - // this.logger.error('Could not load locale: ' + locale); - // }).then(selectedLocale => { - // if (selectedLocale) { - // registerLocaleData(selectedLocale.default); - // } else { - // locale = newCulture.name.split('-')[0]; - // import(`/node_modules/@angular/common/locales/${locale}.mjs`).catch(reason => { - // this.logger.error('Could not load locale: ' + locale); - // }).then(selectedDefaultLocale => { - // registerLocaleData(selectedDefaultLocale.default); - // }); - // } - // }); + let locale = newCulture.name; + this.loadLocale(locale); } getCultureChangeObservable(): Observable { return this.cultureChangeSubject.asObservable(); } - getCurrentCulture(): CultureInfo { - return this.currentCulture || this.cultureValues.get('en-US'); //TODO: fix this + getCurrentCulture(installationConfigurationService?: ConfigurationService): CultureInfo { + if (this.currentCulture == null && installationConfigurationService != null) { + this.cultureSelected(installationConfigurationService.defaultCulture); + } + return this.currentCulture; + } + + private loadLocale(locale: string) { + switch (locale) { + + case 'af': + import('@angular/common/locales/af').then(data => { + registerLocaleData(data.default); + }); + break; + case 'am': + import('@angular/common/locales/am').then(data => { + registerLocaleData(data.default); + }); + break; + case 'ar-SA': + import('@angular/common/locales/ar-SA').then(data => { + registerLocaleData(data.default); + });; + break; + case 'bg': + import('@angular/common/locales/bg').then(data => { + registerLocaleData(data.default); + }); + break; + case 'cs': + import('@angular/common/locales/cs').then(data => { + registerLocaleData(data.default); + }); + break; + case 'da': + import('@angular/common/locales/da').then(data => { + registerLocaleData(data.default); + }); + break; + case 'de': + import('@angular/common/locales/de').then(data => { + registerLocaleData(data.default); + }); + break; + case 'el': + import('@angular/common/locales/el').then(data => { + registerLocaleData(data.default); + }); + break; + case 'en-GB': + import('@angular/common/locales/en-GB').then(data => { + registerLocaleData(data.default); + }); + break; + case 'es-419': + import('@angular/common/locales/es-419').then(data => { + registerLocaleData(data.default); + }); + break; + case 'es': + import('@angular/common/locales/es').then(data => { + registerLocaleData(data.default); + }); + break; + case 'et': + import('@angular/common/locales/et').then(data => { + registerLocaleData(data.default); + }); + break; + case 'fa': + import('@angular/common/locales/fa').then(data => { + registerLocaleData(data.default); + }); + break; + case 'fi': + import('@angular/common/locales/fi').then(data => { + registerLocaleData(data.default); + }); + break; + case 'fil': + import('@angular/common/locales/fil').then(data => { + registerLocaleData(data.default); + }); + break; + case 'fr-CA': + import('@angular/common/locales/fr-CA').then(data => { + registerLocaleData(data.default); + }); + break; + case 'fr': + import('@angular/common/locales/fr').then(data => { + registerLocaleData(data.default); + }); + break; + case 'he': + import('@angular/common/locales/he').then(data => { + registerLocaleData(data.default); + }); + break; + case 'hi': + import('@angular/common/locales/hi').then(data => { + registerLocaleData(data.default); + }); + break; + case 'hr': + import('@angular/common/locales/hr').then(data => { + registerLocaleData(data.default); + }); + break; + case 'hu': + import('@angular/common/locales/hu').then(data => { + registerLocaleData(data.default); + }); + break; + case 'id': + import('@angular/common/locales/id').then(data => { + registerLocaleData(data.default); + }); + break; + case 'is': + import('@angular/common/locales/is').then(data => { + registerLocaleData(data.default); + }); + break; + case 'it': + import('@angular/common/locales/it').then(data => { + registerLocaleData(data.default); + }); + break; + case 'ja': + import('@angular/common/locales/ja').then(data => { + registerLocaleData(data.default); + }); + break; + case 'ko': + import('@angular/common/locales/ko').then(data => { + registerLocaleData(data.default); + }); + break; + case 'lt': + import('@angular/common/locales/lt').then(data => { + registerLocaleData(data.default); + }); + break; + case 'lv': + import('@angular/common/locales/lv').then(data => { + registerLocaleData(data.default); + }); + break; + case 'ms': + import('@angular/common/locales/ms').then(data => { + registerLocaleData(data.default); + }); + break; + case 'ne': + import('@angular/common/locales/ne').then(data => { + registerLocaleData(data.default); + }); + break; + case 'nl': + import('@angular/common/locales/nl').then(data => { + registerLocaleData(data.default); + }); + case 'no': + import('@angular/common/locales/no').then(data => { + registerLocaleData(data.default); + }); + break; + case 'pl': + import('@angular/common/locales/pl').then(data => { + registerLocaleData(data.default); + }); + break; + case 'pt': + import('@angular/common/locales/pt').then(data => { + registerLocaleData(data.default); + }); + break; + case 'pt-PT': + import('@angular/common/locales/pt-PT').then(data => { + registerLocaleData(data.default); + }); + break; + case 'ro': + import('@angular/common/locales/ro').then(data => { + registerLocaleData(data.default); + }); + break; + case 'ru': + import('@angular/common/locales/ru').then(data => { + registerLocaleData(data.default); + }); + break; + case 'sk': + import('@angular/common/locales/sk').then(data => { + registerLocaleData(data.default); + }); + break; + case 'sl': + import('@angular/common/locales/sl').then(data => { + registerLocaleData(data.default); + }); + break; + case 'sv': + import('@angular/common/locales/sv').then(data => { + registerLocaleData(data.default); + }); + break; + case 'sw-KE': + import('@angular/common/locales/sw-KE').then(data => { + registerLocaleData(data.default); + }); + break; + case 'sw': + import('@angular/common/locales/sw').then(data => { + registerLocaleData(data.default); + }); + break; + case 'th': + import('@angular/common/locales/th').then(data => { + registerLocaleData(data.default); + }); + break; + case 'tr': + import('@angular/common/locales/tr').then(data => { + registerLocaleData(data.default); + }); + break; + case 'uk': + import('@angular/common/locales/uk').then(data => { + registerLocaleData(data.default); + }); + break; + case 'vi': + import('@angular/common/locales/vi').then(data => { + registerLocaleData(data.default); + }); + break; + case 'zh': + import('@angular/common/locales/zh').then(data => { + registerLocaleData(data.default); + }); + break; + default: + import('@angular/common/locales/en').then(data => { + registerLocaleData(data.default); + }); + break; + } } } diff --git a/dmp-frontend/src/app/core/services/default-user-locale/default-user-locale.service.ts b/dmp-frontend/src/app/core/services/default-user-locale/default-user-locale.service.ts index a0e9130d0..cabfd8e1b 100644 --- a/dmp-frontend/src/app/core/services/default-user-locale/default-user-locale.service.ts +++ b/dmp-frontend/src/app/core/services/default-user-locale/default-user-locale.service.ts @@ -1,41 +1,40 @@ import { Injectable } from '@angular/core'; +import { TimezoneInfoDisplayPipe } from '@app/core/pipes/timezone-info-display.pipe'; +import { DefaultUserLocaleCultureLookup, DefaultUserLocaleTimezoneLookup } from '@app/core/query/default-user-locale.lookup'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; +import moment from 'moment'; import { Observable, of } from 'rxjs'; import { map } from 'rxjs/operators'; -import moment from 'moment'; -import { DefaultUserLocaleCultureLookup, DefaultUserLocaleTimezoneLookup } from '@app/core/query/default-user-locale.lookup'; -import { TimezoneInfoDisplayPipe } from '@app/core/pipes/timezone-info-display.pipe'; -import { CultureInfo } from '@app/core/model/culture-info'; -import { CultureService } from '../culture/culture-service'; +import { CultureInfo, CultureService } from '../culture/culture-service'; @Injectable() export class DefaultUserLocaleService { constructor( - private timezoneInfoDisplayPipe: TimezoneInfoDisplayPipe, - private cultureService: CultureService - ) { } + private timezoneInfoDisplayPipe: TimezoneInfoDisplayPipe, + private cultureService: CultureService + ) { } queryTimezone(q: DefaultUserLocaleTimezoneLookup): Observable { - let timezones = of(moment.tz.names().sort((x, y) => x.localeCompare(y))); + let timezones = of(moment.tz.names().sort((x, y) => x.localeCompare(y))); - if (q.like) { + if (q.like) { let likeValue = q.like.toLowerCase(); - timezones = timezones.pipe(map((items: string[]) => { - let filteredItems: string[] = items.filter(i => this.timezoneInfoDisplayPipe.transform(i).toLowerCase().includes(likeValue)); - if (filteredItems != null && filteredItems?.length > 0) return filteredItems; - else return null; - })); - } + timezones = timezones.pipe(map((items: string[]) => { + let filteredItems: string[] = items.filter(i => this.timezoneInfoDisplayPipe.transform(i).toLowerCase().includes(likeValue)); + if (filteredItems != null && filteredItems?.length > 0) return filteredItems; + else return null; + })); + } - if (q.selectedItem) { - timezones = timezones.pipe(map((items: string[]) => { - let filteredItem: string = items.find(i => i === q.selectedItem); - if (filteredItem != null) return [filteredItem]; - else return null; - })); - } + if (q.selectedItem) { + timezones = timezones.pipe(map((items: string[]) => { + let filteredItem: string = items.find(i => i === q.selectedItem); + if (filteredItem != null) return [filteredItem]; + else return null; + })); + } return timezones; } @@ -45,35 +44,35 @@ export class DefaultUserLocaleService { if (q.like) { let likeValue = q.like.toLowerCase(); - cultures = cultures.pipe(map((items: CultureInfo[]) => { - let filteredItems = items.filter(i => { - const displayValue = `${i?.displayName} - ${i?.nativeName}`; + cultures = cultures.pipe(map((items: CultureInfo[]) => { + let filteredItems = items.filter(i => { + const displayValue = `${i?.displayName} - ${i?.name}`; if (displayValue.toLowerCase().includes(likeValue)) { return true; } else { return false; } }); - if (filteredItems != null && filteredItems?.length > 0) return filteredItems; - else return null; - })); - } + if (filteredItems != null && filteredItems?.length > 0) return filteredItems; + else return null; + })); + } if (q.selectedItem) { let selectedItemValue = q.selectedItem.toLowerCase(); cultures = cultures.pipe(map((items: CultureInfo[]) => { - let selected = items.find(i => { + let selected = items.find(i => { if (i.name.toLowerCase().includes(selectedItemValue)) { return true; } else { return false; } }); - if (selected != null) { - return [selected]; + if (selected != null) { + return [selected]; } - else return null; - })); + else return null; + })); } return cultures; @@ -85,32 +84,32 @@ export class DefaultUserLocaleService { // singleTimezoneAutocompleteConfiguration: SingleAutoCompleteConfiguration = { initialItems: (data?: any) => this.queryTimezone(this.buildTimezoneAutocompleteLookup(null)), - filterFn: (searchQuery: string, data?: any) => this.queryTimezone(this.buildTimezoneAutocompleteLookup(searchQuery)), - getSelectedItem: (selectedItem: string) => this.queryTimezone(this.buildTimezoneAutocompleteLookup(null, selectedItem)), - displayFn: (item: string) => this.getTimezoneDisplayFn(item), - titleFn: (item: string) => this.timezoneInfoDisplayPipe.transform(item), - valueAssign: (item: string) => item, + filterFn: (searchQuery: string, data?: any) => this.queryTimezone(this.buildTimezoneAutocompleteLookup(searchQuery)), + getSelectedItem: (selectedItem: string) => this.queryTimezone(this.buildTimezoneAutocompleteLookup(null, selectedItem)), + displayFn: (item: string) => this.getTimezoneDisplayFn(item), + titleFn: (item: string) => this.timezoneInfoDisplayPipe.transform(item), + valueAssign: (item: string) => item, }; private buildTimezoneAutocompleteLookup(like?: string, selectedItem?: string): DefaultUserLocaleTimezoneLookup { const lookup: DefaultUserLocaleTimezoneLookup = new DefaultUserLocaleTimezoneLookup(); lookup.page = { size: 100, offset: 0 }; if (like) { lookup.like = like; } - if (selectedItem) { lookup.selectedItem = selectedItem } + if (selectedItem) { lookup.selectedItem = selectedItem } return lookup; } - + getTimezoneDisplayFn(value: any) { return Array.isArray(value) ? this.timezoneInfoDisplayPipe.transform(value[0]) : this.timezoneInfoDisplayPipe.transform(value); } - + singleCultureAutocompleteConfiguration: SingleAutoCompleteConfiguration = { initialItems: (data?: any) => this.queryCulture(this.buildCultureAutocompleteLookup(null)), filterFn: (searchQuery: string, data?: any) => this.queryCulture(this.buildCultureAutocompleteLookup(searchQuery)), - getSelectedItem: (selectedItem: string) =>this.queryCulture(this.buildCultureAutocompleteLookup(null, selectedItem)), - displayFn: (item: any) => this.getCultureDisplayFn(item), - titleFn: (item: CultureInfo) => this.getCultureTitleFn(item), + getSelectedItem: (selectedItem: string) => this.queryCulture(this.buildCultureAutocompleteLookup(null, selectedItem)), + displayFn: (item: any) => this.getCultureDisplayFn(item), + titleFn: (item: CultureInfo) => this.getCultureTitleFn(item), valueAssign: (item: CultureInfo) => item.name, }; @@ -118,12 +117,12 @@ export class DefaultUserLocaleService { const lookup: DefaultUserLocaleCultureLookup = new DefaultUserLocaleCultureLookup(); lookup.page = { size: 100, offset: 0 }; if (like) { lookup.like = like; } - if (selectedItem) { lookup.selectedItem = selectedItem } + if (selectedItem) { lookup.selectedItem = selectedItem } return lookup; } - + private getCultureTitleFn(culture: any): string { - return `${culture?.displayName} - ${culture?.nativeName}`; + return `${culture?.displayName} - ${culture?.name}`; } private getCultureDisplayFn(culture: any): string { diff --git a/dmp-frontend/src/app/core/services/router/router-utils.service.ts b/dmp-frontend/src/app/core/services/router/router-utils.service.ts new file mode 100644 index 000000000..6093c17c8 --- /dev/null +++ b/dmp-frontend/src/app/core/services/router/router-utils.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; +import { AuthService } from '../auth/auth.service'; +import { TenantHandlingService } from '../tenant/tenant-handling.service'; + +@Injectable() +export class RouterUtilsService { + + constructor( + private tenantHandlingService: TenantHandlingService, + private authService: AuthService + ) { + } + + generateUrl(url: string | string[]): string { + const tenant = this.authService.selectedTenant() ?? 'default'; + if (Array.isArray(url)) { + return this.tenantHandlingService.getUrlEnrichedWithTenantCode(url.join(''), tenant) + } else { + return this.tenantHandlingService.getUrlEnrichedWithTenantCode(url, tenant); + } + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/core/services/timezone/timezone-service.ts b/dmp-frontend/src/app/core/services/timezone/timezone-service.ts index 0c6afe5cc..b7eb1928e 100644 --- a/dmp-frontend/src/app/core/services/timezone/timezone-service.ts +++ b/dmp-frontend/src/app/core/services/timezone/timezone-service.ts @@ -38,7 +38,7 @@ export class TimezoneService { public buildDateTime(params: { time: string, - date: moment.Moment + date: moment.Moment | string }): moment.Moment { const { time, date } = params; @@ -48,7 +48,7 @@ export class TimezoneService { } const momentTime = moment.duration(time); - const momentDate = moment(date.toString()); + const momentDate = moment(date); const toReturn = moment.utc({ year: momentDate.year(), @@ -66,13 +66,16 @@ export class TimezoneService { dateTime: moment.Moment, }): { date: moment.Moment, time: string } | null { + const { dateTime } = params if (!dateTime) { return null; } - const dateTimeMoment = moment(dateTime.toString()).tz(this.getCurrentTimezone()); + + const dateTimeMoment = moment(dateTime).tz(this.getCurrentTimezone()); + const date = moment.utc({ @@ -84,9 +87,13 @@ export class TimezoneService { const hours = dateTimeMoment.hour(); const minutes = dateTimeMoment.minute(); + const hoursString = hours > 10 ? hours.toString() : `0${hours}` const minutesString = hours > 10 ? minutes.toString() : `0${minutes}` + + + return { date, time: `${hoursString}:${minutesString}:00` diff --git a/dmp-frontend/src/app/ui/admin/description-template/description-template.routing.ts b/dmp-frontend/src/app/ui/admin/description-template/description-template.routing.ts index 1b34e994d..29efdb82d 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/description-template.routing.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/description-template.routing.ts @@ -50,6 +50,9 @@ const routes: Routes = [ authContext: { permissions: [AppPermission.EditDescriptionTemplate] }, + ...BreadcrumbService.generateRouteDataConfiguration({ + skipNavigation: true + }), getFromTitleService: true, usePrefix: false, action: 'clone' diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts index 6722f125b..7ab8b30bb 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts @@ -1,6 +1,5 @@ import { CdkStep, StepperSelectionEvent } from '@angular/cdk/stepper'; -import { DatePipe } from '@angular/common'; import { Component, OnInit, QueryList, ViewChild } from '@angular/core'; import { FormArray, FormControl, FormGroup, UntypedFormArray, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; @@ -124,7 +123,6 @@ export class DescriptionTemplateEditorComponent extends BaseEditor
- @@ -36,16 +36,15 @@ -
- {{item?.label | nullifyValue}} + {{item?.label | nullifyValue}}
- {{item?.description | nullifyValue}} + {{item?.description | nullifyValue}}
@@ -93,16 +92,16 @@ more_horiz - - - - diff --git a/dmp-frontend/src/app/ui/admin/description-template/listing/description-template-listing.component.ts b/dmp-frontend/src/app/ui/admin/description-template/listing/description-template-listing.component.ts index 432fa763b..8282121c1 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/listing/description-template-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/listing/description-template-listing.component.ts @@ -17,7 +17,7 @@ import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; import { BaseListingComponent } from '@common/base/base-listing-component'; import { PipeService } from '@common/formatting/pipe.service'; -import { DataTableDateTimeFormatPipe } from '@common/formatting/pipes/date-time-format.pipe'; +import { DataTableDateTimeFormatPipe } from '@app/core/pipes/date-time-format.pipe'; import { IsActiveTypePipe } from '@common/formatting/pipes/is-active-type.pipe'; import { QueryResult } from '@common/model/query-result'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; @@ -30,6 +30,7 @@ import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { nameof } from 'ts-simple-nameof'; import { ImportDescriptionTemplateDialogComponent } from './import-description-template/import-description-template.dialog.component'; +import { RouterUtilsService } from '@app/core/services/router/router-utils.service'; @Component({ @@ -78,7 +79,8 @@ export class DescriptionTemplateListingComponent extends BaseListingComponent @@ -42,7 +42,7 @@
- {{item?.name | nullifyValue}}
@@ -93,7 +93,7 @@ more_horiz -
- @@ -40,7 +40,7 @@
- {{item?.label | nullifyValue}} + {{item?.label | nullifyValue}}
@@ -88,16 +88,16 @@ more_horiz - - - - diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts index ee631cf08..ea9ed51aa 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/listing/dmp-blueprint-listing.component.ts @@ -16,7 +16,7 @@ import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; import { BaseListingComponent } from '@common/base/base-listing-component'; import { PipeService } from '@common/formatting/pipe.service'; -import { DataTableDateTimeFormatPipe } from '@common/formatting/pipes/date-time-format.pipe'; +import { DataTableDateTimeFormatPipe } from '@app/core/pipes/date-time-format.pipe'; import { IsActiveTypePipe } from '@common/formatting/pipes/is-active-type.pipe'; import { QueryResult } from '@common/model/query-result'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; @@ -29,6 +29,7 @@ import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { nameof } from 'ts-simple-nameof'; import { ImportDmpBlueprintDialogComponent } from './import-dmp-blueprint/import-dmp-blueprint.dialog.component'; +import { RouterUtilsService } from '@app/core/services/router/router-utils.service'; @Component({ @@ -63,6 +64,7 @@ export class DmpBlueprintListingComponent extends BaseListingComponent x.id; constructor( + public routerUtils: RouterUtilsService, protected router: Router, protected route: ActivatedRoute, protected uiNotificationService: UiNotificationService, diff --git a/dmp-frontend/src/app/ui/admin/entity-locks/lock-listing.component.ts b/dmp-frontend/src/app/ui/admin/entity-locks/lock-listing.component.ts index 6f96ee9e1..939c9c4fa 100644 --- a/dmp-frontend/src/app/ui/admin/entity-locks/lock-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/entity-locks/lock-listing.component.ts @@ -6,7 +6,7 @@ import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; import { BaseListingComponent } from '@common/base/base-listing-component'; import { PipeService } from '@common/formatting/pipe.service'; -import { DataTableDateTimeFormatPipe } from '@common/formatting/pipes/date-time-format.pipe'; +import { DataTableDateTimeFormatPipe } from '@app/core/pipes/date-time-format.pipe'; import { QueryResult } from '@common/model/query-result'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/http-error-handling.service'; diff --git a/dmp-frontend/src/app/ui/admin/language/editor/language-editor.component.ts b/dmp-frontend/src/app/ui/admin/language/editor/language-editor.component.ts index d0e48e6bd..5bb3aaa94 100644 --- a/dmp-frontend/src/app/ui/admin/language/editor/language-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/language/editor/language-editor.component.ts @@ -1,16 +1,21 @@ import { Component, OnInit } from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; +import { MatCheckboxChange } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; +import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; -import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; -import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; -import { DatePipe } from '@angular/common'; import { IsActive } from '@app/core/common/enum/is-active.enum'; import { AppPermission } from '@app/core/common/enum/permission.enum'; import { Language, LanguagePersist } from '@app/core/model/language/language'; import { AuthService } from '@app/core/services/auth/auth.service'; +import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; +import { LanguageHttpService } from '@app/core/services/language/language.http.service'; +import { LockService } from '@app/core/services/lock/lock.service'; import { LoggingService } from '@app/core/services/logging/logging-service'; +import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { FileUtils } from '@app/core/services/utilities/file-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; import { BaseEditor } from '@common/base/base-editor'; @@ -21,15 +26,9 @@ import { FilterService } from '@common/modules/text-filter/filter-service'; import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; import { map, takeUntil } from 'rxjs/operators'; +import { LanguageEditorModel } from './language-editor.model'; import { LanguageEditorResolver } from './language-editor.resolver'; import { LanguageEditorService } from './language-editor.service'; -import { LanguageEditorModel } from './language-editor.model'; -import { LanguageHttpService } from '@app/core/services/language/language.http.service'; -import { MatCheckboxChange } from '@angular/material/checkbox'; -import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; -import { LockService } from '@app/core/services/lock/lock.service'; -import { Title } from '@angular/platform-browser'; -import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; @Component({ @@ -73,7 +72,6 @@ export class LanguageEditorComponent extends BaseEditor this.availableLanguageCodes = data.items, error => { this.router.navigate(['/languages']); @@ -122,7 +120,7 @@ export class LanguageEditorComponent extends BaseEditor { - this.formGroup.get('payload').patchValue(language.payload); - }, - error => { - matCheckBox.source.checked = false; - this.httpErrorHandlingService.handleBackedRequestError(error); - }); - }else{ + .pipe(takeUntil(this._destroyed)) + .subscribe(language => { + this.formGroup.get('payload').patchValue(language.payload); + }, + error => { + matCheckBox.source.checked = false; + this.httpErrorHandlingService.handleBackedRequestError(error); + }); + } else { this.formGroup.get('payload').patchValue(this.currentPayload); } } diff --git a/dmp-frontend/src/app/ui/admin/language/listing/language-listing.component.html b/dmp-frontend/src/app/ui/admin/language/listing/language-listing.component.html index c141becfb..c6f01ce25 100644 --- a/dmp-frontend/src/app/ui/admin/language/listing/language-listing.component.html +++ b/dmp-frontend/src/app/ui/admin/language/listing/language-listing.component.html @@ -8,7 +8,7 @@
@@ -39,7 +39,7 @@
- {{item?.code | nullifyValue}}
@@ -81,7 +81,7 @@ more_horiz - @@ -40,7 +40,7 @@
- {{item?.name | nullifyValue}}
@@ -83,7 +83,7 @@ more_horiz - @@ -44,7 +44,7 @@
- {{item?.name | nullifyValue}}
@@ -96,7 +96,7 @@ more_horiz - @@ -42,7 +42,7 @@
- {{item?.label | nullifyValue}}
@@ -105,7 +105,7 @@ more_horiz - @@ -42,7 +41,7 @@
- {{item?.name | nullifyValue}}
@@ -85,7 +84,7 @@ more_horiz -
.
{{'DESCRIPTION-OVERVIEW.EDITED' | translate}} : - {{description.updatedAt | dateTimeCultureFormatter: "d MMMM y"}} + {{description.updatedAt | dateTimeFormatter: "d MMMM y"}}
diff --git a/dmp-frontend/src/app/ui/description/overview/description-overview.component.ts b/dmp-frontend/src/app/ui/description/overview/description-overview.component.ts index b510b279c..8880a76b4 100644 --- a/dmp-frontend/src/app/ui/description/overview/description-overview.component.ts +++ b/dmp-frontend/src/app/ui/description/overview/description-overview.component.ts @@ -165,6 +165,7 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni this.descriptionService.getPublicSingle(publicId, this.lookupFields()) .pipe(takeUntil(this._destroyed)) .subscribe(data => { + this.breadcrumbService.addExcludedParam('public', true); this.breadcrumbService.addIdResolvedValue(data.id.toString(), data.label); this.description = data; diff --git a/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.ts b/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.ts index f9be7ebcc..c5b80b917 100644 --- a/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.ts +++ b/dmp-frontend/src/app/ui/description/start-new-description-dialog/start-new-description-dialog.component.ts @@ -1,11 +1,11 @@ -import { DatePipe } from '@angular/common'; import { Component, Inject } from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { IsActive } from '@app/core/common/enum/is-active.enum'; -import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; +import { DmpBlueprintDefinitionSection } from '@app/core/model/dmp-blueprint/dmp-blueprint'; import { Dmp } from '@app/core/model/dmp/dmp'; +import { DateTimeFormatPipe } from '@app/core/pipes/date-time-format.pipe'; import { DmpDescriptionTemplateLookup } from '@app/core/query/dmp-description-template.lookup'; import { DmpLookup } from '@app/core/query/dmp.lookup'; import { DmpService } from '@app/core/services/dmp/dmp.service'; @@ -33,7 +33,7 @@ export class StartNewDescriptionDialogComponent extends BaseComponent { filterFn: (searchQuery: string, data?: any) => this.dmpService.query(this.buildAutocompleteLookup(searchQuery)).pipe(map(x => x.items)), getSelectedItem: (selectedItem: any) => this.dmpService.query(this.buildAutocompleteLookup(null, null, [selectedItem])).pipe(map(x => x.items[0])), displayFn: (item: Dmp) => item.label, - subtitleFn: (item: Dmp) => `${this.language.instant('DASHBOARD.ADD-NEW-DATASET.OPTIONS.CREATED-AT')} ${this.datePipe.transform(item.createdAt ,'dd/MM/yyyy')}`, + subtitleFn: (item: Dmp) => `${this.language.instant('DASHBOARD.ADD-NEW-DATASET.OPTIONS.CREATED-AT')} ${this.dateTimeFormatPipe.transform(item.createdAt, 'dd/MM/yyyy')}`, titleFn: (item: Dmp) => item.label, valueAssign: (item: Dmp) => item.id, }; @@ -65,7 +65,7 @@ export class StartNewDescriptionDialogComponent extends BaseComponent { private language: TranslateService, private dmpService: DmpService, private filterService: FilterService, - private datePipe: DatePipe + private dateTimeFormatPipe: DateTimeFormatPipe ) { super(); this.formGroup = data.formGroup; diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.html b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.html index 93857b784..01ab98f4a 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.html +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.html @@ -115,7 +115,7 @@
-
-
@@ -249,7 +249,7 @@
-
diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts index d498e5379..3a71718a1 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.component.ts @@ -1,8 +1,8 @@ import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; -import { DatePipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; import { FormArray, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; +import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { DescriptionStatus } from '@app/core/common/enum/description-status'; import { DmpAccessType } from '@app/core/common/enum/dmp-access-type'; @@ -30,6 +30,7 @@ import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.servic import { DmpService } from '@app/core/services/dmp/dmp.service'; import { LockService } from '@app/core/services/lock/lock.service'; import { LoggingService } from '@app/core/services/logging/logging-service'; +import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { UserService } from '@app/core/services/user/user.service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; @@ -38,6 +39,7 @@ import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/mu import { MultipleAutoCompleteCanRemoveItem } from '@app/library/auto-complete/multiple/multiple-auto-complete.component'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; import { DescriptionTemplatePreviewDialogComponent } from '@app/ui/admin/description-template/description-template-preview/description-template-preview-dialog.component'; +import { BreadcrumbService } from '@app/ui/misc/breadcrumb/breadcrumb.service'; import { BaseEditor } from '@common/base/base-editor'; import { FormService } from '@common/forms/form-service'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; @@ -46,13 +48,11 @@ import { FilterService } from '@common/modules/text-filter/filter-service'; import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; import { map, takeUntil } from 'rxjs/operators'; +import { DmpContactPrefillDialogComponent } from '../dmp-contact-prefill-dialog/dmp-contact-prefill-dialog.component'; import { DmpEditorModel, DmpFieldIndicator } from './dmp-editor.model'; import { DmpEditorResolver } from './dmp-editor.resolver'; import { DmpEditorService } from './dmp-editor.service'; -import { Title } from '@angular/platform-browser'; -import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; -import { DmpContactPrefillDialogComponent } from '../dmp-contact-prefill-dialog/dmp-contact-prefill-dialog.component'; -import { BreadcrumbService } from '@app/ui/misc/breadcrumb/breadcrumb.service'; +import { RouterUtilsService } from '@app/core/services/router/router-utils.service'; @Component({ selector: 'app-dmp-editor', @@ -151,7 +151,6 @@ export class DmpEditorComponent extends BaseEditor implemen protected uiNotificationService: UiNotificationService, protected httpErrorHandlingService: HttpErrorHandlingService, protected filterService: FilterService, - protected datePipe: DatePipe, protected route: ActivatedRoute, protected queryParamsService: QueryParamsService, protected lockService: LockService, @@ -163,6 +162,7 @@ export class DmpEditorComponent extends BaseEditor implemen public dmpBlueprintService: DmpBlueprintService, // public visibilityRulesService: VisibilityRulesService, private languageInfoService: LanguageInfoService, + public routerUtils: RouterUtilsService, public enumUtils: EnumUtils, public descriptionTemplateService: DescriptionTemplateService, public userService: UserService, @@ -171,13 +171,13 @@ export class DmpEditorComponent extends BaseEditor implemen private analyticsService: AnalyticsService, private breadcrumbService: BreadcrumbService ) { - const descriptionLabel:string = route.snapshot.data['entity']?.label; + const descriptionLabel: string = route.snapshot.data['entity']?.label; if (descriptionLabel) { titleService.setTitle(descriptionLabel); } else { titleService.setTitle('DMP-EDITOR.TITLE-EDIT'); } - super(dialog, language, formService, router, uiNotificationService, httpErrorHandlingService, filterService, datePipe, route, queryParamsService, lockService, authService, configurationService); + super(dialog, language, formService, router, uiNotificationService, httpErrorHandlingService, filterService, route, queryParamsService, lockService, authService, configurationService); } ngOnInit(): void { @@ -200,9 +200,9 @@ export class DmpEditorComponent extends BaseEditor implemen prepareForm(data: Dmp) { try { if (data?.blueprint?.definition?.sections != null) { - data.blueprint.definition.sections = data.blueprint.definition.sections.sort((s1,s2) => s1.ordinal-s2.ordinal); - for (let i=0; i f1.ordinal-f2.ordinal); + data.blueprint.definition.sections = data.blueprint.definition.sections.sort((s1, s2) => s1.ordinal - s2.ordinal); + for (let i = 0; i < data.blueprint.definition.sections.length; i++) { + data.blueprint.definition.sections[i].fields = data.blueprint.definition.sections[i]?.fields?.sort((f1, f2) => f1.ordinal - f2.ordinal); } } this.editorModel = data ? new DmpEditorModel().fromModel(data) : new DmpEditorModel(); @@ -235,7 +235,7 @@ export class DmpEditorComponent extends BaseEditor implemen .pipe(takeUntil(this._destroyed)).subscribe( complete => { this.permissionPerSection = complete, - this.buildForm(); + this.buildForm(); }, error => this.onCallbackError(error) ); @@ -278,7 +278,7 @@ export class DmpEditorComponent extends BaseEditor implemen this.getItem(this.editorModel.id, (data: Dmp) => { this.breadcrumbService.addIdResolvedValue(data.id.toString(), data.label); this.prepareForm(data) - if (this.isNew === false && this.step===0) this.nextStep(); + if (this.isNew === false && this.step === 0) this.nextStep(); }); } @@ -301,7 +301,7 @@ export class DmpEditorComponent extends BaseEditor implemen //Transform descriptionTemplates formData.descriptionTemplates = []; for (const sectionId in (this.formGroup.get('descriptionTemplates') as UntypedFormGroup).controls) { - if (this.formGroup.get('descriptionTemplates').get(sectionId).value != undefined){ + if (this.formGroup.get('descriptionTemplates').get(sectionId).value != undefined) { formData.descriptionTemplates.push( ...(this.formGroup.get('descriptionTemplates').get(sectionId).value as Guid[]).map(x => { return { sectionId: Guid.parse(sectionId), descriptionTemplateGroupId: x } }) ); @@ -353,7 +353,7 @@ export class DmpEditorComponent extends BaseEditor implemen dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { if (result) { setTimeout(x => { - if (this.isNew) this.step = 0; + if (this.isNew) this.step = 0; else this.step = this.step > 0 ? this.step - 1 : 0; this.ngOnInit(); }); @@ -446,27 +446,27 @@ export class DmpEditorComponent extends BaseEditor implemen // selectBlueprint() { this.dmpBlueprintService.getSingle(this.formGroup.get('blueprint').value, DmpEditorResolver.blueprintLookupFields()).pipe(takeUntil(this._destroyed)) - .subscribe(data => { - this.selectedBlueprint = data; - this.buildFormAfterBlueprintSelection(); - this.nextStep(); - }, - error => this.httpErrorHandlingService.handleBackedRequestError(error)); + .subscribe(data => { + this.selectedBlueprint = data; + this.buildFormAfterBlueprintSelection(); + this.nextStep(); + }, + error => this.httpErrorHandlingService.handleBackedRequestError(error)); } selectDefaultBlueprint(): void { this.dmpBlueprintService.getSingle(this.configurationService.defaultBlueprintId, DmpEditorResolver.blueprintLookupFields()).pipe(takeUntil(this._destroyed)) - .subscribe(data => { - this.selectedBlueprint = data; - this.formGroup.get('blueprint').setValue(this.selectedBlueprint.id); + .subscribe(data => { + this.selectedBlueprint = data; + this.formGroup.get('blueprint').setValue(this.selectedBlueprint.id); - const goToNextStep: boolean = this.formGroup.get('label').valid && this.formGroup.get('description').valid; - if (goToNextStep) { - this.buildFormAfterBlueprintSelection(); - this.nextStep(); - } - }, - error => this.httpErrorHandlingService.handleBackedRequestError(error)); + const goToNextStep: boolean = this.formGroup.get('label').valid && this.formGroup.get('description').valid; + if (goToNextStep) { + this.buildFormAfterBlueprintSelection(); + this.nextStep(); + } + }, + error => this.httpErrorHandlingService.handleBackedRequestError(error)); } private buildFormAfterBlueprintSelection() { @@ -532,13 +532,13 @@ export class DmpEditorComponent extends BaseEditor implemen this.formGroup.get('properties').get('contacts').markAsDirty(); } - searchContact(contactIndex: number, field: FieldInSection): void{ + searchContact(contactIndex: number, field: FieldInSection): void { const dialogRef = this.dialog.open(DmpContactPrefillDialogComponent, { maxWidth: '700px', maxHeight: '80vh', data: { contactFormGroup: (this.formGroup.get('properties').get('contacts') as FormArray).at(contactIndex), - label: field.label + label: field.label } }); dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe((result: Dmp) => { diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.resolver.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.resolver.ts index df91b06c3..2a6b803e0 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.resolver.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor.resolver.ts @@ -125,7 +125,7 @@ export class DmpEditorResolver extends BaseEditorResolver { ]; const id = route.paramMap.get('id'); if (id != null) { - return this.descriptionService.getSingle(Guid.parse(id), fields).pipe(tap(x => this.breadcrumbService.addIdResolvedValue(x.id?.toString(), x.label)), takeUntil(this._destroyed)); + return this.descriptionService.getSingle(Guid.parse(id), fields).pipe(tap(x => this.breadcrumbService.addIdResolvedValue(id, x.label)), takeUntil(this._destroyed)); } } } diff --git a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.html b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.html index 83c71a852..bb843934f 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.html @@ -1,9 +1,9 @@
- {{'GENERAL.ACTIONS.SHOW-MORE' | translate}} + {{'GENERAL.ACTIONS.SHOW-MORE' | translate}}
open_in_new{{'DMP-LISTING.ACTIONS.EXPORT' | translate}} - add{{'DMP-LISTING.ACTIONS.ADD-DESCRIPTION-SHORT' | translate}} + add{{'DMP-LISTING.ACTIONS.ADD-DESCRIPTION-SHORT' | translate}} group_add{{'DMP-LISTING.ACTIONS.INVITE-SHORT' | translate}} filter_none{{'DMP-LISTING.ACTIONS.CLONE' | translate}} library_books{{'DMP-LISTING.ACTIONS.VIEW-VERSION' | translate}} diff --git a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts index ea38534a3..8565a32af 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts @@ -30,6 +30,7 @@ import { DmpVersionStatus } from '@app/core/common/enum/dmp-version-status'; import { DmpDeleteDialogComponent } from '../../dmp-delete-dialog/dmp-delete-dialog.component'; import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/http-error-handling.service'; +import { RouterUtilsService } from '@app/core/services/router/router-utils.service'; @Component({ selector: 'app-dmp-listing-item-component', @@ -50,6 +51,7 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { fileTransformerEntityTypeEnum = FileTransformerEntityType; constructor( + public routerUtils: RouterUtilsService, private router: Router, private dialog: MatDialog, private authentication: AuthService, diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index 1c670b78a..ea89f3cee 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -41,7 +41,7 @@
{{'DMP-OVERVIEW.EDITED' | translate}} : - {{dmp.updatedAt | dateTimeCultureFormatter: "d MMMM y"}} + {{dmp.updatedAt | dateTimeFormatter: "d MMMM y"}}
@@ -117,7 +117,7 @@
diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 2e2cef224..799e4dc49 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -52,6 +52,7 @@ import { DmpEditorResolver } from '../dmp-editor-blueprint/dmp-editor.resolver'; import { DmpFinalizeDialogComponent, DmpFinalizeDialogOutput } from '../dmp-finalize-dialog/dmp-finalize-dialog.component'; import { DmpInvitationDialogComponent } from '../invitation/dialog/dmp-invitation-dialog.component'; import { NewVersionDmpDialogComponent } from '../new-version-dialog/dmp-new-version-dialog.component'; +import { RouterUtilsService } from '@app/core/services/router/router-utils.service'; @Component({ selector: 'app-dmp-overview', @@ -87,6 +88,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { userName: string; constructor( + public routerUtils: RouterUtilsService, private route: ActivatedRoute, private router: Router, private dmpService: DmpService, @@ -170,6 +172,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.dmpService.getPublicSingle(publicId, this.lookupFields()) .pipe(takeUntil(this._destroyed)) .subscribe(data => { + this.breadcrumbService.addExcludedParam('public', true); this.breadcrumbService.addIdResolvedValue(data.id?.toString(), data.label); this.dmp = data; diff --git a/dmp-frontend/src/app/ui/misc/breadcrumb/breadcrumb.service.ts b/dmp-frontend/src/app/ui/misc/breadcrumb/breadcrumb.service.ts index 0da932625..300d8b79b 100644 --- a/dmp-frontend/src/app/ui/misc/breadcrumb/breadcrumb.service.ts +++ b/dmp-frontend/src/app/ui/misc/breadcrumb/breadcrumb.service.ts @@ -7,9 +7,11 @@ import { BehaviorSubject, Observable } from 'rxjs'; export class BreadcrumbService { //todo maybe some memory management private paramToStringDictionary: Record = {}; + private excludedParamsDictionary: Record = {}; private pathOverrideMap = new Map(); private resolvedValues$ = new BehaviorSubject>({ ...this.paramToStringDictionary }) + private excludedValues$ = new BehaviorSubject>({ ...this.excludedParamsDictionary }) public addIdResolvedValue(param: string, value: string) { @@ -21,14 +23,42 @@ export class BreadcrumbService { //todo maybe some memory management } this.paramToStringDictionary[param] = value; + // sync excludedParamsDictionary if needed + if (this.excludedParamsDictionary[param]) + { + delete this.excludedParamsDictionary[param]; + this.excludedValues$.next({ ...this.excludedParamsDictionary }) + } this.resolvedValues$.next({ ...this.paramToStringDictionary }) } + + public addExcludedParam(param: string, value: boolean) { + if (!param) { + return; + } + if (this.excludedParamsDictionary[param] === value) { // value already in dictionary + return; + } + this.excludedParamsDictionary[param] = value; + // sync paramToStringDictionary if needed + if (this.paramToStringDictionary[param]) + { + delete this.paramToStringDictionary[param]; + this.resolvedValues$.next({ ...this.paramToStringDictionary }); + } + + this.excludedValues$.next({ ...this.excludedParamsDictionary }) + } public resolvedValues(): Observable> { return this.resolvedValues$.asObservable(); } + + public excludedValues(): Observable> { + return this.excludedValues$.asObservable(); + } public addPathOverride(pathOverride: PathOverride): void { if (!pathOverride) { diff --git a/dmp-frontend/src/app/ui/misc/breadcrumb/navigation-breadcrumb.component.html b/dmp-frontend/src/app/ui/misc/breadcrumb/navigation-breadcrumb.component.html index b2e3bf841..a97074d7e 100644 --- a/dmp-frontend/src/app/ui/misc/breadcrumb/navigation-breadcrumb.component.html +++ b/dmp-frontend/src/app/ui/misc/breadcrumb/navigation-breadcrumb.component.html @@ -1,33 +1,40 @@ - + + + + + {{ item.title | translate:item.translateParams }} + + + +
+ + +
+
home diff --git a/dmp-frontend/src/app/ui/misc/breadcrumb/navigation-breadcrumb.component.ts b/dmp-frontend/src/app/ui/misc/breadcrumb/navigation-breadcrumb.component.ts index 5c70231c5..1d6929fbf 100644 --- a/dmp-frontend/src/app/ui/misc/breadcrumb/navigation-breadcrumb.component.ts +++ b/dmp-frontend/src/app/ui/misc/breadcrumb/navigation-breadcrumb.component.ts @@ -17,9 +17,9 @@ import { BreadCrumbRouteData, BreadcrumbService } from "./breadcrumb.service"; export class NavigationBreadcrumbComponent extends BaseComponent { breadCrumbs: BreadCrumbItem[] = []; - titleReferences: string[] = []; paramToStringDictionary: Record = {}; + excludedParamsDictionary: Record = {}; protected readonly HOME_SYMBOL = Symbol('home') @@ -31,6 +31,9 @@ export class NavigationBreadcrumbComponent extends BaseComponent { this.breadcrumbService.resolvedValues().pipe( tap(x => this.paramToStringDictionary = x), ), + this.breadcrumbService.excludedValues().pipe( + tap(x => this.excludedParamsDictionary = x), + ), router.events.pipe( filter(event => event instanceof NavigationEnd), map((x: NavigationEnd) => x.url?.split('?')?.[0]), @@ -42,14 +45,13 @@ export class NavigationBreadcrumbComponent extends BaseComponent { .pipe( map(() => { const routeSnapshot = this.router.routerState.snapshot.root; - const breadcrumbs = this._buildBreadCrumbs(routeSnapshot).filter(x => !!x.title && !x.hideItem); + const breadcrumbs = this._buildBreadCrumbs(routeSnapshot).filter(x => !!x.title); return breadcrumbs; }), takeUntil(this._destroyed), ) .subscribe(breadCrumbs => { this.breadCrumbs = breadCrumbs; - this.titleReferences = this.getTitleReferences(); this.cdr.markForCheck(); }); } @@ -86,29 +88,35 @@ export class NavigationBreadcrumbComponent extends BaseComponent { let path = activatedRoute.routeConfig?.path ?? '/'; // undefined path is the root path + const breadcrumbData: BreadCrumbRouteData | undefined = activatedRoute.routeConfig?.data?.[BreadcrumbService.ROUTE_DATA_KEY]; - const [title, translateParams] = this._composeBreadCrumbTitle({ - path, - breadcrumbData, - pathParams: activatedRoute.params - }); + const pathItems = path == '/' ? ['/'] : path.split('/'); + const currentItems: BreadCrumbItem[] = []; - path = this._enrichPathParamNames(path, activatedRoute.params); // somepath/:id => somepath/1239dfg123-123-123...etc + for (let pathItem of pathItems) { - const skipNavigation = activatedRoute.routeConfig?.data?.breadcrumb?.skipNavigation ?? false; - const hideItem = breadcrumbData?.hideNavigationItem ?? false + const [title, translateParams] = this._composeBreadCrumbTitle({ + path: pathItem, + breadcrumbData, + pathParams: activatedRoute.params + }); + + let pathName = this._enrichPathParamNames(pathItem, activatedRoute.params); // somepath/:id => somepath/1239dfg123-123-123...etc + + const skipNavigation = activatedRoute.routeConfig?.data?.breadcrumb?.skipNavigation ?? false; + const hideItem = (breadcrumbData?.hideNavigationItem || this.excludedParamsDictionary[pathName]) ?? false; - - const currentItem: BreadCrumbItem = { - title, - path, - translateParams, - skipNavigation, - hideItem + const currentItem: BreadCrumbItem = { + title, + path: pathName, + translateParams, + skipNavigation, + hideItem + } + currentItems.push(currentItem); } - - return [currentItem, ...this._buildBreadCrumbs(activatedRoute.firstChild)]; + return [...currentItems, ...this._buildBreadCrumbs(activatedRoute.firstChild)]; } @@ -144,14 +152,7 @@ export class NavigationBreadcrumbComponent extends BaseComponent { } - // replace whole pathParams - const paramText = Object.keys(pathParams) - .map(key => pathParams[key]) - .join('/'); - if (this.paramToStringDictionary[paramText]) { - return [this.paramToStringDictionary[paramText], null]; - } // replace path params segments const title = Object.keys(pathParams) @@ -179,10 +180,6 @@ export class NavigationBreadcrumbComponent extends BaseComponent { return path; } - - getTitleReferences(): string[] { - return this.breadCrumbs[this.breadCrumbs.length-1].title.split('/'); - } } diff --git a/dmp-frontend/src/app/ui/sidebar/sidebar.component.html b/dmp-frontend/src/app/ui/sidebar/sidebar.component.html index 8c0ec3c4f..5d46e6e61 100644 --- a/dmp-frontend/src/app/ui/sidebar/sidebar.component.html +++ b/dmp-frontend/src/app/ui/sidebar/sidebar.component.html @@ -4,12 +4,12 @@

- + {{ groupMenuRoute.icon }} person {{groupMenuRoute.title | translate}} - +
@@ -143,18 +139,17 @@
- - - - {{ timezone | timezoneInfoDisplay }} - + + {{formGroup.get('additionalInfo').get('timezone').getError('backendError').message}} + {{'COMMONS.VALIDATION.REQUIRED' | translate}} + + {{timezone | timezoneInfoDisplay}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}}
- +
{{'USER-PROFILE.SETTINGS.CULTURE' | translate}} *
@@ -162,18 +157,17 @@
- - - - {{ culture.displayName }} - {{ culture.nativeName }} - + + {{formGroup.get('additionalInfo').get('culture').getError('backendError').message}} + {{'COMMONS.VALIDATION.REQUIRED' | translate}} + + {{culture | cultureInfoDisplay}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}}
- +
{{'USER-PROFILE.SETTINGS.LANGUAGE' | translate}} *
@@ -183,7 +177,7 @@ - + {{ "GENERAL.LANGUAGES."+ language | translate }} @@ -223,4 +217,4 @@
-
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/user-profile/user-profile.component.ts b/dmp-frontend/src/app/ui/user-profile/user-profile.component.ts index d8d5f1d46..7868e9f4d 100644 --- a/dmp-frontend/src/app/ui/user-profile/user-profile.component.ts +++ b/dmp-frontend/src/app/ui/user-profile/user-profile.component.ts @@ -3,14 +3,13 @@ import { UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Validators } fr import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Params } from '@angular/router'; import { RoleOrganizationType } from '@app/core/common/enum/role-organization-type'; -import { CultureInfo } from '@app/core/model/culture-info'; import { ReferenceType } from '@app/core/model/reference-type/reference-type'; import { Reference } from '@app/core/model/reference/reference'; import { Tenant } from '@app/core/model/tenant/tenant'; import { User, UserAdditionalInfo, UserCredential, UserPersist } from '@app/core/model/user/user'; import { AuthService } from '@app/core/services/auth/auth.service'; import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; -import { CultureService } from '@app/core/services/culture/culture-service'; +import { CultureInfo, CultureService } from '@app/core/services/culture/culture-service'; import { PrincipalService } from '@app/core/services/http/principal.service'; import { LanguageService } from '@app/core/services/language/language.service'; import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; @@ -18,6 +17,7 @@ import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/serv import { ReferenceTypeService } from '@app/core/services/reference-type/reference-type.service'; import { ReferenceService } from '@app/core/services/reference/reference.service'; import { TenantHandlingService } from '@app/core/services/tenant/tenant-handling.service'; +import { TimezoneService } from '@app/core/services/timezone/timezone-service'; import { UserService } from '@app/core/services/user/user.service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; @@ -31,7 +31,6 @@ import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/http-error-handling.service'; import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; -import * as moment from 'moment-timezone'; import { Observable, of } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; import { nameof } from 'ts-simple-nameof'; @@ -52,7 +51,10 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes firstEmail: String; userLanguage: String; currentUserId: string; - cultures: Observable; + cultureValues = new Array(); + timezoneValues = new Array(); + filteredCultures = new Array(); + filteredTimezones = new Array(); timezones: Observable; editMode = false; languages = []; @@ -74,6 +76,7 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes private authService: AuthService, private language: TranslateService, private cultureService: CultureService, + private timezoneService: TimezoneService, private languageService: LanguageService, private configurationService: ConfigurationService, private uiNotificationService: UiNotificationService, @@ -111,6 +114,9 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes } ngOnInit() { + this.cultureValues = this.cultureService.getCultureValues(); + this.timezoneValues = this.timezoneService.getTimezoneValues(); + this.tenantFormGroup = this.formBuilder.group({ tenantCode: [this.authService.selectedTenant(), [Validators.required]] }); @@ -159,12 +165,7 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes this.userProfileEditorModel = new UserProfileEditorModel().fromModel(result); this.formGroup = this.userProfileEditorModel.buildForm(this.languageService.getAvailableLanguagesCodes()); - this.formGroup.get('additionalInfo').get('timezone').valueChanges - .pipe(takeUntil(this._destroyed)) - .subscribe(x => { if (x) { this.timezones = this._filterTimezone(x); } }); - this.formGroup.get('additionalInfo').get('culture').valueChanges - .pipe(takeUntil(this._destroyed)) - .subscribe(x => { if (x) { this.cultures = this._filterCulture(x); } }); + this.registerChangeListeners(); this.tenants = this.loadUserTenants(); this.unlock(); @@ -172,42 +173,29 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes })); } - ngOnDestroy(): void { + registerChangeListeners() { + + this.filteredCultures = this.cultureValues.filter((culture) => culture.name === this.userProfileEditorModel.additionalInfo.culture); + this.filteredTimezones = this.timezoneValues.filter((zone) => zone === this.userProfileEditorModel.additionalInfo.timezone); + // set change listeners + this.formGroup.get('additionalInfo').get('timezone').valueChanges + .pipe(takeUntil(this._destroyed)) + .subscribe((text) => { + const searchText = text.toLowerCase(); + const result = this.timezoneValues.filter((zone) => zone.toLowerCase().indexOf(searchText) >= 0); + this.filteredTimezones = result; + }); + + this.formGroup.get('additionalInfo').get('culture').valueChanges + .pipe(takeUntil(this._destroyed)) + .subscribe((text) => { + const searchText = text.toLowerCase(); + const result = this.cultureValues.filter((culture) => culture.name.toLowerCase().indexOf(searchText) >= 0); + this.filteredCultures = result; + }); } - public hasProvider(userCredential: UserCredential, provider: string): boolean { - const result = userCredential.data.externalProviderNames?.find(x => x == provider); - return result != null; - } - - private _filterTimezone(value: string): Observable { - if (value && typeof value === 'string') { - const filterValue = value.toLowerCase(); - return of(moment.tz.names().filter(option => option.toLowerCase().includes(filterValue))); - } else { - return of(moment.tz.names()); - } - } - - private _filterCulture(value: string): Observable { - if (value && typeof value === 'string') { - const filterValue = value.toLowerCase(); - return of(this.cultureService.getCultureValues().filter(option => option.displayName.toLowerCase().includes(filterValue))); - } else { - return of(this.cultureService.getCultureValues()); - } - } - - displayFn(culture?: CultureInfo): string | undefined { - - if (culture == null - || culture.displayName == null - || culture.nativeName == null) - return undefined; - - return culture.displayName + '-' + culture.nativeName; - } save() { this.formService.removeAllBackEndErrors(this.formGroup); @@ -375,4 +363,15 @@ export class UserProfileComponent extends BaseComponent implements OnInit, OnDes expandPreferences(): void { this.expandedPreferences = true; } + + displayCultureFn(cultureName?: string): string | undefined { + + const culture: CultureInfo = this.cultureValues?.find(x => x.name == cultureName); + if (culture == null + || culture.displayName == null) + return undefined; + + return culture.displayName + ' [' + culture.name + ']'; + } + } diff --git a/dmp-frontend/src/assets/config/config.json b/dmp-frontend/src/assets/config/config.json index 7016d43e7..24ee81afe 100644 --- a/dmp-frontend/src/assets/config/config.json +++ b/dmp-frontend/src/assets/config/config.json @@ -6,7 +6,7 @@ "Enabled": false, "Url": "localhost:5000/" }, - "defaultCulture": "en-US", + "defaultCulture": "en", "defaultBlueprintId": "86635178-36a6-484f-9057-a934e4eeecd5", "keycloak": { "enabled": true, diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 4b9d9c26c..9a10f23ee 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -2249,5 +2249,9 @@ "ACTIONS": { "CONFIRM": "Confirm" } - } + }, + + "copy": "Copy", + "clone": "Clone", + "new-version": "New Version" } diff --git a/dmp-frontend/src/assets/localization/available-cultures.json b/dmp-frontend/src/assets/localization/available-cultures.json index 102b0d38a..58f22d456 100644 --- a/dmp-frontend/src/assets/localization/available-cultures.json +++ b/dmp-frontend/src/assets/localization/available-cultures.json @@ -1,2816 +1,194 @@ -[{ - "name": "aa-DJ", - "displayName": "Qafar (Yabuuti)", - "nativeName": "Qafar (Yabuuti)" +[ + { + "name": "af", + "displayName": "Afrikaans" }, { - "name": "aa-ER", - "displayName": "Qafar (Eretria)", - "nativeName": "Qafar (Eretria)" - }, - { - "name": "aa-ET", - "displayName": "Qafar (Otobbia)", - "nativeName": "Qafar (Otobbia)" - }, - { - "name": "af-NA", - "displayName": "Afrikaans (Namibië)", - "nativeName": "Afrikaans (Namibië)" - }, - { - "name": "af-ZA", - "displayName": "Afrikaans (South Africa)", - "nativeName": "Afrikaans (Suid-Afrika)" - }, - { - "name": "agq-CM", - "displayName": "Aghem (Kàmàlûŋ)", - "nativeName": "Aghem (Kàmàlûŋ)" - }, - { - "name": "ak-GH", - "displayName": "Akan (Gaana)", - "nativeName": "Akan (Gaana)" - }, - { - "name": "am-ET", - "displayName": "Amharic (Ethiopia)", - "nativeName": "አማርኛ (ኢትዮጵያ)" - }, - { - "name": "ar-001", - "displayName": "العربية (العالم)", - "nativeName": "العربية (العالم)" - }, - { - "name": "ar-AE", - "displayName": "Arabic (United Arab Emirates)", - "nativeName": "العربية (الإمارات العربية المتحدة)" - }, - { - "name": "ar-BH", - "displayName": "Arabic (Bahrain)", - "nativeName": "العربية (البحرين)" - }, - { - "name": "ar-DJ", - "displayName": "العربية (جيبوتي)", - "nativeName": "العربية (جيبوتي)" - }, - { - "name": "ar-DZ", - "displayName": "Arabic (Algeria)", - "nativeName": "العربية (الجزائر)" - }, - { - "name": "ar-EG", - "displayName": "Arabic (Egypt)", - "nativeName": "العربية (مصر)" - }, - { - "name": "ar-ER", - "displayName": "العربية (إريتريا)", - "nativeName": "العربية (إريتريا)" - }, - { - "name": "ar-IL", - "displayName": "العربية (إسرائيل)", - "nativeName": "العربية (إسرائيل)" - }, - { - "name": "ar-IQ", - "displayName": "Arabic (Iraq)", - "nativeName": "العربية (العراق)" - }, - { - "name": "ar-JO", - "displayName": "Arabic (Jordan)", - "nativeName": "العربية (الأردن)" - }, - { - "name": "ar-KM", - "displayName": "العربية (جزر القمر)", - "nativeName": "العربية (جزر القمر)" - }, - { - "name": "ar-KW", - "displayName": "Arabic (Kuwait)", - "nativeName": "العربية (الكويت)" - }, - { - "name": "ar-LB", - "displayName": "Arabic (Lebanon)", - "nativeName": "العربية (لبنان)" - }, - { - "name": "ar-LY", - "displayName": "Arabic (Libya)", - "nativeName": "العربية (ليبيا)" - }, - { - "name": "ar-MA", - "displayName": "Arabic (Morocco)", - "nativeName": "العربية (المملكة المغربية)" - }, - { - "name": "ar-MR", - "displayName": "العربية (موريتانيا)", - "nativeName": "العربية (موريتانيا)" - }, - { - "name": "ar-OM", - "displayName": "Arabic (Oman)", - "nativeName": "العربية (عمان)" - }, - { - "name": "ar-PS", - "displayName": "العربية (السلطة الفلسطينية)", - "nativeName": "العربية (السلطة الفلسطينية)" - }, - { - "name": "ar-QA", - "displayName": "Arabic (Qatar)", - "nativeName": "العربية (قطر)" + "name": "am", + "displayName": "Amharic" }, { "name": "ar-SA", - "displayName": "Arabic (Saudi Arabia)", - "nativeName": "العربية (المملكة العربية السعودية)" + "displayName": "Arabic" }, { - "name": "ar-SD", - "displayName": "العربية (السودان)", - "nativeName": "العربية (السودان)" + "name": "bg", + "displayName": "Bulgarian" }, { - "name": "ar-SO", - "displayName": "العربية (الصومال)", - "nativeName": "العربية (الصومال)" + "name": "cs", + "displayName": "Czech" }, { - "name": "ar-SS", - "displayName": "العربية (جنوب السودان)", - "nativeName": "العربية (جنوب السودان)" + "name": "da", + "displayName": "Danish" }, { - "name": "ar-SY", - "displayName": "Arabic (Syria)", - "nativeName": "العربية (سوريا)" + "name": "de", + "displayName": "German" }, { - "name": "ar-TD", - "displayName": "العربية (تشاد)", - "nativeName": "العربية (تشاد)" - }, - { - "name": "ar-TN", - "displayName": "Arabic (Tunisia)", - "nativeName": "العربية (تونس)" - }, - { - "name": "ar-YE", - "displayName": "Arabic (Yemen)", - "nativeName": "العربية (اليمن)" - }, - { - "name": "arn-CL", - "displayName": "Mapudungun (Chile)", - "nativeName": "Mapudungun (Chile)" - }, - { - "name": "as-IN", - "displayName": "Assamese (India)", - "nativeName": "অসমীয়া (ভাৰত)" - }, - { - "name": "asa-TZ", - "displayName": "Kipare (Tadhania)", - "nativeName": "Kipare (Tadhania)" - }, - { - "name": "ast-ES", - "displayName": "asturianu (España)", - "nativeName": "asturianu (España)" - }, - { - "name": "az-Cyrl-AZ", - "displayName": "Azerbaijani (Cyrillic, Azerbaijan)", - "nativeName": "азәрбајҹан (Азәрбајҹан)" - }, - { - "name": "az-Latn-AZ", - "displayName": "Azerbaijani (Latin, Azerbaijan)", - "nativeName": "azərbaycan (Azərbaycan)" - }, - { - "name": "ba-RU", - "displayName": "Bashkir (Russia)", - "nativeName": "Башҡорт (Рәсәй)" - }, - { - "name": "bas-CM", - "displayName": "Ɓàsàa (Kàmɛ̀rûn)", - "nativeName": "Ɓàsàa (Kàmɛ̀rûn)" - }, - { - "name": "be-BY", - "displayName": "Belarusian (Belarus)", - "nativeName": "Беларуская (Беларусь)" - }, - { - "name": "bem-ZM", - "displayName": "Ichibemba (Zambia)", - "nativeName": "Ichibemba (Zambia)" - }, - { - "name": "bez-TZ", - "displayName": "Hibena (Hutanzania)", - "nativeName": "Hibena (Hutanzania)" - }, - { - "name": "bg-BG", - "displayName": "Bulgarian (Bulgaria)", - "nativeName": "български (България)" - }, - { - "name": "bin-NG", - "displayName": "Edo (Nigeria)", - "nativeName": "Ẹ̀dó (Nigeria)" - }, - { - "name": "bm-Latn-ML", - "displayName": "bamanakan (Mali)", - "nativeName": "bamanakan (Mali)" - }, - { - "name": "bn-BD", - "displayName": "Bangla (Bangladesh)", - "nativeName": "বাংলা (বাংলাদেশ)" - }, - { - "name": "bn-IN", - "displayName": "Bangla (India)", - "nativeName": "বাংলা (ভারত)" - }, - { - "name": "bo-CN", - "displayName": "Tibetan (China)", - "nativeName": "བོད་ཡིག (ཀྲུང་ཧྭ་མི་དམངས་སྤྱི་མཐུན་རྒྱལ་ཁབ།)" - }, - { - "name": "bo-IN", - "displayName": "བོད་སྐད་ (རྒྱ་གར་)", - "nativeName": "བོད་སྐད་ (རྒྱ་གར་)" - }, - { - "name": "br-FR", - "displayName": "Breton (France)", - "nativeName": "brezhoneg (Frañs)" - }, - { - "name": "brx-IN", - "displayName": "बड़ो (भारत)", - "nativeName": "बड़ो (भारत)" - }, - { - "name": "bs-Cyrl-BA", - "displayName": "Bosnian (Cyrillic, Bosnia and Herzegovina)", - "nativeName": "босански (Босна и Херцеговина)" - }, - { - "name": "bs-Latn-BA", - "displayName": "Bosnian (Latin, Bosnia and Herzegovina)", - "nativeName": "bosanski (Bosna i Hercegovina)" - }, - { - "name": "byn-ER", - "displayName": "ብሊን (ኤርትራ)", - "nativeName": "ብሊን (ኤርትራ)" - }, - { - "name": "ca-AD", - "displayName": "català (Andorra)", - "nativeName": "català (Andorra)" - }, - { - "name": "ca-ES", - "displayName": "Catalan (Catalan)", - "nativeName": "català (català)" - }, - { - "name": "ca-ES-valencia", - "displayName": "Valencian (Spain)", - "nativeName": "valencià (Espanya)" - }, - { - "name": "ca-FR", - "displayName": "català (França)", - "nativeName": "català (França)" - }, - { - "name": "ca-IT", - "displayName": "català (Itàlia)", - "nativeName": "català (Itàlia)" - }, - { - "name": "ce-RU", - "displayName": "нохчийн (Росси)", - "nativeName": "нохчийн (Росси)" - }, - { - "name": "cgg-UG", - "displayName": "Rukiga (Uganda)", - "nativeName": "Rukiga (Uganda)" - }, - { - "name": "chr-Cher-US", - "displayName": "Cherokee (Cherokee, United States)", - "nativeName": "ᏣᎳᎩ (ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ)" - }, - { - "name": "co-FR", - "displayName": "Corsican (France)", - "nativeName": "Corsu (Francia)" - }, - { - "name": "cs-CZ", - "displayName": "Czech (Czechia)", - "nativeName": "čeština (Česko)" - }, - { - "name": "cu-RU", - "displayName": "церковнослове́нскїй (рѡссі́а)", - "nativeName": "церковнослове́нскїй (рѡссі́а)" - }, - { - "name": "cy-GB", - "displayName": "Welsh (United Kingdom)", - "nativeName": "Cymraeg (Y Deyrnas Unedig)" - }, - { - "name": "da-DK", - "displayName": "Danish (Denmark)", - "nativeName": "dansk (Danmark)" - }, - { - "name": "da-GL", - "displayName": "dansk (Grønland)", - "nativeName": "dansk (Grønland)" - }, - { - "name": "dav-KE", - "displayName": "Kitaita (Kenya)", - "nativeName": "Kitaita (Kenya)" - }, - { - "name": "de-AT", - "displayName": "German (Austria)", - "nativeName": "Deutsch (Österreich)" - }, - { - "name": "de-BE", - "displayName": "Deutsch (Belgien)", - "nativeName": "Deutsch (Belgien)" - }, - { - "name": "de-CH", - "displayName": "German (Switzerland)", - "nativeName": "Deutsch (Schweiz)" - }, - { - "name": "de-DE", - "displayName": "German (Germany)", - "nativeName": "Deutsch (Deutschland)" - }, - { - "name": "de-IT", - "displayName": "Deutsch (Italien)", - "nativeName": "Deutsch (Italien)" - }, - { - "name": "de-LI", - "displayName": "German (Liechtenstein)", - "nativeName": "Deutsch (Liechtenstein)" - }, - { - "name": "de-LU", - "displayName": "German (Luxembourg)", - "nativeName": "Deutsch (Luxemburg)" - }, - { - "name": "dje-NE", - "displayName": "Zarmaciine (Nižer)", - "nativeName": "Zarmaciine (Nižer)" - }, - { - "name": "dsb-DE", - "displayName": "Lower Sorbian (Germany)", - "nativeName": "dolnoserbšćina (Nimska)" - }, - { - "name": "dua-CM", - "displayName": "duálá (Cameroun)", - "nativeName": "duálá (Cameroun)" - }, - { - "name": "dv-MV", - "displayName": "Divehi (Maldives)", - "nativeName": "ދިވެހިބަސް (ދިވެހި ރާއްޖެ)" - }, - { - "name": "dyo-SN", - "displayName": "joola (Senegal)", - "nativeName": "joola (Senegal)" - }, - { - "name": "dz-BT", - "displayName": "Dzongkha (Bhutan)", - "nativeName": "རྫོང་ཁ (འབྲུག)" - }, - { - "name": "ebu-KE", - "displayName": "Kĩembu (Kenya)", - "nativeName": "Kĩembu (Kenya)" - }, - { - "name": "ee-GH", - "displayName": "Eʋegbe (Ghana nutome)", - "nativeName": "Eʋegbe (Ghana nutome)" - }, - { - "name": "ee-TG", - "displayName": "Eʋegbe (Togo nutome)", - "nativeName": "Eʋegbe (Togo nutome)" - }, - { - "name": "el-CY", - "displayName": "Ελληνικά (Κύπρος)", - "nativeName": "Ελληνικά (Κύπρος)" - }, - { - "name": "el-GR", - "displayName": "Greek (Greece)", - "nativeName": "Ελληνικά (Ελλάδα)" - }, - { - "name": "en-001", - "displayName": "English (World)", - "nativeName": "English (World)" - }, - { - "name": "en-029", - "displayName": "English (Caribbean)", - "nativeName": "English (Caribbean)" - }, - { - "name": "en-150", - "displayName": "English (Europe)", - "nativeName": "English (Europe)" - }, - { - "name": "en-AG", - "displayName": "English (Antigua and Barbuda)", - "nativeName": "English (Antigua and Barbuda)" - }, - { - "name": "en-AI", - "displayName": "English (Anguilla)", - "nativeName": "English (Anguilla)" - }, - { - "name": "en-AS", - "displayName": "English (American Samoa)", - "nativeName": "English (American Samoa)" - }, - { - "name": "en-AT", - "displayName": "English (Austria)", - "nativeName": "English (Austria)" - }, - { - "name": "en-AU", - "displayName": "English (Australia)", - "nativeName": "English (Australia)" - }, - { - "name": "en-BB", - "displayName": "English (Barbados)", - "nativeName": "English (Barbados)" - }, - { - "name": "en-BE", - "displayName": "English (Belgium)", - "nativeName": "English (Belgium)" - }, - { - "name": "en-BI", - "displayName": "English (Burundi)", - "nativeName": "English (Burundi)" - }, - { - "name": "en-BM", - "displayName": "English (Bermuda)", - "nativeName": "English (Bermuda)" - }, - { - "name": "en-BS", - "displayName": "English (Bahamas)", - "nativeName": "English (Bahamas)" - }, - { - "name": "en-BW", - "displayName": "English (Botswana)", - "nativeName": "English (Botswana)" - }, - { - "name": "en-BZ", - "displayName": "English (Belize)", - "nativeName": "English (Belize)" - }, - { - "name": "en-CA", - "displayName": "English (Canada)", - "nativeName": "English (Canada)" - }, - { - "name": "en-CC", - "displayName": "English (Cocos (Keeling) Islands)", - "nativeName": "English (Cocos (Keeling) Islands)" - }, - { - "name": "en-CH", - "displayName": "English (Switzerland)", - "nativeName": "English (Switzerland)" - }, - { - "name": "en-CK", - "displayName": "English (Cook Islands)", - "nativeName": "English (Cook Islands)" - }, - { - "name": "en-CM", - "displayName": "English (Cameroon)", - "nativeName": "English (Cameroon)" - }, - { - "name": "en-CX", - "displayName": "English (Christmas Island)", - "nativeName": "English (Christmas Island)" - }, - { - "name": "en-CY", - "displayName": "English (Cyprus)", - "nativeName": "English (Cyprus)" - }, - { - "name": "en-DE", - "displayName": "English (Germany)", - "nativeName": "English (Germany)" - }, - { - "name": "en-DK", - "displayName": "English (Denmark)", - "nativeName": "English (Denmark)" - }, - { - "name": "en-DM", - "displayName": "English (Dominica)", - "nativeName": "English (Dominica)" - }, - { - "name": "en-ER", - "displayName": "English (Eritrea)", - "nativeName": "English (Eritrea)" - }, - { - "name": "en-FI", - "displayName": "English (Finland)", - "nativeName": "English (Finland)" - }, - { - "name": "en-FJ", - "displayName": "English (Fiji)", - "nativeName": "English (Fiji)" - }, - { - "name": "en-FK", - "displayName": "English (Falkland Islands)", - "nativeName": "English (Falkland Islands)" - }, - { - "name": "en-FM", - "displayName": "English (Micronesia)", - "nativeName": "English (Micronesia)" + "name": "el", + "displayName": "Greek" }, { "name": "en-GB", - "displayName": "English (United Kingdom)", - "nativeName": "English (United Kingdom)" + "displayName": "English (UK)" }, { - "name": "en-GD", - "displayName": "English (Grenada)", - "nativeName": "English (Grenada)" - }, - { - "name": "en-GG", - "displayName": "English (Guernsey)", - "nativeName": "English (Guernsey)" - }, - { - "name": "en-GH", - "displayName": "English (Ghana)", - "nativeName": "English (Ghana)" - }, - { - "name": "en-GI", - "displayName": "English (Gibraltar)", - "nativeName": "English (Gibraltar)" - }, - { - "name": "en-GM", - "displayName": "English (Gambia)", - "nativeName": "English (Gambia)" - }, - { - "name": "en-GU", - "displayName": "English (Guam)", - "nativeName": "English (Guam)" - }, - { - "name": "en-GY", - "displayName": "English (Guyana)", - "nativeName": "English (Guyana)" - }, - { - "name": "en-HK", - "displayName": "English (Hong Kong SAR)", - "nativeName": "English (Hong Kong SAR)" - }, - { - "name": "en-ID", - "displayName": "English (Indonesia)", - "nativeName": "English (Indonesia)" - }, - { - "name": "en-IE", - "displayName": "English (Ireland)", - "nativeName": "English (Ireland)" - }, - { - "name": "en-IL", - "displayName": "English (Israel)", - "nativeName": "English (Israel)" - }, - { - "name": "en-IM", - "displayName": "English (Isle of Man)", - "nativeName": "English (Isle of Man)" - }, - { - "name": "en-IN", - "displayName": "English (India)", - "nativeName": "English (India)" - }, - { - "name": "en-IO", - "displayName": "English (British Indian Ocean Territory)", - "nativeName": "English (British Indian Ocean Territory)" - }, - { - "name": "en-JE", - "displayName": "English (Jersey)", - "nativeName": "English (Jersey)" - }, - { - "name": "en-JM", - "displayName": "English (Jamaica)", - "nativeName": "English (Jamaica)" - }, - { - "name": "en-KE", - "displayName": "English (Kenya)", - "nativeName": "English (Kenya)" - }, - { - "name": "en-KI", - "displayName": "English (Kiribati)", - "nativeName": "English (Kiribati)" - }, - { - "name": "en-KN", - "displayName": "English (Saint Kitts and Nevis)", - "nativeName": "English (Saint Kitts and Nevis)" - }, - { - "name": "en-KY", - "displayName": "English (Cayman Islands)", - "nativeName": "English (Cayman Islands)" - }, - { - "name": "en-LC", - "displayName": "English (Saint Lucia)", - "nativeName": "English (Saint Lucia)" - }, - { - "name": "en-LR", - "displayName": "English (Liberia)", - "nativeName": "English (Liberia)" - }, - { - "name": "en-LS", - "displayName": "English (Lesotho)", - "nativeName": "English (Lesotho)" - }, - { - "name": "en-MG", - "displayName": "English (Madagascar)", - "nativeName": "English (Madagascar)" - }, - { - "name": "en-MH", - "displayName": "English (Marshall Islands)", - "nativeName": "English (Marshall Islands)" - }, - { - "name": "en-MO", - "displayName": "English (Macao SAR)", - "nativeName": "English (Macao SAR)" - }, - { - "name": "en-MP", - "displayName": "English (Northern Mariana Islands)", - "nativeName": "English (Northern Mariana Islands)" - }, - { - "name": "en-MS", - "displayName": "English (Montserrat)", - "nativeName": "English (Montserrat)" - }, - { - "name": "en-MT", - "displayName": "English (Malta)", - "nativeName": "English (Malta)" - }, - { - "name": "en-MU", - "displayName": "English (Mauritius)", - "nativeName": "English (Mauritius)" - }, - { - "name": "en-MW", - "displayName": "English (Malawi)", - "nativeName": "English (Malawi)" - }, - { - "name": "en-MY", - "displayName": "English (Malaysia)", - "nativeName": "English (Malaysia)" - }, - { - "name": "en-NA", - "displayName": "English (Namibia)", - "nativeName": "English (Namibia)" - }, - { - "name": "en-NF", - "displayName": "English (Norfolk Island)", - "nativeName": "English (Norfolk Island)" - }, - { - "name": "en-NG", - "displayName": "English (Nigeria)", - "nativeName": "English (Nigeria)" - }, - { - "name": "en-NL", - "displayName": "English (Netherlands)", - "nativeName": "English (Netherlands)" - }, - { - "name": "en-NR", - "displayName": "English (Nauru)", - "nativeName": "English (Nauru)" - }, - { - "name": "en-NU", - "displayName": "English (Niue)", - "nativeName": "English (Niue)" - }, - { - "name": "en-NZ", - "displayName": "English (New Zealand)", - "nativeName": "English (New Zealand)" - }, - { - "name": "en-PG", - "displayName": "English (Papua New Guinea)", - "nativeName": "English (Papua New Guinea)" - }, - { - "name": "en-PH", - "displayName": "English (Philippines)", - "nativeName": "English (Philippines)" - }, - { - "name": "en-PK", - "displayName": "English (Pakistan)", - "nativeName": "English (Pakistan)" - }, - { - "name": "en-PN", - "displayName": "English (Pitcairn Islands)", - "nativeName": "English (Pitcairn Islands)" - }, - { - "name": "en-PR", - "displayName": "English (Puerto Rico)", - "nativeName": "English (Puerto Rico)" - }, - { - "name": "en-PW", - "displayName": "English (Palau)", - "nativeName": "English (Palau)" - }, - { - "name": "en-RW", - "displayName": "English (Rwanda)", - "nativeName": "English (Rwanda)" - }, - { - "name": "en-SB", - "displayName": "English (Solomon Islands)", - "nativeName": "English (Solomon Islands)" - }, - { - "name": "en-SC", - "displayName": "English (Seychelles)", - "nativeName": "English (Seychelles)" - }, - { - "name": "en-SD", - "displayName": "English (Sudan)", - "nativeName": "English (Sudan)" - }, - { - "name": "en-SE", - "displayName": "English (Sweden)", - "nativeName": "English (Sweden)" - }, - { - "name": "en-SG", - "displayName": "English (Singapore)", - "nativeName": "English (Singapore)" - }, - { - "name": "en-SH", - "displayName": "English (St Helena, Ascension, Tristan da Cunha)", - "nativeName": "English (St Helena, Ascension, Tristan da Cunha)" - }, - { - "name": "en-SI", - "displayName": "English (Slovenia)", - "nativeName": "English (Slovenia)" - }, - { - "name": "en-SL", - "displayName": "English (Sierra Leone)", - "nativeName": "English (Sierra Leone)" - }, - { - "name": "en-SS", - "displayName": "English (South Sudan)", - "nativeName": "English (South Sudan)" - }, - { - "name": "en-SX", - "displayName": "English (Sint Maarten)", - "nativeName": "English (Sint Maarten)" - }, - { - "name": "en-SZ", - "displayName": "English (Swaziland)", - "nativeName": "English (Swaziland)" - }, - { - "name": "en-TC", - "displayName": "English (Turks and Caicos Islands)", - "nativeName": "English (Turks and Caicos Islands)" - }, - { - "name": "en-TK", - "displayName": "English (Tokelau)", - "nativeName": "English (Tokelau)" - }, - { - "name": "en-TO", - "displayName": "English (Tonga)", - "nativeName": "English (Tonga)" - }, - { - "name": "en-TT", - "displayName": "English (Trinidad and Tobago)", - "nativeName": "English (Trinidad and Tobago)" - }, - { - "name": "en-TV", - "displayName": "English (Tuvalu)", - "nativeName": "English (Tuvalu)" - }, - { - "name": "en-TZ", - "displayName": "English (Tanzania)", - "nativeName": "English (Tanzania)" - }, - { - "name": "en-UG", - "displayName": "English (Uganda)", - "nativeName": "English (Uganda)" - }, - { - "name": "en-UM", - "displayName": "English (U.S. Outlying Islands)", - "nativeName": "English (U.S. Outlying Islands)" - }, - { - "name": "en-US", - "displayName": "English (United States)", - "nativeName": "English (United States)" - }, - { - "name": "en-VC", - "displayName": "English (Saint Vincent and the Grenadines)", - "nativeName": "English (Saint Vincent and the Grenadines)" - }, - { - "name": "en-VG", - "displayName": "English (British Virgin Islands)", - "nativeName": "English (British Virgin Islands)" - }, - { - "name": "en-VI", - "displayName": "English (U.S. Virgin Islands)", - "nativeName": "English (U.S. Virgin Islands)" - }, - { - "name": "en-VU", - "displayName": "English (Vanuatu)", - "nativeName": "English (Vanuatu)" - }, - { - "name": "en-WS", - "displayName": "English (Samoa)", - "nativeName": "English (Samoa)" - }, - { - "name": "en-ZA", - "displayName": "English (South Africa)", - "nativeName": "English (South Africa)" - }, - { - "name": "en-ZM", - "displayName": "English (Zambia)", - "nativeName": "English (Zambia)" - }, - { - "name": "en-ZW", - "displayName": "English (Zimbabwe)", - "nativeName": "English (Zimbabwe)" - }, - { - "name": "eo-001", - "displayName": "esperanto (World)", - "nativeName": "esperanto (World)" + "name": "en", + "displayName": "English (US)" }, { "name": "es-419", - "displayName": "Spanish (Latin America)", - "nativeName": "español (Latinoamérica)" - }, - { - "name": "es-AR", - "displayName": "Spanish (Argentina)", - "nativeName": "español (Argentina)" - }, - { - "name": "es-BO", - "displayName": "Spanish (Bolivia)", - "nativeName": "español (Bolivia)" - }, - { - "name": "es-BR", - "displayName": "español (Brasil)", - "nativeName": "español (Brasil)" - }, - { - "name": "es-BZ", - "displayName": "español (Belice)", - "nativeName": "español (Belice)" - }, - { - "name": "es-CL", - "displayName": "Spanish (Chile)", - "nativeName": "español (Chile)" - }, - { - "name": "es-CO", - "displayName": "Spanish (Colombia)", - "nativeName": "español (Colombia)" - }, - { - "name": "es-CR", - "displayName": "Spanish (Costa Rica)", - "nativeName": "español (Costa Rica)" - }, - { - "name": "es-CU", - "displayName": "Spanish (Cuba)", - "nativeName": "español (Cuba)" - }, - { - "name": "es-DO", - "displayName": "Spanish (Dominican Republic)", - "nativeName": "español (República Dominicana)" - }, - { - "name": "es-EC", - "displayName": "Spanish (Ecuador)", - "nativeName": "español (Ecuador)" + "displayName": "Spanish (Latin America)" }, { "name": "es-ES", - "displayName": "Spanish (Spain, International Sort)", - "nativeName": "español (España, alfabetización internacional)" - }, - { - "name": "es-GQ", - "displayName": "español (Guinea Ecuatorial)", - "nativeName": "español (Guinea Ecuatorial)" - }, - { - "name": "es-GT", - "displayName": "Spanish (Guatemala)", - "nativeName": "español (Guatemala)" - }, - { - "name": "es-HN", - "displayName": "Spanish (Honduras)", - "nativeName": "español (Honduras)" - }, - { - "name": "es-MX", - "displayName": "Spanish (Mexico)", - "nativeName": "español (México)" - }, - { - "name": "es-NI", - "displayName": "Spanish (Nicaragua)", - "nativeName": "español (Nicaragua)" - }, - { - "name": "es-PA", - "displayName": "Spanish (Panama)", - "nativeName": "español (Panamá)" - }, - { - "name": "es-PE", - "displayName": "Spanish (Peru)", - "nativeName": "español (Perú)" - }, - { - "name": "es-PH", - "displayName": "español (Filipinas)", - "nativeName": "español (Filipinas)" - }, - { - "name": "es-PR", - "displayName": "Spanish (Puerto Rico)", - "nativeName": "español (Puerto Rico)" - }, - { - "name": "es-PY", - "displayName": "Spanish (Paraguay)", - "nativeName": "español (Paraguay)" - }, - { - "name": "es-SV", - "displayName": "Spanish (El Salvador)", - "nativeName": "español (El Salvador)" - }, - { - "name": "es-US", - "displayName": "Spanish (United States)", - "nativeName": "español (Estados Unidos)" - }, - { - "name": "es-UY", - "displayName": "Spanish (Uruguay)", - "nativeName": "español (Uruguay)" - }, - { - "name": "es-VE", - "displayName": "Spanish (Venezuela)", - "nativeName": "español (Venezuela)" + "displayName": "Spanish (Spain)" }, { "name": "et-EE", - "displayName": "Estonian (Estonia)", - "nativeName": "eesti (Eesti)" - }, - { - "name": "eu-ES", - "displayName": "Basque (Basque)", - "nativeName": "euskara (euskara)" - }, - { - "name": "ewo-CM", - "displayName": "ewondo (Kamərún)", - "nativeName": "ewondo (Kamərún)" + "displayName": "Estonian" }, { "name": "fa-IR", - "displayName": "Persian (Iran)", - "nativeName": "فارسى (ایران)" - }, - { - "name": "ff-CM", - "displayName": "Pulaar (Kameruun)", - "nativeName": "Pulaar (Kameruun)" - }, - { - "name": "ff-GN", - "displayName": "Pulaar (Gine)", - "nativeName": "Pulaar (Gine)" - }, - { - "name": "ff-Latn-SN", - "displayName": "Fulah (Latin, Senegal)", - "nativeName": "Fulah (Sénégal)" - }, - { - "name": "ff-MR", - "displayName": "Pulaar (Muritani)", - "nativeName": "Pulaar (Muritani)" - }, - { - "name": "ff-NG", - "displayName": "Fulah (Nigeria)", - "nativeName": "Pulaar (Nigeria)" + "displayName": "Persian" }, { "name": "fi-FI", - "displayName": "Finnish (Finland)", - "nativeName": "suomi (Suomi)" + "displayName": "Finnish" }, { "name": "fil-PH", - "displayName": "Filipino (Philippines)", - "nativeName": "Filipino (Pilipinas)" - }, - { - "name": "fo-DK", - "displayName": "føroyskt (Danmark)", - "nativeName": "føroyskt (Danmark)" - }, - { - "name": "fo-FO", - "displayName": "Faroese (Faroe Islands)", - "nativeName": "føroyskt (Føroyar)" - }, - { - "name": "fr-029", - "displayName": "French (Caribbean)", - "nativeName": "français (caraïbes)" - }, - { - "name": "fr-BE", - "displayName": "French (Belgium)", - "nativeName": "français (Belgique)" - }, - { - "name": "fr-BF", - "displayName": "français (Burkina Faso)", - "nativeName": "français (Burkina Faso)" - }, - { - "name": "fr-BI", - "displayName": "français (Burundi)", - "nativeName": "français (Burundi)" - }, - { - "name": "fr-BJ", - "displayName": "français (Bénin)", - "nativeName": "français (Bénin)" - }, - { - "name": "fr-BL", - "displayName": "français (Saint-Barthélemy)", - "nativeName": "français (Saint-Barthélemy)" + "displayName": "Filipino" }, { "name": "fr-CA", - "displayName": "French (Canada)", - "nativeName": "français (Canada)" + "displayName": "French (Canada)" }, { - "name": "fr-CD", - "displayName": "French Congo (DRC)", - "nativeName": "français (Congo, République démocratique du)" + "name": "fr", + "displayName": "French (France)" }, { - "name": "fr-CF", - "displayName": "français (République centrafricaine)", - "nativeName": "français (République centrafricaine)" + "name": "he", + "displayName": "Hebrew" }, { - "name": "fr-CG", - "displayName": "français (Congo)", - "nativeName": "français (Congo)" + "name": "hi", + "displayName": "Hindi" }, { - "name": "fr-CH", - "displayName": "French (Switzerland)", - "nativeName": "français (Suisse)" + "name": "hr", + "displayName": "Croatian" }, { - "name": "fr-CI", - "displayName": "French (Côte d’Ivoire)", - "nativeName": "français (Côte d’Ivoire)" + "name": "hu", + "displayName": "Hungarian" }, { - "name": "fr-CM", - "displayName": "French (Cameroon)", - "nativeName": "français (Cameroun)" + "name": "id", + "displayName": "Indonesian" }, { - "name": "fr-DJ", - "displayName": "français (Djibouti)", - "nativeName": "français (Djibouti)" + "name": "is", + "displayName": "Icelandic" }, { - "name": "fr-DZ", - "displayName": "français (Algérie)", - "nativeName": "français (Algérie)" + "name": "it", + "displayName": "Italian" }, { - "name": "fr-FR", - "displayName": "French (France)", - "nativeName": "français (France)" + "name": "ja", + "displayName": "Japanese" }, { - "name": "fr-GA", - "displayName": "français (Gabon)", - "nativeName": "français (Gabon)" + "name": "ko", + "displayName": "Korean" }, { - "name": "fr-GF", - "displayName": "français (Guyane française)", - "nativeName": "français (Guyane française)" + "name": "lt", + "displayName": "Lithuanian" }, { - "name": "fr-GN", - "displayName": "français (Guinée)", - "nativeName": "français (Guinée)" + "name": "lv", + "displayName": "Latvian" }, { - "name": "fr-GP", - "displayName": "français (Guadeloupe)", - "nativeName": "français (Guadeloupe)" + "name": "ms", + "displayName": "Malay" }, { - "name": "fr-GQ", - "displayName": "français (Guinée équatoriale)", - "nativeName": "français (Guinée équatoriale)" + "name": "ne", + "displayName": "Nepali" }, { - "name": "fr-HT", - "displayName": "French (Haiti)", - "nativeName": "français (Haïti)" + "name": "nl", + "displayName": "Dutch" }, { - "name": "fr-KM", - "displayName": "français (Comores)", - "nativeName": "français (Comores)" + "name": "no", + "displayName": "Norwegian Bokmål" }, { - "name": "fr-LU", - "displayName": "French (Luxembourg)", - "nativeName": "français (Luxembourg)" + "name": "pl", + "displayName": "Polish" }, { - "name": "fr-MA", - "displayName": "French (Morocco)", - "nativeName": "français (Maroc)" - }, - { - "name": "fr-MC", - "displayName": "French (Monaco)", - "nativeName": "français (Monaco)" - }, - { - "name": "fr-MF", - "displayName": "français (Saint-Martin)", - "nativeName": "français (Saint-Martin)" - }, - { - "name": "fr-MG", - "displayName": "français (Madagascar)", - "nativeName": "français (Madagascar)" - }, - { - "name": "fr-ML", - "displayName": "French (Mali)", - "nativeName": "français (Mali)" - }, - { - "name": "fr-MQ", - "displayName": "français (Martinique)", - "nativeName": "français (Martinique)" - }, - { - "name": "fr-MR", - "displayName": "français (Mauritanie)", - "nativeName": "français (Mauritanie)" - }, - { - "name": "fr-MU", - "displayName": "français (Maurice)", - "nativeName": "français (Maurice)" - }, - { - "name": "fr-NC", - "displayName": "français (Nouvelle-Calédonie)", - "nativeName": "français (Nouvelle-Calédonie)" - }, - { - "name": "fr-NE", - "displayName": "français (Niger)", - "nativeName": "français (Niger)" - }, - { - "name": "fr-PF", - "displayName": "français (Polynésie française)", - "nativeName": "français (Polynésie française)" - }, - { - "name": "fr-PM", - "displayName": "français (Saint-Pierre-et-Miquelon)", - "nativeName": "français (Saint-Pierre-et-Miquelon)" - }, - { - "name": "fr-RE", - "displayName": "French (Réunion)", - "nativeName": "français (La Réunion)" - }, - { - "name": "fr-RW", - "displayName": "français (Rwanda)", - "nativeName": "français (Rwanda)" - }, - { - "name": "fr-SC", - "displayName": "français (Seychelles)", - "nativeName": "français (Seychelles)" - }, - { - "name": "fr-SN", - "displayName": "French (Senegal)", - "nativeName": "français (Sénégal)" - }, - { - "name": "fr-SY", - "displayName": "français (Syrie)", - "nativeName": "français (Syrie)" - }, - { - "name": "fr-TD", - "displayName": "français (Tchad)", - "nativeName": "français (Tchad)" - }, - { - "name": "fr-TG", - "displayName": "français (Togo)", - "nativeName": "français (Togo)" - }, - { - "name": "fr-TN", - "displayName": "français (Tunisie)", - "nativeName": "français (Tunisie)" - }, - { - "name": "fr-VU", - "displayName": "français (Vanuatu)", - "nativeName": "français (Vanuatu)" - }, - { - "name": "fr-WF", - "displayName": "français (Wallis-et-Futuna)", - "nativeName": "français (Wallis-et-Futuna)" - }, - { - "name": "fr-YT", - "displayName": "français (Mayotte)", - "nativeName": "français (Mayotte)" - }, - { - "name": "fur-IT", - "displayName": "furlan (Italie)", - "nativeName": "furlan (Italie)" - }, - { - "name": "fy-NL", - "displayName": "Western Frisian (Netherlands)", - "nativeName": "Frysk (Nederlân)" - }, - { - "name": "ga-IE", - "displayName": "Irish (Ireland)", - "nativeName": "Gaeilge (Éire)" - }, - { - "name": "gd-GB", - "displayName": "Scottish Gaelic (United Kingdom)", - "nativeName": "Gàidhlig (An Rìoghachd Aonaichte)" - }, - { - "name": "gl-ES", - "displayName": "Galician (Galician)", - "nativeName": "galego (galego)" - }, - { - "name": "gn-PY", - "displayName": "Guarani (Paraguay)", - "nativeName": "Avañe’ẽ (Paraguái)" - }, - { - "name": "gsw-CH", - "displayName": "Schwiizertüütsch (Schwiiz)", - "nativeName": "Schwiizertüütsch (Schwiiz)" - }, - { - "name": "gsw-FR", - "displayName": "Alsatian (France)", - "nativeName": "Elsässisch (Frànkrisch)" - }, - { - "name": "gsw-LI", - "displayName": "Schwiizertüütsch (Liächteschtäi)", - "nativeName": "Schwiizertüütsch (Liächteschtäi)" - }, - { - "name": "gu-IN", - "displayName": "Gujarati (India)", - "nativeName": "ગુજરાતી (ભારત)" - }, - { - "name": "guz-KE", - "displayName": "Ekegusii (Kenya)", - "nativeName": "Ekegusii (Kenya)" - }, - { - "name": "gv-IM", - "displayName": "Gaelg (Ellan Vannin)", - "nativeName": "Gaelg (Ellan Vannin)" - }, - { - "name": "ha-Latn-GH", - "displayName": "Hausa (Gana)", - "nativeName": "Hausa (Gana)" - }, - { - "name": "ha-Latn-NE", - "displayName": "Hausa (Nijar)", - "nativeName": "Hausa (Nijar)" - }, - { - "name": "ha-Latn-NG", - "displayName": "Hausa (Latin, Nigeria)", - "nativeName": "Hausa (Najeriya)" - }, - { - "name": "haw-US", - "displayName": "Hawaiian (United States)", - "nativeName": "ʻŌlelo Hawaiʻi (ʻAmelika Hui Pū ʻIa)" - }, - { - "name": "he-IL", - "displayName": "Hebrew (Israel)", - "nativeName": "עברית (ישראל)" - }, - { - "name": "hi-IN", - "displayName": "Hindi (India)", - "nativeName": "हिंदी (भारत)" - }, - { - "name": "hr-BA", - "displayName": "Croatian (Bosnia and Herzegovina)", - "nativeName": "hrvatski (Bosna i Hercegovina)" - }, - { - "name": "hr-HR", - "displayName": "Croatian (Croatia)", - "nativeName": "hrvatski (Hrvatska)" - }, - { - "name": "hsb-DE", - "displayName": "Upper Sorbian (Germany)", - "nativeName": "hornjoserbšćina (Němska)" - }, - { - "name": "hu-HU", - "displayName": "Hungarian (Hungary)", - "nativeName": "magyar (Magyarország)" - }, - { - "name": "hy-AM", - "displayName": "Armenian (Armenia)", - "nativeName": "Հայերեն (Հայաստան)" - }, - { - "name": "ia-001", - "displayName": "interlingua (World)", - "nativeName": "interlingua (World)" - }, - { - "name": "ia-FR", - "displayName": "interlingua (Francia)", - "nativeName": "interlingua (Francia)" - }, - { - "name": "ibb-NG", - "displayName": "Ibibio (Nigeria)", - "nativeName": "Ibibio-Efik (Nigeria)" - }, - { - "name": "id-ID", - "displayName": "Indonesian (Indonesia)", - "nativeName": "Indonesia (Indonesia)" - }, - { - "name": "ig-NG", - "displayName": "Igbo (Nigeria)", - "nativeName": "Igbo (Nigeria)" - }, - { - "name": "ii-CN", - "displayName": "Yi (China)", - "nativeName": "ꆈꌠꁱꂷ (ꍏꉸꏓꂱꇭꉼꇩ)" - }, - { - "name": "is-IS", - "displayName": "Icelandic (Iceland)", - "nativeName": "íslenska (Ísland)" - }, - { - "name": "it-CH", - "displayName": "Italian (Switzerland)", - "nativeName": "italiano (Svizzera)" - }, - { - "name": "it-IT", - "displayName": "Italian (Italy)", - "nativeName": "italiano (Italia)" - }, - { - "name": "it-SM", - "displayName": "italiano (San Marino)", - "nativeName": "italiano (San Marino)" - }, - { - "name": "it-VA", - "displayName": "italiano (Città del Vaticano)", - "nativeName": "italiano (Città del Vaticano)" - }, - { - "name": "iu-Cans-CA", - "displayName": "Inuktitut (Syllabics, Canada)", - "nativeName": "ᐃᓄᒃᑎᑐᑦ (ᑲᓇᑕᒥ)" - }, - { - "name": "iu-Latn-CA", - "displayName": "Inuktitut (Latin, Canada)", - "nativeName": "Inuktitut (Kanatami)" - }, - { - "name": "ja-JP", - "displayName": "Japanese (Japan)", - "nativeName": "日本語 (日本)" - }, - { - "name": "jgo-CM", - "displayName": "Ndaꞌa (Kamɛlûn)", - "nativeName": "Ndaꞌa (Kamɛlûn)" - }, - { - "name": "jmc-TZ", - "displayName": "Kimachame (Tanzania)", - "nativeName": "Kimachame (Tanzania)" - }, - { - "name": "jv-Java-ID", - "displayName": "ꦧꦱꦗꦮ (Indonesia)", - "nativeName": "ꦧꦱꦗꦮ (Indonesia)" - }, - { - "name": "jv-Latn-ID", - "displayName": "Basa Jawa (Indonesia)", - "nativeName": "Basa Jawa (Indonesia)" - }, - { - "name": "ka-GE", - "displayName": "Georgian (Georgia)", - "nativeName": "ქართული (საქართველო)" - }, - { - "name": "kab-DZ", - "displayName": "Taqbaylit (Lezzayer)", - "nativeName": "Taqbaylit (Lezzayer)" - }, - { - "name": "kam-KE", - "displayName": "Kikamba (Kenya)", - "nativeName": "Kikamba (Kenya)" - }, - { - "name": "kde-TZ", - "displayName": "Chimakonde (Tanzania)", - "nativeName": "Chimakonde (Tanzania)" - }, - { - "name": "kea-CV", - "displayName": "kabuverdianu (Kabu Verdi)", - "nativeName": "kabuverdianu (Kabu Verdi)" - }, - { - "name": "khq-ML", - "displayName": "Koyra ciini (Maali)", - "nativeName": "Koyra ciini (Maali)" - }, - { - "name": "ki-KE", - "displayName": "Gikuyu (Kenya)", - "nativeName": "Gikuyu (Kenya)" - }, - { - "name": "kk-KZ", - "displayName": "Kazakh (Kazakhstan)", - "nativeName": "қазақ тілі (Қазақстан)" - }, - { - "name": "kkj-CM", - "displayName": "kakɔ (Kamɛrun)", - "nativeName": "kakɔ (Kamɛrun)" - }, - { - "name": "kl-GL", - "displayName": "Greenlandic (Greenland)", - "nativeName": "kalaallisut (Kalaallit Nunaat)" - }, - { - "name": "kln-KE", - "displayName": "Kalenjin (Emetab Kenya)", - "nativeName": "Kalenjin (Emetab Kenya)" - }, - { - "name": "km-KH", - "displayName": "Khmer (Cambodia)", - "nativeName": "ភាសាខ្មែរ (កម្ពុជា)" - }, - { - "name": "kn-IN", - "displayName": "Kannada (India)", - "nativeName": "ಕನ್ನಡ (ಭಾರತ)" - }, - { - "name": "ko-KP", - "displayName": "한국어 (조선민주주의인민공화국)", - "nativeName": "한국어 (조선민주주의인민공화국)" - }, - { - "name": "ko-KR", - "displayName": "Korean (Korea)", - "nativeName": "한국어(대한민국)" - }, - { - "name": "kok-IN", - "displayName": "Konkani (India)", - "nativeName": "कोंकणी (भारत)" - }, - { - "name": "kr-NG", - "displayName": "Kanuri (Nigeria)", - "nativeName": "Kanuri (Nigeria)" - }, - { - "name": "ks-Arab-IN", - "displayName": "کٲشُر (اَربی)", - "nativeName": "کٲشُر (اَربی)" - }, - { - "name": "ks-Deva-IN", - "displayName": "Kashmiri (Devanagari)", - "nativeName": "कॉशुर" - }, - { - "name": "ksb-TZ", - "displayName": "Kishambaa (Tanzania)", - "nativeName": "Kishambaa (Tanzania)" - }, - { - "name": "ksf-CM", - "displayName": "rikpa (kamɛrún)", - "nativeName": "rikpa (kamɛrún)" - }, - { - "name": "ksh-DE", - "displayName": "Kölsch (Doütschland)", - "nativeName": "Kölsch (Doütschland)" - }, - { - "name": "ku-Arab-IQ", - "displayName": "Central Kurdish (Iraq)", - "nativeName": "کوردیی ناوەڕاست (عێراق)" - }, - { - "name": "ku-Arab-IR", - "displayName": "کوردی (ئێران)", - "nativeName": "کوردی (ئێران)" - }, - { - "name": "kw-GB", - "displayName": "kernewek (Rywvaneth Unys)", - "nativeName": "kernewek (Rywvaneth Unys)" - }, - { - "name": "ky-KG", - "displayName": "Kyrgyz (Kyrgyzstan)", - "nativeName": "Кыргыз (Кыргызстан)" - }, - { - "name": "la-001", - "displayName": "Latin (World)", - "nativeName": "lingua latīna (World)" - }, - { - "name": "lag-TZ", - "displayName": "Kɨlaangi (Taansanía)", - "nativeName": "Kɨlaangi (Taansanía)" - }, - { - "name": "lb-LU", - "displayName": "Luxembourgish (Luxembourg)", - "nativeName": "Lëtzebuergesch (Lëtzebuerg)" - }, - { - "name": "lg-UG", - "displayName": "Luganda (Yuganda)", - "nativeName": "Luganda (Yuganda)" - }, - { - "name": "lkt-US", - "displayName": "Lakȟólʼiyapi (Mílahaŋska Tȟamákȟočhe)", - "nativeName": "Lakȟólʼiyapi (Mílahaŋska Tȟamákȟočhe)" - }, - { - "name": "ln-AO", - "displayName": "lingála (Angóla)", - "nativeName": "lingála (Angóla)" - }, - { - "name": "ln-CD", - "displayName": "lingála (Republíki ya Kongó Demokratíki)", - "nativeName": "lingála (Republíki ya Kongó Demokratíki)" - }, - { - "name": "ln-CF", - "displayName": "lingála (Repibiki ya Afríka ya Káti)", - "nativeName": "lingála (Repibiki ya Afríka ya Káti)" - }, - { - "name": "ln-CG", - "displayName": "lingála (Kongo)", - "nativeName": "lingála (Kongo)" - }, - { - "name": "lo-LA", - "displayName": "Lao (Laos)", - "nativeName": "ລາວ (ລາວ)" - }, - { - "name": "lrc-IQ", - "displayName": "لۊری شومالی (Iraq)", - "nativeName": "لۊری شومالی (Iraq)" - }, - { - "name": "lrc-IR", - "displayName": "لۊری شومالی (Iran)", - "nativeName": "لۊری شومالی (Iran)" - }, - { - "name": "lt-LT", - "displayName": "Lithuanian (Lithuania)", - "nativeName": "lietuvių (Lietuva)" - }, - { - "name": "lu-CD", - "displayName": "Tshiluba (Ditunga wa Kongu)", - "nativeName": "Tshiluba (Ditunga wa Kongu)" - }, - { - "name": "luo-KE", - "displayName": "Dholuo (Kenya)", - "nativeName": "Dholuo (Kenya)" - }, - { - "name": "luy-KE", - "displayName": "Luluhia (Kenya)", - "nativeName": "Luluhia (Kenya)" - }, - { - "name": "lv-LV", - "displayName": "Latvian (Latvia)", - "nativeName": "latviešu (Latvija)" - }, - { - "name": "mas-KE", - "displayName": "Maa (Kenya)", - "nativeName": "Maa (Kenya)" - }, - { - "name": "mas-TZ", - "displayName": "Maa (Tansania)", - "nativeName": "Maa (Tansania)" - }, - { - "name": "mer-KE", - "displayName": "Kĩmĩrũ (Kenya)", - "nativeName": "Kĩmĩrũ (Kenya)" - }, - { - "name": "mfe-MU", - "displayName": "kreol morisien (Moris)", - "nativeName": "kreol morisien (Moris)" - }, - { - "name": "mg-MG", - "displayName": "Malagasy (Madagasikara)", - "nativeName": "Malagasy (Madagasikara)" - }, - { - "name": "mgh-MZ", - "displayName": "Makua (Umozambiki)", - "nativeName": "Makua (Umozambiki)" - }, - { - "name": "mgo-CM", - "displayName": "metaʼ (Kamalun)", - "nativeName": "metaʼ (Kamalun)" - }, - { - "name": "mi-NZ", - "displayName": "Maori (New Zealand)", - "nativeName": "Reo Māori (Aotearoa)" - }, - { - "name": "mk-MK", - "displayName": "Macedonian (Macedonia, FYRO)", - "nativeName": "македонски (Република Македонија)" - }, - { - "name": "ml-IN", - "displayName": "Malayalam (India)", - "nativeName": "മലയാളം (ഇന്ത്യ)" - }, - { - "name": "mn-MN", - "displayName": "Mongolian (Mongolia)", - "nativeName": "монгол (Монгол)" - }, - { - "name": "mn-Mong-CN", - "displayName": "Mongolian (Traditional Mongolian, China)", - "nativeName": "ᠮᠣᠩᠭᠣᠤᠯ ᠬᠡᠯᠡ (ᠪᠦᠭᠦᠳᠡ ᠨᠠᠢᠷᠠᠮᠳᠠᠬᠤ ᠳᠤᠮᠳᠠᠳᠤ ᠠᠷᠠᠳ ᠣᠯᠣᠰ)" - }, - { - "name": "mn-Mong-MN", - "displayName": "Mongolian (Traditional Mongolian, Mongolia)", - "nativeName": "ᠮᠣᠩᠭᠣᠯ ᠬᠡᠯᠡ (ᠮᠣᠩᠭᠣᠯ ᠣᠯᠣᠰ)" - }, - { - "name": "mni-IN", - "displayName": "Manipuri (India)", - "nativeName": "মৈতৈলোন্ (India)" - }, - { - "name": "moh-CA", - "displayName": "Mohawk (Mohawk)", - "nativeName": "Kanien'kéha" - }, - { - "name": "mr-IN", - "displayName": "Marathi (India)", - "nativeName": "मराठी (भारत)" - }, - { - "name": "ms-BN", - "displayName": "Malay (Brunei)", - "nativeName": "Bahasa Melayu (Brunei)" - }, - { - "name": "ms-MY", - "displayName": "Malay (Malaysia)", - "nativeName": "Bahasa Melayu (Malaysia)" - }, - { - "name": "ms-SG", - "displayName": "Bahasa Melayu (Singapura)", - "nativeName": "Bahasa Melayu (Singapura)" - }, - { - "name": "mt-MT", - "displayName": "Maltese (Malta)", - "nativeName": "Malti (Malta)" - }, - { - "name": "mua-CM", - "displayName": "MUNDAŊ (kameruŋ)", - "nativeName": "MUNDAŊ (kameruŋ)" - }, - { - "name": "my-MM", - "displayName": "Burmese (Myanmar)", - "nativeName": "မြန်မာ (မြန်မာ)" - }, - { - "name": "mzn-IR", - "displayName": "مازرونی (ایران)", - "nativeName": "مازرونی (ایران)" - }, - { - "name": "naq-NA", - "displayName": "Khoekhoegowab (Namibiab)", - "nativeName": "Khoekhoegowab (Namibiab)" - }, - { - "name": "nb-NO", - "displayName": "Norwegian Bokmål (Norway)", - "nativeName": "norsk bokmål (Norge)" - }, - { - "name": "nb-SJ", - "displayName": "norsk bokmål (Svalbard og Jan Mayen)", - "nativeName": "norsk bokmål (Svalbard og Jan Mayen)" - }, - { - "name": "nd-ZW", - "displayName": "isiNdebele (Zimbabwe)", - "nativeName": "isiNdebele (Zimbabwe)" - }, - { - "name": "nds-DE", - "displayName": "Neddersass’sch (Düütschland)", - "nativeName": "Neddersass’sch (Düütschland)" - }, - { - "name": "nds-NL", - "displayName": "Neddersass’sch (Nedderlannen)", - "nativeName": "Neddersass’sch (Nedderlannen)" - }, - { - "name": "ne-IN", - "displayName": "Nepali (India)", - "nativeName": "नेपाली (भारत)" - }, - { - "name": "ne-NP", - "displayName": "Nepali (Nepal)", - "nativeName": "नेपाली (नेपाल)" - }, - { - "name": "nl-AW", - "displayName": "Nederlands (Aruba)", - "nativeName": "Nederlands (Aruba)" - }, - { - "name": "nl-BE", - "displayName": "Dutch (Belgium)", - "nativeName": "Nederlands (België)" - }, - { - "name": "nl-BQ", - "displayName": "Nederlands (Bonaire, Sint Eustatius en Saba)", - "nativeName": "Nederlands (Bonaire, Sint Eustatius en Saba)" - }, - { - "name": "nl-CW", - "displayName": "Nederlands (Curaçao)", - "nativeName": "Nederlands (Curaçao)" - }, - { - "name": "nl-NL", - "displayName": "Dutch (Netherlands)", - "nativeName": "Nederlands (Nederland)" - }, - { - "name": "nl-SR", - "displayName": "Nederlands (Suriname)", - "nativeName": "Nederlands (Suriname)" - }, - { - "name": "nl-SX", - "displayName": "Nederlands (Sint-Maarten)", - "nativeName": "Nederlands (Sint-Maarten)" - }, - { - "name": "nmg-CM", - "displayName": "Kwasio (Kamerun)", - "nativeName": "Kwasio (Kamerun)" - }, - { - "name": "nn-NO", - "displayName": "Norwegian Nynorsk (Norway)", - "nativeName": "nynorsk (Noreg)" - }, - { - "name": "nnh-CM", - "displayName": "Shwóŋò ngiembɔɔn (Kàmalûm)", - "nativeName": "Shwóŋò ngiembɔɔn (Kàmalûm)" - }, - { - "name": "nqo-GN", - "displayName": "ߒߞߏ (ߖߌ߬ߣߍ߬ ߞߊ߲ߓߍ߲)", - "nativeName": "ߒߞߏ (ߖߌ߬ߣߍ߬ ߞߊ߲ߓߍ߲)" - }, - { - "name": "nr-ZA", - "displayName": "isiNdebele (South Africa)", - "nativeName": "isiNdebele (South Africa)" - }, - { - "name": "nso-ZA", - "displayName": "Sesotho sa Leboa (South Africa)", - "nativeName": "Sesotho sa Leboa (Afrika Borwa)" - }, - { - "name": "nus-SS", - "displayName": "Thok Nath (South Sudan)", - "nativeName": "Thok Nath (South Sudan)" - }, - { - "name": "nyn-UG", - "displayName": "Runyankore (Uganda)", - "nativeName": "Runyankore (Uganda)" - }, - { - "name": "oc-FR", - "displayName": "Occitan (France)", - "nativeName": "Occitan (França)" - }, - { - "name": "om-ET", - "displayName": "Oromo (Ethiopia)", - "nativeName": "Oromoo (Itoophiyaa)" - }, - { - "name": "om-KE", - "displayName": "Oromoo (Keeniyaa)", - "nativeName": "Oromoo (Keeniyaa)" - }, - { - "name": "or-IN", - "displayName": "Odia (India)", - "nativeName": "ଓଡ଼ିଆ (ଭାରତ)" - }, - { - "name": "os-GE", - "displayName": "ирон (Гуырдзыстон)", - "nativeName": "ирон (Гуырдзыстон)" - }, - { - "name": "os-RU", - "displayName": "ирон (Уӕрӕсе)", - "nativeName": "ирон (Уӕрӕсе)" - }, - { - "name": "pa-Arab-PK", - "displayName": "Punjabi (Pakistan)", - "nativeName": "پنجابی (پاکستان)" - }, - { - "name": "pa-IN", - "displayName": "Punjabi (India)", - "nativeName": "ਪੰਜਾਬੀ (ਭਾਰਤ)" - }, - { - "name": "pap-029", - "displayName": "Papiamento (Caribbean)", - "nativeName": "Papiamentu (Caribbean)" - }, - { - "name": "pl-PL", - "displayName": "Polish (Poland)", - "nativeName": "polski (Polska)" - }, - { - "name": "prg-001", - "displayName": "prūsiskan (swītai)", - "nativeName": "prūsiskan (swītai)" - }, - { - "name": "prs-AF", - "displayName": "Dari (Afghanistan)", - "nativeName": "درى (افغانستان)" - }, - { - "name": "ps-AF", - "displayName": "Pashto (Afghanistan)", - "nativeName": "پښتو (افغانستان)" - }, - { - "name": "pt-AO", - "displayName": "português (Angola)", - "nativeName": "português (Angola)" - }, - { - "name": "pt-BR", - "displayName": "Portuguese (Brazil)", - "nativeName": "português (Brasil)" - }, - { - "name": "pt-CH", - "displayName": "português (Suíça)", - "nativeName": "português (Suíça)" - }, - { - "name": "pt-CV", - "displayName": "português (Cabo Verde)", - "nativeName": "português (Cabo Verde)" - }, - { - "name": "pt-GQ", - "displayName": "português (Guiné Equatorial)", - "nativeName": "português (Guiné Equatorial)" - }, - { - "name": "pt-GW", - "displayName": "português (Guiné-Bissau)", - "nativeName": "português (Guiné-Bissau)" - }, - { - "name": "pt-LU", - "displayName": "português (Luxemburgo)", - "nativeName": "português (Luxemburgo)" - }, - { - "name": "pt-MO", - "displayName": "português (RAE de Macau)", - "nativeName": "português (RAE de Macau)" - }, - { - "name": "pt-MZ", - "displayName": "português (Moçambique)", - "nativeName": "português (Moçambique)" + "name": "pt", + "displayName": "Portuguese (Brazil)" }, { "name": "pt-PT", - "displayName": "Portuguese (Portugal)", - "nativeName": "português (Portugal)" + "displayName": "Portuguese (Portugal)" }, { - "name": "pt-ST", - "displayName": "português (São Tomé e Príncipe)", - "nativeName": "português (São Tomé e Príncipe)" + "name": "ro", + "displayName": "Romanian" }, { - "name": "pt-TL", - "displayName": "português (Timor-Leste)", - "nativeName": "português (Timor-Leste)" + "name": "ru", + "displayName": "Russian" }, { - "name": "quc-Latn-GT", - "displayName": "K'iche' (Guatemala)", - "nativeName": "K'iche' (Guatemala)" + "name": "sk", + "displayName": "Slovak" }, { - "name": "quz-BO", - "displayName": "Quechua (Bolivia)", - "nativeName": "Runasimi (Bolivia)" + "name": "sl", + "displayName": "Slovenian" }, { - "name": "quz-EC", - "displayName": "Quichua (Ecuador)", - "nativeName": "Runasimi (Ecuador)" - }, - { - "name": "quz-PE", - "displayName": "Quechua (Peru)", - "nativeName": "Runasimi (Perú)" - }, - { - "name": "rm-CH", - "displayName": "Romansh (Switzerland)", - "nativeName": "rumantsch (Svizra)" - }, - { - "name": "rn-BI", - "displayName": "Ikirundi (Uburundi)", - "nativeName": "Ikirundi (Uburundi)" - }, - { - "name": "ro-MD", - "displayName": "Romanian (Moldova)", - "nativeName": "română (Republica Moldova)" - }, - { - "name": "ro-RO", - "displayName": "Romanian (Romania)", - "nativeName": "română (România)" - }, - { - "name": "rof-TZ", - "displayName": "Kihorombo (Tanzania)", - "nativeName": "Kihorombo (Tanzania)" - }, - { - "name": "ru-BY", - "displayName": "русский (Беларусь)", - "nativeName": "русский (Беларусь)" - }, - { - "name": "ru-KG", - "displayName": "русский (Киргизия)", - "nativeName": "русский (Киргизия)" - }, - { - "name": "ru-KZ", - "displayName": "русский (Казахстан)", - "nativeName": "русский (Казахстан)" - }, - { - "name": "ru-MD", - "displayName": "Russian (Moldova)", - "nativeName": "русский (Молдова)" - }, - { - "name": "ru-RU", - "displayName": "Russian (Russia)", - "nativeName": "русский (Россия)" - }, - { - "name": "ru-UA", - "displayName": "русский (Украина)", - "nativeName": "русский (Украина)" - }, - { - "name": "rw-RW", - "displayName": "Kinyarwanda (Rwanda)", - "nativeName": "Kinyarwanda (Rwanda)" - }, - { - "name": "rwk-TZ", - "displayName": "Kiruwa (Tanzania)", - "nativeName": "Kiruwa (Tanzania)" - }, - { - "name": "sa-IN", - "displayName": "Sanskrit (India)", - "nativeName": "संस्कृत (भारतम्)" - }, - { - "name": "sah-RU", - "displayName": "Sakha (Russia)", - "nativeName": "Саха (Россия)" - }, - { - "name": "saq-KE", - "displayName": "Kisampur (Kenya)", - "nativeName": "Kisampur (Kenya)" - }, - { - "name": "sbp-TZ", - "displayName": "Ishisangu (Tansaniya)", - "nativeName": "Ishisangu (Tansaniya)" - }, - { - "name": "sd-Arab-PK", - "displayName": "Sindhi (Pakistan)", - "nativeName": "سنڌي (پاکستان)" - }, - { - "name": "sd-Deva-IN", - "displayName": "Sindhi (Devanagari, India)", - "nativeName": "सिन्धी (India)" - }, - { - "name": "se-FI", - "displayName": "Sami, Northern (Finland)", - "nativeName": "davvisámegiella (Suopma)" - }, - { - "name": "se-NO", - "displayName": "Sami, Northern (Norway)", - "nativeName": "davvisámegiella (Norga)" - }, - { - "name": "se-SE", - "displayName": "Sami, Northern (Sweden)", - "nativeName": "davvisámegiella (Ruoŧŧa)" - }, - { - "name": "seh-MZ", - "displayName": "sena (Moçambique)", - "nativeName": "sena (Moçambique)" - }, - { - "name": "ses-ML", - "displayName": "Koyraboro senni (Maali)", - "nativeName": "Koyraboro senni (Maali)" - }, - { - "name": "sg-CF", - "displayName": "Sängö (Ködörösêse tî Bêafrîka)", - "nativeName": "Sängö (Ködörösêse tî Bêafrîka)" - }, - { - "name": "shi-Latn-MA", - "displayName": "Tashelḥiyt (lmɣrib)", - "nativeName": "Tashelḥiyt (lmɣrib)" - }, - { - "name": "shi-Tfng-MA", - "displayName": "ⵜⴰⵛⵍⵃⵉⵜ (ⵍⵎⵖⵔⵉⴱ)", - "nativeName": "ⵜⴰⵛⵍⵃⵉⵜ (ⵍⵎⵖⵔⵉⴱ)" - }, - { - "name": "si-LK", - "displayName": "Sinhala (Sri Lanka)", - "nativeName": "සිංහල (ශ්‍රී ලංකාව)" - }, - { - "name": "sk-SK", - "displayName": "Slovak (Slovakia)", - "nativeName": "slovenčina (Slovensko)" - }, - { - "name": "sl-SI", - "displayName": "Slovenian (Slovenia)", - "nativeName": "slovenščina (Slovenija)" - }, - { - "name": "sma-NO", - "displayName": "Sami, Southern (Norway)", - "nativeName": "åarjelsaemiengïele (Nöörje)" - }, - { - "name": "sma-SE", - "displayName": "Sami, Southern (Sweden)", - "nativeName": "åarjelsaemiengïele (Sveerje)" - }, - { - "name": "smj-NO", - "displayName": "Sami, Lule (Norway)", - "nativeName": "julevusámegiella (Vuodna)" - }, - { - "name": "smj-SE", - "displayName": "Sami, Lule (Sweden)", - "nativeName": "julevusámegiella (Svierik)" - }, - { - "name": "smn-FI", - "displayName": "Sami, Inari (Finland)", - "nativeName": "anarâškielâ (Suomâ)" - }, - { - "name": "sms-FI", - "displayName": "Sami, Skolt (Finland)", - "nativeName": "sää´mǩiõll (Lää´ddjânnam)" - }, - { - "name": "sn-Latn-ZW", - "displayName": "chiShona (Zimbabwe)", - "nativeName": "chiShona (Zimbabwe)" - }, - { - "name": "so-DJ", - "displayName": "Soomaali (Jabuuti)", - "nativeName": "Soomaali (Jabuuti)" - }, - { - "name": "so-ET", - "displayName": "Soomaali (Itoobiya)", - "nativeName": "Soomaali (Itoobiya)" - }, - { - "name": "so-KE", - "displayName": "Soomaali (Kiiniya)", - "nativeName": "Soomaali (Kiiniya)" - }, - { - "name": "so-SO", - "displayName": "Somali (Somalia)", - "nativeName": "Soomaali (Soomaaliya)" - }, - { - "name": "sq-AL", - "displayName": "Albanian (Albania)", - "nativeName": "shqip (Shqipëri)" - }, - { - "name": "sq-MK", - "displayName": "shqip (Republika e Maqedonisë)", - "nativeName": "shqip (Republika e Maqedonisë)" - }, - { - "name": "sq-XK", - "displayName": "shqip (Kosovë)", - "nativeName": "shqip (Kosovë)" - }, - { - "name": "sr-Cyrl-BA", - "displayName": "Serbian (Cyrillic, Bosnia and Herzegovina)", - "nativeName": "српски (Босна и Херцеговина)" - }, - { - "name": "sr-Cyrl-ME", - "displayName": "Serbian (Cyrillic, Montenegro)", - "nativeName": "српски (Црна Гора)" - }, - { - "name": "sr-Cyrl-RS", - "displayName": "Serbian (Cyrillic, Serbia)", - "nativeName": "српски (Србија)" - }, - { - "name": "sr-Cyrl-XK", - "displayName": "српски (Косово)", - "nativeName": "српски (Косово)" - }, - { - "name": "sr-Latn-BA", - "displayName": "Serbian (Latin, Bosnia and Herzegovina)", - "nativeName": "srpski (Bosna i Hercegovina)" - }, - { - "name": "sr-Latn-ME", - "displayName": "Serbian (Latin, Montenegro)", - "nativeName": "srpski (Crna Gora)" - }, - { - "name": "sr-Latn-RS", - "displayName": "Serbian (Latin, Serbia)", - "nativeName": "srpski (Srbija)" - }, - { - "name": "sr-Latn-XK", - "displayName": "srpski (Kosovo)", - "nativeName": "srpski (Kosovo)" - }, - { - "name": "ss-SZ", - "displayName": "siSwati (Swaziland)", - "nativeName": "siSwati (Swaziland)" - }, - { - "name": "ss-ZA", - "displayName": "siSwati (South Africa)", - "nativeName": "siSwati (South Africa)" - }, - { - "name": "ssy-ER", - "displayName": "Saho (Eretria)", - "nativeName": "Saho (Eretria)" - }, - { - "name": "st-LS", - "displayName": "Sesotho (Lesotho)", - "nativeName": "Sesotho (Lesotho)" - }, - { - "name": "st-ZA", - "displayName": "Sesotho (South Africa)", - "nativeName": "Sesotho (South Africa)" - }, - { - "name": "sv-AX", - "displayName": "svenska (Åland)", - "nativeName": "svenska (Åland)" - }, - { - "name": "sv-FI", - "displayName": "Swedish (Finland)", - "nativeName": "svenska (Finland)" - }, - { - "name": "sv-SE", - "displayName": "Swedish (Sweden)", - "nativeName": "svenska (Sverige)" - }, - { - "name": "sw-CD", - "displayName": "Kiswahili (Jamhuri ya Kidemokrasia ya Kongo)", - "nativeName": "Kiswahili (Jamhuri ya Kidemokrasia ya Kongo)" + "name": "sv", + "displayName": "Swedish" }, { "name": "sw-KE", - "displayName": "Kiswahili (Kenya)", - "nativeName": "Kiswahili (Kenya)" + "displayName": "Swahili (Kenya)" }, { - "name": "sw-TZ", - "displayName": "Kiswahili (Tanzania)", - "nativeName": "Kiswahili (Tanzania)" + "name": "sw", + "displayName": "Swahili (Tanzania)" }, { - "name": "sw-UG", - "displayName": "Kiswahili (Uganda)", - "nativeName": "Kiswahili (Uganda)" + "name": "th", + "displayName": "Thai" }, { - "name": "syr-SY", - "displayName": "Syriac (Syria)", - "nativeName": "ܣܘܪܝܝܐ (ܣܘܪܝܐ)" + "name": "tr", + "displayName": "Turkish" }, { - "name": "ta-IN", - "displayName": "Tamil (India)", - "nativeName": "தமிழ் (இந்தியா)" + "name": "uk", + "displayName": "Ukrainian" }, { - "name": "ta-LK", - "displayName": "Tamil (Sri Lanka)", - "nativeName": "தமிழ் (இலங்கை)" + "name": "vi", + "displayName": "Vietnamese" }, { - "name": "ta-MY", - "displayName": "தமிழ் (மலேசியா)", - "nativeName": "தமிழ் (மலேசியா)" - }, - { - "name": "ta-SG", - "displayName": "தமிழ் (சிங்கப்பூர்)", - "nativeName": "தமிழ் (சிங்கப்பூர்)" - }, - { - "name": "te-IN", - "displayName": "Telugu (India)", - "nativeName": "తెలుగు (భారత దేశం)" - }, - { - "name": "teo-KE", - "displayName": "Kiteso (Kenia)", - "nativeName": "Kiteso (Kenia)" - }, - { - "name": "teo-UG", - "displayName": "Kiteso (Uganda)", - "nativeName": "Kiteso (Uganda)" - }, - { - "name": "tg-Cyrl-TJ", - "displayName": "Tajik (Cyrillic, Tajikistan)", - "nativeName": "тоҷикӣ (Тоҷикистон)" - }, - { - "name": "th-TH", - "displayName": "Thai (Thailand)", - "nativeName": "ไทย (ไทย)" - }, - { - "name": "ti-ER", - "displayName": "Tigrinya (Eritrea)", - "nativeName": "ትግርኛ (ኤርትራ)" - }, - { - "name": "ti-ET", - "displayName": "Tigrinya (Ethiopia)", - "nativeName": "ትግርኛ (ኢትዮጵያ)" - }, - { - "name": "tig-ER", - "displayName": "ትግረ (ኤርትራ)", - "nativeName": "ትግረ (ኤርትራ)" - }, - { - "name": "tk-TM", - "displayName": "Turkmen (Turkmenistan)", - "nativeName": "Türkmen dili (Türkmenistan)" - }, - { - "name": "tn-BW", - "displayName": "Setswana (Botswana)", - "nativeName": "Setswana (Botswana)" - }, - { - "name": "tn-ZA", - "displayName": "Setswana (South Africa)", - "nativeName": "Setswana (Aforika Borwa)" - }, - { - "name": "to-TO", - "displayName": "lea fakatonga (Tonga)", - "nativeName": "lea fakatonga (Tonga)" - }, - { - "name": "tr-CY", - "displayName": "Türkçe (Kıbrıs)", - "nativeName": "Türkçe (Kıbrıs)" - }, - { - "name": "tr-TR", - "displayName": "Turkish (Turkey)", - "nativeName": "Türkçe (Türkiye)" - }, - { - "name": "ts-ZA", - "displayName": "Xitsonga (South Africa)", - "nativeName": "Xitsonga (South Africa)" - }, - { - "name": "tt-RU", - "displayName": "Tatar (Russia)", - "nativeName": "Татар (Россия)" - }, - { - "name": "twq-NE", - "displayName": "Tasawaq senni (Nižer)", - "nativeName": "Tasawaq senni (Nižer)" - }, - { - "name": "tzm-Arab-MA", - "displayName": "Central Atlas Tamazight (Arabic, Morocco)", - "nativeName": "أطلس المركزية التامازيتية (Morocco)" - }, - { - "name": "tzm-Latn-DZ", - "displayName": "Central Atlas Tamazight (Latin, Algeria)", - "nativeName": "Tamaziɣt n laṭlaṣ (Djazaïr)" - }, - { - "name": "tzm-Latn-MA", - "displayName": "Tamaziɣt n laṭlaṣ (Meṛṛuk)", - "nativeName": "Tamaziɣt n laṭlaṣ (Meṛṛuk)" - }, - { - "name": "tzm-Tfng-MA", - "displayName": "Central Atlas Tamazight (Tifinagh, Morocco)", - "nativeName": "ⵜⴰⵎⴰⵣⵉⵖⵜ (ⵍⵎⵖⵔⵉⴱ)" - }, - { - "name": "ug-CN", - "displayName": "Uyghur (China)", - "nativeName": "ئۇيغۇرچە (جۇڭخۇا خەلق جۇمھۇرىيىتى)" - }, - { - "name": "uk-UA", - "displayName": "Ukrainian (Ukraine)", - "nativeName": "українська (Україна)" - }, - { - "name": "ur-IN", - "displayName": "Urdu (India)", - "nativeName": "اردو (بھارت)" - }, - { - "name": "ur-PK", - "displayName": "Urdu (Pakistan)", - "nativeName": "اُردو (پاکستان)" - }, - { - "name": "uz-Arab-AF", - "displayName": "اوزبیک (افغانستان)", - "nativeName": "اوزبیک (افغانستان)" - }, - { - "name": "uz-Cyrl-UZ", - "displayName": "Uzbek (Cyrillic, Uzbekistan)", - "nativeName": "ўзбекча (Ўзбекистон)" - }, - { - "name": "uz-Latn-UZ", - "displayName": "Uzbek (Latin, Uzbekistan)", - "nativeName": "o‘zbek (Oʻzbekiston)" - }, - { - "name": "vai-Latn-LR", - "displayName": "Vai (Laibhiya)", - "nativeName": "Vai (Laibhiya)" - }, - { - "name": "vai-Vaii-LR", - "displayName": "ꕙꔤ (ꕞꔤꔫꕩ)", - "nativeName": "ꕙꔤ (ꕞꔤꔫꕩ)" - }, - { - "name": "ve-ZA", - "displayName": "Venda (South Africa)", - "nativeName": "Tshivenḓa (South Africa)" - }, - { - "name": "vi-VN", - "displayName": "Vietnamese (Vietnam)", - "nativeName": "Tiếng Việt (Việt Nam)" - }, - { - "name": "vo-001", - "displayName": "Volapük (World)", - "nativeName": "Volapük (World)" - }, - { - "name": "vun-TZ", - "displayName": "Kyivunjo (Tanzania)", - "nativeName": "Kyivunjo (Tanzania)" - }, - { - "name": "wae-CH", - "displayName": "Walser (Schwiz)", - "nativeName": "Walser (Schwiz)" - }, - { - "name": "wal-ET", - "displayName": "ወላይታቱ (ኢትዮጵያ)", - "nativeName": "ወላይታቱ (ኢትዮጵያ)" - }, - { - "name": "wo-SN", - "displayName": "Wolof (Senegal)", - "nativeName": "Wolof (Senegaal)" - }, - { - "name": "xh-ZA", - "displayName": "isiXhosa (South Africa)", - "nativeName": "isiXhosa (eMzantsi Afrika)" - }, - { - "name": "xog-UG", - "displayName": "Olusoga (Yuganda)", - "nativeName": "Olusoga (Yuganda)" - }, - { - "name": "yav-CM", - "displayName": "nuasue (Kemelún)", - "nativeName": "nuasue (Kemelún)" - }, - { - "name": "yi-001", - "displayName": "Yiddish (World)", - "nativeName": "ייִדיש (וועלט)" - }, - { - "name": "yo-BJ", - "displayName": "Èdè Yorùbá (Orílɛ́ède Bɛ̀nɛ̀)", - "nativeName": "Èdè Yorùbá (Orílɛ́ède Bɛ̀nɛ̀)" - }, - { - "name": "yo-NG", - "displayName": "Yoruba (Nigeria)", - "nativeName": "Èdè Yorùbá (Orílẹ́ède Nàìjíríà)" - }, - { - "name": "zgh-Tfng-MA", - "displayName": "ⵜⴰⵎⴰⵣⵉⵖⵜ (ⵍⵎⵖⵔⵉⴱ)", - "nativeName": "ⵜⴰⵎⴰⵣⵉⵖⵜ (ⵍⵎⵖⵔⵉⴱ)" - }, - { - "name": "zh-CN", - "displayName": "Chinese (Simplified, China)", - "nativeName": "中文(中国)" - }, - { - "name": "zh-Hans-HK", - "displayName": "中文 (香港特别行政区)", - "nativeName": "中文 (香港特别行政区)" - }, - { - "name": "zh-Hans-MO", - "displayName": "中文 (澳门特别行政区)", - "nativeName": "中文 (澳门特别行政区)" - }, - { - "name": "zh-HK", - "displayName": "Chinese (Traditional, Hong Kong SAR)", - "nativeName": "中文(香港特別行政區)" - }, - { - "name": "zh-MO", - "displayName": "Chinese (Traditional, Macao SAR)", - "nativeName": "中文(澳門特別行政區)" - }, - { - "name": "zh-SG", - "displayName": "Chinese (Simplified, Singapore)", - "nativeName": "中文(新加坡)" - }, - { - "name": "zh-TW", - "displayName": "Chinese (Traditional, Taiwan)", - "nativeName": "中文(台灣)" - }, - { - "name": "zu-ZA", - "displayName": "isiZulu (South Africa)", - "nativeName": "isiZulu (i-South Africa)" + "name": "zh", + "displayName": "Chinese" } -] +] \ No newline at end of file diff --git a/dmp-frontend/src/assets/resources/available-cultures.json b/dmp-frontend/src/assets/resources/available-cultures.json deleted file mode 100644 index 102b0d38a..000000000 --- a/dmp-frontend/src/assets/resources/available-cultures.json +++ /dev/null @@ -1,2816 +0,0 @@ -[{ - "name": "aa-DJ", - "displayName": "Qafar (Yabuuti)", - "nativeName": "Qafar (Yabuuti)" - }, - { - "name": "aa-ER", - "displayName": "Qafar (Eretria)", - "nativeName": "Qafar (Eretria)" - }, - { - "name": "aa-ET", - "displayName": "Qafar (Otobbia)", - "nativeName": "Qafar (Otobbia)" - }, - { - "name": "af-NA", - "displayName": "Afrikaans (Namibië)", - "nativeName": "Afrikaans (Namibië)" - }, - { - "name": "af-ZA", - "displayName": "Afrikaans (South Africa)", - "nativeName": "Afrikaans (Suid-Afrika)" - }, - { - "name": "agq-CM", - "displayName": "Aghem (Kàmàlûŋ)", - "nativeName": "Aghem (Kàmàlûŋ)" - }, - { - "name": "ak-GH", - "displayName": "Akan (Gaana)", - "nativeName": "Akan (Gaana)" - }, - { - "name": "am-ET", - "displayName": "Amharic (Ethiopia)", - "nativeName": "አማርኛ (ኢትዮጵያ)" - }, - { - "name": "ar-001", - "displayName": "العربية (العالم)", - "nativeName": "العربية (العالم)" - }, - { - "name": "ar-AE", - "displayName": "Arabic (United Arab Emirates)", - "nativeName": "العربية (الإمارات العربية المتحدة)" - }, - { - "name": "ar-BH", - "displayName": "Arabic (Bahrain)", - "nativeName": "العربية (البحرين)" - }, - { - "name": "ar-DJ", - "displayName": "العربية (جيبوتي)", - "nativeName": "العربية (جيبوتي)" - }, - { - "name": "ar-DZ", - "displayName": "Arabic (Algeria)", - "nativeName": "العربية (الجزائر)" - }, - { - "name": "ar-EG", - "displayName": "Arabic (Egypt)", - "nativeName": "العربية (مصر)" - }, - { - "name": "ar-ER", - "displayName": "العربية (إريتريا)", - "nativeName": "العربية (إريتريا)" - }, - { - "name": "ar-IL", - "displayName": "العربية (إسرائيل)", - "nativeName": "العربية (إسرائيل)" - }, - { - "name": "ar-IQ", - "displayName": "Arabic (Iraq)", - "nativeName": "العربية (العراق)" - }, - { - "name": "ar-JO", - "displayName": "Arabic (Jordan)", - "nativeName": "العربية (الأردن)" - }, - { - "name": "ar-KM", - "displayName": "العربية (جزر القمر)", - "nativeName": "العربية (جزر القمر)" - }, - { - "name": "ar-KW", - "displayName": "Arabic (Kuwait)", - "nativeName": "العربية (الكويت)" - }, - { - "name": "ar-LB", - "displayName": "Arabic (Lebanon)", - "nativeName": "العربية (لبنان)" - }, - { - "name": "ar-LY", - "displayName": "Arabic (Libya)", - "nativeName": "العربية (ليبيا)" - }, - { - "name": "ar-MA", - "displayName": "Arabic (Morocco)", - "nativeName": "العربية (المملكة المغربية)" - }, - { - "name": "ar-MR", - "displayName": "العربية (موريتانيا)", - "nativeName": "العربية (موريتانيا)" - }, - { - "name": "ar-OM", - "displayName": "Arabic (Oman)", - "nativeName": "العربية (عمان)" - }, - { - "name": "ar-PS", - "displayName": "العربية (السلطة الفلسطينية)", - "nativeName": "العربية (السلطة الفلسطينية)" - }, - { - "name": "ar-QA", - "displayName": "Arabic (Qatar)", - "nativeName": "العربية (قطر)" - }, - { - "name": "ar-SA", - "displayName": "Arabic (Saudi Arabia)", - "nativeName": "العربية (المملكة العربية السعودية)" - }, - { - "name": "ar-SD", - "displayName": "العربية (السودان)", - "nativeName": "العربية (السودان)" - }, - { - "name": "ar-SO", - "displayName": "العربية (الصومال)", - "nativeName": "العربية (الصومال)" - }, - { - "name": "ar-SS", - "displayName": "العربية (جنوب السودان)", - "nativeName": "العربية (جنوب السودان)" - }, - { - "name": "ar-SY", - "displayName": "Arabic (Syria)", - "nativeName": "العربية (سوريا)" - }, - { - "name": "ar-TD", - "displayName": "العربية (تشاد)", - "nativeName": "العربية (تشاد)" - }, - { - "name": "ar-TN", - "displayName": "Arabic (Tunisia)", - "nativeName": "العربية (تونس)" - }, - { - "name": "ar-YE", - "displayName": "Arabic (Yemen)", - "nativeName": "العربية (اليمن)" - }, - { - "name": "arn-CL", - "displayName": "Mapudungun (Chile)", - "nativeName": "Mapudungun (Chile)" - }, - { - "name": "as-IN", - "displayName": "Assamese (India)", - "nativeName": "অসমীয়া (ভাৰত)" - }, - { - "name": "asa-TZ", - "displayName": "Kipare (Tadhania)", - "nativeName": "Kipare (Tadhania)" - }, - { - "name": "ast-ES", - "displayName": "asturianu (España)", - "nativeName": "asturianu (España)" - }, - { - "name": "az-Cyrl-AZ", - "displayName": "Azerbaijani (Cyrillic, Azerbaijan)", - "nativeName": "азәрбајҹан (Азәрбајҹан)" - }, - { - "name": "az-Latn-AZ", - "displayName": "Azerbaijani (Latin, Azerbaijan)", - "nativeName": "azərbaycan (Azərbaycan)" - }, - { - "name": "ba-RU", - "displayName": "Bashkir (Russia)", - "nativeName": "Башҡорт (Рәсәй)" - }, - { - "name": "bas-CM", - "displayName": "Ɓàsàa (Kàmɛ̀rûn)", - "nativeName": "Ɓàsàa (Kàmɛ̀rûn)" - }, - { - "name": "be-BY", - "displayName": "Belarusian (Belarus)", - "nativeName": "Беларуская (Беларусь)" - }, - { - "name": "bem-ZM", - "displayName": "Ichibemba (Zambia)", - "nativeName": "Ichibemba (Zambia)" - }, - { - "name": "bez-TZ", - "displayName": "Hibena (Hutanzania)", - "nativeName": "Hibena (Hutanzania)" - }, - { - "name": "bg-BG", - "displayName": "Bulgarian (Bulgaria)", - "nativeName": "български (България)" - }, - { - "name": "bin-NG", - "displayName": "Edo (Nigeria)", - "nativeName": "Ẹ̀dó (Nigeria)" - }, - { - "name": "bm-Latn-ML", - "displayName": "bamanakan (Mali)", - "nativeName": "bamanakan (Mali)" - }, - { - "name": "bn-BD", - "displayName": "Bangla (Bangladesh)", - "nativeName": "বাংলা (বাংলাদেশ)" - }, - { - "name": "bn-IN", - "displayName": "Bangla (India)", - "nativeName": "বাংলা (ভারত)" - }, - { - "name": "bo-CN", - "displayName": "Tibetan (China)", - "nativeName": "བོད་ཡིག (ཀྲུང་ཧྭ་མི་དམངས་སྤྱི་མཐུན་རྒྱལ་ཁབ།)" - }, - { - "name": "bo-IN", - "displayName": "བོད་སྐད་ (རྒྱ་གར་)", - "nativeName": "བོད་སྐད་ (རྒྱ་གར་)" - }, - { - "name": "br-FR", - "displayName": "Breton (France)", - "nativeName": "brezhoneg (Frañs)" - }, - { - "name": "brx-IN", - "displayName": "बड़ो (भारत)", - "nativeName": "बड़ो (भारत)" - }, - { - "name": "bs-Cyrl-BA", - "displayName": "Bosnian (Cyrillic, Bosnia and Herzegovina)", - "nativeName": "босански (Босна и Херцеговина)" - }, - { - "name": "bs-Latn-BA", - "displayName": "Bosnian (Latin, Bosnia and Herzegovina)", - "nativeName": "bosanski (Bosna i Hercegovina)" - }, - { - "name": "byn-ER", - "displayName": "ብሊን (ኤርትራ)", - "nativeName": "ብሊን (ኤርትራ)" - }, - { - "name": "ca-AD", - "displayName": "català (Andorra)", - "nativeName": "català (Andorra)" - }, - { - "name": "ca-ES", - "displayName": "Catalan (Catalan)", - "nativeName": "català (català)" - }, - { - "name": "ca-ES-valencia", - "displayName": "Valencian (Spain)", - "nativeName": "valencià (Espanya)" - }, - { - "name": "ca-FR", - "displayName": "català (França)", - "nativeName": "català (França)" - }, - { - "name": "ca-IT", - "displayName": "català (Itàlia)", - "nativeName": "català (Itàlia)" - }, - { - "name": "ce-RU", - "displayName": "нохчийн (Росси)", - "nativeName": "нохчийн (Росси)" - }, - { - "name": "cgg-UG", - "displayName": "Rukiga (Uganda)", - "nativeName": "Rukiga (Uganda)" - }, - { - "name": "chr-Cher-US", - "displayName": "Cherokee (Cherokee, United States)", - "nativeName": "ᏣᎳᎩ (ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ)" - }, - { - "name": "co-FR", - "displayName": "Corsican (France)", - "nativeName": "Corsu (Francia)" - }, - { - "name": "cs-CZ", - "displayName": "Czech (Czechia)", - "nativeName": "čeština (Česko)" - }, - { - "name": "cu-RU", - "displayName": "церковнослове́нскїй (рѡссі́а)", - "nativeName": "церковнослове́нскїй (рѡссі́а)" - }, - { - "name": "cy-GB", - "displayName": "Welsh (United Kingdom)", - "nativeName": "Cymraeg (Y Deyrnas Unedig)" - }, - { - "name": "da-DK", - "displayName": "Danish (Denmark)", - "nativeName": "dansk (Danmark)" - }, - { - "name": "da-GL", - "displayName": "dansk (Grønland)", - "nativeName": "dansk (Grønland)" - }, - { - "name": "dav-KE", - "displayName": "Kitaita (Kenya)", - "nativeName": "Kitaita (Kenya)" - }, - { - "name": "de-AT", - "displayName": "German (Austria)", - "nativeName": "Deutsch (Österreich)" - }, - { - "name": "de-BE", - "displayName": "Deutsch (Belgien)", - "nativeName": "Deutsch (Belgien)" - }, - { - "name": "de-CH", - "displayName": "German (Switzerland)", - "nativeName": "Deutsch (Schweiz)" - }, - { - "name": "de-DE", - "displayName": "German (Germany)", - "nativeName": "Deutsch (Deutschland)" - }, - { - "name": "de-IT", - "displayName": "Deutsch (Italien)", - "nativeName": "Deutsch (Italien)" - }, - { - "name": "de-LI", - "displayName": "German (Liechtenstein)", - "nativeName": "Deutsch (Liechtenstein)" - }, - { - "name": "de-LU", - "displayName": "German (Luxembourg)", - "nativeName": "Deutsch (Luxemburg)" - }, - { - "name": "dje-NE", - "displayName": "Zarmaciine (Nižer)", - "nativeName": "Zarmaciine (Nižer)" - }, - { - "name": "dsb-DE", - "displayName": "Lower Sorbian (Germany)", - "nativeName": "dolnoserbšćina (Nimska)" - }, - { - "name": "dua-CM", - "displayName": "duálá (Cameroun)", - "nativeName": "duálá (Cameroun)" - }, - { - "name": "dv-MV", - "displayName": "Divehi (Maldives)", - "nativeName": "ދިވެހިބަސް (ދިވެހި ރާއްޖެ)" - }, - { - "name": "dyo-SN", - "displayName": "joola (Senegal)", - "nativeName": "joola (Senegal)" - }, - { - "name": "dz-BT", - "displayName": "Dzongkha (Bhutan)", - "nativeName": "རྫོང་ཁ (འབྲུག)" - }, - { - "name": "ebu-KE", - "displayName": "Kĩembu (Kenya)", - "nativeName": "Kĩembu (Kenya)" - }, - { - "name": "ee-GH", - "displayName": "Eʋegbe (Ghana nutome)", - "nativeName": "Eʋegbe (Ghana nutome)" - }, - { - "name": "ee-TG", - "displayName": "Eʋegbe (Togo nutome)", - "nativeName": "Eʋegbe (Togo nutome)" - }, - { - "name": "el-CY", - "displayName": "Ελληνικά (Κύπρος)", - "nativeName": "Ελληνικά (Κύπρος)" - }, - { - "name": "el-GR", - "displayName": "Greek (Greece)", - "nativeName": "Ελληνικά (Ελλάδα)" - }, - { - "name": "en-001", - "displayName": "English (World)", - "nativeName": "English (World)" - }, - { - "name": "en-029", - "displayName": "English (Caribbean)", - "nativeName": "English (Caribbean)" - }, - { - "name": "en-150", - "displayName": "English (Europe)", - "nativeName": "English (Europe)" - }, - { - "name": "en-AG", - "displayName": "English (Antigua and Barbuda)", - "nativeName": "English (Antigua and Barbuda)" - }, - { - "name": "en-AI", - "displayName": "English (Anguilla)", - "nativeName": "English (Anguilla)" - }, - { - "name": "en-AS", - "displayName": "English (American Samoa)", - "nativeName": "English (American Samoa)" - }, - { - "name": "en-AT", - "displayName": "English (Austria)", - "nativeName": "English (Austria)" - }, - { - "name": "en-AU", - "displayName": "English (Australia)", - "nativeName": "English (Australia)" - }, - { - "name": "en-BB", - "displayName": "English (Barbados)", - "nativeName": "English (Barbados)" - }, - { - "name": "en-BE", - "displayName": "English (Belgium)", - "nativeName": "English (Belgium)" - }, - { - "name": "en-BI", - "displayName": "English (Burundi)", - "nativeName": "English (Burundi)" - }, - { - "name": "en-BM", - "displayName": "English (Bermuda)", - "nativeName": "English (Bermuda)" - }, - { - "name": "en-BS", - "displayName": "English (Bahamas)", - "nativeName": "English (Bahamas)" - }, - { - "name": "en-BW", - "displayName": "English (Botswana)", - "nativeName": "English (Botswana)" - }, - { - "name": "en-BZ", - "displayName": "English (Belize)", - "nativeName": "English (Belize)" - }, - { - "name": "en-CA", - "displayName": "English (Canada)", - "nativeName": "English (Canada)" - }, - { - "name": "en-CC", - "displayName": "English (Cocos (Keeling) Islands)", - "nativeName": "English (Cocos (Keeling) Islands)" - }, - { - "name": "en-CH", - "displayName": "English (Switzerland)", - "nativeName": "English (Switzerland)" - }, - { - "name": "en-CK", - "displayName": "English (Cook Islands)", - "nativeName": "English (Cook Islands)" - }, - { - "name": "en-CM", - "displayName": "English (Cameroon)", - "nativeName": "English (Cameroon)" - }, - { - "name": "en-CX", - "displayName": "English (Christmas Island)", - "nativeName": "English (Christmas Island)" - }, - { - "name": "en-CY", - "displayName": "English (Cyprus)", - "nativeName": "English (Cyprus)" - }, - { - "name": "en-DE", - "displayName": "English (Germany)", - "nativeName": "English (Germany)" - }, - { - "name": "en-DK", - "displayName": "English (Denmark)", - "nativeName": "English (Denmark)" - }, - { - "name": "en-DM", - "displayName": "English (Dominica)", - "nativeName": "English (Dominica)" - }, - { - "name": "en-ER", - "displayName": "English (Eritrea)", - "nativeName": "English (Eritrea)" - }, - { - "name": "en-FI", - "displayName": "English (Finland)", - "nativeName": "English (Finland)" - }, - { - "name": "en-FJ", - "displayName": "English (Fiji)", - "nativeName": "English (Fiji)" - }, - { - "name": "en-FK", - "displayName": "English (Falkland Islands)", - "nativeName": "English (Falkland Islands)" - }, - { - "name": "en-FM", - "displayName": "English (Micronesia)", - "nativeName": "English (Micronesia)" - }, - { - "name": "en-GB", - "displayName": "English (United Kingdom)", - "nativeName": "English (United Kingdom)" - }, - { - "name": "en-GD", - "displayName": "English (Grenada)", - "nativeName": "English (Grenada)" - }, - { - "name": "en-GG", - "displayName": "English (Guernsey)", - "nativeName": "English (Guernsey)" - }, - { - "name": "en-GH", - "displayName": "English (Ghana)", - "nativeName": "English (Ghana)" - }, - { - "name": "en-GI", - "displayName": "English (Gibraltar)", - "nativeName": "English (Gibraltar)" - }, - { - "name": "en-GM", - "displayName": "English (Gambia)", - "nativeName": "English (Gambia)" - }, - { - "name": "en-GU", - "displayName": "English (Guam)", - "nativeName": "English (Guam)" - }, - { - "name": "en-GY", - "displayName": "English (Guyana)", - "nativeName": "English (Guyana)" - }, - { - "name": "en-HK", - "displayName": "English (Hong Kong SAR)", - "nativeName": "English (Hong Kong SAR)" - }, - { - "name": "en-ID", - "displayName": "English (Indonesia)", - "nativeName": "English (Indonesia)" - }, - { - "name": "en-IE", - "displayName": "English (Ireland)", - "nativeName": "English (Ireland)" - }, - { - "name": "en-IL", - "displayName": "English (Israel)", - "nativeName": "English (Israel)" - }, - { - "name": "en-IM", - "displayName": "English (Isle of Man)", - "nativeName": "English (Isle of Man)" - }, - { - "name": "en-IN", - "displayName": "English (India)", - "nativeName": "English (India)" - }, - { - "name": "en-IO", - "displayName": "English (British Indian Ocean Territory)", - "nativeName": "English (British Indian Ocean Territory)" - }, - { - "name": "en-JE", - "displayName": "English (Jersey)", - "nativeName": "English (Jersey)" - }, - { - "name": "en-JM", - "displayName": "English (Jamaica)", - "nativeName": "English (Jamaica)" - }, - { - "name": "en-KE", - "displayName": "English (Kenya)", - "nativeName": "English (Kenya)" - }, - { - "name": "en-KI", - "displayName": "English (Kiribati)", - "nativeName": "English (Kiribati)" - }, - { - "name": "en-KN", - "displayName": "English (Saint Kitts and Nevis)", - "nativeName": "English (Saint Kitts and Nevis)" - }, - { - "name": "en-KY", - "displayName": "English (Cayman Islands)", - "nativeName": "English (Cayman Islands)" - }, - { - "name": "en-LC", - "displayName": "English (Saint Lucia)", - "nativeName": "English (Saint Lucia)" - }, - { - "name": "en-LR", - "displayName": "English (Liberia)", - "nativeName": "English (Liberia)" - }, - { - "name": "en-LS", - "displayName": "English (Lesotho)", - "nativeName": "English (Lesotho)" - }, - { - "name": "en-MG", - "displayName": "English (Madagascar)", - "nativeName": "English (Madagascar)" - }, - { - "name": "en-MH", - "displayName": "English (Marshall Islands)", - "nativeName": "English (Marshall Islands)" - }, - { - "name": "en-MO", - "displayName": "English (Macao SAR)", - "nativeName": "English (Macao SAR)" - }, - { - "name": "en-MP", - "displayName": "English (Northern Mariana Islands)", - "nativeName": "English (Northern Mariana Islands)" - }, - { - "name": "en-MS", - "displayName": "English (Montserrat)", - "nativeName": "English (Montserrat)" - }, - { - "name": "en-MT", - "displayName": "English (Malta)", - "nativeName": "English (Malta)" - }, - { - "name": "en-MU", - "displayName": "English (Mauritius)", - "nativeName": "English (Mauritius)" - }, - { - "name": "en-MW", - "displayName": "English (Malawi)", - "nativeName": "English (Malawi)" - }, - { - "name": "en-MY", - "displayName": "English (Malaysia)", - "nativeName": "English (Malaysia)" - }, - { - "name": "en-NA", - "displayName": "English (Namibia)", - "nativeName": "English (Namibia)" - }, - { - "name": "en-NF", - "displayName": "English (Norfolk Island)", - "nativeName": "English (Norfolk Island)" - }, - { - "name": "en-NG", - "displayName": "English (Nigeria)", - "nativeName": "English (Nigeria)" - }, - { - "name": "en-NL", - "displayName": "English (Netherlands)", - "nativeName": "English (Netherlands)" - }, - { - "name": "en-NR", - "displayName": "English (Nauru)", - "nativeName": "English (Nauru)" - }, - { - "name": "en-NU", - "displayName": "English (Niue)", - "nativeName": "English (Niue)" - }, - { - "name": "en-NZ", - "displayName": "English (New Zealand)", - "nativeName": "English (New Zealand)" - }, - { - "name": "en-PG", - "displayName": "English (Papua New Guinea)", - "nativeName": "English (Papua New Guinea)" - }, - { - "name": "en-PH", - "displayName": "English (Philippines)", - "nativeName": "English (Philippines)" - }, - { - "name": "en-PK", - "displayName": "English (Pakistan)", - "nativeName": "English (Pakistan)" - }, - { - "name": "en-PN", - "displayName": "English (Pitcairn Islands)", - "nativeName": "English (Pitcairn Islands)" - }, - { - "name": "en-PR", - "displayName": "English (Puerto Rico)", - "nativeName": "English (Puerto Rico)" - }, - { - "name": "en-PW", - "displayName": "English (Palau)", - "nativeName": "English (Palau)" - }, - { - "name": "en-RW", - "displayName": "English (Rwanda)", - "nativeName": "English (Rwanda)" - }, - { - "name": "en-SB", - "displayName": "English (Solomon Islands)", - "nativeName": "English (Solomon Islands)" - }, - { - "name": "en-SC", - "displayName": "English (Seychelles)", - "nativeName": "English (Seychelles)" - }, - { - "name": "en-SD", - "displayName": "English (Sudan)", - "nativeName": "English (Sudan)" - }, - { - "name": "en-SE", - "displayName": "English (Sweden)", - "nativeName": "English (Sweden)" - }, - { - "name": "en-SG", - "displayName": "English (Singapore)", - "nativeName": "English (Singapore)" - }, - { - "name": "en-SH", - "displayName": "English (St Helena, Ascension, Tristan da Cunha)", - "nativeName": "English (St Helena, Ascension, Tristan da Cunha)" - }, - { - "name": "en-SI", - "displayName": "English (Slovenia)", - "nativeName": "English (Slovenia)" - }, - { - "name": "en-SL", - "displayName": "English (Sierra Leone)", - "nativeName": "English (Sierra Leone)" - }, - { - "name": "en-SS", - "displayName": "English (South Sudan)", - "nativeName": "English (South Sudan)" - }, - { - "name": "en-SX", - "displayName": "English (Sint Maarten)", - "nativeName": "English (Sint Maarten)" - }, - { - "name": "en-SZ", - "displayName": "English (Swaziland)", - "nativeName": "English (Swaziland)" - }, - { - "name": "en-TC", - "displayName": "English (Turks and Caicos Islands)", - "nativeName": "English (Turks and Caicos Islands)" - }, - { - "name": "en-TK", - "displayName": "English (Tokelau)", - "nativeName": "English (Tokelau)" - }, - { - "name": "en-TO", - "displayName": "English (Tonga)", - "nativeName": "English (Tonga)" - }, - { - "name": "en-TT", - "displayName": "English (Trinidad and Tobago)", - "nativeName": "English (Trinidad and Tobago)" - }, - { - "name": "en-TV", - "displayName": "English (Tuvalu)", - "nativeName": "English (Tuvalu)" - }, - { - "name": "en-TZ", - "displayName": "English (Tanzania)", - "nativeName": "English (Tanzania)" - }, - { - "name": "en-UG", - "displayName": "English (Uganda)", - "nativeName": "English (Uganda)" - }, - { - "name": "en-UM", - "displayName": "English (U.S. Outlying Islands)", - "nativeName": "English (U.S. Outlying Islands)" - }, - { - "name": "en-US", - "displayName": "English (United States)", - "nativeName": "English (United States)" - }, - { - "name": "en-VC", - "displayName": "English (Saint Vincent and the Grenadines)", - "nativeName": "English (Saint Vincent and the Grenadines)" - }, - { - "name": "en-VG", - "displayName": "English (British Virgin Islands)", - "nativeName": "English (British Virgin Islands)" - }, - { - "name": "en-VI", - "displayName": "English (U.S. Virgin Islands)", - "nativeName": "English (U.S. Virgin Islands)" - }, - { - "name": "en-VU", - "displayName": "English (Vanuatu)", - "nativeName": "English (Vanuatu)" - }, - { - "name": "en-WS", - "displayName": "English (Samoa)", - "nativeName": "English (Samoa)" - }, - { - "name": "en-ZA", - "displayName": "English (South Africa)", - "nativeName": "English (South Africa)" - }, - { - "name": "en-ZM", - "displayName": "English (Zambia)", - "nativeName": "English (Zambia)" - }, - { - "name": "en-ZW", - "displayName": "English (Zimbabwe)", - "nativeName": "English (Zimbabwe)" - }, - { - "name": "eo-001", - "displayName": "esperanto (World)", - "nativeName": "esperanto (World)" - }, - { - "name": "es-419", - "displayName": "Spanish (Latin America)", - "nativeName": "español (Latinoamérica)" - }, - { - "name": "es-AR", - "displayName": "Spanish (Argentina)", - "nativeName": "español (Argentina)" - }, - { - "name": "es-BO", - "displayName": "Spanish (Bolivia)", - "nativeName": "español (Bolivia)" - }, - { - "name": "es-BR", - "displayName": "español (Brasil)", - "nativeName": "español (Brasil)" - }, - { - "name": "es-BZ", - "displayName": "español (Belice)", - "nativeName": "español (Belice)" - }, - { - "name": "es-CL", - "displayName": "Spanish (Chile)", - "nativeName": "español (Chile)" - }, - { - "name": "es-CO", - "displayName": "Spanish (Colombia)", - "nativeName": "español (Colombia)" - }, - { - "name": "es-CR", - "displayName": "Spanish (Costa Rica)", - "nativeName": "español (Costa Rica)" - }, - { - "name": "es-CU", - "displayName": "Spanish (Cuba)", - "nativeName": "español (Cuba)" - }, - { - "name": "es-DO", - "displayName": "Spanish (Dominican Republic)", - "nativeName": "español (República Dominicana)" - }, - { - "name": "es-EC", - "displayName": "Spanish (Ecuador)", - "nativeName": "español (Ecuador)" - }, - { - "name": "es-ES", - "displayName": "Spanish (Spain, International Sort)", - "nativeName": "español (España, alfabetización internacional)" - }, - { - "name": "es-GQ", - "displayName": "español (Guinea Ecuatorial)", - "nativeName": "español (Guinea Ecuatorial)" - }, - { - "name": "es-GT", - "displayName": "Spanish (Guatemala)", - "nativeName": "español (Guatemala)" - }, - { - "name": "es-HN", - "displayName": "Spanish (Honduras)", - "nativeName": "español (Honduras)" - }, - { - "name": "es-MX", - "displayName": "Spanish (Mexico)", - "nativeName": "español (México)" - }, - { - "name": "es-NI", - "displayName": "Spanish (Nicaragua)", - "nativeName": "español (Nicaragua)" - }, - { - "name": "es-PA", - "displayName": "Spanish (Panama)", - "nativeName": "español (Panamá)" - }, - { - "name": "es-PE", - "displayName": "Spanish (Peru)", - "nativeName": "español (Perú)" - }, - { - "name": "es-PH", - "displayName": "español (Filipinas)", - "nativeName": "español (Filipinas)" - }, - { - "name": "es-PR", - "displayName": "Spanish (Puerto Rico)", - "nativeName": "español (Puerto Rico)" - }, - { - "name": "es-PY", - "displayName": "Spanish (Paraguay)", - "nativeName": "español (Paraguay)" - }, - { - "name": "es-SV", - "displayName": "Spanish (El Salvador)", - "nativeName": "español (El Salvador)" - }, - { - "name": "es-US", - "displayName": "Spanish (United States)", - "nativeName": "español (Estados Unidos)" - }, - { - "name": "es-UY", - "displayName": "Spanish (Uruguay)", - "nativeName": "español (Uruguay)" - }, - { - "name": "es-VE", - "displayName": "Spanish (Venezuela)", - "nativeName": "español (Venezuela)" - }, - { - "name": "et-EE", - "displayName": "Estonian (Estonia)", - "nativeName": "eesti (Eesti)" - }, - { - "name": "eu-ES", - "displayName": "Basque (Basque)", - "nativeName": "euskara (euskara)" - }, - { - "name": "ewo-CM", - "displayName": "ewondo (Kamərún)", - "nativeName": "ewondo (Kamərún)" - }, - { - "name": "fa-IR", - "displayName": "Persian (Iran)", - "nativeName": "فارسى (ایران)" - }, - { - "name": "ff-CM", - "displayName": "Pulaar (Kameruun)", - "nativeName": "Pulaar (Kameruun)" - }, - { - "name": "ff-GN", - "displayName": "Pulaar (Gine)", - "nativeName": "Pulaar (Gine)" - }, - { - "name": "ff-Latn-SN", - "displayName": "Fulah (Latin, Senegal)", - "nativeName": "Fulah (Sénégal)" - }, - { - "name": "ff-MR", - "displayName": "Pulaar (Muritani)", - "nativeName": "Pulaar (Muritani)" - }, - { - "name": "ff-NG", - "displayName": "Fulah (Nigeria)", - "nativeName": "Pulaar (Nigeria)" - }, - { - "name": "fi-FI", - "displayName": "Finnish (Finland)", - "nativeName": "suomi (Suomi)" - }, - { - "name": "fil-PH", - "displayName": "Filipino (Philippines)", - "nativeName": "Filipino (Pilipinas)" - }, - { - "name": "fo-DK", - "displayName": "føroyskt (Danmark)", - "nativeName": "føroyskt (Danmark)" - }, - { - "name": "fo-FO", - "displayName": "Faroese (Faroe Islands)", - "nativeName": "føroyskt (Føroyar)" - }, - { - "name": "fr-029", - "displayName": "French (Caribbean)", - "nativeName": "français (caraïbes)" - }, - { - "name": "fr-BE", - "displayName": "French (Belgium)", - "nativeName": "français (Belgique)" - }, - { - "name": "fr-BF", - "displayName": "français (Burkina Faso)", - "nativeName": "français (Burkina Faso)" - }, - { - "name": "fr-BI", - "displayName": "français (Burundi)", - "nativeName": "français (Burundi)" - }, - { - "name": "fr-BJ", - "displayName": "français (Bénin)", - "nativeName": "français (Bénin)" - }, - { - "name": "fr-BL", - "displayName": "français (Saint-Barthélemy)", - "nativeName": "français (Saint-Barthélemy)" - }, - { - "name": "fr-CA", - "displayName": "French (Canada)", - "nativeName": "français (Canada)" - }, - { - "name": "fr-CD", - "displayName": "French Congo (DRC)", - "nativeName": "français (Congo, République démocratique du)" - }, - { - "name": "fr-CF", - "displayName": "français (République centrafricaine)", - "nativeName": "français (République centrafricaine)" - }, - { - "name": "fr-CG", - "displayName": "français (Congo)", - "nativeName": "français (Congo)" - }, - { - "name": "fr-CH", - "displayName": "French (Switzerland)", - "nativeName": "français (Suisse)" - }, - { - "name": "fr-CI", - "displayName": "French (Côte d’Ivoire)", - "nativeName": "français (Côte d’Ivoire)" - }, - { - "name": "fr-CM", - "displayName": "French (Cameroon)", - "nativeName": "français (Cameroun)" - }, - { - "name": "fr-DJ", - "displayName": "français (Djibouti)", - "nativeName": "français (Djibouti)" - }, - { - "name": "fr-DZ", - "displayName": "français (Algérie)", - "nativeName": "français (Algérie)" - }, - { - "name": "fr-FR", - "displayName": "French (France)", - "nativeName": "français (France)" - }, - { - "name": "fr-GA", - "displayName": "français (Gabon)", - "nativeName": "français (Gabon)" - }, - { - "name": "fr-GF", - "displayName": "français (Guyane française)", - "nativeName": "français (Guyane française)" - }, - { - "name": "fr-GN", - "displayName": "français (Guinée)", - "nativeName": "français (Guinée)" - }, - { - "name": "fr-GP", - "displayName": "français (Guadeloupe)", - "nativeName": "français (Guadeloupe)" - }, - { - "name": "fr-GQ", - "displayName": "français (Guinée équatoriale)", - "nativeName": "français (Guinée équatoriale)" - }, - { - "name": "fr-HT", - "displayName": "French (Haiti)", - "nativeName": "français (Haïti)" - }, - { - "name": "fr-KM", - "displayName": "français (Comores)", - "nativeName": "français (Comores)" - }, - { - "name": "fr-LU", - "displayName": "French (Luxembourg)", - "nativeName": "français (Luxembourg)" - }, - { - "name": "fr-MA", - "displayName": "French (Morocco)", - "nativeName": "français (Maroc)" - }, - { - "name": "fr-MC", - "displayName": "French (Monaco)", - "nativeName": "français (Monaco)" - }, - { - "name": "fr-MF", - "displayName": "français (Saint-Martin)", - "nativeName": "français (Saint-Martin)" - }, - { - "name": "fr-MG", - "displayName": "français (Madagascar)", - "nativeName": "français (Madagascar)" - }, - { - "name": "fr-ML", - "displayName": "French (Mali)", - "nativeName": "français (Mali)" - }, - { - "name": "fr-MQ", - "displayName": "français (Martinique)", - "nativeName": "français (Martinique)" - }, - { - "name": "fr-MR", - "displayName": "français (Mauritanie)", - "nativeName": "français (Mauritanie)" - }, - { - "name": "fr-MU", - "displayName": "français (Maurice)", - "nativeName": "français (Maurice)" - }, - { - "name": "fr-NC", - "displayName": "français (Nouvelle-Calédonie)", - "nativeName": "français (Nouvelle-Calédonie)" - }, - { - "name": "fr-NE", - "displayName": "français (Niger)", - "nativeName": "français (Niger)" - }, - { - "name": "fr-PF", - "displayName": "français (Polynésie française)", - "nativeName": "français (Polynésie française)" - }, - { - "name": "fr-PM", - "displayName": "français (Saint-Pierre-et-Miquelon)", - "nativeName": "français (Saint-Pierre-et-Miquelon)" - }, - { - "name": "fr-RE", - "displayName": "French (Réunion)", - "nativeName": "français (La Réunion)" - }, - { - "name": "fr-RW", - "displayName": "français (Rwanda)", - "nativeName": "français (Rwanda)" - }, - { - "name": "fr-SC", - "displayName": "français (Seychelles)", - "nativeName": "français (Seychelles)" - }, - { - "name": "fr-SN", - "displayName": "French (Senegal)", - "nativeName": "français (Sénégal)" - }, - { - "name": "fr-SY", - "displayName": "français (Syrie)", - "nativeName": "français (Syrie)" - }, - { - "name": "fr-TD", - "displayName": "français (Tchad)", - "nativeName": "français (Tchad)" - }, - { - "name": "fr-TG", - "displayName": "français (Togo)", - "nativeName": "français (Togo)" - }, - { - "name": "fr-TN", - "displayName": "français (Tunisie)", - "nativeName": "français (Tunisie)" - }, - { - "name": "fr-VU", - "displayName": "français (Vanuatu)", - "nativeName": "français (Vanuatu)" - }, - { - "name": "fr-WF", - "displayName": "français (Wallis-et-Futuna)", - "nativeName": "français (Wallis-et-Futuna)" - }, - { - "name": "fr-YT", - "displayName": "français (Mayotte)", - "nativeName": "français (Mayotte)" - }, - { - "name": "fur-IT", - "displayName": "furlan (Italie)", - "nativeName": "furlan (Italie)" - }, - { - "name": "fy-NL", - "displayName": "Western Frisian (Netherlands)", - "nativeName": "Frysk (Nederlân)" - }, - { - "name": "ga-IE", - "displayName": "Irish (Ireland)", - "nativeName": "Gaeilge (Éire)" - }, - { - "name": "gd-GB", - "displayName": "Scottish Gaelic (United Kingdom)", - "nativeName": "Gàidhlig (An Rìoghachd Aonaichte)" - }, - { - "name": "gl-ES", - "displayName": "Galician (Galician)", - "nativeName": "galego (galego)" - }, - { - "name": "gn-PY", - "displayName": "Guarani (Paraguay)", - "nativeName": "Avañe’ẽ (Paraguái)" - }, - { - "name": "gsw-CH", - "displayName": "Schwiizertüütsch (Schwiiz)", - "nativeName": "Schwiizertüütsch (Schwiiz)" - }, - { - "name": "gsw-FR", - "displayName": "Alsatian (France)", - "nativeName": "Elsässisch (Frànkrisch)" - }, - { - "name": "gsw-LI", - "displayName": "Schwiizertüütsch (Liächteschtäi)", - "nativeName": "Schwiizertüütsch (Liächteschtäi)" - }, - { - "name": "gu-IN", - "displayName": "Gujarati (India)", - "nativeName": "ગુજરાતી (ભારત)" - }, - { - "name": "guz-KE", - "displayName": "Ekegusii (Kenya)", - "nativeName": "Ekegusii (Kenya)" - }, - { - "name": "gv-IM", - "displayName": "Gaelg (Ellan Vannin)", - "nativeName": "Gaelg (Ellan Vannin)" - }, - { - "name": "ha-Latn-GH", - "displayName": "Hausa (Gana)", - "nativeName": "Hausa (Gana)" - }, - { - "name": "ha-Latn-NE", - "displayName": "Hausa (Nijar)", - "nativeName": "Hausa (Nijar)" - }, - { - "name": "ha-Latn-NG", - "displayName": "Hausa (Latin, Nigeria)", - "nativeName": "Hausa (Najeriya)" - }, - { - "name": "haw-US", - "displayName": "Hawaiian (United States)", - "nativeName": "ʻŌlelo Hawaiʻi (ʻAmelika Hui Pū ʻIa)" - }, - { - "name": "he-IL", - "displayName": "Hebrew (Israel)", - "nativeName": "עברית (ישראל)" - }, - { - "name": "hi-IN", - "displayName": "Hindi (India)", - "nativeName": "हिंदी (भारत)" - }, - { - "name": "hr-BA", - "displayName": "Croatian (Bosnia and Herzegovina)", - "nativeName": "hrvatski (Bosna i Hercegovina)" - }, - { - "name": "hr-HR", - "displayName": "Croatian (Croatia)", - "nativeName": "hrvatski (Hrvatska)" - }, - { - "name": "hsb-DE", - "displayName": "Upper Sorbian (Germany)", - "nativeName": "hornjoserbšćina (Němska)" - }, - { - "name": "hu-HU", - "displayName": "Hungarian (Hungary)", - "nativeName": "magyar (Magyarország)" - }, - { - "name": "hy-AM", - "displayName": "Armenian (Armenia)", - "nativeName": "Հայերեն (Հայաստան)" - }, - { - "name": "ia-001", - "displayName": "interlingua (World)", - "nativeName": "interlingua (World)" - }, - { - "name": "ia-FR", - "displayName": "interlingua (Francia)", - "nativeName": "interlingua (Francia)" - }, - { - "name": "ibb-NG", - "displayName": "Ibibio (Nigeria)", - "nativeName": "Ibibio-Efik (Nigeria)" - }, - { - "name": "id-ID", - "displayName": "Indonesian (Indonesia)", - "nativeName": "Indonesia (Indonesia)" - }, - { - "name": "ig-NG", - "displayName": "Igbo (Nigeria)", - "nativeName": "Igbo (Nigeria)" - }, - { - "name": "ii-CN", - "displayName": "Yi (China)", - "nativeName": "ꆈꌠꁱꂷ (ꍏꉸꏓꂱꇭꉼꇩ)" - }, - { - "name": "is-IS", - "displayName": "Icelandic (Iceland)", - "nativeName": "íslenska (Ísland)" - }, - { - "name": "it-CH", - "displayName": "Italian (Switzerland)", - "nativeName": "italiano (Svizzera)" - }, - { - "name": "it-IT", - "displayName": "Italian (Italy)", - "nativeName": "italiano (Italia)" - }, - { - "name": "it-SM", - "displayName": "italiano (San Marino)", - "nativeName": "italiano (San Marino)" - }, - { - "name": "it-VA", - "displayName": "italiano (Città del Vaticano)", - "nativeName": "italiano (Città del Vaticano)" - }, - { - "name": "iu-Cans-CA", - "displayName": "Inuktitut (Syllabics, Canada)", - "nativeName": "ᐃᓄᒃᑎᑐᑦ (ᑲᓇᑕᒥ)" - }, - { - "name": "iu-Latn-CA", - "displayName": "Inuktitut (Latin, Canada)", - "nativeName": "Inuktitut (Kanatami)" - }, - { - "name": "ja-JP", - "displayName": "Japanese (Japan)", - "nativeName": "日本語 (日本)" - }, - { - "name": "jgo-CM", - "displayName": "Ndaꞌa (Kamɛlûn)", - "nativeName": "Ndaꞌa (Kamɛlûn)" - }, - { - "name": "jmc-TZ", - "displayName": "Kimachame (Tanzania)", - "nativeName": "Kimachame (Tanzania)" - }, - { - "name": "jv-Java-ID", - "displayName": "ꦧꦱꦗꦮ (Indonesia)", - "nativeName": "ꦧꦱꦗꦮ (Indonesia)" - }, - { - "name": "jv-Latn-ID", - "displayName": "Basa Jawa (Indonesia)", - "nativeName": "Basa Jawa (Indonesia)" - }, - { - "name": "ka-GE", - "displayName": "Georgian (Georgia)", - "nativeName": "ქართული (საქართველო)" - }, - { - "name": "kab-DZ", - "displayName": "Taqbaylit (Lezzayer)", - "nativeName": "Taqbaylit (Lezzayer)" - }, - { - "name": "kam-KE", - "displayName": "Kikamba (Kenya)", - "nativeName": "Kikamba (Kenya)" - }, - { - "name": "kde-TZ", - "displayName": "Chimakonde (Tanzania)", - "nativeName": "Chimakonde (Tanzania)" - }, - { - "name": "kea-CV", - "displayName": "kabuverdianu (Kabu Verdi)", - "nativeName": "kabuverdianu (Kabu Verdi)" - }, - { - "name": "khq-ML", - "displayName": "Koyra ciini (Maali)", - "nativeName": "Koyra ciini (Maali)" - }, - { - "name": "ki-KE", - "displayName": "Gikuyu (Kenya)", - "nativeName": "Gikuyu (Kenya)" - }, - { - "name": "kk-KZ", - "displayName": "Kazakh (Kazakhstan)", - "nativeName": "қазақ тілі (Қазақстан)" - }, - { - "name": "kkj-CM", - "displayName": "kakɔ (Kamɛrun)", - "nativeName": "kakɔ (Kamɛrun)" - }, - { - "name": "kl-GL", - "displayName": "Greenlandic (Greenland)", - "nativeName": "kalaallisut (Kalaallit Nunaat)" - }, - { - "name": "kln-KE", - "displayName": "Kalenjin (Emetab Kenya)", - "nativeName": "Kalenjin (Emetab Kenya)" - }, - { - "name": "km-KH", - "displayName": "Khmer (Cambodia)", - "nativeName": "ភាសាខ្មែរ (កម្ពុជា)" - }, - { - "name": "kn-IN", - "displayName": "Kannada (India)", - "nativeName": "ಕನ್ನಡ (ಭಾರತ)" - }, - { - "name": "ko-KP", - "displayName": "한국어 (조선민주주의인민공화국)", - "nativeName": "한국어 (조선민주주의인민공화국)" - }, - { - "name": "ko-KR", - "displayName": "Korean (Korea)", - "nativeName": "한국어(대한민국)" - }, - { - "name": "kok-IN", - "displayName": "Konkani (India)", - "nativeName": "कोंकणी (भारत)" - }, - { - "name": "kr-NG", - "displayName": "Kanuri (Nigeria)", - "nativeName": "Kanuri (Nigeria)" - }, - { - "name": "ks-Arab-IN", - "displayName": "کٲشُر (اَربی)", - "nativeName": "کٲشُر (اَربی)" - }, - { - "name": "ks-Deva-IN", - "displayName": "Kashmiri (Devanagari)", - "nativeName": "कॉशुर" - }, - { - "name": "ksb-TZ", - "displayName": "Kishambaa (Tanzania)", - "nativeName": "Kishambaa (Tanzania)" - }, - { - "name": "ksf-CM", - "displayName": "rikpa (kamɛrún)", - "nativeName": "rikpa (kamɛrún)" - }, - { - "name": "ksh-DE", - "displayName": "Kölsch (Doütschland)", - "nativeName": "Kölsch (Doütschland)" - }, - { - "name": "ku-Arab-IQ", - "displayName": "Central Kurdish (Iraq)", - "nativeName": "کوردیی ناوەڕاست (عێراق)" - }, - { - "name": "ku-Arab-IR", - "displayName": "کوردی (ئێران)", - "nativeName": "کوردی (ئێران)" - }, - { - "name": "kw-GB", - "displayName": "kernewek (Rywvaneth Unys)", - "nativeName": "kernewek (Rywvaneth Unys)" - }, - { - "name": "ky-KG", - "displayName": "Kyrgyz (Kyrgyzstan)", - "nativeName": "Кыргыз (Кыргызстан)" - }, - { - "name": "la-001", - "displayName": "Latin (World)", - "nativeName": "lingua latīna (World)" - }, - { - "name": "lag-TZ", - "displayName": "Kɨlaangi (Taansanía)", - "nativeName": "Kɨlaangi (Taansanía)" - }, - { - "name": "lb-LU", - "displayName": "Luxembourgish (Luxembourg)", - "nativeName": "Lëtzebuergesch (Lëtzebuerg)" - }, - { - "name": "lg-UG", - "displayName": "Luganda (Yuganda)", - "nativeName": "Luganda (Yuganda)" - }, - { - "name": "lkt-US", - "displayName": "Lakȟólʼiyapi (Mílahaŋska Tȟamákȟočhe)", - "nativeName": "Lakȟólʼiyapi (Mílahaŋska Tȟamákȟočhe)" - }, - { - "name": "ln-AO", - "displayName": "lingála (Angóla)", - "nativeName": "lingála (Angóla)" - }, - { - "name": "ln-CD", - "displayName": "lingála (Republíki ya Kongó Demokratíki)", - "nativeName": "lingála (Republíki ya Kongó Demokratíki)" - }, - { - "name": "ln-CF", - "displayName": "lingála (Repibiki ya Afríka ya Káti)", - "nativeName": "lingála (Repibiki ya Afríka ya Káti)" - }, - { - "name": "ln-CG", - "displayName": "lingála (Kongo)", - "nativeName": "lingála (Kongo)" - }, - { - "name": "lo-LA", - "displayName": "Lao (Laos)", - "nativeName": "ລາວ (ລາວ)" - }, - { - "name": "lrc-IQ", - "displayName": "لۊری شومالی (Iraq)", - "nativeName": "لۊری شومالی (Iraq)" - }, - { - "name": "lrc-IR", - "displayName": "لۊری شومالی (Iran)", - "nativeName": "لۊری شومالی (Iran)" - }, - { - "name": "lt-LT", - "displayName": "Lithuanian (Lithuania)", - "nativeName": "lietuvių (Lietuva)" - }, - { - "name": "lu-CD", - "displayName": "Tshiluba (Ditunga wa Kongu)", - "nativeName": "Tshiluba (Ditunga wa Kongu)" - }, - { - "name": "luo-KE", - "displayName": "Dholuo (Kenya)", - "nativeName": "Dholuo (Kenya)" - }, - { - "name": "luy-KE", - "displayName": "Luluhia (Kenya)", - "nativeName": "Luluhia (Kenya)" - }, - { - "name": "lv-LV", - "displayName": "Latvian (Latvia)", - "nativeName": "latviešu (Latvija)" - }, - { - "name": "mas-KE", - "displayName": "Maa (Kenya)", - "nativeName": "Maa (Kenya)" - }, - { - "name": "mas-TZ", - "displayName": "Maa (Tansania)", - "nativeName": "Maa (Tansania)" - }, - { - "name": "mer-KE", - "displayName": "Kĩmĩrũ (Kenya)", - "nativeName": "Kĩmĩrũ (Kenya)" - }, - { - "name": "mfe-MU", - "displayName": "kreol morisien (Moris)", - "nativeName": "kreol morisien (Moris)" - }, - { - "name": "mg-MG", - "displayName": "Malagasy (Madagasikara)", - "nativeName": "Malagasy (Madagasikara)" - }, - { - "name": "mgh-MZ", - "displayName": "Makua (Umozambiki)", - "nativeName": "Makua (Umozambiki)" - }, - { - "name": "mgo-CM", - "displayName": "metaʼ (Kamalun)", - "nativeName": "metaʼ (Kamalun)" - }, - { - "name": "mi-NZ", - "displayName": "Maori (New Zealand)", - "nativeName": "Reo Māori (Aotearoa)" - }, - { - "name": "mk-MK", - "displayName": "Macedonian (Macedonia, FYRO)", - "nativeName": "македонски (Република Македонија)" - }, - { - "name": "ml-IN", - "displayName": "Malayalam (India)", - "nativeName": "മലയാളം (ഇന്ത്യ)" - }, - { - "name": "mn-MN", - "displayName": "Mongolian (Mongolia)", - "nativeName": "монгол (Монгол)" - }, - { - "name": "mn-Mong-CN", - "displayName": "Mongolian (Traditional Mongolian, China)", - "nativeName": "ᠮᠣᠩᠭᠣᠤᠯ ᠬᠡᠯᠡ (ᠪᠦᠭᠦᠳᠡ ᠨᠠᠢᠷᠠᠮᠳᠠᠬᠤ ᠳᠤᠮᠳᠠᠳᠤ ᠠᠷᠠᠳ ᠣᠯᠣᠰ)" - }, - { - "name": "mn-Mong-MN", - "displayName": "Mongolian (Traditional Mongolian, Mongolia)", - "nativeName": "ᠮᠣᠩᠭᠣᠯ ᠬᠡᠯᠡ (ᠮᠣᠩᠭᠣᠯ ᠣᠯᠣᠰ)" - }, - { - "name": "mni-IN", - "displayName": "Manipuri (India)", - "nativeName": "মৈতৈলোন্ (India)" - }, - { - "name": "moh-CA", - "displayName": "Mohawk (Mohawk)", - "nativeName": "Kanien'kéha" - }, - { - "name": "mr-IN", - "displayName": "Marathi (India)", - "nativeName": "मराठी (भारत)" - }, - { - "name": "ms-BN", - "displayName": "Malay (Brunei)", - "nativeName": "Bahasa Melayu (Brunei)" - }, - { - "name": "ms-MY", - "displayName": "Malay (Malaysia)", - "nativeName": "Bahasa Melayu (Malaysia)" - }, - { - "name": "ms-SG", - "displayName": "Bahasa Melayu (Singapura)", - "nativeName": "Bahasa Melayu (Singapura)" - }, - { - "name": "mt-MT", - "displayName": "Maltese (Malta)", - "nativeName": "Malti (Malta)" - }, - { - "name": "mua-CM", - "displayName": "MUNDAŊ (kameruŋ)", - "nativeName": "MUNDAŊ (kameruŋ)" - }, - { - "name": "my-MM", - "displayName": "Burmese (Myanmar)", - "nativeName": "မြန်မာ (မြန်မာ)" - }, - { - "name": "mzn-IR", - "displayName": "مازرونی (ایران)", - "nativeName": "مازرونی (ایران)" - }, - { - "name": "naq-NA", - "displayName": "Khoekhoegowab (Namibiab)", - "nativeName": "Khoekhoegowab (Namibiab)" - }, - { - "name": "nb-NO", - "displayName": "Norwegian Bokmål (Norway)", - "nativeName": "norsk bokmål (Norge)" - }, - { - "name": "nb-SJ", - "displayName": "norsk bokmål (Svalbard og Jan Mayen)", - "nativeName": "norsk bokmål (Svalbard og Jan Mayen)" - }, - { - "name": "nd-ZW", - "displayName": "isiNdebele (Zimbabwe)", - "nativeName": "isiNdebele (Zimbabwe)" - }, - { - "name": "nds-DE", - "displayName": "Neddersass’sch (Düütschland)", - "nativeName": "Neddersass’sch (Düütschland)" - }, - { - "name": "nds-NL", - "displayName": "Neddersass’sch (Nedderlannen)", - "nativeName": "Neddersass’sch (Nedderlannen)" - }, - { - "name": "ne-IN", - "displayName": "Nepali (India)", - "nativeName": "नेपाली (भारत)" - }, - { - "name": "ne-NP", - "displayName": "Nepali (Nepal)", - "nativeName": "नेपाली (नेपाल)" - }, - { - "name": "nl-AW", - "displayName": "Nederlands (Aruba)", - "nativeName": "Nederlands (Aruba)" - }, - { - "name": "nl-BE", - "displayName": "Dutch (Belgium)", - "nativeName": "Nederlands (België)" - }, - { - "name": "nl-BQ", - "displayName": "Nederlands (Bonaire, Sint Eustatius en Saba)", - "nativeName": "Nederlands (Bonaire, Sint Eustatius en Saba)" - }, - { - "name": "nl-CW", - "displayName": "Nederlands (Curaçao)", - "nativeName": "Nederlands (Curaçao)" - }, - { - "name": "nl-NL", - "displayName": "Dutch (Netherlands)", - "nativeName": "Nederlands (Nederland)" - }, - { - "name": "nl-SR", - "displayName": "Nederlands (Suriname)", - "nativeName": "Nederlands (Suriname)" - }, - { - "name": "nl-SX", - "displayName": "Nederlands (Sint-Maarten)", - "nativeName": "Nederlands (Sint-Maarten)" - }, - { - "name": "nmg-CM", - "displayName": "Kwasio (Kamerun)", - "nativeName": "Kwasio (Kamerun)" - }, - { - "name": "nn-NO", - "displayName": "Norwegian Nynorsk (Norway)", - "nativeName": "nynorsk (Noreg)" - }, - { - "name": "nnh-CM", - "displayName": "Shwóŋò ngiembɔɔn (Kàmalûm)", - "nativeName": "Shwóŋò ngiembɔɔn (Kàmalûm)" - }, - { - "name": "nqo-GN", - "displayName": "ߒߞߏ (ߖߌ߬ߣߍ߬ ߞߊ߲ߓߍ߲)", - "nativeName": "ߒߞߏ (ߖߌ߬ߣߍ߬ ߞߊ߲ߓߍ߲)" - }, - { - "name": "nr-ZA", - "displayName": "isiNdebele (South Africa)", - "nativeName": "isiNdebele (South Africa)" - }, - { - "name": "nso-ZA", - "displayName": "Sesotho sa Leboa (South Africa)", - "nativeName": "Sesotho sa Leboa (Afrika Borwa)" - }, - { - "name": "nus-SS", - "displayName": "Thok Nath (South Sudan)", - "nativeName": "Thok Nath (South Sudan)" - }, - { - "name": "nyn-UG", - "displayName": "Runyankore (Uganda)", - "nativeName": "Runyankore (Uganda)" - }, - { - "name": "oc-FR", - "displayName": "Occitan (France)", - "nativeName": "Occitan (França)" - }, - { - "name": "om-ET", - "displayName": "Oromo (Ethiopia)", - "nativeName": "Oromoo (Itoophiyaa)" - }, - { - "name": "om-KE", - "displayName": "Oromoo (Keeniyaa)", - "nativeName": "Oromoo (Keeniyaa)" - }, - { - "name": "or-IN", - "displayName": "Odia (India)", - "nativeName": "ଓଡ଼ିଆ (ଭାରତ)" - }, - { - "name": "os-GE", - "displayName": "ирон (Гуырдзыстон)", - "nativeName": "ирон (Гуырдзыстон)" - }, - { - "name": "os-RU", - "displayName": "ирон (Уӕрӕсе)", - "nativeName": "ирон (Уӕрӕсе)" - }, - { - "name": "pa-Arab-PK", - "displayName": "Punjabi (Pakistan)", - "nativeName": "پنجابی (پاکستان)" - }, - { - "name": "pa-IN", - "displayName": "Punjabi (India)", - "nativeName": "ਪੰਜਾਬੀ (ਭਾਰਤ)" - }, - { - "name": "pap-029", - "displayName": "Papiamento (Caribbean)", - "nativeName": "Papiamentu (Caribbean)" - }, - { - "name": "pl-PL", - "displayName": "Polish (Poland)", - "nativeName": "polski (Polska)" - }, - { - "name": "prg-001", - "displayName": "prūsiskan (swītai)", - "nativeName": "prūsiskan (swītai)" - }, - { - "name": "prs-AF", - "displayName": "Dari (Afghanistan)", - "nativeName": "درى (افغانستان)" - }, - { - "name": "ps-AF", - "displayName": "Pashto (Afghanistan)", - "nativeName": "پښتو (افغانستان)" - }, - { - "name": "pt-AO", - "displayName": "português (Angola)", - "nativeName": "português (Angola)" - }, - { - "name": "pt-BR", - "displayName": "Portuguese (Brazil)", - "nativeName": "português (Brasil)" - }, - { - "name": "pt-CH", - "displayName": "português (Suíça)", - "nativeName": "português (Suíça)" - }, - { - "name": "pt-CV", - "displayName": "português (Cabo Verde)", - "nativeName": "português (Cabo Verde)" - }, - { - "name": "pt-GQ", - "displayName": "português (Guiné Equatorial)", - "nativeName": "português (Guiné Equatorial)" - }, - { - "name": "pt-GW", - "displayName": "português (Guiné-Bissau)", - "nativeName": "português (Guiné-Bissau)" - }, - { - "name": "pt-LU", - "displayName": "português (Luxemburgo)", - "nativeName": "português (Luxemburgo)" - }, - { - "name": "pt-MO", - "displayName": "português (RAE de Macau)", - "nativeName": "português (RAE de Macau)" - }, - { - "name": "pt-MZ", - "displayName": "português (Moçambique)", - "nativeName": "português (Moçambique)" - }, - { - "name": "pt-PT", - "displayName": "Portuguese (Portugal)", - "nativeName": "português (Portugal)" - }, - { - "name": "pt-ST", - "displayName": "português (São Tomé e Príncipe)", - "nativeName": "português (São Tomé e Príncipe)" - }, - { - "name": "pt-TL", - "displayName": "português (Timor-Leste)", - "nativeName": "português (Timor-Leste)" - }, - { - "name": "quc-Latn-GT", - "displayName": "K'iche' (Guatemala)", - "nativeName": "K'iche' (Guatemala)" - }, - { - "name": "quz-BO", - "displayName": "Quechua (Bolivia)", - "nativeName": "Runasimi (Bolivia)" - }, - { - "name": "quz-EC", - "displayName": "Quichua (Ecuador)", - "nativeName": "Runasimi (Ecuador)" - }, - { - "name": "quz-PE", - "displayName": "Quechua (Peru)", - "nativeName": "Runasimi (Perú)" - }, - { - "name": "rm-CH", - "displayName": "Romansh (Switzerland)", - "nativeName": "rumantsch (Svizra)" - }, - { - "name": "rn-BI", - "displayName": "Ikirundi (Uburundi)", - "nativeName": "Ikirundi (Uburundi)" - }, - { - "name": "ro-MD", - "displayName": "Romanian (Moldova)", - "nativeName": "română (Republica Moldova)" - }, - { - "name": "ro-RO", - "displayName": "Romanian (Romania)", - "nativeName": "română (România)" - }, - { - "name": "rof-TZ", - "displayName": "Kihorombo (Tanzania)", - "nativeName": "Kihorombo (Tanzania)" - }, - { - "name": "ru-BY", - "displayName": "русский (Беларусь)", - "nativeName": "русский (Беларусь)" - }, - { - "name": "ru-KG", - "displayName": "русский (Киргизия)", - "nativeName": "русский (Киргизия)" - }, - { - "name": "ru-KZ", - "displayName": "русский (Казахстан)", - "nativeName": "русский (Казахстан)" - }, - { - "name": "ru-MD", - "displayName": "Russian (Moldova)", - "nativeName": "русский (Молдова)" - }, - { - "name": "ru-RU", - "displayName": "Russian (Russia)", - "nativeName": "русский (Россия)" - }, - { - "name": "ru-UA", - "displayName": "русский (Украина)", - "nativeName": "русский (Украина)" - }, - { - "name": "rw-RW", - "displayName": "Kinyarwanda (Rwanda)", - "nativeName": "Kinyarwanda (Rwanda)" - }, - { - "name": "rwk-TZ", - "displayName": "Kiruwa (Tanzania)", - "nativeName": "Kiruwa (Tanzania)" - }, - { - "name": "sa-IN", - "displayName": "Sanskrit (India)", - "nativeName": "संस्कृत (भारतम्)" - }, - { - "name": "sah-RU", - "displayName": "Sakha (Russia)", - "nativeName": "Саха (Россия)" - }, - { - "name": "saq-KE", - "displayName": "Kisampur (Kenya)", - "nativeName": "Kisampur (Kenya)" - }, - { - "name": "sbp-TZ", - "displayName": "Ishisangu (Tansaniya)", - "nativeName": "Ishisangu (Tansaniya)" - }, - { - "name": "sd-Arab-PK", - "displayName": "Sindhi (Pakistan)", - "nativeName": "سنڌي (پاکستان)" - }, - { - "name": "sd-Deva-IN", - "displayName": "Sindhi (Devanagari, India)", - "nativeName": "सिन्धी (India)" - }, - { - "name": "se-FI", - "displayName": "Sami, Northern (Finland)", - "nativeName": "davvisámegiella (Suopma)" - }, - { - "name": "se-NO", - "displayName": "Sami, Northern (Norway)", - "nativeName": "davvisámegiella (Norga)" - }, - { - "name": "se-SE", - "displayName": "Sami, Northern (Sweden)", - "nativeName": "davvisámegiella (Ruoŧŧa)" - }, - { - "name": "seh-MZ", - "displayName": "sena (Moçambique)", - "nativeName": "sena (Moçambique)" - }, - { - "name": "ses-ML", - "displayName": "Koyraboro senni (Maali)", - "nativeName": "Koyraboro senni (Maali)" - }, - { - "name": "sg-CF", - "displayName": "Sängö (Ködörösêse tî Bêafrîka)", - "nativeName": "Sängö (Ködörösêse tî Bêafrîka)" - }, - { - "name": "shi-Latn-MA", - "displayName": "Tashelḥiyt (lmɣrib)", - "nativeName": "Tashelḥiyt (lmɣrib)" - }, - { - "name": "shi-Tfng-MA", - "displayName": "ⵜⴰⵛⵍⵃⵉⵜ (ⵍⵎⵖⵔⵉⴱ)", - "nativeName": "ⵜⴰⵛⵍⵃⵉⵜ (ⵍⵎⵖⵔⵉⴱ)" - }, - { - "name": "si-LK", - "displayName": "Sinhala (Sri Lanka)", - "nativeName": "සිංහල (ශ්‍රී ලංකාව)" - }, - { - "name": "sk-SK", - "displayName": "Slovak (Slovakia)", - "nativeName": "slovenčina (Slovensko)" - }, - { - "name": "sl-SI", - "displayName": "Slovenian (Slovenia)", - "nativeName": "slovenščina (Slovenija)" - }, - { - "name": "sma-NO", - "displayName": "Sami, Southern (Norway)", - "nativeName": "åarjelsaemiengïele (Nöörje)" - }, - { - "name": "sma-SE", - "displayName": "Sami, Southern (Sweden)", - "nativeName": "åarjelsaemiengïele (Sveerje)" - }, - { - "name": "smj-NO", - "displayName": "Sami, Lule (Norway)", - "nativeName": "julevusámegiella (Vuodna)" - }, - { - "name": "smj-SE", - "displayName": "Sami, Lule (Sweden)", - "nativeName": "julevusámegiella (Svierik)" - }, - { - "name": "smn-FI", - "displayName": "Sami, Inari (Finland)", - "nativeName": "anarâškielâ (Suomâ)" - }, - { - "name": "sms-FI", - "displayName": "Sami, Skolt (Finland)", - "nativeName": "sää´mǩiõll (Lää´ddjânnam)" - }, - { - "name": "sn-Latn-ZW", - "displayName": "chiShona (Zimbabwe)", - "nativeName": "chiShona (Zimbabwe)" - }, - { - "name": "so-DJ", - "displayName": "Soomaali (Jabuuti)", - "nativeName": "Soomaali (Jabuuti)" - }, - { - "name": "so-ET", - "displayName": "Soomaali (Itoobiya)", - "nativeName": "Soomaali (Itoobiya)" - }, - { - "name": "so-KE", - "displayName": "Soomaali (Kiiniya)", - "nativeName": "Soomaali (Kiiniya)" - }, - { - "name": "so-SO", - "displayName": "Somali (Somalia)", - "nativeName": "Soomaali (Soomaaliya)" - }, - { - "name": "sq-AL", - "displayName": "Albanian (Albania)", - "nativeName": "shqip (Shqipëri)" - }, - { - "name": "sq-MK", - "displayName": "shqip (Republika e Maqedonisë)", - "nativeName": "shqip (Republika e Maqedonisë)" - }, - { - "name": "sq-XK", - "displayName": "shqip (Kosovë)", - "nativeName": "shqip (Kosovë)" - }, - { - "name": "sr-Cyrl-BA", - "displayName": "Serbian (Cyrillic, Bosnia and Herzegovina)", - "nativeName": "српски (Босна и Херцеговина)" - }, - { - "name": "sr-Cyrl-ME", - "displayName": "Serbian (Cyrillic, Montenegro)", - "nativeName": "српски (Црна Гора)" - }, - { - "name": "sr-Cyrl-RS", - "displayName": "Serbian (Cyrillic, Serbia)", - "nativeName": "српски (Србија)" - }, - { - "name": "sr-Cyrl-XK", - "displayName": "српски (Косово)", - "nativeName": "српски (Косово)" - }, - { - "name": "sr-Latn-BA", - "displayName": "Serbian (Latin, Bosnia and Herzegovina)", - "nativeName": "srpski (Bosna i Hercegovina)" - }, - { - "name": "sr-Latn-ME", - "displayName": "Serbian (Latin, Montenegro)", - "nativeName": "srpski (Crna Gora)" - }, - { - "name": "sr-Latn-RS", - "displayName": "Serbian (Latin, Serbia)", - "nativeName": "srpski (Srbija)" - }, - { - "name": "sr-Latn-XK", - "displayName": "srpski (Kosovo)", - "nativeName": "srpski (Kosovo)" - }, - { - "name": "ss-SZ", - "displayName": "siSwati (Swaziland)", - "nativeName": "siSwati (Swaziland)" - }, - { - "name": "ss-ZA", - "displayName": "siSwati (South Africa)", - "nativeName": "siSwati (South Africa)" - }, - { - "name": "ssy-ER", - "displayName": "Saho (Eretria)", - "nativeName": "Saho (Eretria)" - }, - { - "name": "st-LS", - "displayName": "Sesotho (Lesotho)", - "nativeName": "Sesotho (Lesotho)" - }, - { - "name": "st-ZA", - "displayName": "Sesotho (South Africa)", - "nativeName": "Sesotho (South Africa)" - }, - { - "name": "sv-AX", - "displayName": "svenska (Åland)", - "nativeName": "svenska (Åland)" - }, - { - "name": "sv-FI", - "displayName": "Swedish (Finland)", - "nativeName": "svenska (Finland)" - }, - { - "name": "sv-SE", - "displayName": "Swedish (Sweden)", - "nativeName": "svenska (Sverige)" - }, - { - "name": "sw-CD", - "displayName": "Kiswahili (Jamhuri ya Kidemokrasia ya Kongo)", - "nativeName": "Kiswahili (Jamhuri ya Kidemokrasia ya Kongo)" - }, - { - "name": "sw-KE", - "displayName": "Kiswahili (Kenya)", - "nativeName": "Kiswahili (Kenya)" - }, - { - "name": "sw-TZ", - "displayName": "Kiswahili (Tanzania)", - "nativeName": "Kiswahili (Tanzania)" - }, - { - "name": "sw-UG", - "displayName": "Kiswahili (Uganda)", - "nativeName": "Kiswahili (Uganda)" - }, - { - "name": "syr-SY", - "displayName": "Syriac (Syria)", - "nativeName": "ܣܘܪܝܝܐ (ܣܘܪܝܐ)" - }, - { - "name": "ta-IN", - "displayName": "Tamil (India)", - "nativeName": "தமிழ் (இந்தியா)" - }, - { - "name": "ta-LK", - "displayName": "Tamil (Sri Lanka)", - "nativeName": "தமிழ் (இலங்கை)" - }, - { - "name": "ta-MY", - "displayName": "தமிழ் (மலேசியா)", - "nativeName": "தமிழ் (மலேசியா)" - }, - { - "name": "ta-SG", - "displayName": "தமிழ் (சிங்கப்பூர்)", - "nativeName": "தமிழ் (சிங்கப்பூர்)" - }, - { - "name": "te-IN", - "displayName": "Telugu (India)", - "nativeName": "తెలుగు (భారత దేశం)" - }, - { - "name": "teo-KE", - "displayName": "Kiteso (Kenia)", - "nativeName": "Kiteso (Kenia)" - }, - { - "name": "teo-UG", - "displayName": "Kiteso (Uganda)", - "nativeName": "Kiteso (Uganda)" - }, - { - "name": "tg-Cyrl-TJ", - "displayName": "Tajik (Cyrillic, Tajikistan)", - "nativeName": "тоҷикӣ (Тоҷикистон)" - }, - { - "name": "th-TH", - "displayName": "Thai (Thailand)", - "nativeName": "ไทย (ไทย)" - }, - { - "name": "ti-ER", - "displayName": "Tigrinya (Eritrea)", - "nativeName": "ትግርኛ (ኤርትራ)" - }, - { - "name": "ti-ET", - "displayName": "Tigrinya (Ethiopia)", - "nativeName": "ትግርኛ (ኢትዮጵያ)" - }, - { - "name": "tig-ER", - "displayName": "ትግረ (ኤርትራ)", - "nativeName": "ትግረ (ኤርትራ)" - }, - { - "name": "tk-TM", - "displayName": "Turkmen (Turkmenistan)", - "nativeName": "Türkmen dili (Türkmenistan)" - }, - { - "name": "tn-BW", - "displayName": "Setswana (Botswana)", - "nativeName": "Setswana (Botswana)" - }, - { - "name": "tn-ZA", - "displayName": "Setswana (South Africa)", - "nativeName": "Setswana (Aforika Borwa)" - }, - { - "name": "to-TO", - "displayName": "lea fakatonga (Tonga)", - "nativeName": "lea fakatonga (Tonga)" - }, - { - "name": "tr-CY", - "displayName": "Türkçe (Kıbrıs)", - "nativeName": "Türkçe (Kıbrıs)" - }, - { - "name": "tr-TR", - "displayName": "Turkish (Turkey)", - "nativeName": "Türkçe (Türkiye)" - }, - { - "name": "ts-ZA", - "displayName": "Xitsonga (South Africa)", - "nativeName": "Xitsonga (South Africa)" - }, - { - "name": "tt-RU", - "displayName": "Tatar (Russia)", - "nativeName": "Татар (Россия)" - }, - { - "name": "twq-NE", - "displayName": "Tasawaq senni (Nižer)", - "nativeName": "Tasawaq senni (Nižer)" - }, - { - "name": "tzm-Arab-MA", - "displayName": "Central Atlas Tamazight (Arabic, Morocco)", - "nativeName": "أطلس المركزية التامازيتية (Morocco)" - }, - { - "name": "tzm-Latn-DZ", - "displayName": "Central Atlas Tamazight (Latin, Algeria)", - "nativeName": "Tamaziɣt n laṭlaṣ (Djazaïr)" - }, - { - "name": "tzm-Latn-MA", - "displayName": "Tamaziɣt n laṭlaṣ (Meṛṛuk)", - "nativeName": "Tamaziɣt n laṭlaṣ (Meṛṛuk)" - }, - { - "name": "tzm-Tfng-MA", - "displayName": "Central Atlas Tamazight (Tifinagh, Morocco)", - "nativeName": "ⵜⴰⵎⴰⵣⵉⵖⵜ (ⵍⵎⵖⵔⵉⴱ)" - }, - { - "name": "ug-CN", - "displayName": "Uyghur (China)", - "nativeName": "ئۇيغۇرچە (جۇڭخۇا خەلق جۇمھۇرىيىتى)" - }, - { - "name": "uk-UA", - "displayName": "Ukrainian (Ukraine)", - "nativeName": "українська (Україна)" - }, - { - "name": "ur-IN", - "displayName": "Urdu (India)", - "nativeName": "اردو (بھارت)" - }, - { - "name": "ur-PK", - "displayName": "Urdu (Pakistan)", - "nativeName": "اُردو (پاکستان)" - }, - { - "name": "uz-Arab-AF", - "displayName": "اوزبیک (افغانستان)", - "nativeName": "اوزبیک (افغانستان)" - }, - { - "name": "uz-Cyrl-UZ", - "displayName": "Uzbek (Cyrillic, Uzbekistan)", - "nativeName": "ўзбекча (Ўзбекистон)" - }, - { - "name": "uz-Latn-UZ", - "displayName": "Uzbek (Latin, Uzbekistan)", - "nativeName": "o‘zbek (Oʻzbekiston)" - }, - { - "name": "vai-Latn-LR", - "displayName": "Vai (Laibhiya)", - "nativeName": "Vai (Laibhiya)" - }, - { - "name": "vai-Vaii-LR", - "displayName": "ꕙꔤ (ꕞꔤꔫꕩ)", - "nativeName": "ꕙꔤ (ꕞꔤꔫꕩ)" - }, - { - "name": "ve-ZA", - "displayName": "Venda (South Africa)", - "nativeName": "Tshivenḓa (South Africa)" - }, - { - "name": "vi-VN", - "displayName": "Vietnamese (Vietnam)", - "nativeName": "Tiếng Việt (Việt Nam)" - }, - { - "name": "vo-001", - "displayName": "Volapük (World)", - "nativeName": "Volapük (World)" - }, - { - "name": "vun-TZ", - "displayName": "Kyivunjo (Tanzania)", - "nativeName": "Kyivunjo (Tanzania)" - }, - { - "name": "wae-CH", - "displayName": "Walser (Schwiz)", - "nativeName": "Walser (Schwiz)" - }, - { - "name": "wal-ET", - "displayName": "ወላይታቱ (ኢትዮጵያ)", - "nativeName": "ወላይታቱ (ኢትዮጵያ)" - }, - { - "name": "wo-SN", - "displayName": "Wolof (Senegal)", - "nativeName": "Wolof (Senegaal)" - }, - { - "name": "xh-ZA", - "displayName": "isiXhosa (South Africa)", - "nativeName": "isiXhosa (eMzantsi Afrika)" - }, - { - "name": "xog-UG", - "displayName": "Olusoga (Yuganda)", - "nativeName": "Olusoga (Yuganda)" - }, - { - "name": "yav-CM", - "displayName": "nuasue (Kemelún)", - "nativeName": "nuasue (Kemelún)" - }, - { - "name": "yi-001", - "displayName": "Yiddish (World)", - "nativeName": "ייִדיש (וועלט)" - }, - { - "name": "yo-BJ", - "displayName": "Èdè Yorùbá (Orílɛ́ède Bɛ̀nɛ̀)", - "nativeName": "Èdè Yorùbá (Orílɛ́ède Bɛ̀nɛ̀)" - }, - { - "name": "yo-NG", - "displayName": "Yoruba (Nigeria)", - "nativeName": "Èdè Yorùbá (Orílẹ́ède Nàìjíríà)" - }, - { - "name": "zgh-Tfng-MA", - "displayName": "ⵜⴰⵎⴰⵣⵉⵖⵜ (ⵍⵎⵖⵔⵉⴱ)", - "nativeName": "ⵜⴰⵎⴰⵣⵉⵖⵜ (ⵍⵎⵖⵔⵉⴱ)" - }, - { - "name": "zh-CN", - "displayName": "Chinese (Simplified, China)", - "nativeName": "中文(中国)" - }, - { - "name": "zh-Hans-HK", - "displayName": "中文 (香港特别行政区)", - "nativeName": "中文 (香港特别行政区)" - }, - { - "name": "zh-Hans-MO", - "displayName": "中文 (澳门特别行政区)", - "nativeName": "中文 (澳门特别行政区)" - }, - { - "name": "zh-HK", - "displayName": "Chinese (Traditional, Hong Kong SAR)", - "nativeName": "中文(香港特別行政區)" - }, - { - "name": "zh-MO", - "displayName": "Chinese (Traditional, Macao SAR)", - "nativeName": "中文(澳門特別行政區)" - }, - { - "name": "zh-SG", - "displayName": "Chinese (Simplified, Singapore)", - "nativeName": "中文(新加坡)" - }, - { - "name": "zh-TW", - "displayName": "Chinese (Traditional, Taiwan)", - "nativeName": "中文(台灣)" - }, - { - "name": "zu-ZA", - "displayName": "isiZulu (South Africa)", - "nativeName": "isiZulu (i-South Africa)" - } -] diff --git a/dmp-frontend/src/assets/resources/locales.json b/dmp-frontend/src/assets/resources/locales.json deleted file mode 100644 index e69de29bb..000000000 diff --git a/dmp-frontend/src/common/base/base-editor.ts b/dmp-frontend/src/common/base/base-editor.ts index 7a1f9f464..3cff0d2e0 100644 --- a/dmp-frontend/src/common/base/base-editor.ts +++ b/dmp-frontend/src/common/base/base-editor.ts @@ -1,4 +1,3 @@ -import { DatePipe } from '@angular/common'; import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; import { UntypedFormGroup } from '@angular/forms'; @@ -62,7 +61,6 @@ export abstract class BaseEditor 11) { + throw Error(`Invalid month index "${month}". Month index has to be between 0 and 11.`); + } + + if (date < 1) { + throw Error(`Invalid date "${date}". Date has to be greater than 0.`); + } + + if (hour < 0 || hour > 23) { + throw Error(`Invalid hours "${hour}". Hours has to be between 0 and 23.`); + } + + if (minute < 0 || minute > 59) { + throw Error(`Invalid minutes "${minute}". Minutes has to between 0 and 59.`); + } + + + const result = moment.utc({ year, month, date, hour, minute }).locale(this.locale); + + + if (this.timezoneService) {// !!GOTCHA! super() calls createDate . At that moment it has no timezoneService + result.tz(this.timezoneService.getCurrentTimezone(), true) + } + + // If the result isn't valid, the date must have been out of bounds for this month. + if (!result.isValid()) { + throw Error(`Invalid date "${date}" for month with index "${month}".`); + } + + + + return result; + } + + // manually writing on the textbox + parse(value: any, parseFormat: string | string[]): Moment | null { + const initialParse = super.parse(value, parseFormat); + if (!initialParse) { + return null + } + + if (!initialParse.isValid()) { return initialParse; } + + const result = moment.utc({ + year: initialParse.year(), + month: initialParse.month(), + date: initialParse.date(), + hour: initialParse.hour(), + minute: initialParse.minute() + }).locale(this.locale) + .tz(this.timezoneService.getCurrentTimezone(), true) + return result; + } + + format(date: Moment, displayFormat: string): string { + date.tz(this.timezoneService.getCurrentTimezone()); + return super.format(date, displayFormat); + } +} diff --git a/dmp-frontend/src/common/formatting/common-formatting.module.ts b/dmp-frontend/src/common/formatting/common-formatting.module.ts index eea51fd69..c4f720963 100644 --- a/dmp-frontend/src/common/formatting/common-formatting.module.ts +++ b/dmp-frontend/src/common/formatting/common-formatting.module.ts @@ -1,8 +1,6 @@ import { NgModule } from '@angular/core'; import { ArrayToStringPipe } from '@common/formatting/pipes/array-to-string.pipe'; -import { DataTableDateFormatPipe, DateFormatPipe } from '@common/formatting/pipes/date-format.pipe'; import { DataTableDateOnlyFormatPipe, DateOnlyPipe } from '@common/formatting/pipes/date-only-format.pipe'; -import { DataTableDateTimeFormatPipe, DateTimeFormatPipe } from '@common/formatting/pipes/date-time-format.pipe'; import { LowercaseFirstLetterPipe } from '@common/formatting/pipes/lowercase-first-letter.pipe'; import { IsActiveTypePipe } from './pipes/is-active-type.pipe'; import { NotificationContactTypePipe } from './pipes/notification-contact-type.pipe'; @@ -22,10 +20,6 @@ import { LockTargetTypePipe } from './pipes/lock-target-type.pipe'; // @NgModule({ declarations: [ - DateFormatPipe, - DateTimeFormatPipe, - DataTableDateFormatPipe, - DataTableDateTimeFormatPipe, LowercaseFirstLetterPipe, ArrayToStringPipe, DateOnlyPipe, @@ -42,10 +36,6 @@ import { LockTargetTypePipe } from './pipes/lock-target-type.pipe'; LockTargetTypePipe ], exports: [ - DateFormatPipe, - DateTimeFormatPipe, - DataTableDateFormatPipe, - DataTableDateTimeFormatPipe, LowercaseFirstLetterPipe, ArrayToStringPipe, DateOnlyPipe, @@ -62,10 +52,6 @@ import { LockTargetTypePipe } from './pipes/lock-target-type.pipe'; LockTargetTypePipe ], providers: [ - DateFormatPipe, - DateTimeFormatPipe, - DataTableDateFormatPipe, - DataTableDateTimeFormatPipe, LowercaseFirstLetterPipe, ArrayToStringPipe, DateOnlyPipe, diff --git a/dmp-frontend/src/common/formatting/pipes/date-format.pipe.ts b/dmp-frontend/src/common/formatting/pipes/date-format.pipe.ts deleted file mode 100644 index 9cffc2d3a..000000000 --- a/dmp-frontend/src/common/formatting/pipes/date-format.pipe.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { DatePipe } from '@angular/common'; -import { Pipe, PipeTransform } from '@angular/core'; -import moment from 'moment'; -import 'moment-timezone'; - - -/** - * @deprecated - */ -@Pipe({ - name: 'dateFormatter' -}) -export class DateFormatPipe implements PipeTransform { - - constructor(private datePipe: DatePipe) { - - } - - transform(value: any, format?: string, locale?: string): string | null { - // using timezone set in timezoneService by default. can be overwritten with pipe arguments - const timezoneToUse = moment(value).tz('UTC').format('Z'); - return this.datePipe.transform(value, format, timezoneToUse, locale); - } -} -/** - * @deprecated - */ -@Pipe({ - name: 'dataTableDateFormatter' -}) -// This is only used for the DataTable Column definition. -// It's a hacky way to apply format to the pipe because it only supports passing a pipe instance and calls transform in it without params. -export class DataTableDateFormatPipe extends DateFormatPipe implements PipeTransform { - - format: string; - - constructor(_datePipe: DatePipe) { - super(_datePipe); - } - - public withFormat(format: string): DataTableDateFormatPipe { - this.format = format; - return this; - } - - transform(value: any): string | null { - return super.transform(value, this.format); - } -} diff --git a/dmp-frontend/src/common/formatting/pipes/date-time-format.pipe.ts b/dmp-frontend/src/common/formatting/pipes/date-time-format.pipe.ts deleted file mode 100644 index 09c4fdaa6..000000000 --- a/dmp-frontend/src/common/formatting/pipes/date-time-format.pipe.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { DatePipe } from '@angular/common'; -import { Pipe, PipeTransform } from '@angular/core'; -import { CultureService } from '@app/core/services/culture/culture-service'; -import { TimezoneService } from '@app/core/services/timezone/timezone-service'; -import moment from 'moment'; -import 'moment-timezone'; - -@Pipe({ - name: 'dateTimeFormatter' -}) -export class DateTimeFormatPipe implements PipeTransform { - - constructor(private datePipe: DatePipe, private timezoneService: TimezoneService, private cultureService: CultureService) { - - } - - transform(value: any, format?: string, timezone?: string, locale?: string): string | null { - // using timezone set in timezoneService by default. can be overwritten with pipe arguments - const timezoneToUse = timezone ? timezone : moment(value).tz(this.timezoneService.getCurrentTimezone()).format('Z'); - const localeToUse = locale ? locale : this.cultureService.getCurrentCulture().name; - return this.datePipe.transform(value, format, timezoneToUse, localeToUse); - } -} - - -@Pipe({ - name: 'dataTableDateTimeFormatter' -}) -// This is only used for the DataTable Column definition. -// It's a hacky way to apply format to the pipe because it only supports passing a pipe instance and calls transform in it without params. -export class DataTableDateTimeFormatPipe extends DateTimeFormatPipe implements PipeTransform { - - format: string; - - constructor(private _datePipe: DatePipe, private _timezoneService: TimezoneService, private _cultureService: CultureService) { - super(_datePipe, _timezoneService, _cultureService); - } - - public withFormat(format: string): DataTableDateTimeFormatPipe { - this.format = format; - return this; - } - - transform(value: any): string | null { - return super.transform(value, this.format); - } -} diff --git a/dmp-frontend/src/common/modules/errors/errors.module.ts b/dmp-frontend/src/common/modules/errors/errors.module.ts index d630e7a17..1b883b56e 100644 --- a/dmp-frontend/src/common/modules/errors/errors.module.ts +++ b/dmp-frontend/src/common/modules/errors/errors.module.ts @@ -31,4 +31,4 @@ import { ServerErrorsInterceptor } from '@common/modules/errors/server-errors-in }, ] }) -export class ErrorsModule { } +export class ErrorsModule { } //not used diff --git a/dmp-frontend/src/notification-service/ui/admin/notification-template/editor/notification-template-editor.component.ts b/dmp-frontend/src/notification-service/ui/admin/notification-template/editor/notification-template-editor.component.ts index eae6adc1b..24d76b6dc 100644 --- a/dmp-frontend/src/notification-service/ui/admin/notification-template/editor/notification-template-editor.component.ts +++ b/dmp-frontend/src/notification-service/ui/admin/notification-template/editor/notification-template-editor.component.ts @@ -1,42 +1,40 @@ import { Component, OnInit } from '@angular/core'; -import { FormArray, UntypedFormGroup } from '@angular/forms'; +import { UntypedFormGroup } from '@angular/forms'; +import { MatCheckboxChange } from '@angular/material/checkbox'; +import { MatChipEditedEvent, MatChipInputEvent } from '@angular/material/chips'; import { MatDialog } from '@angular/material/dialog'; +import { Title } from '@angular/platform-browser'; +import { ActivatedRoute, Router } from '@angular/router'; +import { AppPermission } from '@app/core/common/enum/permission.enum'; +import { Language } from '@app/core/model/language/language'; import { AuthService } from '@app/core/services/auth/auth.service'; +import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; +import { LanguageHttpService } from '@app/core/services/language/language.http.service'; +import { LockService } from '@app/core/services/lock/lock.service'; +import { LoggingService } from '@app/core/services/logging/logging-service'; +import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; +import { BaseEditor } from '@common/base/base-editor'; import { FormService } from '@common/forms/form-service'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/http-error-handling.service'; -import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; -import { TranslateService } from '@ngx-translate/core'; -import { AppPermission } from '@app/core/common/enum/permission.enum'; -import { NotificationTemplate, NotificationTemplatePersist } from '@notification-service/core/model/notification-template.model'; -import { NotificationTemplateService } from '@notification-service/services/http/notification-template.service'; -import { NotificationFieldInfoEditorModel, NotificationFieldOptionsEditorModel, NotificationTemplateEditorModel } from './notification-template-editor.model'; -import { map, takeUntil } from 'rxjs/operators'; -import { BaseEditor } from '@common/base/base-editor'; -import { ActivatedRoute, Router } from '@angular/router'; import { FilterService } from '@common/modules/text-filter/filter-service'; -import { DatePipe } from '@angular/common'; -import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; -import { NotificationServiceEnumUtils } from '@notification-service/core/formatting/enum-utils.service'; -import { NotificationTemplateEditorService } from './notification-template-editor.service'; import { Guid } from '@common/types/guid'; -import { NotificationTemplateEditorResolver } from './notification-template-editor.resolver'; -import { LoggingService } from '@app/core/services/logging/logging-service'; -import { LanguageHttpService } from '@app/core/services/language/language.http.service'; -import { Language } from '@app/core/model/language/language'; -import { nameof } from 'ts-simple-nameof'; -import { MatChipEditedEvent, MatChipInputEvent } from '@angular/material/chips'; -import { MatCheckboxChange } from '@angular/material/checkbox'; -import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; -import { LockService } from '@app/core/services/lock/lock.service'; +import { TranslateService } from '@ngx-translate/core'; +import { EmailOverrideMode } from '@notification-service/core/enum/email-override-mode'; import { IsActive } from '@notification-service/core/enum/is-active.enum'; +import { NotificationDataType } from '@notification-service/core/enum/notification-data-type'; import { NotificationTemplateChannel } from '@notification-service/core/enum/notification-template-channel.enum'; import { NotificationTemplateKind } from '@notification-service/core/enum/notification-template-kind.enum'; import { NotificationType } from '@notification-service/core/enum/notification-type.enum'; -import { EmailOverrideMode } from '@notification-service/core/enum/email-override-mode'; -import { NotificationDataType } from '@notification-service/core/enum/notification-data-type'; -import { Title } from '@angular/platform-browser'; -import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; +import { NotificationServiceEnumUtils } from '@notification-service/core/formatting/enum-utils.service'; +import { NotificationTemplate, NotificationTemplatePersist } from '@notification-service/core/model/notification-template.model'; +import { NotificationTemplateService } from '@notification-service/services/http/notification-template.service'; +import { map, takeUntil } from 'rxjs/operators'; +import { NotificationTemplateEditorModel } from './notification-template-editor.model'; +import { NotificationTemplateEditorResolver } from './notification-template-editor.resolver'; +import { NotificationTemplateEditorService } from './notification-template-editor.service'; @Component({ selector: 'app-notification-template-editor', @@ -87,7 +85,6 @@ export class NotificationTemplateEditorComponent extends BaseEditor @@ -40,7 +40,7 @@
- {{item?.name | nullifyValue}}
@@ -98,7 +98,7 @@ more_horiz -