diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dec16be5..f8e3dd7cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,33 @@ +## v2.105.7 - 2024-10-02 + +[Full Changelog](https://github.com/ORCID/orcid-angular/compare/v2.105.6...v2.105.7) + +- [#2358](https://github.com/ORCID/orcid-angular/pull/2358): lmendoza/fixes-oct-1 +- [#2359](https://github.com/ORCID/orcid-angular/pull/2359): tx pull + +## v2.105.6 - 2024-09-26 + +[Full Changelog](https://github.com/ORCID/orcid-angular/compare/v2.105.5...v2.105.6) + +- [#2355](https://github.com/ORCID/orcid-angular/pull/2355): Observability +- [#2354](https://github.com/ORCID/orcid-angular/pull/2354): lmendoza/sep-25-batch-of-fixes + +## v2.105.5 - 2024-09-25 + +[Full Changelog](https://github.com/ORCID/orcid-angular/compare/v2.105.4...v2.105.5) + +- [#2353](https://github.com/ORCID/orcid-angular/pull/2353): 24-sep-bach-fixes + +## v2.105.4 - 2024-09-24 + +[Full Changelog](https://github.com/ORCID/orcid-angular/compare/v2.105.3...v2.105.4) + +- [#2352](https://github.com/ORCID/orcid-angular/pull/2352): summary-batch-update-sep + +## v2.105.3 - 2024-09-19 + +[Full Changelog](https://github.com/ORCID/orcid-angular/compare/v2.105.2...v2.105.3) + ## v2.105.2 - 2024-09-13 [Full Changelog](https://github.com/ORCID/orcid-angular/compare/v2.105.1...v2.105.2) diff --git a/src/app/cdk/trusted-summary/component/summary-simple-panel/summary-simple-panel.component.ts b/src/app/cdk/trusted-summary/component/summary-simple-panel/summary-simple-panel.component.ts index 5153a515c..182e2fa4b 100644 --- a/src/app/cdk/trusted-summary/component/summary-simple-panel/summary-simple-panel.component.ts +++ b/src/app/cdk/trusted-summary/component/summary-simple-panel/summary-simple-panel.component.ts @@ -46,7 +46,8 @@ export class SummarySimplePanelComponent implements OnInit { constructor(@Inject(WINDOW) private _window: Window) {} ngOnInit(): void { - this.acitivityCountOverflow = this.simpleActivities.length > 3 + this.acitivityCountOverflow = + this.simpleActivities.length > 3 || this.count > 3 this.simpleActivities = this.simpleActivities.slice(0, 3) } goToUrl(url?: string, event?: KeyboardEvent) { diff --git a/src/app/cdk/trusted-summary/component/trusted-summary/trusted-summary.component.html b/src/app/cdk/trusted-summary/component/trusted-summary/trusted-summary.component.html index 4242e5f31..433600d26 100644 --- a/src/app/cdk/trusted-summary/component/trusted-summary/trusted-summary.component.html +++ b/src/app/cdk/trusted-summary/component/trusted-summary/trusted-summary.component.html @@ -144,6 +144,38 @@

[activitySection]="'affiliations'" > + + +

+ EMAIL DOMAINS +

+
+ +

KEY DATES @@ -193,7 +225,12 @@

@@ -311,6 +375,38 @@

[activitySection]="'professional-activities'" > + + +

+ EDUCATION AND QUALIFICATIONS +

+
+ +
(click)="goToActivitySection('other-identifiers')" (keydown)="goToActivitySection('other-identifiers', $event)" [attr.aria-label]="ariaLabelIdentifiers" + (mouseenter)="externalIdentifiersHover = true" + (mouseleave)="externalIdentifiersHover = false" >

1 + ? this.labelValidatedResearchResources + : this.labelValidatedResearchResource, + }) + } + if (this.trustedSummary.selfAssertedResearchResources) { + this.researchResoruces.push({ + verified: false, + countA: this.trustedSummary.selfAssertedResearchResources, + stringA: + this.trustedSummary.selfAssertedResearchResources > 1 + ? this.labelSelfAssertedResearchResources + : this.labelSelfAssertedResearchResource, + }) + } + if (this.trustedSummary.selfAssertedFunds) { this.funds.push({ verified: false, @@ -204,41 +258,62 @@ export class TrustedSummaryComponent implements OnInit, OnDestroy { } } ) - + this.emailDomains = this.trustedSummary.emailDomains?.map((domain) => { + return { + verified: true, + stringA: domain.value, + } + }) if ( (this.works.length > 0 || this.funds.length > 0 || - this.peerReviews.length > 0) && + this.peerReviews.length > 0 || + this.researchResoruces.length) && (this.externalIdentifiers?.length > 0 || this.trustedSummary.professionalActivitiesCount > 0 || - this.trustedSummary.externalIdentifiers.length > 0) + this.trustedSummary.educationQualifications?.length > 0) ) { this.threeColumns = true } else if ( this.works.length > 0 || this.funds.length > 0 || this.peerReviews.length > 0 || + this.researchResoruces.length > 0 || this.externalIdentifiers?.length > 0 || - this.trustedSummary.professionalActivitiesCount > 0 + this.trustedSummary.professionalActivitiesCount > 0 || + this.trustedSummary.educationQualifications?.length > 0 ) { this.twoColumns = true } else { this.oneColumn = true } + this._changeDetectorRef.markForCheck() this.ariaLabelAffiliations = this.getAriaLabelSection( this.labelViewAffiliations ) this.ariaLabelWorks = this.getAriaLabelSection(this.labelViewWorks) this.ariaLabelFundings = this.getAriaLabelSection(this.labelViewFundings) + this.ariaLabelResearchResources = this.getAriaLabelSection( + this.labelViewResearchResources + ) this.ariaLabelPeerReviews = this.getAriaLabelSection( this.labelViewPeerReviews ) this.ariaLabelProfessionalActivities = this.getAriaLabelSection( this.labelViewProfessionalActivities ) + + this.ariaLabelEducationQualificationsActions = this.getAriaLabelSection( + this.labelViewEducationQualificationsActivities + ) + this.ariaLabelIdentifiers = this.getAriaLabelSection( this.labelViewIdentifiers ) + + this.ariaLabelEmailDomains = this.getAriaLabelSection( + this.labelViewDomain + ) }) } dateWithOffset(creation: string): any { diff --git a/src/app/core/observability-events/observability-events.service.ts b/src/app/core/observability-events/observability-events.service.ts new file mode 100644 index 000000000..958da77e4 --- /dev/null +++ b/src/app/core/observability-events/observability-events.service.ts @@ -0,0 +1,110 @@ +import { Inject, Injectable } from '@angular/core' +import { WINDOW } from 'src/app/cdk/window' +import { environment } from 'src/environments/environment' + +export type JourneyType = 'orcid_registration' | 'orcid_update_emails' +@Injectable({ + providedIn: 'root', +}) +export class CustomEventService { + // Store the start times of each journey + private journeys: { [key: string]: { startTime: number; attributes: any } } = + {} + + constructor(@Inject(WINDOW) private window: Window) {} + + /** + * Starts a new user journey. + * @param journeyType The type of the journey (e.g., 'orcid_registration', 'orcid_update_emails'). + * @param attributes Additional attributes to store with the journey + */ + startJourney(journeyType: JourneyType, attributes: any = {}): void { + // Record the start time and initial attributes + this.journeys[journeyType] = { + startTime: Date.now(), + attributes, + } + + if (environment.debugger) { + console.debug( + `-> Journey "${journeyType}" started at ${this.journeys[journeyType].startTime}`, + attributes + ) + } + } + + /** + * Records an event within the journey. + * @param journeyType The type of the journey (e.g., 'orcid_registration'). + * @param eventName The name of the event to track (e.g., 'page_loaded', 'form_submitted'). + * @param additionalAttributes Any additional attributes related to the event. + */ + recordEvent( + journeyType: JourneyType, + eventName: string, + additionalAttributes: any = {} + ): void { + if (!this.journeys[journeyType]) { + console.error(`Journey "${journeyType}" not started.`) + return + } + + // Calculate time since the start of the journey + const elapsedTime = Date.now() - this.journeys[journeyType].startTime + + // Combine the journey attributes with additional attributes + const eventAttributes = { + ...this.journeys[journeyType].attributes, + ...additionalAttributes, + eventName, + elapsedTime, + } + if (typeof (this.window as any)?.addPageAction === 'function') { + ;(this.window as any).newrelic.addPageAction(journeyType, eventAttributes) + } + // Send the custom event to New Relic + + if (environment.debugger) { + console.debug( + `-> Event "${eventName}" recorded for journey "${journeyType}" with elapsed time ${elapsedTime}ms`, + eventAttributes + ) + } + } + + /** + * Finishes the user journey. + * @param journeyType The type of the journey (e.g., 'orcid_registration'). + * @param additionalAttributes Any final attributes or metadata to log at the end of the journey. + */ + finishJourney(journeyType: string, additionalAttributes: any = {}): void { + if (!this.journeys[journeyType]) { + console.error(`Journey "${journeyType}" not started.`) + return + } + + // Calculate time since the start of the journey + const elapsedTime = Date.now() - this.journeys[journeyType].startTime + + // Final event attributes + const finalAttributes = { + ...this.journeys[journeyType].attributes, + ...additionalAttributes, + eventName: 'journey_finished', + elapsedTime, + } + + // Send the final custom event to New Relic + if (typeof (this.window as any)?.addPageAction === 'function') { + ;(this.window as any).addPageAction(journeyType, finalAttributes) + } + + // Clean up the journey data + delete this.journeys[journeyType] + + console.debug( + `Journey "${journeyType}" finished with elapsed time ${elapsedTime}ms`, + finalAttributes + ) + } +} diff --git a/src/app/record/components/affiliation-stacks-groups/affiliation-stacks-groups.component.html b/src/app/record/components/affiliation-stacks-groups/affiliation-stacks-groups.component.html index f75c16f58..dad742dbc 100644 --- a/src/app/record/components/affiliation-stacks-groups/affiliation-stacks-groups.component.html +++ b/src/app/record/components/affiliation-stacks-groups/affiliation-stacks-groups.component.html @@ -60,7 +60,8 @@ - x === this.fragment) ) { setTimeout(() => { diff --git a/src/app/register2/components/form-anti-robots/form-anti-robots.component.ts b/src/app/register2/components/form-anti-robots/form-anti-robots.component.ts index 8e4deb525..7c9a67ad7 100644 --- a/src/app/register2/components/form-anti-robots/form-anti-robots.component.ts +++ b/src/app/register2/components/form-anti-robots/form-anti-robots.component.ts @@ -12,6 +12,7 @@ import { merge, Subject } from 'rxjs' import { Register2Service } from 'src/app/core/register2/register2.service' import { BaseForm } from '../BaseForm' +import { RegisterStateService } from '../../register-state.service' @Component({ selector: 'app-form-anti-robots', @@ -31,11 +32,11 @@ import { BaseForm } from '../BaseForm' ], }) export class FormAntiRobotsComponent extends BaseForm implements OnInit { - @Input() nextButtonWasClicked captchaFailState = false captchaLoadedWithWidgetId: number $widgetIdUpdated = new Subject() errorState = false + nextButtonWasClicked = false captcha = new UntypedFormControl(null, { validators: [this.captchaValidator()], }) @@ -43,11 +44,14 @@ export class FormAntiRobotsComponent extends BaseForm implements OnInit { this.form = new UntypedFormGroup({ captcha: this.captcha, }) + this._registerStateService.getNextButtonClickFor('d').subscribe(() => { + this.nextButtonWasClicked = true + }) } constructor( private _register: Register2Service, - private _errorStateMatcher: ErrorStateMatcher + private _registerStateService: RegisterStateService ) { super() } diff --git a/src/app/register2/components/form-current-employment/form-current-employment.component.ts b/src/app/register2/components/form-current-employment/form-current-employment.component.ts index ef6c2dd63..67576ba86 100644 --- a/src/app/register2/components/form-current-employment/form-current-employment.component.ts +++ b/src/app/register2/components/form-current-employment/form-current-employment.component.ts @@ -1,4 +1,11 @@ -import { Component, forwardRef, Input, OnInit, ViewChild } from '@angular/core' +import { + Component, + forwardRef, + Input, + OnDestroy, + OnInit, + ViewChild, +} from '@angular/core' import { FormBuilder, FormControl, @@ -14,7 +21,7 @@ import { import { Register2Service } from 'src/app/core/register2/register2.service' import { OrcidValidators } from 'src/app/validators' -import { first, switchMap, tap } from 'rxjs/operators' +import { first, switchMap, takeUntil, tap } from 'rxjs/operators' import { ReactivationService } from '../../../core/reactivation/reactivation.service' import { ReactivationLocal } from '../../../types/reactivation.local' import { BaseForm } from '../BaseForm' @@ -27,11 +34,12 @@ import { AffiliationType, Organization, } from 'src/app/types/record-affiliation.endpoint' -import { EMPTY, Observable, of } from 'rxjs' +import { EMPTY, Observable, of, Subject } from 'rxjs' import { RecordAffiliationService } from 'src/app/core/record-affiliations/record-affiliations.service' import { dateMonthYearValidator } from 'src/app/shared/validators/date/date.validator' import { RegisterStateService } from '../../register-state.service' import { OrgDisambiguated } from 'src/app/types' +import { RegisterObservabilityService } from '../../register-observability.service' export class MyErrorStateMatcher implements ErrorStateMatcher { isErrorState( control: FormControl | null, @@ -69,7 +77,10 @@ export class MyErrorStateMatcher implements ErrorStateMatcher { }, ], }) -export class FormCurrentEmploymentComponent extends BaseForm implements OnInit { +export class FormCurrentEmploymentComponent + extends BaseForm + implements OnInit, OnDestroy +{ // matcher = new MyErrorStateMatcher() selectedOrganizationFromDatabase: Organization displayOrganizationHint: boolean @@ -77,6 +88,7 @@ export class FormCurrentEmploymentComponent extends BaseForm implements OnInit { private _type: AffiliationType affiliationFound = false rorIdHasBeenMatched: boolean + destroy = new Subject() @Input() public get type(): AffiliationType { @@ -85,7 +97,7 @@ export class FormCurrentEmploymentComponent extends BaseForm implements OnInit { filteredOptions: Observable - @Input() nextButtonWasClicked: boolean + nextButtonWasClicked: boolean @Input() reactivation: ReactivationLocal @ViewChild(FormGroupDirective) formGroupDir: FormGroupDirective ariaLabelClearOrganization = $localize`:@@register.clearOrganization:Clear organization` @@ -119,7 +131,8 @@ export class FormCurrentEmploymentComponent extends BaseForm implements OnInit { private _liveAnnouncer: LiveAnnouncer, private _recordAffiliationService: RecordAffiliationService, private _formBuilder: FormBuilder, - private registerStateService: RegisterStateService + private registerStateService: RegisterStateService, + private _registerObservabilityService: RegisterObservabilityService ) { super() this._platform.get().subscribe((platform) => { @@ -127,8 +140,24 @@ export class FormCurrentEmploymentComponent extends BaseForm implements OnInit { this.isMobile = platform.columns4 || platform.columns8 }) } + ngOnDestroy(): void { + this.destroy.next() + } ngOnInit() { + this.registerStateService + .getNextButtonClickFor('c2') + .pipe(takeUntil(this.destroy)) + .subscribe(() => { + this.nextButtonWasClicked = true + this._registerObservabilityService.stepC2NextButtonClicked(this.form) + }) + this.registerStateService + .getSkipButtonClickFor('c2') + .pipe(takeUntil(this.destroy)) + .subscribe(() => { + this._registerObservabilityService.stepC2SkipButtonClicked(this.form) + }) this.registerStateService.matchOrganization$.subscribe((organization) => { this.organization = organization this.form.patchValue({ diff --git a/src/app/register2/components/form-password/form-password.component.ts b/src/app/register2/components/form-password/form-password.component.ts index 4aeb9f34f..248522899 100644 --- a/src/app/register2/components/form-password/form-password.component.ts +++ b/src/app/register2/components/form-password/form-password.component.ts @@ -3,6 +3,7 @@ import { Component, forwardRef, Input, + OnDestroy, OnInit, ViewChild, } from '@angular/core' @@ -22,6 +23,10 @@ import { OrcidValidators } from 'src/app/validators' import { BaseForm } from '../BaseForm' import { LiveAnnouncer } from '@angular/cdk/a11y' import { environment } from 'src/environments/environment' +import { RegisterObservabilityService } from '../../register-observability.service' +import { RegisterStateService } from '../../register-state.service' +import { Subject } from 'rxjs' +import { takeUntil } from 'rxjs/operators' @Component({ selector: 'app-form-password', @@ -46,7 +51,10 @@ import { environment } from 'src/environments/environment' ], preserveWhitespaces: true, }) -export class FormPasswordComponent extends BaseForm implements OnInit { +export class FormPasswordComponent + extends BaseForm + implements OnInit, OnDestroy +{ labelInfo = $localize`:@@register.ariaLabelInfoPassword:info about password` labelClose = $localize`:@@register.ariaLabelClose:close` labelConfirmPassword = $localize`:@@register.confirmYourPassword:Confirm your password` @@ -63,20 +71,31 @@ export class FormPasswordComponent extends BaseForm implements OnInit { hasNumberPattern = HAS_NUMBER hasLetterOrSymbolPattern = HAS_LETTER_OR_SYMBOL @Input() personalData: RegisterForm - @Input() nextButtonWasClicked: boolean + nextButtonWasClicked: boolean + currentValidate8orMoreCharactersStatus: boolean ccurentValidateAtLeastALetterOrSymbolStatus: boolean currentValidateAtLeastANumber: boolean passwordsValidAreValidAlreadyChecked: any _currentAccesibilityError: string + destroy = new Subject() constructor( private _register: Register2Service, private _liveAnnouncer: LiveAnnouncer, - private _changeDetectorRef: ChangeDetectorRef + private _changeDetectorRef: ChangeDetectorRef, + private _registerObservability: RegisterObservabilityService, + private _registerStateService: RegisterStateService ) { super() } ngOnInit() { + this._registerStateService + .getNextButtonClickFor('b') + .pipe(takeUntil(this.destroy)) + .subscribe((value) => { + this.nextButtonWasClicked = true + this._registerObservability.stepBNextButtonClicked(this.form) + }) this.form = new UntypedFormGroup( { password: new UntypedFormControl('', { @@ -212,6 +231,7 @@ export class FormPasswordComponent extends BaseForm implements OnInit { } this._currentAccesibilityError = value if (!value) { + this._registerObservability.reportRegisterEvent('password_valid') this.announce( $localize`:@@register.allPasswordContrainsArMet:All password constraints are met` ) @@ -244,6 +264,7 @@ export class FormPasswordComponent extends BaseForm implements OnInit { const validStatus = this.confirmPasswordValid && this.passwordValid if (!this.passwordsValidAreValidAlreadyChecked && validStatus) { + this._registerObservability.reportRegisterEvent('password_match') this.announce( $localize`:@@register.passwordAreValid:Your passwords match` ) @@ -295,4 +316,8 @@ export class FormPasswordComponent extends BaseForm implements OnInit { } this._liveAnnouncer.announce(announcement, 'assertive') } + + ngOnDestroy(): void { + this.destroy.next() + } } diff --git a/src/app/register2/components/form-personal/form-personal.component.ts b/src/app/register2/components/form-personal/form-personal.component.ts index dfe10074e..043b19e13 100644 --- a/src/app/register2/components/form-personal/form-personal.component.ts +++ b/src/app/register2/components/form-personal/form-personal.component.ts @@ -5,6 +5,7 @@ import { forwardRef, Inject, Input, + OnDestroy, OnInit, ViewChild, } from '@angular/core' @@ -30,6 +31,7 @@ import { startWith, switchMap, take, + takeUntil, } from 'rxjs/operators' import { ReactivationService } from '../../../core/reactivation/reactivation.service' import { ReactivationLocal } from '../../../types/reactivation.local' @@ -50,6 +52,8 @@ import { SignInService } from 'src/app/core/sign-in/sign-in.service' import { ErrorHandlerService } from 'src/app/core/error-handler/error-handler.service' import { ERROR_REPORT } from 'src/app/errors' import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' +import { Subject } from 'rxjs' export class MyErrorStateMatcher implements ErrorStateMatcher { isErrorState( control: FormControl | null, @@ -86,9 +90,11 @@ export class MyErrorStateMatcher implements ErrorStateMatcher { }, ], }) -export class FormPersonalComponent extends BaseForm implements OnInit { +export class FormPersonalComponent + extends BaseForm + implements OnInit, OnDestroy +{ matcher = new MyErrorStateMatcher() - @Input() nextButtonWasClicked: boolean @Input() reactivation: ReactivationLocal @ViewChild(FormGroupDirective) formGroupDir: FormGroupDirective emailPlaceholder = $localize`:@@register.emailPlaceholder:The email address you use most` @@ -104,6 +110,8 @@ export class FormPersonalComponent extends BaseForm implements OnInit { undefinedEmail: boolean emailsAreValidAlreadyChecked: boolean registerBackendErrors: RegisterBackendErrors + nextButtonWasClicked: boolean + destroy = new Subject() constructor( private _register: Register2Service, @@ -115,10 +123,14 @@ export class FormPersonalComponent extends BaseForm implements OnInit { private _signIn: SignInService, private _errorHandler: ErrorHandlerService, private _registerStateService: RegisterStateService, - @Inject(WINDOW) private window: Window + @Inject(WINDOW) private window: Window, + private _registerObservability: RegisterObservabilityService ) { super() } + ngOnDestroy(): void { + this.destroy.next() + } emails: UntypedFormGroup = new UntypedFormGroup({}) additionalEmails: UntypedFormGroup = new UntypedFormGroup({ @@ -129,6 +141,13 @@ export class FormPersonalComponent extends BaseForm implements OnInit { }) ngOnInit() { + this._registerStateService + .getNextButtonClickFor('a') + .pipe(takeUntil(this.destroy)) + .subscribe((value) => { + this.nextButtonWasClicked = true + this._registerObservability.stepANextButtonClicked(this.form) + }) this.emails = new UntypedFormGroup( { email: new UntypedFormControl('', { @@ -312,7 +331,9 @@ export class FormPersonalComponent extends BaseForm implements OnInit { const validStatus = this.emailConfirmationValid && this.emailValid if (!this.emailsAreValidAlreadyChecked && validStatus) { this.announce($localize`:@@register.emailAreValid:Your emails match`) + this._registerObservability.reportRegisterEvent('emails_match') } else if (this.emailsAreValidAlreadyChecked && !validStatus) { + this._registerObservability.reportRegisterEvent('emails_do_not_match') this.announce( $localize`:@@register.emailAreNotValid:Your emails do not match` ) diff --git a/src/app/register2/components/form-terms/form-terms.component.ts b/src/app/register2/components/form-terms/form-terms.component.ts index ec3bf671c..4dd9ed513 100644 --- a/src/app/register2/components/form-terms/form-terms.component.ts +++ b/src/app/register2/components/form-terms/form-terms.component.ts @@ -11,6 +11,7 @@ import { Register2Service } from 'src/app/core/register2/register2.service' import { environment } from 'src/environments/environment' import { BaseForm } from '../BaseForm' +import { RegisterStateService } from '../../register-state.service' @Component({ selector: 'app-form-terms', @@ -36,11 +37,12 @@ import { BaseForm } from '../BaseForm' }) // tslint:disable-next-line: class-name export class FormTermsComponent extends BaseForm implements OnInit, DoCheck { - @Input() nextButtonWasClicked: boolean + nextButtonWasClicked: boolean environment = environment constructor( private _register: Register2Service, - private _errorStateMatcher: ErrorStateMatcher + private _errorStateMatcher: ErrorStateMatcher, + private _registerStateService: RegisterStateService ) { super() } @@ -53,6 +55,9 @@ export class FormTermsComponent extends BaseForm implements OnInit, DoCheck { termsOfUse: this.termsOfUse, dataProcessed: this.dataProcessed, }) + this._registerStateService.getNextButtonClickFor('d').subscribe(() => { + this.nextButtonWasClicked = true + }) } // OVERWRITE diff --git a/src/app/register2/components/form-visibility/form-visibility.component.ts b/src/app/register2/components/form-visibility/form-visibility.component.ts index e12d3ffdc..c1cb29ed2 100644 --- a/src/app/register2/components/form-visibility/form-visibility.component.ts +++ b/src/app/register2/components/form-visibility/form-visibility.component.ts @@ -1,4 +1,10 @@ -import { Component, DoCheck, forwardRef, OnInit } from '@angular/core' +import { + Component, + DoCheck, + forwardRef, + OnDestroy, + OnInit, +} from '@angular/core' import { NG_ASYNC_VALIDATORS, NG_VALUE_ACCESSOR, @@ -11,6 +17,10 @@ import { VISIBILITY_OPTIONS } from 'src/app/constants' import { Register2Service } from 'src/app/core/register2/register2.service' import { BaseForm } from '../BaseForm' +import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' +import { Subject } from 'rxjs' +import { takeUntil } from 'rxjs/operators' @Component({ selector: 'app-form-visibility', @@ -36,19 +46,31 @@ import { BaseForm } from '../BaseForm' }) export class FormVisibilityComponent extends BaseForm - implements OnInit, DoCheck + implements OnInit, DoCheck, OnDestroy { ariaLabelMoreInformationOnVisibility = $localize`:@@register.ariaLabelMoreInformationOnVisibility:More information on visibility settings (Opens in new tab)` visibilityOptions = VISIBILITY_OPTIONS errorState = false activitiesVisibilityDefault = new UntypedFormControl('', Validators.required) + destroy = new Subject() constructor( private _register: Register2Service, - private _errorStateMatcher: ErrorStateMatcher + private _errorStateMatcher: ErrorStateMatcher, + private _registerStateService: RegisterStateService, + private _registerObservability: RegisterObservabilityService ) { super() } + ngOnDestroy(): void { + this.destroy.next() + } ngOnInit() { + this._registerStateService + .getNextButtonClickFor('c') + .pipe(takeUntil(this.destroy)) + .subscribe(() => { + this._registerObservability.stepCNextButtonClicked(this.form) + }) this.form = new UntypedFormGroup({ activitiesVisibilityDefault: this.activitiesVisibilityDefault, }) diff --git a/src/app/register2/components/step-a/step-a.component.html b/src/app/register2/components/step-a/step-a.component.html index 4d1898211..21396af6f 100644 --- a/src/app/register2/components/step-a/step-a.component.html +++ b/src/app/register2/components/step-a/step-a.component.html @@ -50,7 +50,6 @@

diff --git a/src/app/register2/components/step-a/step-a.component.ts b/src/app/register2/components/step-a/step-a.component.ts index 40e5870d8..664f9a5ff 100644 --- a/src/app/register2/components/step-a/step-a.component.ts +++ b/src/app/register2/components/step-a/step-a.component.ts @@ -3,6 +3,7 @@ import { Component, ElementRef, Input, + OnInit, ViewChild, } from '@angular/core' @@ -13,6 +14,8 @@ import { ApplicationRoutes } from 'src/app/constants' import { environment } from 'src/environments/environment' import { ReactivationLocal } from '../../../types/reactivation.local' import { BaseStepDirective } from '../BaseStep' +import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' @Component({ selector: 'app-step-a', @@ -24,18 +27,29 @@ import { BaseStepDirective } from '../BaseStep' ], preserveWhitespaces: true, }) -export class StepAComponent extends BaseStepDirective implements AfterViewInit { +export class StepAComponent + extends BaseStepDirective + implements AfterViewInit, OnInit +{ @ViewChild('firstInput') firstInput: ElementRef @Input() reactivation: ReactivationLocal nextButtonWasClicked: boolean - constructor(private _platform: PlatformInfoService, private _router: Router) { + constructor( + private _platform: PlatformInfoService, + private _router: Router, + private _registerStateService: RegisterStateService, + private _registerObservabilityService: RegisterObservabilityService + ) { super() } + + ngOnInit(): void {} infoSiteBaseUrl = environment.INFO_SITE goBack() { + this._registerStateService.registerStepperButtonClicked('a', 'back') this._platform .get() .pipe(first()) @@ -72,10 +86,11 @@ export class StepAComponent extends BaseStepDirective implements AfterViewInit { nextButton2() { this.nextButtonWasClicked = true - // this.formGroup.controls.personal.markAsTouched() + this._registerStateService.registerStepperButtonClicked('a', 'next') } signIn() { + this._registerObservabilityService.signInButtonClicked() this._platform .get() .pipe(first()) @@ -99,4 +114,8 @@ export class StepAComponent extends BaseStepDirective implements AfterViewInit { }) }) } + + backButton() { + this._registerStateService.registerStepperButtonClicked('a', 'back') + } } diff --git a/src/app/register2/components/step-b/step-b.component.html b/src/app/register2/components/step-b/step-b.component.html index 169dbafa7..bf1edfd6c 100644 --- a/src/app/register2/components/step-b/step-b.component.html +++ b/src/app/register2/components/step-b/step-b.component.html @@ -32,7 +32,6 @@

diff --git a/src/app/register2/components/step-c/step-c.component.ts b/src/app/register2/components/step-c/step-c.component.ts index 4060b11cc..66abd4b3f 100644 --- a/src/app/register2/components/step-c/step-c.component.ts +++ b/src/app/register2/components/step-c/step-c.component.ts @@ -1,7 +1,9 @@ -import { Component, Input } from '@angular/core' +import { Component, Input, OnInit } from '@angular/core' import { ReactivationLocal } from '../../../types/reactivation.local' import { BaseStepDirective } from '../BaseStep' +import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' @Component({ selector: 'app-step-c', @@ -12,11 +14,19 @@ import { BaseStepDirective } from '../BaseStep' '../register2.scss-theme.scss', ], }) -export class StepCComponent extends BaseStepDirective { +export class StepCComponent extends BaseStepDirective implements OnInit { @Input() loading @Input() reactivation: ReactivationLocal - constructor() { + constructor(private _registrationStateService: RegisterStateService) { super() } + ngOnInit(): void {} + + nextButton2() { + this._registrationStateService.registerStepperButtonClicked('c', 'next') + } + backButton() { + this._registrationStateService.registerStepperButtonClicked('c', 'back') + } } diff --git a/src/app/register2/components/step-c/step-c.spec.ts b/src/app/register2/components/step-c/step-c.spec.ts index af56bda93..36be29d63 100644 --- a/src/app/register2/components/step-c/step-c.spec.ts +++ b/src/app/register2/components/step-c/step-c.spec.ts @@ -15,6 +15,8 @@ import { RouterTestingModule } from '@angular/router/testing' import { WINDOW_PROVIDERS } from 'src/app/cdk/window' import { SnackbarService } from 'src/app/cdk/snackbar/snackbar.service' import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar' +import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' @Component({ selector: 'app-form-visibility', @@ -46,8 +48,19 @@ describe('StepCComponent', () => { MatLegacySnackBarModule, ], declarations: [StepCComponent, MockFormVisibilityComponent], - providers: [WINDOW_PROVIDERS, SnackbarService], schemas: [CUSTOM_ELEMENTS_SCHEMA], + providers: [ + WINDOW_PROVIDERS, + SnackbarService, + { + provide: RegisterStateService, + useValue: {}, + }, + { + provide: RegisterObservabilityService, + useValue: {}, + }, + ], }).compileComponents() }) diff --git a/src/app/register2/components/step-c2/step-c2.component.html b/src/app/register2/components/step-c2/step-c2.component.html index a5f207a1d..025a82870 100644 --- a/src/app/register2/components/step-c2/step-c2.component.html +++ b/src/app/register2/components/step-c2/step-c2.component.html @@ -42,7 +42,6 @@

diff --git a/src/app/register2/components/step-c2/step-c2.component.ts b/src/app/register2/components/step-c2/step-c2.component.ts index 76f28bdae..1e679c831 100644 --- a/src/app/register2/components/step-c2/step-c2.component.ts +++ b/src/app/register2/components/step-c2/step-c2.component.ts @@ -1,8 +1,10 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core' +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core' import { ReactivationLocal } from '../../../types/reactivation.local' import { BaseStepDirective } from '../BaseStep' import { FormBuilder, FormGroup } from '@angular/forms' +import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' @Component({ selector: 'app-step-c2', @@ -13,15 +15,16 @@ import { FormBuilder, FormGroup } from '@angular/forms' '../register2.scss-theme.scss', ], }) -export class StepC2Component extends BaseStepDirective { +export class StepC2Component extends BaseStepDirective implements OnInit { @Input() loading @Input() reactivation: ReactivationLocal nextButtonWasClicked: boolean @Output() formGroupStepC2OptionalChange = new EventEmitter() - constructor(private _formBuilder: FormBuilder) { + constructor(private _registrationStateService: RegisterStateService) { super() } + ngOnInit(): void {} optionalNextStep() { this.formGroup.setValue({ @@ -35,13 +38,16 @@ export class StepC2Component extends BaseStepDirective { }, }, }) - this.formGroupStepC2OptionalChange.emit(true) - this.nextButtonWasClicked = true + this._registrationStateService.registerStepperButtonClicked('c2', 'skip') } - requiredNextStep() { + nextButton2() { this.formGroupStepC2OptionalChange.emit(false) - this.nextButtonWasClicked = true + this._registrationStateService.registerStepperButtonClicked('c2', 'next') + } + + backButton() { + this._registrationStateService.registerStepperButtonClicked('c2', 'back') } } diff --git a/src/app/register2/components/step-c2/step-c2.spec.ts b/src/app/register2/components/step-c2/step-c2.spec.ts index 8ab14e360..49c0ef1c2 100644 --- a/src/app/register2/components/step-c2/step-c2.spec.ts +++ b/src/app/register2/components/step-c2/step-c2.spec.ts @@ -10,6 +10,8 @@ import { UntypedFormControl, UntypedFormGroup, } from '@angular/forms' +import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' @Component({ selector: 'app-form-current-employment', @@ -38,6 +40,16 @@ describe('StepCComponent', () => { TestBed.configureTestingModule({ imports: [ReactiveFormsModule], declarations: [StepC2Component, MockFormCurrentEmploymentComponent], + providers: [ + { + provide: RegisterStateService, + useValue: {}, + }, + { + provide: RegisterObservabilityService, + useValue: {}, + }, + ], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents() }) diff --git a/src/app/register2/components/step-d/step-d.component.html b/src/app/register2/components/step-d/step-d.component.html index afbf43998..bf1bc1fbc 100644 --- a/src/app/register2/components/step-d/step-d.component.html +++ b/src/app/register2/components/step-d/step-d.component.html @@ -38,21 +38,15 @@

- - + +
diff --git a/src/app/register2/components/step-d/step-d.component.spec.ts b/src/app/register2/components/step-d/step-d.component.spec.ts index 3a5021278..295d19da3 100644 --- a/src/app/register2/components/step-d/step-d.component.spec.ts +++ b/src/app/register2/components/step-d/step-d.component.spec.ts @@ -10,6 +10,8 @@ import { UntypedFormControl, UntypedFormGroup, } from '@angular/forms' +import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' @Component({ selector: 'app-form-notifications', @@ -76,6 +78,16 @@ describe('StepDComponent', () => { MockFormAntiRobotsComponent, ], schemas: [CUSTOM_ELEMENTS_SCHEMA], + providers: [ + { + provide: RegisterStateService, + useValue: {}, + }, + { + provide: RegisterObservabilityService, + useValue: {}, + }, + ], }).compileComponents() }) diff --git a/src/app/register2/components/step-d/step-d.component.ts b/src/app/register2/components/step-d/step-d.component.ts index 8f18e56db..5263881dd 100644 --- a/src/app/register2/components/step-d/step-d.component.ts +++ b/src/app/register2/components/step-d/step-d.component.ts @@ -2,6 +2,8 @@ import { Component, Input } from '@angular/core' import { ReactivationLocal } from '../../../types/reactivation.local' import { BaseStepDirective } from '../BaseStep' +import { RegisterStateService } from '../../register-state.service' +import { RegisterObservabilityService } from '../../register-observability.service' @Component({ selector: 'app-step-d', @@ -16,9 +18,19 @@ export class StepDComponent extends BaseStepDirective { @Input() loading @Input() reactivation: ReactivationLocal - nextButtonWasClicked = false - - constructor() { + constructor( + private _registrationStateService: RegisterStateService, + private _registerObservabilityService: RegisterObservabilityService + ) { super() } + ngOnInit(): void {} + + nextButton2() { + this._registrationStateService.registerStepperButtonClicked('d', 'next') + this._registerObservabilityService.stepDNextButtonClicked(this.formGroup) + } + backButton() { + this._registrationStateService.registerStepperButtonClicked('d', 'back') + } } diff --git a/src/app/register2/pages/register/register2.component.ts b/src/app/register2/pages/register/register2.component.ts index 957449b2e..b1312b971 100644 --- a/src/app/register2/pages/register/register2.component.ts +++ b/src/app/register2/pages/register/register2.component.ts @@ -32,6 +32,11 @@ import { ThirdPartyAuthData } from 'src/app/types/sign-in-data.endpoint' import { GoogleTagManagerService } from '../../../core/google-tag-manager/google-tag-manager.service' import { SearchService } from '../../../core/search/search.service' import { ReactivationLocal } from '../../../types/reactivation.local' +import { + CustomEventService, + JourneyType, +} from 'src/app/core/observability-events/observability-events.service' +import { RegisterObservabilityService } from '../../register-observability.service' @Component({ selector: 'app-register-2', @@ -48,6 +53,8 @@ export class Register2Component implements OnInit, AfterViewInit { @ViewChild('stepComponentA', { read: ElementRef }) stepComponentA: ElementRef @ViewChild('stepComponentB', { read: ElementRef }) stepComponentB: ElementRef @ViewChild('stepComponentC', { read: ElementRef }) stepComponentC: ElementRef + @ViewChild('stepComponentC2', { read: ElementRef }) + stepComponentC2: ElementRef @ViewChild('stepComponentD', { read: ElementRef }) stepComponentD: ElementRef platform: PlatformInfo @@ -76,19 +83,24 @@ export class Register2Component implements OnInit, AfterViewInit { private _platformInfo: PlatformInfoService, private _formBuilder: UntypedFormBuilder, private _register: Register2Service, - private _dialog: MatDialog, @Inject(WINDOW) private window: Window, private _googleTagManagerService: GoogleTagManagerService, - private _user: UserService, private _router: Router, private _errorHandler: ErrorHandlerService, private _userInfo: UserService, - private _searchService: SearchService + private _registerObservabilityService: RegisterObservabilityService ) { _platformInfo.get().subscribe((platform) => { this.platform = platform this.reactivation.isReactivation = this.platform.reactivation this.reactivation.reactivationCode = this.platform.reactivationCode + + this._registerObservabilityService.initializeJourney({ + isReactivation: this.reactivation.isReactivation, + coulumn4: this.platform.columns4, + column8: this.platform.columns8, + column12: this.platform.columns12, + }) }) } ngOnInit() { @@ -126,6 +138,9 @@ export class Register2Component implements OnInit, AfterViewInit { this.requestInfoForm = session.oauthSession if (this.thirdPartyAuthData || this.requestInfoForm) { + this._registerObservabilityService.reportRegisterEvent( + 'prefill_register-form' + ) this.FormGroupStepA = this.prefillRegisterForm( this.requestInfoForm, this.thirdPartyAuthData @@ -165,12 +180,24 @@ export class Register2Component implements OnInit, AfterViewInit { ) .pipe( switchMap((validator: RegisterForm) => { + this._registerObservabilityService.reportRegisterEvent( + 'register-validate', + { + validator, + } + ) if (validator.errors.length > 0) { // At this point any backend error is unexpected this._errorHandler.handleError( new Error('registerUnexpectedValidateFail'), ERROR_REPORT.REGISTER ) + this._registerObservabilityService.reportRegisterErrorEvent( + 'register-validate', + { + errors: validator.errors, + } + ) } return this._register.register( this.FormGroupStepA, @@ -186,6 +213,13 @@ export class Register2Component implements OnInit, AfterViewInit { .subscribe((response) => { this.loading = false if (response.url) { + this._registerObservabilityService.reportRegisterEvent( + 'register-confirmation', + { + response, + } + ) + const analyticsReports: Observable[] = [] analyticsReports.push( @@ -208,6 +242,13 @@ export class Register2Component implements OnInit, AfterViewInit { () => this.afterRegisterRedirectionHandler(response) ) } else { + this._registerObservabilityService.reportRegisterErrorEvent( + 'register-confirmation', + { + response, + } + ) + this._errorHandler.handleError( new Error('registerUnexpectedConfirmation'), ERROR_REPORT.REGISTER @@ -241,6 +282,8 @@ export class Register2Component implements OnInit, AfterViewInit { } } selectionChange(event: StepperSelectionEvent) { + const step = ['a', 'b', 'c2', 'c', 'd'][event.selectedIndex] as JourneyType + this._registerObservabilityService.stepLoaded(step) if (this.platform.columns4 || this.platform.columns8) { this.focusCurrentStep(event) } @@ -255,8 +298,10 @@ export class Register2Component implements OnInit, AfterViewInit { } else if (event.selectedIndex === 1) { nextStep = this.stepComponentB } else if (event.selectedIndex === 2) { - nextStep = this.stepComponentC + nextStep = this.stepComponentC2 } else if (event.selectedIndex === 3) { + nextStep = this.stepComponentC + } else if (event.selectedIndex === 4) { nextStep = this.stepComponentD } // On mobile scroll the current step component into view diff --git a/src/app/register2/register-observability.service.ts b/src/app/register2/register-observability.service.ts new file mode 100644 index 000000000..cc00b1655 --- /dev/null +++ b/src/app/register2/register-observability.service.ts @@ -0,0 +1,181 @@ +import { Injectable } from '@angular/core' +import { OrganizationsService } from '../core' +import { Organization } from 'src/app/types/record-affiliation.endpoint' +import { Subject } from 'rxjs' +import { OrgDisambiguated } from '../types' +import { + CustomEventService, + JourneyType, +} from '../core/observability-events/observability-events.service' +import { UntypedFormArray, UntypedFormGroup } from '@angular/forms' +import { RegisterStateService } from './register-state.service' +import init from 'helphero' +@Injectable({ + providedIn: 'root', +}) +export class RegisterObservabilityService { + rorIdHasBeenMatched: boolean = false + matchOrganization$ = new Subject() + primaryEmailMatched: Organization + secondaryEmail: Organization + registrationJourneyStarted: any + constructor( + private _observability: CustomEventService, + private _registrationStateService: RegisterStateService + ) { + this._registrationStateService.getBackButtonClick().subscribe((step) => { + this._observability.recordEvent( + 'orcid_registration', + `step-${step.step}-back-button-clicked` + ) + }) + } + + signInButtonClicked() { + this._observability.recordEvent( + 'orcid_registration', + 'step-a-sign-in-button-clicked' + ) + } + + stepANextButtonClicked(form: UntypedFormGroup) { + this._observability.recordEvent( + 'orcid_registration', + 'step-a-next-button-clicked', + { + // List all form controls errors + formValues: form.value, + formValid: form.valid, + errors: { + givenNamesError: form.controls.givenNames.errors, + familyNamesError: form.controls.familyNames.errors, + emailError: (form.controls.emails as UntypedFormGroup).controls.email + .errors, + confirmEmailError: (form.controls.emails as UntypedFormGroup).controls + .confirmEmail.errors, + additionalEmailsError: (form.controls.emails as UntypedFormGroup) + .controls.additionalEmails.errors, + }, + } + ) + } + + stepBNextButtonClicked(form: UntypedFormGroup) { + this._observability.recordEvent( + 'orcid_registration', + 'step-b-next-button-clicked', + { + // List all form controls errors + formValues: form.value, + formValid: form.valid, + errors: { + passwordError: form.controls.password.errors, + confirmPasswordError: form.controls.passwordConfirm.errors, + }, + } + ) + } + + stepC2NextButtonClicked(form: UntypedFormGroup) { + this._observability.recordEvent( + 'orcid_registration', + 'step-c2-next-button-clicked', + { + // List all form controls errors + formValues: form.value, + formValid: form.valid, + errors: { + departmentNameError: form.controls.departmentName.errors, + roleTitleError: form.controls.roleTitle.errors, + startDateGroupErrors: form.controls.startDateGroup.errors, + organizationErrors: form.controls.organization.errors, + }, + } + ) + } + + stepC2SkipButtonClicked(form: UntypedFormGroup) { + this._observability.recordEvent( + 'orcid_registration', + 'step-c2-skip-button-clicked', + { + // List all form controls errors + formValues: form.value, + formValid: form.valid, + errors: { + departmentNameError: form.controls.departmentName.errors, + roleTitleError: form.controls.roleTitle.errors, + startDateGroupErrors: form.controls.startDateGroup.errors, + organizationErrors: form.controls.organization.errors, + }, + } + ) + } + + stepCNextButtonClicked(form: UntypedFormGroup) { + this._observability.recordEvent( + 'orcid_registration', + 'step-c-next-button-clicked', + { + // List all form controls errors + formValues: form.value, + formValid: form.valid, + errors: { + visibilityErrors: form.controls.activitiesVisibilityDefault.errors, + }, + } + ) + } + + stepDNextButtonClicked(form: UntypedFormGroup) { + this._observability.recordEvent( + 'orcid_registration', + 'step-d-next-button-clicked', + { + // List all form controls errors + formValues: form.value, + formValid: form.valid, + errors: { + captcha: form.controls.captcha.errors, + sendMemberUpdatesError: form.controls.sendOrcidNews.errors, + termsOfUseError: form.controls.termsOfUse.errors, + }, + } + ) + } + + stepLoaded(step: JourneyType) { + this._observability.recordEvent('orcid_registration', `step-${step}-loaded`) + } + + initializeJourney(reactivation) { + if (!this.registrationJourneyStarted) { + this._observability.startJourney('orcid_registration', { + ...reactivation, + }) + this.registrationJourneyStarted = true + } + } + + completeJourney(attributes: any = {}) { + this._observability.recordEvent( + 'orcid_registration', + 'journey-complete', + attributes + ) + this._observability.finishJourney('orcid_registration') + this.registrationJourneyStarted = false + } + + reportRegisterEvent(eventName: string, attributes: any = {}) { + this._observability.recordEvent('orcid_registration', eventName, attributes) + } + + reportRegisterErrorEvent(eventName: string, attributes: any = {}) { + this._observability.recordEvent( + 'orcid_registration', + `${eventName}-error`, + attributes + ) + } +} diff --git a/src/app/register2/register-state.service.spec.ts b/src/app/register2/register-state.service.spec.ts index 5be2466a0..460594909 100644 --- a/src/app/register2/register-state.service.spec.ts +++ b/src/app/register2/register-state.service.spec.ts @@ -3,6 +3,7 @@ import { TestBed } from '@angular/core/testing' import { RegisterStateService } from './register-state.service' import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core' +import { OrganizationsService } from '../core' describe('RegisterStateService', () => { let service: RegisterStateService @@ -11,7 +12,7 @@ describe('RegisterStateService', () => { TestBed.configureTestingModule({ providers: [ { - provide: RegisterStateService, + provide: OrganizationsService, useValue: {}, }, ], diff --git a/src/app/register2/register-state.service.ts b/src/app/register2/register-state.service.ts index 58bf95ceb..6211e11cc 100644 --- a/src/app/register2/register-state.service.ts +++ b/src/app/register2/register-state.service.ts @@ -3,12 +3,17 @@ import { OrganizationsService } from '../core' import { Organization } from 'src/app/types/record-affiliation.endpoint' import { Subject } from 'rxjs' import { OrgDisambiguated } from '../types' +import { filter } from 'rxjs/operators' @Injectable({ providedIn: 'root', }) export class RegisterStateService { rorIdHasBeenMatched: boolean = false matchOrganization$ = new Subject() + private stepperButtonClicked = new Subject<{ + step: 'a' | 'b' | 'c' | 'c2' | 'd' + direction: 'next' | 'back' | 'skip' + }>() primaryEmailMatched: Organization secondaryEmail: Organization constructor(private _organizationsService: OrganizationsService) {} @@ -64,4 +69,32 @@ export class RegisterStateService { this.matchOrganization$.next('') } } + + registerStepperButtonClicked( + step: 'a' | 'b' | 'c' | 'c2' | 'd', + direction: 'next' | 'back' | 'skip' + ) { + this.stepperButtonClicked.next({ step, direction }) + } + + getNextButtonClickFor(step: 'a' | 'b' | 'c' | 'c2' | 'd') { + return this.stepperButtonClicked + .asObservable() + .pipe( + filter((value) => value.step === step && value.direction === 'next') + ) + } + getBackButtonClick() { + return this.stepperButtonClicked + .asObservable() + .pipe(filter((value) => value.direction === 'back')) + } + + getSkipButtonClickFor(step: 'a' | 'b' | 'c' | 'c2' | 'd') { + return this.stepperButtonClicked + .asObservable() + .pipe( + filter((value) => value.step === step && value.direction === 'skip') + ) + } } diff --git a/src/app/types/trust-summary.ts b/src/app/types/trust-summary.ts index 8735fb51c..f9c2d8640 100644 --- a/src/app/types/trust-summary.ts +++ b/src/app/types/trust-summary.ts @@ -5,6 +5,10 @@ export interface TrustedSummary { orcid: string employmentAffiliations: ActivitySummary[] employmentAffiliationsCount: number + educationQualifications: ActivitySummary[] + educationQualificationsCount: number + validatedResearchResources: number + selfAssertedResearchResources: number creation: string lastModified: string validatedWorks: number @@ -16,6 +20,8 @@ export interface TrustedSummary { professionalActivities: ActivitySummary[] professionalActivitiesCount: number externalIdentifiers: ExternalIdentifierSummary[] + emailDomainsCount: number + emailDomains: EmailDomains[] status: 'locked' | 'deprecated' | 'deactivated' | 'active' } @@ -30,6 +36,10 @@ export interface ActivitySummary { validated: boolean } +export interface EmailDomains { + value: string +} + export interface ExternalIdentifierSummary { id: string commonName: string diff --git a/src/environments/environment.local.ts b/src/environments/environment.local.ts index 25061c9d3..975d5c70f 100644 --- a/src/environments/environment.local.ts +++ b/src/environments/environment.local.ts @@ -1,6 +1,6 @@ export const environment = { production: false, - debugger: false, + debugger: true, ROBOTS: 'all', API_NEWS: 'https://www.mocky.io/v2/5dced45b3000007300931ce8', API_PUB: `//pub./v3.0`, diff --git a/src/locale/properties/side-bar/side-bar.ar.properties b/src/locale/properties/side-bar/side-bar.ar.properties index e12cd4592..d49ddd6ff 100644 --- a/src/locale/properties/side-bar/side-bar.ar.properties +++ b/src/locale/properties/side-bar/side-bar.ar.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=شروط الاستخدام side-bar.youMayOnly=لا يمكنك إضافة عناوين بريد إلكتروني إلا التي تستطيع التحكم فيها فحسب. في كل مرة تضيف فيها عنوان بريد إلكتروني، سنرسل إليك بريداً إلكترونياً نطلب منك التحقق من هذا العنوان. side-bar.primaryEmail=عنوان البريد الإلكتروني الرئيسي side-bar.verifiedEmail=عنوان البريد الإلكتروني الذي تم التحقق منه +side-bar.verifiedEmailAddresses=عناوين البريد الإلكتروني التي تم التحقق منها side-bar.emailCanNotBeDuplicated=لا يمكن تكرار البريد الإلكتروني side-bar.noOtherEmails=لم تقم بإضافة أي عناوين بريد إلكتروني أخرى حتى الآن. side-bar.invalidEmailFormat=تنسيق بريد إلكتروني غير صالح @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=تعيين رؤية بريد إلكترون side-bar.ariaLabelEmailPublic=تعيين إمكانية رؤية البريد الإلكتروني على "الجميع" side-bar.ariaLabelEmailTrustedParties=تعيين إمكانية رؤية البريد الإلكتروني على "الأطراف الموثوقة" side-bar.ariaLabelEmailPrivate=تعيين رؤية البريد الإلكتروني على "أنا فقط" +side-bar.ariaLabelDomainVisibilityPublic=تعيين رؤية المجال للجميع +side-bar.ariaLabelDomainVisibilityTrustedParties=تعيين رؤية المجال للأطراف الموثوقة +side-bar.ariaLabelDomainVisibilityPrivate=تعيين رؤية المجال لي فقط side-bar.ariaOpenAccountSettings=فتح إعدادات الحساب الخاص بك في أوركيد side-bar.notificationsAreSentToEmail=تُرسل الإشعارات إلى diff --git a/src/locale/properties/side-bar/side-bar.cs.properties b/src/locale/properties/side-bar/side-bar.cs.properties index 1805f0847..62908e59c 100644 --- a/src/locale/properties/side-bar/side-bar.cs.properties +++ b/src/locale/properties/side-bar/side-bar.cs.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=Podmínek užití ORCID side-bar.youMayOnly=můžete přidat pouze e-mailové adresy, které máte pod kontrolou. Pokaždé, když přidáte e-mailovou adresu, zašleme vám e-mail s žádostí o její ověření. side-bar.primaryEmail=Primární e-mailová adresa side-bar.verifiedEmail=Ověřená e-mailová adresa +side-bar.verifiedEmailAddresses=Ověřené e-mailové adresy side-bar.emailCanNotBeDuplicated=E-mail nelze duplikovat side-bar.noOtherEmails=Zatím jste nepřidali žádné další e-mailové adresy. side-bar.invalidEmailFormat=Neplatný formát e-mailu @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Nastavit viditelnost dalších e-mailů na P side-bar.ariaLabelEmailPublic=Nastavit viditelnost e-mailu na Všichni side-bar.ariaLabelEmailTrustedParties=Nastavit viditelnost e-mailu na Důvěryhodné strany side-bar.ariaLabelEmailPrivate=Nastavit viditelnost e-mailu na Pouze já +side-bar.ariaLabelDomainVisibilityPublic=Nastavit viditelnost domény na Všichni +side-bar.ariaLabelDomainVisibilityTrustedParties=Nastavit viditelnost domény na Důvěryhodné strany +side-bar.ariaLabelDomainVisibilityPrivate=Nastavit viditelnost domény na Pouze já side-bar.ariaOpenAccountSettings=Otevřít nastavení svého účtu ORCID side-bar.notificationsAreSentToEmail=Oznámení jsou zasílána na adresu diff --git a/src/locale/properties/side-bar/side-bar.de.properties b/src/locale/properties/side-bar/side-bar.de.properties index 6b35e4694..712e40056 100644 --- a/src/locale/properties/side-bar/side-bar.de.properties +++ b/src/locale/properties/side-bar/side-bar.de.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=ORCID-Nutzungsbedingungen side-bar.youMayOnly=dürfen Sie nur E-Mail-Adressen hinzufügen, über die Sie die Kontrolle haben. Jedes Mal, wenn Sie eine E-Mail-Adresse hinzufügen, senden wir Ihnen eine E-Mail, in der Sie aufgefordert werden, diese zu bestätigen. side-bar.primaryEmail=Primäre E-Mail-Adresse side-bar.verifiedEmail=Verifizierte E-Mail-Adresse +side-bar.verifiedEmailAddresses=Verifizierte E-Mail-Adressen side-bar.emailCanNotBeDuplicated=Die E-Mail-Adresse darf nicht doppelt eingegeben werden side-bar.noOtherEmails=Sie haben noch keine weiteren E-Mail-Adressen hinzugefügt. side-bar.invalidEmailFormat=Ungültiges Format für die E-Mail-Adresse @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Sichtbarkeit der anderen E-Mail-Adressen auf side-bar.ariaLabelEmailPublic=Sichtbarkeit von E-Mails auf „Alle“ festlegen side-bar.ariaLabelEmailTrustedParties=Sichtbarkeit von E-Mails auf „Vertrauenswürdige Parteien“ festlegen side-bar.ariaLabelEmailPrivate=Sichtbarkeit von E-Mails auf „Nur ich“ festlegen +side-bar.ariaLabelDomainVisibilityPublic=Domain-Sichtbarkeit auf „Alle“ festlegen +side-bar.ariaLabelDomainVisibilityTrustedParties=Domain-Sichtbarkeit auf „Vertrauenswürdige Parteien“ festlegen +side-bar.ariaLabelDomainVisibilityPrivate=Domain-Sichtbarkeit auf „Nur ich“ festlegen side-bar.ariaOpenAccountSettings=Öffnen Sie die Einstellungen Ihres ORCID-Kontos side-bar.notificationsAreSentToEmail=Benachrichtigungen werden gesendet an diff --git a/src/locale/properties/side-bar/side-bar.es.properties b/src/locale/properties/side-bar/side-bar.es.properties index bf591aec6..02cc50ba9 100644 --- a/src/locale/properties/side-bar/side-bar.es.properties +++ b/src/locale/properties/side-bar/side-bar.es.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=términos de uso de ORCID side-bar.youMayOnly=solo puede añadir direcciones de correo electrónico a las que tenga acceso. Cada vez que añada una dirección, le enviaremos un correo de verificación. side-bar.primaryEmail=Dirección de correo principal side-bar.verifiedEmail=Dirección de correo electrónico verificada +side-bar.verifiedEmailAddresses=Direcciones de correo electrónico verificadas side-bar.emailCanNotBeDuplicated=El correo electrónico no se puede duplicar side-bar.noOtherEmails=Aún no ha añadido una dirección de correo electrónico adicional. side-bar.invalidEmailFormat=Formato de correo electrónico no válido @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Establezca la visibilidad de otro correo ele side-bar.ariaLabelEmailPublic=Establezca la visibilidad de los correos electrónicos para Todos side-bar.ariaLabelEmailTrustedParties=Establezca la visibilidad de los correos electrónicos para Partes de confianza side-bar.ariaLabelEmailPrivate=Establezca la visibilidad de los correos electrónicos para Solo yo +side-bar.ariaLabelDomainVisibilityPublic=Establezca la visibilidad de los dominios para Todos +side-bar.ariaLabelDomainVisibilityTrustedParties=Establezca la visibilidad de los dominios para Partes de confianza +side-bar.ariaLabelDomainVisibilityPrivate=Establezca la visibilidad de los dominios para Solo yo side-bar.ariaOpenAccountSettings=Abra el menú de configuración de su cuenta de ORCID side-bar.notificationsAreSentToEmail=Las notificaciones se envían a diff --git a/src/locale/properties/side-bar/side-bar.fr.properties b/src/locale/properties/side-bar/side-bar.fr.properties index 1bc61280f..fb2dd606f 100644 --- a/src/locale/properties/side-bar/side-bar.fr.properties +++ b/src/locale/properties/side-bar/side-bar.fr.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=conditions d'utilisation d'ORCID side-bar.youMayOnly=vous ne pouvez ajouter que les adresses e-mails que vous contrôlez. À chaque fois que vous en ajouterez une, nous vous enverrons un e-mail vous demandant de procéder à sa vérification. side-bar.primaryEmail=Adresse e-mail principale side-bar.verifiedEmail=Adresse e-mail vérifiée +side-bar.verifiedEmailAddresses=Adresses e-mail vérifiées side-bar.emailCanNotBeDuplicated=L'e-mail ne peut pas être dupliqué. side-bar.noOtherEmails=Vous n'avez pas encore ajouté d'autres adresses e-mails. side-bar.invalidEmailFormat=Format d'email invalide @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Définir la visibilité de l'autre adresse e side-bar.ariaLabelEmailPublic=Définir la visibilité des e-mails sur Tout le monde side-bar.ariaLabelEmailTrustedParties=Définir la visibilité des e-mails sur Parties de confiance side-bar.ariaLabelEmailPrivate=Définir la visibilité des e-mails sur Privé +side-bar.ariaLabelDomainVisibilityPublic=Définir la visibilité du domaine sur Tout le monde +side-bar.ariaLabelDomainVisibilityTrustedParties=Définir la visibilité du domaine sur Parties de confiance +side-bar.ariaLabelDomainVisibilityPrivate=Définir la visibilité du domaine sur Privé side-bar.ariaOpenAccountSettings=Ouvrir les paramètres de votre compte ORCID side-bar.notificationsAreSentToEmail=Les notifications sont envoyées à diff --git a/src/locale/properties/side-bar/side-bar.it.properties b/src/locale/properties/side-bar/side-bar.it.properties index b1d423dee..dae6376b1 100644 --- a/src/locale/properties/side-bar/side-bar.it.properties +++ b/src/locale/properties/side-bar/side-bar.it.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=Termini di uso di ORCID side-bar.youMayOnly=puoi aggiungere solo gli indirizzi email che gestisci tu. Ogni volta che aggiungi un indirizzo email ti invieremo un'email per verificarlo. side-bar.primaryEmail=Indirizzo email primario side-bar.verifiedEmail=Indirizzo email verificato +side-bar.verifiedEmailAddresses=Indirizzi email verificati side-bar.emailCanNotBeDuplicated=L'email non può essere duplicata side-bar.noOtherEmails=Non hai ancora aggiunto altri indirizzi email. side-bar.invalidEmailFormat=Formato email non valido @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Per la visibilità delle altre email imposta side-bar.ariaLabelEmailPublic=Imposta la visibilità dell’email su Tutti side-bar.ariaLabelEmailTrustedParties=Imposta la visibilità dell’email su Parti fidate side-bar.ariaLabelEmailPrivate=Imposta la visibilità dell’email su Solo io +side-bar.ariaLabelDomainVisibilityPublic=Imposta la visibilità del dominio su Tutti +side-bar.ariaLabelDomainVisibilityTrustedParties=Imposta la visibilità del dominio su Parti fidate +side-bar.ariaLabelDomainVisibilityPrivate=Imposta la visibilità del dominio su Privato side-bar.ariaOpenAccountSettings=Apri le impostazioni del tuo account ORCID side-bar.notificationsAreSentToEmail=Le notifiche vengono inviate a diff --git a/src/locale/properties/side-bar/side-bar.ja.properties b/src/locale/properties/side-bar/side-bar.ja.properties index da4878643..844cc93d9 100644 --- a/src/locale/properties/side-bar/side-bar.ja.properties +++ b/src/locale/properties/side-bar/side-bar.ja.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=利用規約により side-bar.youMayOnly=自分で管理できるメールアドレスのみを追加できます。メールアドレスを追加するたびに、確認を求めるメールが送信されます。 side-bar.primaryEmail=メインのメールアドレス side-bar.verifiedEmail=確認済みのメールアドレス +side-bar.verifiedEmailAddresses=確認済みのメールアドレス side-bar.emailCanNotBeDuplicated=電子メールは重複できません。 side-bar.noOtherEmails=まだ他のメールアドレスが追加されていません。 side-bar.invalidEmailFormat=無効なメールフォーマットです @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=他のメールアドレスの表示設定 side-bar.ariaLabelEmailPublic=メールの表示設定を全員に変更 side-bar.ariaLabelEmailTrustedParties=メールの表示設定を信頼できる個人・組織に設定 side-bar.ariaLabelEmailPrivate=メールの表示設定を自分のみに設定 +side-bar.ariaLabelDomainVisibilityPublic=ドメインの表示設定を全員に変更 +side-bar.ariaLabelDomainVisibilityTrustedParties=ドメインの表示設定を信頼できる個人・組織に設定 +side-bar.ariaLabelDomainVisibilityPrivate=ドメインの表示設定を自分のみに設定 side-bar.ariaOpenAccountSettings=ORCIDアカウント設定を開く side-bar.notificationsAreSentToEmail=通知の送信先: diff --git a/src/locale/properties/side-bar/side-bar.ko.properties b/src/locale/properties/side-bar/side-bar.ko.properties index 0a3b40716..595318b55 100644 --- a/src/locale/properties/side-bar/side-bar.ko.properties +++ b/src/locale/properties/side-bar/side-bar.ko.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=이용 약관에 따라 side-bar.youMayOnly=본인이 실제로 관리 중인 이메일 주소만 추가 가능합니다. 이메일 주소를 하나 추가할 때마다 메일을 전송해 인증 절차를 요청할 것입니다. side-bar.primaryEmail=기본 이메일 주소 side-bar.verifiedEmail=확인된 이메일 주소 +side-bar.verifiedEmailAddresses=확인된 이메일 주소 side-bar.emailCanNotBeDuplicated=이메일은 중복될 수 없습니다 side-bar.noOtherEmails=아직 이메일 주소를 추가하지 않았습니다. side-bar.invalidEmailFormat=잘못된 이메일 형식 @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=다른 이메일을 비공개로 설정 side-bar.ariaLabelEmailPublic=이메일을 모두에게 공개로 설정 side-bar.ariaLabelEmailTrustedParties=이메일을 제한적으로 공개로 설정 side-bar.ariaLabelEmailPrivate=이메일을 비공개로 설정 +side-bar.ariaLabelDomainVisibilityPublic=도메인을 모두에게 공개로 설정 +side-bar.ariaLabelDomainVisibilityTrustedParties=도메인을 제한적으로 공개로 설정 +side-bar.ariaLabelDomainVisibilityPrivate=도메인을 비공개로 설정 side-bar.ariaOpenAccountSettings=ORCID 계정 설정 열기 side-bar.notificationsAreSentToEmail=알림이 다음으로 전송됨 diff --git a/src/locale/properties/side-bar/side-bar.pl.properties b/src/locale/properties/side-bar/side-bar.pl.properties index 733e685ca..ea4bbf019 100644 --- a/src/locale/properties/side-bar/side-bar.pl.properties +++ b/src/locale/properties/side-bar/side-bar.pl.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=Warunki korzystania z ORCID side-bar.youMayOnly=możesz dodawać tylko adresy te e-mail, którymi zarządzasz. Za każdym razem, gdy dodasz adres e-mail, wyślemy Ci wiadomość e-mail z prośbą o jego weryfikację. side-bar.primaryEmail=Podstawowy adres e-mail side-bar.verifiedEmail=Zweryfikowany adres e-mail +side-bar.verifiedEmailAddresses=Zweryfikowane adresy e-mail side-bar.emailCanNotBeDuplicated=Adres e-mail nie może być zduplikowany side-bar.noOtherEmails=Nie dodano jeszcze żadnych innych adresów e-mail. side-bar.invalidEmailFormat=Nieprawidłowy format adresu e-mail @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Ustaw widoczność innych e-maili na Tylko j side-bar.ariaLabelEmailPublic=Ustaw widoczność wiadomości e-mail na Wszyscy side-bar.ariaLabelEmailTrustedParties=Ustaw widoczność wiadomości e-mail na Zaufane strony side-bar.ariaLabelEmailPrivate=Ustaw widoczność wiadomości e-mail na Tylko ja +side-bar.ariaLabelDomainVisibilityPublic=Ustaw widoczność domeny na Wszyscy +side-bar.ariaLabelDomainVisibilityTrustedParties=Ustaw widoczność domeny na Zaufane strony +side-bar.ariaLabelDomainVisibilityPrivate=Ustaw widoczność domeny na Tylko ja side-bar.ariaOpenAccountSettings=Otwórz ustawienia swojego konta ORCID side-bar.notificationsAreSentToEmail=Powiadomienia są wysyłane do diff --git a/src/locale/properties/side-bar/side-bar.pt.properties b/src/locale/properties/side-bar/side-bar.pt.properties index 742cd3ee4..1a9c4f857 100644 --- a/src/locale/properties/side-bar/side-bar.pt.properties +++ b/src/locale/properties/side-bar/side-bar.pt.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=Termos de uso da ORCID side-bar.youMayOnly=você só pode adicionar endereços de e-mail sobre os quais tenha controle. Cada vez que adicionar um endereço de e-mail, enviaremos um e-mail solicitando que o verifique. side-bar.primaryEmail=Endereço de e-mail principal side-bar.verifiedEmail=Endereço de e-mail verificado +side-bar.verifiedEmailAddresses=Endereços de e-mail verificados side-bar.emailCanNotBeDuplicated=O e-mail não pode ser duplicado side-bar.noOtherEmails=Você ainda não adicionou nenhum outro endereço de e-mail. side-bar.invalidEmailFormat=Formato de e-mail inválido @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Definir a visibilidade de e-mail de outros c side-bar.ariaLabelEmailPublic=Definir a visibilidade de e-mail como Todos side-bar.ariaLabelEmailTrustedParties=Definir a visibilidade de e-mail como Partes confiáveis side-bar.ariaLabelEmailPrivate=Definir a visibilidade de e-mail como Apenas para mim +side-bar.ariaLabelDomainVisibilityPublic=Definir a visibilidade de domínio como Todos +side-bar.ariaLabelDomainVisibilityTrustedParties=Definir a visibilidade de domínio como Partes confiáveis +side-bar.ariaLabelDomainVisibilityPrivate=Definir a visibilidade de domínio como Apenas para mim side-bar.ariaOpenAccountSettings=Abra as configurações da sua conta ORCID side-bar.notificationsAreSentToEmail=As notificações são enviadas para diff --git a/src/locale/properties/side-bar/side-bar.ru.properties b/src/locale/properties/side-bar/side-bar.ru.properties index a683ad416..11233c60a 100644 --- a/src/locale/properties/side-bar/side-bar.ru.properties +++ b/src/locale/properties/side-bar/side-bar.ru.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=условиям использования ORCID side-bar.youMayOnly=Вы можете добавлять только те адреса электронной почты, которые Вы контролируете. Каждый раз, когда Вы добавляете адрес электронной почты, мы будем отправлять Вам электронное письмо с просьбой подтвердить его. side-bar.primaryEmail=Основной адрес электронной почты side-bar.verifiedEmail=Подтвержденный адрес эл. почты +side-bar.verifiedEmailAddresses=Подтвержденные адреса электронной почты side-bar.emailCanNotBeDuplicated=Адрес электронной почты не может дублироваться side-bar.noOtherEmails=Вы еще не добавили каких-либо других адресов электронной почты. side-bar.invalidEmailFormat=Недействительный формат электронной почты @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Выбрать для параметра в side-bar.ariaLabelEmailPublic=Выбрать настройку видимости эл. почты «Публичный доступ» side-bar.ariaLabelEmailTrustedParties=Выбрать настройку видимости эл. почты «Доверенные лица» side-bar.ariaLabelEmailPrivate=Выбрать настройку видимости эл. почты «Приватный доступ» +side-bar.ariaLabelDomainVisibilityPublic=Выбрать настройку видимости домена «Публичный доступ» +side-bar.ariaLabelDomainVisibilityTrustedParties=Выбрать настройку видимости домена «Доверенные лица» +side-bar.ariaLabelDomainVisibilityPrivate=Выбрать настройку видимости домена «Личный доступ» side-bar.ariaOpenAccountSettings=Открыть настройки профиля ORCID side-bar.notificationsAreSentToEmail=Уведомления отправляются на адрес diff --git a/src/locale/properties/side-bar/side-bar.tr.properties b/src/locale/properties/side-bar/side-bar.tr.properties index 2c4fa7108..22d8e9990 100644 --- a/src/locale/properties/side-bar/side-bar.tr.properties +++ b/src/locale/properties/side-bar/side-bar.tr.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=göre side-bar.youMayOnly=yalnızca yönettiğiniz e-posta adreslerini ekleyebilirsiniz. Her e-posta adresi eklediğinizde, size doğrulamanızı isteyen bir e-posta göndeririz. side-bar.primaryEmail=Birincil e-posta adresi side-bar.verifiedEmail=Doğrulanmış e-posta adresi +side-bar.verifiedEmailAddresses=Doğrulanmış e-posta adresleri side-bar.emailCanNotBeDuplicated=E-posta çoğaltılamaz side-bar.noOtherEmails=Henüz başka bir e-posta adresi eklemediniz. side-bar.invalidEmailFormat=Geçersiz e-posta biçimi @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=Diğer e-posta görünürlüğünü Yalnızc side-bar.ariaLabelEmailPublic=E-posta görünürlüğünü Herkes olarak ayarla side-bar.ariaLabelEmailTrustedParties=E-posta görünürlüğünü Güvenilen Taraflar olarak ayarla side-bar.ariaLabelEmailPrivate=E-posta görünürlüğünü Yalnızca Ben olarak ayarla +side-bar.ariaLabelDomainVisibilityPublic=Etki alanı görünürlüğünü Herkes olarak ayarla +side-bar.ariaLabelDomainVisibilityTrustedParties=Etki alanı görünürlüğünü Güvenilen Taraflar olarak ayarla +side-bar.ariaLabelDomainVisibilityPrivate=Etki alanı görünürlüğünü Yalnızca Ben olarak ayarla side-bar.ariaOpenAccountSettings=ORCID hesap ayarlarınızı açın side-bar.notificationsAreSentToEmail=Bildirimler gönderildi: diff --git a/src/locale/properties/side-bar/side-bar.zh_CN.properties b/src/locale/properties/side-bar/side-bar.zh_CN.properties index a24982ff6..e96c0ed54 100644 --- a/src/locale/properties/side-bar/side-bar.zh_CN.properties +++ b/src/locale/properties/side-bar/side-bar.zh_CN.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=使用条款 side-bar.youMayOnly=您仅能新增由您使用的电子邮箱地址。我们将在您新增电子邮箱地址时,发送验证邮件,要求您验证该邮箱地址。 side-bar.primaryEmail=主要电子邮箱地址 side-bar.verifiedEmail=已验证电子邮件地址 +side-bar.verifiedEmailAddresses=已验证的电子邮件地址 side-bar.emailCanNotBeDuplicated=无法复制电子邮箱地址 side-bar.noOtherEmails=您尚未新增任何其他电子邮箱地址。 side-bar.invalidEmailFormat=无效邮箱格式 @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=将其他电子邮件可能度设置为只 side-bar.ariaLabelEmailPublic=将电子邮件可见性设置为所有人 side-bar.ariaLabelEmailTrustedParties=向受信任方设置电子邮件可见性 side-bar.ariaLabelEmailPrivate=将电子邮件可见性设置为仅我可见 +side-bar.ariaLabelDomainVisibilityPublic=将域名可见性设置为所有人 +side-bar.ariaLabelDomainVisibilityTrustedParties=向受信任方设置域名可见性 +side-bar.ariaLabelDomainVisibilityPrivate=将域名可见性设置为仅我可见 side-bar.ariaOpenAccountSettings=打开您的 ORCID 帐户设置 side-bar.notificationsAreSentToEmail=通知会发送到 diff --git a/src/locale/properties/side-bar/side-bar.zh_TW.properties b/src/locale/properties/side-bar/side-bar.zh_TW.properties index c1a11b265..323aa34a3 100644 --- a/src/locale/properties/side-bar/side-bar.zh_TW.properties +++ b/src/locale/properties/side-bar/side-bar.zh_TW.properties @@ -4,6 +4,7 @@ side-bar.termOfUse=使用條款 side-bar.youMayOnly=您僅能新增由您使用的電子郵件地址。我們將會於您新增電子郵件地址時,寄送驗證郵件請您驗證該電子郵件地址。 side-bar.primaryEmail=主要電子郵件地址 side-bar.verifiedEmail=已驗證的電子郵件地址 +side-bar.verifiedEmailAddresses=已驗證的電子郵件地址 side-bar.emailCanNotBeDuplicated=無法複製電子郵件地址 side-bar.noOtherEmails=您尚未新增任何其他電子郵件地址。 side-bar.invalidEmailFormat=無效的電子郵件格式 @@ -103,5 +104,8 @@ side-bar.ariaLabelOtherEmailPrivate=將其他電子郵件可能度設定為「 side-bar.ariaLabelEmailPublic=將電子郵件可見度設定為「所有人」 side-bar.ariaLabelEmailTrustedParties=將電子郵件可見度設定為「受信任方」 side-bar.ariaLabelEmailPrivate=將電子郵件可見度設定為「只有我」 +side-bar.ariaLabelDomainVisibilityPublic=將網域可見度設定為「所有人」 +side-bar.ariaLabelDomainVisibilityTrustedParties=將網域可見度設定為「受信任方」 +side-bar.ariaLabelDomainVisibilityPrivate=將網域可見度設定為「只有我」 side-bar.ariaOpenAccountSettings=開啟您的 ORCID 帳戶設定 side-bar.notificationsAreSentToEmail=通知會傳送到 diff --git a/src/locale/properties/summary/summary.ar.properties b/src/locale/properties/summary/summary.ar.properties index c4feecbf2..b31433c96 100644 --- a/src/locale/properties/summary/summary.ar.properties +++ b/src/locale/properties/summary/summary.ar.properties @@ -43,3 +43,19 @@ summary.viewFundings=اعرض كل التمويل في summary.viewPeerReviews=اعرض كل التقييمات في summary.viewProfessionalActivities=اعرض كل الأنشطة المهنية في summary.viewIdentifiers=اعرض كل المعرفات في +summary.emailDomains=نطاقات البريد الإلكتروني +summary.researchResources=مصادر البحث +summary.educationQualificationActivites=التعليم والمؤهلات +summary.selfAssertedResearchResources=مصادر البحث الذاتي +summary.validatedResearchResources=مصادر بحثية معتمدة +summary.selfAssertedResearchResource=مصدر بحثي موئوق +summary.validatedResearchResource=مصادر بحث معتمدة +summary.moreEmailDomains=المزيد من نطاقات البريد الإلكتروني +summary.moreEmailDomain=المزيد من نطاق البريد الإلكتروني +summary.emailDomainsLabel=نطاقات البريد الإلكتروني +summary.viewResearchResources=عرض جميع الأبحاث والموارد في +summary.viewEducationQualificationsActivities=عرض جميع المؤهلات والتعليمات في +summary.viewEducationQualificationsActivitie=عرض المؤهلات والتعليمات في +summary.moreEducationQualifications=مزيد من التعليم والمؤهلات +summary.moreEducationQualification=مزيد من التعليم والمؤهل +summary.viewDomain=عرض جميع نطاقات البريد الإلكتروني في diff --git a/src/locale/properties/summary/summary.cs.properties b/src/locale/properties/summary/summary.cs.properties index d1a357047..a8f9e19e5 100644 --- a/src/locale/properties/summary/summary.cs.properties +++ b/src/locale/properties/summary/summary.cs.properties @@ -43,3 +43,19 @@ summary.viewFundings=Zobrazit všechna financování do summary.viewPeerReviews=Zobrazit všechny recenze v summary.viewProfessionalActivities=Zobrazit všechny odborné činnosti v summary.viewIdentifiers=Zobrazit všechny identifikátory v +summary.emailDomains=E-MAILOVÉ DOMÉNY +summary.researchResources=PROHLEDAT ZDROJE +summary.educationQualificationActivites=VZDĚLÁNÍ A KVALIFIKACE +summary.selfAssertedResearchResources=Výzkumné zdroje přidané uživatelem +summary.validatedResearchResources=Ověřené výzkumné zdroje +summary.selfAssertedResearchResource=Výzkumný zdroj přidaný uživatelem +summary.validatedResearchResource=Ověřený výzkumný zdroj +summary.moreEmailDomains=další e-mailové domény +summary.moreEmailDomain=další e-mailová doména +summary.emailDomainsLabel=E-mailové domény +summary.viewResearchResources=Zobrazit všechny výzkumy a zdroje v +summary.viewEducationQualificationsActivities=Zobrazit všechna vzdělání a kvalifikace v +summary.viewEducationQualificationsActivitie=Zobrazit vzdělání a kvalifikaci v +summary.moreEducationQualifications=další vzdělání a kvalifikace +summary.moreEducationQualification=další vzdělání a kvalifikace +summary.viewDomain=Zobrazit všechny e-mailové domény v diff --git a/src/locale/properties/summary/summary.de.properties b/src/locale/properties/summary/summary.de.properties index 571a55c9a..cb1ef0dfb 100644 --- a/src/locale/properties/summary/summary.de.properties +++ b/src/locale/properties/summary/summary.de.properties @@ -43,3 +43,19 @@ summary.viewFundings=Alle Finanzierungsdaten in summary.viewPeerReviews=Alle Peer-Reviews in summary.viewProfessionalActivities=Alle beruflichen Tätigkeiten in summary.viewIdentifiers=Alle Identifikatoren in +summary.emailDomains=E-MAIL-DOMAINS +summary.researchResources=FORSCHUNGSRESSOURCEN +summary.educationQualificationActivites=AUSBILDUNG UND QUALIFIKATIONEN +summary.selfAssertedResearchResources=Selbst angegebene Forschungsressourcen +summary.validatedResearchResources=Verifizierte Forschungsressourcen +summary.selfAssertedResearchResource=Selbst angegebene Forschungsressource +summary.validatedResearchResource=Verifizierte Forschungsressourcen +summary.moreEmailDomains=weitere E-Mail-Domains +summary.moreEmailDomain=weitere E-Mail-Domain +summary.emailDomainsLabel=E-Mail-Domains +summary.viewResearchResources=Alle Forschung und Ressourcen für folgenden Eintrag anzeigen: +summary.viewEducationQualificationsActivities=Alle Ausbildung und Qualifikationen für folgenden Eintrag anzeigen: +summary.viewEducationQualificationsActivitie=Ausbildung und Qualifikation für folgenden Eintrag anzeigen: +summary.moreEducationQualifications=weitere Ausbildung und Qualifikationen +summary.moreEducationQualification=weitere Ausbildung und Qualifikation +summary.viewDomain=Alle E-Mail-Domains für folgenden Eintrag anzeigen: diff --git a/src/locale/properties/summary/summary.en.properties b/src/locale/properties/summary/summary.en.properties index b33a8d8cf..aa69bf590 100644 --- a/src/locale/properties/summary/summary.en.properties +++ b/src/locale/properties/summary/summary.en.properties @@ -43,3 +43,19 @@ summary.viewFundings=View all funding in summary.viewPeerReviews=View all peer reviews in summary.viewProfessionalActivities=View all professional activities in summary.viewIdentifiers=View all identifiers in +summary.emailDomains=EMAIL DOMAINS +summary.researchResources=RESEARCH RESOURCES +summary.educationQualificationActivites=EDUCATION AND QUALIFICATIONS +summary.selfAssertedResearchResources=Self-asserted research resources +summary.validatedResearchResources=Validated research resources +summary.selfAssertedResearchResource=Self-asserted research resource +summary.validatedResearchResource=Validated research resource +summary.moreEmailDomains=more Email Domains +summary.moreEmailDomain=more Email Domain +summary.emailDomainsLabel=Email Domains +summary.viewResearchResources=View all research and resources in +summary.viewEducationQualificationsActivities=View all education and qualifications in +summary.viewEducationQualificationsActivitie=View education and qualification in +summary.moreEducationQualifications=more Education and Qualifications +summary.moreEducationQualification=more Education and Qualification +summary.viewDomain=View all email domains in diff --git a/src/locale/properties/summary/summary.es.properties b/src/locale/properties/summary/summary.es.properties index 68c2700d5..e5d60e7eb 100644 --- a/src/locale/properties/summary/summary.es.properties +++ b/src/locale/properties/summary/summary.es.properties @@ -43,3 +43,19 @@ summary.viewFundings=Ver todas las financiaciones en summary.viewPeerReviews=Ver todas las revisiones por pares en summary.viewProfessionalActivities=Ver todas las actividades profesionales en summary.viewIdentifiers=Ver todos los identificadores en +summary.emailDomains=DOMINIOS DE CORREO ELECTRÓNICO +summary.researchResources=RECURSOS DE INVESTIGACIÓN +summary.educationQualificationActivites=EDUCACIÓN Y TITULACIONES +summary.selfAssertedResearchResources=Recursos de investigación autoafirmados +summary.validatedResearchResources=Recursos de investigación validados +summary.selfAssertedResearchResource=Recurso de investigación autoafirmado +summary.validatedResearchResource=Recurso de investigación validado +summary.moreEmailDomains=dominios de correo electrónico más +summary.moreEmailDomain=dominio de correo electrónico más +summary.emailDomainsLabel=Dominios de correo electrónico +summary.viewResearchResources=Ver todas las investigaciones y recursos en +summary.viewEducationQualificationsActivities=Ver toda la educación y las titulaciones en +summary.viewEducationQualificationsActivitie=Ver la educación y la titulación en +summary.moreEducationQualifications=educación y titulaciones más +summary.moreEducationQualification=educación y titulación más +summary.viewDomain=Ver todos los dominios de correo electrónico en diff --git a/src/locale/properties/summary/summary.fr.properties b/src/locale/properties/summary/summary.fr.properties index 4a9e34a0e..5902c968e 100644 --- a/src/locale/properties/summary/summary.fr.properties +++ b/src/locale/properties/summary/summary.fr.properties @@ -43,3 +43,19 @@ summary.viewFundings=Afficher tous les financements dans summary.viewPeerReviews=Afficher tous les examens par les pairs dans summary.viewProfessionalActivities=Afficher toutes les activités professionnelles dans summary.viewIdentifiers=Afficher tous les identifiants dans +summary.emailDomains=DOMAINES E-MAIL +summary.researchResources=RESSOURCES DE RECHERCHE +summary.educationQualificationActivites=FORMATIONS ET QUALIFICATIONS +summary.selfAssertedResearchResources=Ressources de recherche autoproclamées +summary.validatedResearchResources=Ressources de recherche validées +summary.selfAssertedResearchResource=Ressource de recherche autoproclamée +summary.validatedResearchResource=Ressource de recherche validée +summary.moreEmailDomains=autres domaines e-mail +summary.moreEmailDomain=autre domaine e-mail +summary.emailDomainsLabel=Domaines e-mail +summary.viewResearchResources=Voir toutes les recherches et ressources dans +summary.viewEducationQualificationsActivities=Voir toutes les formations et qualifications dans +summary.viewEducationQualificationsActivitie=Voir les formations et qualifications dans +summary.moreEducationQualifications=autres formations et qualifications +summary.moreEducationQualification=autre formation et qualification +summary.viewDomain=Voir tous les domaines e-mail dans diff --git a/src/locale/properties/summary/summary.it.properties b/src/locale/properties/summary/summary.it.properties index 20777efa3..0bffb9f7c 100644 --- a/src/locale/properties/summary/summary.it.properties +++ b/src/locale/properties/summary/summary.it.properties @@ -43,3 +43,19 @@ summary.viewFundings=Visualizza tutti i finanziamenti in summary.viewPeerReviews=Visualizza tutte le revisioni paritarie in summary.viewProfessionalActivities=Visualizza tutte le attività professionali in summary.viewIdentifiers=Visualizza tutti gli identificatori in +summary.emailDomains=DOMINI EMAIL +summary.researchResources=RISORSE PER LA RICERCA +summary.educationQualificationActivites=ISTRUZIONE E TITOLI +summary.selfAssertedResearchResources=Risorse per la ricerca autodichiarate +summary.validatedResearchResources=Risorse per la ricerca convalidate +summary.selfAssertedResearchResource=Risorsa per la ricerca autodichiarata +summary.validatedResearchResource=Risorsa per la ricerca convalidata +summary.moreEmailDomains=Altri 2 domini email +summary.moreEmailDomain=altro dominio email +summary.emailDomainsLabel=Domini email +summary.viewResearchResources=Visualizza tutta la ricerca e le risorse in +summary.viewEducationQualificationsActivities=Visualizza tutta l’istruzione e i titoli in +summary.viewEducationQualificationsActivitie=Visualizza l’istruzione e il titolo in +summary.moreEducationQualifications=Altre voci relative a istruzione e titoli +summary.moreEducationQualification=altra voce relativa a istruzione e titolo +summary.viewDomain=Visualizza tutti i domini email in diff --git a/src/locale/properties/summary/summary.ja.properties b/src/locale/properties/summary/summary.ja.properties index 0aab3beeb..3b85a6ecf 100644 --- a/src/locale/properties/summary/summary.ja.properties +++ b/src/locale/properties/summary/summary.ja.properties @@ -43,3 +43,19 @@ summary.viewFundings=すべての資金調達を表示: summary.viewPeerReviews=すべてのピアレビューを表示: summary.viewProfessionalActivities=すべての専門研究活動を表示: summary.viewIdentifiers=すべての識別子を表示: +summary.emailDomains=メールドメイン +summary.researchResources=研究リソース +summary.educationQualificationActivites=教育と資格 +summary.selfAssertedResearchResources=自己出資研究リソース +summary.validatedResearchResources=検証済みの研究リソース +summary.selfAssertedResearchResource=自己出資研究リソース +summary.validatedResearchResource=検証済みの研究リソース +summary.moreEmailDomains=その他のメールドメイン +summary.moreEmailDomain=その他のメールドメイン +summary.emailDomainsLabel=メードメイン +summary.viewResearchResources=すべての研究とリソースを表示: +summary.viewEducationQualificationsActivities=すべての教育と資格を表示: +summary.viewEducationQualificationsActivitie=教育と資格を表示: +summary.moreEducationQualifications=その他の教育と資格 +summary.moreEducationQualification=その他の教育と資格 +summary.viewDomain=すべてのメールドメインを表示: diff --git a/src/locale/properties/summary/summary.ko.properties b/src/locale/properties/summary/summary.ko.properties index eac0c0d58..7a2fada46 100644 --- a/src/locale/properties/summary/summary.ko.properties +++ b/src/locale/properties/summary/summary.ko.properties @@ -43,3 +43,19 @@ summary.viewFundings=모든 자금원 보기 summary.viewPeerReviews=모든 동료 검토 보기 summary.viewProfessionalActivities=모든 전문 활동 보기 summary.viewIdentifiers=모든 식별자 보기 +summary.emailDomains=이메일 도메인 +summary.researchResources=연구 리소스 +summary.educationQualificationActivites=학력 및 자격증 +summary.selfAssertedResearchResources=자기주장 연구 리소스 +summary.validatedResearchResources=검증된 연구 리소스 +summary.selfAssertedResearchResource=자기주장 연구 리소스 +summary.validatedResearchResource=검증된 연구 리소스 +summary.moreEmailDomains=이메일 도메인 더 보기 +summary.moreEmailDomain=이메일 도메인 더 보기 +summary.emailDomainsLabel=이메일 도메인 +summary.viewResearchResources=모든 연구 및 리소스 보기 +summary.viewEducationQualificationsActivities=모든 학력 및 자격증 보기 +summary.viewEducationQualificationsActivitie=학력 및 자격증 보기 +summary.moreEducationQualifications=학력 및 자격증 더 보기 +summary.moreEducationQualification=학력 및 자격증 더 보기 +summary.viewDomain=모든 이메일 도메인 보기 diff --git a/src/locale/properties/summary/summary.lr.properties b/src/locale/properties/summary/summary.lr.properties index 6885814ec..488bf436f 100644 --- a/src/locale/properties/summary/summary.lr.properties +++ b/src/locale/properties/summary/summary.lr.properties @@ -43,3 +43,19 @@ summary.viewFundings=LR summary.viewPeerReviews=LR summary.viewProfessionalActivities=LR summary.viewIdentifiers=LR +summary.emailDomains=LR +summary.researchResources=LR +summary.educationQualificationActivites=LR +summary.selfAssertedResearchResources=LR +summary.validatedResearchResources=LR +summary.selfAssertedResearchResource=LR +summary.validatedResearchResource=LR +summary.moreEmailDomains=LR +summary.moreEmailDomain=LR +summary.emailDomainsLabel=LR +summary.viewResearchResources=LR +summary.viewEducationQualificationsActivities=LR +summary.viewEducationQualificationsActivitie=LR +summary.viewDomain=LR +summary.moreEducationQualifications=LR +summary.moreEducationQualification=LR diff --git a/src/locale/properties/summary/summary.pl.properties b/src/locale/properties/summary/summary.pl.properties index d24901abc..e90ef733f 100644 --- a/src/locale/properties/summary/summary.pl.properties +++ b/src/locale/properties/summary/summary.pl.properties @@ -43,3 +43,19 @@ summary.viewFundings=Zobacz wszystkie fundusze w summary.viewPeerReviews=Zobacz wszystkie recenzje w summary.viewProfessionalActivities=Zobacz wszystkie aktywności zawodowe w summary.viewIdentifiers=Wyświetl wszystkie identyfikatory w +summary.emailDomains=DOMENY E-MAIL +summary.researchResources=ZASOBY BADAWCZE +summary.educationQualificationActivites=WYKSZTAŁCENIE I KWALIFIKACJE +summary.selfAssertedResearchResources=Samoistnie zweryfikowane zasoby badawcze +summary.validatedResearchResources=Zweryfikowane zasoby badawcze +summary.selfAssertedResearchResource=Samoistnie zweryfikowany zasób badawczy +summary.validatedResearchResource=Zweryfikowany zasób badawczy +summary.moreEmailDomains=więcej domen e-mail +summary.moreEmailDomain=dodatkowa domena e-mail +summary.emailDomainsLabel=Domeny e-mail +summary.viewResearchResources=Wyświetl wszystkie zasoby badawcze w +summary.viewEducationQualificationsActivities=Wyświetl wszystkie kwalifikacje i wykształcenie w +summary.viewEducationQualificationsActivitie=Wyświetl wykształcenie i kwalifikacje w +summary.moreEducationQualifications=dodatkowe wykształcenie i kwalifikacje +summary.moreEducationQualification=dodatkowe wykształcenie i kwalifikacje +summary.viewDomain=Wyświetl wszystkie domeny e-mail w diff --git a/src/locale/properties/summary/summary.pt.properties b/src/locale/properties/summary/summary.pt.properties index f2c8f91b6..92bbfe92a 100644 --- a/src/locale/properties/summary/summary.pt.properties +++ b/src/locale/properties/summary/summary.pt.properties @@ -43,3 +43,19 @@ summary.viewFundings=Ver todo o financiamento em summary.viewPeerReviews=Ver todas as revisões por pares em summary.viewProfessionalActivities=Ver todas as atividades profissionais em summary.viewIdentifiers=Ver todos os identificadores em +summary.emailDomains=DOMÍNIOS DE E-MAIL +summary.researchResources=RECURSOS DE PESQUISA +summary.educationQualificationActivites=EDUCAÇÃO E QUALIFICAÇÕES +summary.selfAssertedResearchResources=Recursos de pesquisa autoafirmados +summary.validatedResearchResources=Recursos de pesquisa validados +summary.selfAssertedResearchResource=Recurso de pesquisa autoafirmado +summary.validatedResearchResource=Recurso de pesquisa validado +summary.moreEmailDomains=mais domínios de e-mail +summary.moreEmailDomain=mais Domínio de e-mail +summary.emailDomainsLabel=Domínios de e-mail +summary.viewResearchResources=Ver todas as pesquisas e recursos em +summary.viewEducationQualificationsActivities=Ver toda a educação e qualificações em +summary.viewEducationQualificationsActivitie=Ver educação e qualificação em +summary.moreEducationQualifications=mais Educação e Qualificações +summary.moreEducationQualification=mais Educação e Qualificação +summary.viewDomain=Ver todos os domínios de e-mail em diff --git a/src/locale/properties/summary/summary.rl.properties b/src/locale/properties/summary/summary.rl.properties index 0b5ca21dd..8ffbfa626 100644 --- a/src/locale/properties/summary/summary.rl.properties +++ b/src/locale/properties/summary/summary.rl.properties @@ -43,3 +43,19 @@ summary.viewFundings=RL summary.viewPeerReviews=RL summary.viewProfessionalActivities=RL summary.viewIdentifiers=RL +summary.emailDomains=RL +summary.researchResources=RL +summary.educationQualificationActivites=RL +summary.selfAssertedResearchResources=RL +summary.validatedResearchResources=RL +summary.selfAssertedResearchResource=RL +summary.validatedResearchResource=RL +summary.moreEmailDomains=RL +summary.moreEmailDomain=RL +summary.emailDomainsLabel=RL +summary.viewResearchResources=RL +summary.viewEducationQualificationsActivities=RL +summary.viewEducationQualificationsActivitie=RL +summary.viewDomain=RL +summary.moreEducationQualifications=RL +summary.moreEducationQualification=RL diff --git a/src/locale/properties/summary/summary.ru.properties b/src/locale/properties/summary/summary.ru.properties index 6f1404c56..6937f71e6 100644 --- a/src/locale/properties/summary/summary.ru.properties +++ b/src/locale/properties/summary/summary.ru.properties @@ -43,3 +43,19 @@ summary.viewFundings=Смотреть все источники финансир summary.viewPeerReviews=Смотреть все рецензии здесь: summary.viewProfessionalActivities=Смотреть все сведения о проф. деятельности здесь: summary.viewIdentifiers=Смотреть все идентификаторы здесь: +summary.emailDomains=ДОМЕНЫ ЭЛЕКТРОННОЙ ПОЧТЫ +summary.researchResources=ИССЛЕДОВАТЕЛЬСКИЕ РЕСУРСЫ +summary.educationQualificationActivites=ОБРАЗОВАНИЕ И КВАЛИФИКАЦИЯ +summary.selfAssertedResearchResources=Неподтвержденные исследовательские ресурсы +summary.validatedResearchResources=Подтвержденные исследовательские ресурсы +summary.selfAssertedResearchResource=Неподтвержденный исследовательский ресурс +summary.validatedResearchResource=Подтвержденный исследовательский ресурс +summary.moreEmailDomains=домен. эл. почты +summary.moreEmailDomain=домен электронной почты +summary.emailDomainsLabel=Домены электронной почты +summary.viewResearchResources=Смотреть все исследовательские ресурсы здесь: +summary.viewEducationQualificationsActivities=Смотреть все сведения об образовании и квалификации здесь: +summary.viewEducationQualificationsActivitie=Смотреть сведения об образовании и квалификации здесь: +summary.moreEducationQualifications=свед. об образовании и квалификации +summary.moreEducationQualification=сведение об образовании и квалификации +summary.viewDomain=Смотреть все домены электронной почты здесь: diff --git a/src/locale/properties/summary/summary.tr.properties b/src/locale/properties/summary/summary.tr.properties index d67a03e33..ab994ffa6 100644 --- a/src/locale/properties/summary/summary.tr.properties +++ b/src/locale/properties/summary/summary.tr.properties @@ -43,3 +43,19 @@ summary.viewFundings=Tüm finansmanı görüntüleyin: summary.viewPeerReviews=Tüm meslektaş değerlendirmelerini görüntüleyin: summary.viewProfessionalActivities=Tüm profesyonel faaliyetleri görüntüleyin: summary.viewIdentifiers=Tüm tanımlayıcıları görüntüleyin: +summary.emailDomains=E-POSTA ETKİ ALANLARI +summary.researchResources=ARAŞTIRMA KAYNAKLARI +summary.educationQualificationActivites=EĞİTİM VE NİTELİKLER +summary.selfAssertedResearchResources=Kullanıcı tarafından onaylanmış araştırma kaynakları +summary.validatedResearchResources=Doğrulanmış araştırma kaynakları +summary.selfAssertedResearchResource=Kullanıcı tarafından onaylanmış araştırma kaynağı +summary.validatedResearchResource=Doğrulanmış araştırma kaynağı +summary.moreEmailDomains=daha fazla E-posta Etki Alanı +summary.moreEmailDomain=daha fazla E-posta Etki Alanı +summary.emailDomainsLabel=E-posta Etki Alanları +summary.viewResearchResources=Şuradaki tüm araştırmalar ve kaynakları görüntüleyin: +summary.viewEducationQualificationsActivities=Şuradaki tüm eğitim ve nitelikleri görüntüleyin: +summary.viewEducationQualificationsActivitie=Şuradaki eğitim ve niteliği görüntüleyin: +summary.moreEducationQualifications=daha fazla Eğitim ve Nitelik +summary.moreEducationQualification=daha fazla Eğitim ve Nitelik +summary.viewDomain=Şuradaki tüm e-posta etki alanlarını görüntüleyin: diff --git a/src/locale/properties/summary/summary.xx.properties b/src/locale/properties/summary/summary.xx.properties index 6e2f18c40..634924d1c 100644 --- a/src/locale/properties/summary/summary.xx.properties +++ b/src/locale/properties/summary/summary.xx.properties @@ -43,3 +43,19 @@ summary.viewFundings=X summary.viewPeerReviews=X summary.viewProfessionalActivities=X summary.viewIdentifiers=X +summary.emailDomains=X +summary.researchResources=X +summary.educationQualificationActivites=X +summary.selfAssertedResearchResources=X +summary.validatedResearchResources=X +summary.selfAssertedResearchResource=X +summary.validatedResearchResource=X +summary.moreEmailDomains=X +summary.moreEmailDomain=X +summary.emailDomainsLabel=X +summary.viewResearchResources=X +summary.viewEducationQualificationsActivities=X +summary.viewEducationQualificationsActivitie=X +summary.viewDomain=X +summary.moreEducationQualifications=X +summary.moreEducationQualification=X diff --git a/src/locale/properties/summary/summary.zh_CN.properties b/src/locale/properties/summary/summary.zh_CN.properties index 9a5a6cd4f..0d5e21ebb 100644 --- a/src/locale/properties/summary/summary.zh_CN.properties +++ b/src/locale/properties/summary/summary.zh_CN.properties @@ -43,3 +43,19 @@ summary.viewFundings=查看所有资金 summary.viewPeerReviews=查看所有同行评审 summary.viewProfessionalActivities=查看所有的专业活动 summary.viewIdentifiers=查看所有标识符 +summary.emailDomains=电子邮件域名 +summary.researchResources=研究资源 +summary.educationQualificationActivites=教育和资质 +summary.selfAssertedResearchResources=自我宣称的研究资源 +summary.validatedResearchResources=已认证的研究资源 +summary.selfAssertedResearchResource=自我宣称的研究资源 +summary.validatedResearchResource=已认证的研究资源 +summary.moreEmailDomains=更多电子邮件域名 +summary.moreEmailDomain=更多电子邮件域名 +summary.emailDomainsLabel=电子邮件域名 +summary.viewResearchResources=查看下列的所有研究和资源 +summary.viewEducationQualificationsActivities=查看下列的所有教育和资质 +summary.viewEducationQualificationsActivitie=查看下列的教育和资质 +summary.moreEducationQualifications=更多的教育和资质 +summary.moreEducationQualification=更多的教育和资质 +summary.viewDomain=查看下列的所有电子邮件域名 diff --git a/src/locale/properties/summary/summary.zh_TW.properties b/src/locale/properties/summary/summary.zh_TW.properties index c4fcc15f2..69408ccb6 100644 --- a/src/locale/properties/summary/summary.zh_TW.properties +++ b/src/locale/properties/summary/summary.zh_TW.properties @@ -43,3 +43,19 @@ summary.viewFundings=檢視所有資金 summary.viewPeerReviews=檢視所有同儕審查 summary.viewProfessionalActivities=檢視所有專業活動 summary.viewIdentifiers=檢視所有識別碼 +summary.emailDomains=電子郵件網域 +summary.researchResources=研究資源 +summary.educationQualificationActivites=教育和資格認證 +summary.selfAssertedResearchResources=自我宣稱的研究資源 +summary.validatedResearchResources=已驗證的研究資源 +summary.selfAssertedResearchResource=自我宣稱的研究資源 +summary.validatedResearchResource=已驗證的研究資源 +summary.moreEmailDomains=個其他的電子郵件網域 +summary.moreEmailDomain=個其他的電子郵件網域 +summary.emailDomainsLabel=電子郵件網域 +summary.viewResearchResources=檢視以下位置的所有研究和資源: +summary.viewEducationQualificationsActivities=檢視以下位置的所有教育和資格認證: +summary.viewEducationQualificationsActivitie=檢視以下位置的教育和資格認證: +summary.moreEducationQualifications=個其他的教育和資格認證 +summary.moreEducationQualification=個其他的教育和資格認證 +summary.viewDomain=檢視以下位置的所有電子郵件網域: