diff --git a/angular.json b/angular.json index 10a7014ca..374357c2b 100644 --- a/angular.json +++ b/angular.json @@ -87,16 +87,34 @@ "fi": { "localize": [ "fi" + ], + "fileReplacements": [ + { + "replace": "src/environments/locale.ts", + "with": "src/environments/locale.fi.ts" + } ] }, "en": { "localize": [ "en" + ], + "fileReplacements": [ + { + "replace": "src/environments/locale.ts", + "with": "src/environments/locale.en.ts" + } ] }, "sv": { "localize": [ "sv" + ], + "fileReplacements": [ + { + "replace": "src/environments/locale.ts", + "with": "src/environments/locale.sv.ts" + } ] }, "es5": { diff --git a/src/app/portal/components/collapsible/collapsible.component.html b/src/app/portal/components/collapsible/collapsible.component.html index 2f03b52f3..449cf2a1a 100644 --- a/src/app/portal/components/collapsible/collapsible.component.html +++ b/src/app/portal/components/collapsible/collapsible.component.html @@ -6,7 +6,7 @@
-
+
-
@@ -15,17 +15,19 @@
+
-
{{label}}
+
+ {{label}} - -
- -
-
+ +
+ +
+
+
- +
diff --git a/src/app/portal/components/organization-filter/organization-filter.component.ts b/src/app/portal/components/organization-filter/organization-filter.component.ts index e28ff7b90..fa735d5d8 100644 --- a/src/app/portal/components/organization-filter/organization-filter.component.ts +++ b/src/app/portal/components/organization-filter/organization-filter.component.ts @@ -41,12 +41,13 @@ export class OrganizationFilterComponent { 6: 10, }; + /* TODO localization solution */ // TODO ? public sectorNames = { - 1: "Yliopisto", - 2: "Ammattikorkeakoulu", - 3: "Tutkimuslaitos", - 4: "Yliopistollisen sairaalan erityisvastuualue", - 6: "Muu" + 1: $localize`:@@organizationSector1:Yliopisto`, + 2: $localize`:@@organizationSector2:Ammattikorkeakoulu`, + 3: $localize`:@@organizationSector3:Tutkimuslaitos`, + 4: $localize`:@@organizationSector4:Yliopistollisen sairaalan erityisvastuualue`, + 6: $localize`:@@organizationSector5:Muu` } toggleExpanded() { diff --git a/src/app/portal/components/results/publications2/publications2.component.html b/src/app/portal/components/results/publications2/publications2.component.html index 31703c6c5..cf8504341 100644 --- a/src/app/portal/components/results/publications2/publications2.component.html +++ b/src/app/portal/components/results/publications2/publications2.component.html @@ -121,12 +121,12 @@

Rajaa hakua

OKM:n julkaisutiedonkeruun mukainen julkaisutyyppi A–G. - + - + - + = {}; @@ -300,27 +312,15 @@ export class Publications2Component implements OnDestroy { tap(filters => this.updateFilterCount("parentPublicationType", filters.filter(filter => filter.enabled).length)) ); - - - /* TODO localization solution */ - public sectorName = { - 1: "Yliopisto", - 2: "Ammattikorkeakoulu", - 3: "Tutkimuslaitos", - 4: "Yliopistollisen sairaalan erityisvastuualue", - 6: "Muu" - }; - - /* TODO localization solution */ public mainFieldOfScienceName = { - "1": "Luonnontieteet", - "2": "Tekniikka", - "3": "Lääke- ja terveystieteet", - "4": "Maatalous- ja metsätieteet", - "5": "Yhteiskuntatieteet", - "6": "Humanistiset tieteet", + "1": $localize`:@@naturalSciences:Luonnontieteet`, + "2": $localize`:@@engineeringTecnology:Tekniikka`, + "3": $localize`:@@medicalHealthSciences:Lääke- ja terveystieteet`, + "4": $localize`:@@agriculturalSciences:Maatalous- ja metsätieteet`, + "5": $localize`:@@socialSciences:Yhteiskuntatieteet`, + "6": $localize`:@@humanities:Humanistiset tieteet`, // 7 not used - "8": "Taiteenala", + "8": $localize`:@@fieldsOfArt:Taiteenala`, } /*public collapseStates = { diff --git a/src/app/portal/services/publication2.service.ts b/src/app/portal/services/publication2.service.ts index 718ef0a07..29577bd08 100644 --- a/src/app/portal/services/publication2.service.ts +++ b/src/app/portal/services/publication2.service.ts @@ -6,6 +6,11 @@ import { map, switchMap, take, tap } from 'rxjs/operators'; import { ActivatedRoute } from '@angular/router'; import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; +import { locale } from "../../../environments/locale"; +const path = suffixer(locale); + +console.log("LOOK HERE:", path`fieldsOfScience.nameFiScience.keyword`); + /*const PublicationSearchSchema = object({ publicationId: string(), title: string(), @@ -66,7 +71,9 @@ export class Publication2Service { sanitizer = inject(DomSanitizer); locale = inject(LOCALE_ID); - path = suffixer(this.locale); + // path = suffixer(this.locale); + + searchUrl = 'https://researchfi-api-qa.rahtiapp.fi/portalapi/publication/_search?' // organizationNames$ = this.getOrganizationNames(); @@ -115,7 +122,7 @@ export class Publication2Service { searchParams = searchParams as SearchParams; // TODO no effect? - return this.http.post('https://researchfi-api-qa.rahtiapp.fi/portalapi/publication/_search?', { + return this.http.post(this.searchUrl, { from: from, size: size, track_total_hits: true, @@ -228,7 +235,7 @@ export class Publication2Service { 'size': 65536, 'sources': [ { 'id': { 'terms': { 'field': 'author.organization.organizationId.keyword' } } }, - { 'name': { 'terms': { 'field': 'author.organization.OrganizationNameFi.keyword' } } } // TODO path template needed + { 'name': { 'terms': { 'field': path`author.organization.OrganizationNameFi.keyword` } } } // TODO path template needed ] } } @@ -244,7 +251,7 @@ export class Publication2Service { const sectorIds = [1, 2, 3, 4, /*5,*/ 6]; const responses$ = sectorIds.map((sectorId) => { - return this.http.post('https://researchfi-api-qa.rahtiapp.fi/portalapi/publication/_search?', organizationNamesBySector(sectorId)).pipe( + return this.http.post(this.searchUrl, organizationNamesBySector(sectorId)).pipe( map((res) => getOrganizationNameBuckets(res).map((bucket) => [bucket.key.id, {name: bucket.key.name, sectorId}])), ); }); @@ -271,7 +278,7 @@ export class Publication2Service { 'size': 1000, 'sources': [ { 'id': { 'terms': { 'field': 'languages.languageCode.keyword' } } }, - { 'nameFiLanguage': { 'terms': { 'field': 'languages.languageFi.keyword' } } } + { 'nameFiLanguage': { 'terms': { 'field': path`languages.languageFi.keyword` } } } // TODO: does the key need to be localized? // TODO remove "fi" ? ] } } @@ -292,7 +299,7 @@ export class Publication2Service { }; }; - const response$ = this.http.post('https://researchfi-api-qa.rahtiapp.fi/portalapi/publication/_search?', body); + const response$ = this.http.post(this.searchUrl, body); return response$.pipe( map((res) => res.aggregations.composite_pairs.buckets.map((bucket) => [bucket.key.id, bucket.key.nameFiLanguage])), // TODO localized path needed @@ -310,7 +317,7 @@ export class Publication2Service { 'size': 1000, 'sources': [ { 'id': { 'terms': { 'field': 'publicationFormat.id.keyword' } } }, - { 'nameFiFormat': { 'terms': { 'field': 'publicationFormat.nameFiPublicationFormat.keyword' } } } + { 'nameFiFormat': { 'terms': { 'field': path`publicationFormat.nameFiPublicationFormat.keyword` } } } // TODO Does the key need to be localized? // TODO remove "fi" ? ] } } @@ -331,7 +338,7 @@ export class Publication2Service { }; }; - const response$ = this.http.post('https://researchfi-api-qa.rahtiapp.fi/portalapi/publication/_search?', body); + const response$ = this.http.post(this.searchUrl, body); return response$.pipe( map((res) => res.aggregations.composite_pairs.buckets.map((bucket) => [bucket.key.id, bucket.key.nameFiFormat])), // TODO localized path needed @@ -349,7 +356,7 @@ export class Publication2Service { 'size': 1000, 'sources': [ { 'id': { 'terms': { 'field': 'publicationAudience.id.keyword' } } }, - { 'nameFiAudience': { 'terms': { 'field': 'publicationAudience.nameFiPublicationAudience.keyword' } } } + { 'nameFiAudience': { 'terms': { 'field': path`publicationAudience.nameFiPublicationAudience.keyword` } } } // TODO Does the key need to be localized? // TODO remove "fi" ? ] } } @@ -370,7 +377,7 @@ export class Publication2Service { }; }; - const response$ = this.http.post('https://researchfi-api-qa.rahtiapp.fi/portalapi/publication/_search?', body); + const response$ = this.http.post(this.searchUrl, body); return response$.pipe( map((res) => res.aggregations.composite_pairs.buckets.map((bucket) => [bucket.key.id, bucket.key.nameFiAudience])), // TODO localized path needed @@ -393,7 +400,7 @@ export class Publication2Service { "size": 1000, "sources": [ { "id": { "terms": { "field": "parentPublicationType.id.keyword" } } }, - { "nameFiParentPublicationType": { "terms": { "field": "parentPublicationType.nameFiParentPublicationType.keyword" } } } + { "nameFiParentPublicationType": { "terms": { "field": path`parentPublicationType.nameFiParentPublicationType.keyword` } } } // TODO Does the key need to be localized? // TODO remove "fi" ? ] } } @@ -414,7 +421,7 @@ export class Publication2Service { }; }; - const response$ = this.http.post('https://researchfi-api-qa.rahtiapp.fi/portalapi/publication/_search?', body); + const response$ = this.http.post(this.searchUrl, body); return response$.pipe( map((res) => res.aggregations.composite_pairs.buckets.map((bucket) => [bucket.key.id, bucket.key.nameFiParentPublicationType])), // TODO localized path needed @@ -425,24 +432,24 @@ export class Publication2Service { getPeerReviewedNames(): Observable> { return of({ - "0": "Ei-vertaisarvioitu", // TODO use localize`` - "1": "Vertaisarvioitu" // TODO use localize`` + "0": $localize`:@@notPeerReviewed:Ei-vertaisarvioitu`, // TODO does not exist in localization file + "1": $localize`:@@peerReviewed:Vertaisarvioitu` }); } getInternationalPublicationNames(): Observable> { return of({ - "0": "Kotimainen julkaisu", // TODO use localize`` - "1": "Kansainvälinen julkaisu" // TODO use localize`` + "0": $localize`:@@domesticPublication:Kotimainen julkaisu`, + "1": $localize`:@@internationalPublication:Kansainvälinen julkaisu` }); } getArticleTypeCodeNames(): Observable> { return of({ - "0": "Lehti", // TODO use localize`` - "1": "Kokoomateos", // TODO use localize`` - "2": "Konferenssi", // TODO use localize`` - "3": "Verkkoalusta" // TODO use localize`` + "0": $localize`:@@journal:Lehti`, + "1": $localize`:@@researchBook:Kokoomateos`, + "2": $localize`:@@Conference:Konferenssi`, + "3": $localize`:@@onlinePlatform:Verkkoalusta` }); } @@ -469,7 +476,7 @@ export class Publication2Service { { "name": { "terms": { - "field": "fieldsOfScience.nameFiScience.keyword" // TODO localized path needed + 'field': path`fieldsOfScience.nameFiScience.keyword` // TODO localized path needed } } } @@ -497,7 +504,7 @@ export class Publication2Service { }; }; - const response$ = this.http.post('https://researchfi-api-qa.rahtiapp.fi/portalapi/publication/_search?', body); + const response$ = this.http.post(this.searchUrl, body); return response$.pipe( map((res) => res.aggregations.fieldsOfScience_nested.composite_field_of_science.buckets.map((bucket) => [bucket.key.id, bucket.key.name])), @@ -508,45 +515,45 @@ export class Publication2Service { getPublicationTypeCodeNames(): Observable> { const labels = [ - { value: `A`, name: $localize`@@publicationClassA:Vertaisarvioidut tieteelliset artikkelit` }, - { value: `A1`, name: $localize`@@publicationClassA1:Alkuperäisartikkeli tieteellisessä aikakauslehdessä` }, - { value: `A2`, name: $localize`@@publicationClassA2:Katsausartikkeli tieteellisessä aikakauslehdessä` }, - { value: `A3`, name: $localize`@@publicationClassA3:Kirjan tai muun kokoomateoksen osa` }, - { value: `A4`, name: $localize`@@publicationClassA4:Artikkeli konferenssijulkaisussa` }, - { value: `B`, name: $localize`@@publicationClassB:Vertaisarvioimattomat tieteelliset kirjoitukset` }, - { value: `B1`, name: $localize`@@publicationClassB1:Kirjoitus tieteellisessä aikakausilehdessä` }, - { value: `B2`, name: $localize`@@publicationClassB2:Kirjan tai muun kokoomateoksen osa` }, - { value: `B3`, name: $localize`@@publicationClassB3:Vertaisarvioimaton artikkeli konferenssijulkaisussa` }, - { value: `C`, name: $localize`@@publicationClassC:Tieteelliset kirjat` }, - { value: `C1`, name: $localize`@@publicationClassC1:Kustannettu tieteellinen erillisteos` }, - { value: `C2`, name: $localize`@@publicationClassC2:Toimitettu kirja, kokoomateos, konferenssijulkaisu tai lehden erikoisnumero` }, - { value: `D`, name: $localize`@@publicationClassD:Ammattiyhteisölle suunnatut julkaisut` }, - { value: `D1`, name: $localize`@@publicationClassD1:Artikkeli ammattilehdessä` }, - { value: `D2`, name: $localize`@@publicationClassD2:Artikkeli ammatillisessa kokoomateoksessa` }, - { value: `D3`, name: $localize`@@publicationClassD3:Artikkeli ammatillisessa konferenssijulkaisussa` }, - { value: `D4`, name: $localize`@@publicationClassD4:Julkaistu kehittämis- tai tutkimusraportti taikka -selvitys` }, - { value: `D5`, name: $localize`@@publicationClassD5:Ammatillinen kirja` }, - { value: `D6`, name: $localize`@@publicationClassD6:Toimitettu ammatillinen teos` }, - { value: `E`, name: $localize`@@publicationClassE:Suurelle yleisölle suunnatut julkaisut` }, - { value: `E1`, name: $localize`@@publicationClassE1:Yleistajuinen artikkeli, sanomalehtiartikkeli` }, - { value: `E2`, name: $localize`@@publicationClassE2:Yleistajuinen monografia` }, - { value: `E3`, name: $localize`@@publicationClassE3:Toimitettu yleistajuinen teos` }, - { value: `F`, name: $localize`@@publicationClassF:Julkinen taiteellinen ja taideteollinen toiminta` }, - { value: `F1`, name: $localize`@@publicationClassF1:Itsenäinen teos tai esitys` }, - { value: `F2`, name: $localize`@@publicationClassF2:Taiteellisen teoksen tai esityksen osatoteutus` }, - { value: `F3`, name: $localize`@@publicationClassF3:Ei-taiteellisen julkaisun taiteellinen osa` }, - { value: `G`, name: $localize`@@publicationClassG:Opinnäytteet ` }, - { value: `G1`, name: $localize`@@publicationClassG1:Ammattikorkeakoulututkinnon opinnäytetyö, kandidaatintyö` }, - { value: `G2`, name: $localize`@@publicationClassG2:Pro gradu, diplomityö, ylempi amk-opinnäytetyö` }, - { value: `G3`, name: $localize`@@publicationClassG3:Lisensiaatintyö` }, - { value: `G4`, name: $localize`@@publicationClassG4:Monografiaväitöskirja` }, - { value: `G5`, name: $localize`@@publicationClassG5:Artikkeliväitöskirja` }, - { value: `H`, name: $localize`@@publicationClassH:Patentit ja keksintöilmoitukset` }, - { value: `H1`, name: $localize`@@publicationClassH1:Myönnetty patentti` }, - { value: `H2`, name: $localize`@@publicationClassH2:Keksintöilmoitus` }, - { value: `I`, name: $localize`@@publicationClassI:Audiovisuaaliset julkaisut ja tieto- ja viestintätekniset sovellukset` }, - { value: `I1`, name: $localize`@@publicationClassI1:Audiovisuaaliset julkaisut` }, - { value: `I2`, name: $localize`@@publicationClassI2:Tieto- ja viestintätekniset sovellukset` } + { value: `A`, name: $localize`:@@publicationClassA:Vertaisarvioidut tieteelliset artikkelit` }, + { value: `A1`, name: $localize`:@@publicationClassA1:Alkuperäisartikkeli tieteellisessä aikakauslehdessä` }, + { value: `A2`, name: $localize`:@@publicationClassA2:Katsausartikkeli tieteellisessä aikakauslehdessä` }, + { value: `A3`, name: $localize`:@@publicationClassA3:Kirjan tai muun kokoomateoksen osa` }, + { value: `A4`, name: $localize`:@@publicationClassA4:Artikkeli konferenssijulkaisussa` }, + { value: `B`, name: $localize`:@@publicationClassB:Vertaisarvioimattomat tieteelliset kirjoitukset` }, + { value: `B1`, name: $localize`:@@publicationClassB1:Kirjoitus tieteellisessä aikakausilehdessä` }, + { value: `B2`, name: $localize`:@@publicationClassB2:Kirjan tai muun kokoomateoksen osa` }, + { value: `B3`, name: $localize`:@@publicationClassB3:Vertaisarvioimaton artikkeli konferenssijulkaisussa` }, + { value: `C`, name: $localize`:@@publicationClassC:Tieteelliset kirjat` }, + { value: `C1`, name: $localize`:@@publicationClassC1:Kustannettu tieteellinen erillisteos` }, + { value: `C2`, name: $localize`:@@publicationClassC2:Toimitettu kirja, kokoomateos, konferenssijulkaisu tai lehden erikoisnumero` }, + { value: `D`, name: $localize`:@@publicationClassD:Ammattiyhteisölle suunnatut julkaisut` }, + { value: `D1`, name: $localize`:@@publicationClassD1:Artikkeli ammattilehdessä` }, + { value: `D2`, name: $localize`:@@publicationClassD2:Artikkeli ammatillisessa kokoomateoksessa` }, + { value: `D3`, name: $localize`:@@publicationClassD3:Artikkeli ammatillisessa konferenssijulkaisussa` }, + { value: `D4`, name: $localize`:@@publicationClassD4:Julkaistu kehittämis- tai tutkimusraportti taikka -selvitys` }, + { value: `D5`, name: $localize`:@@publicationClassD5:Ammatillinen kirja` }, + { value: `D6`, name: $localize`:@@publicationClassD6:Toimitettu ammatillinen teos` }, + { value: `E`, name: $localize`:@@publicationClassE:Suurelle yleisölle suunnatut julkaisut` }, + { value: `E1`, name: $localize`:@@publicationClassE1:Yleistajuinen artikkeli, sanomalehtiartikkeli` }, + { value: `E2`, name: $localize`:@@publicationClassE2:Yleistajuinen monografia` }, + { value: `E3`, name: $localize`:@@publicationClassE3:Toimitettu yleistajuinen teos` }, + { value: `F`, name: $localize`:@@publicationClassF:Julkinen taiteellinen ja taideteollinen toiminta` }, + { value: `F1`, name: $localize`:@@publicationClassF1:Itsenäinen teos tai esitys` }, + { value: `F2`, name: $localize`:@@publicationClassF2:Taiteellisen teoksen tai esityksen osatoteutus` }, + { value: `F3`, name: $localize`:@@publicationClassF3:Ei-taiteellisen julkaisun taiteellinen osa` }, + { value: `G`, name: $localize`:@@publicationClassG:Opinnäytteet` }, + { value: `G1`, name: $localize`:@@publicationClassG1:Ammattikorkeakoulututkinnon opinnäytetyö, kandidaatintyö` }, + { value: `G2`, name: $localize`:@@publicationClassG2:Pro gradu, diplomityö, ylempi amk-opinnäytetyö` }, + { value: `G3`, name: $localize`:@@publicationClassG3:Lisensiaatintyö` }, + { value: `G4`, name: $localize`:@@publicationClassG4:Monografiaväitöskirja` }, + { value: `G5`, name: $localize`:@@publicationClassG5:Artikkeliväitöskirja` }, + { value: `H`, name: $localize`:@@publicationClassH:Patentit ja keksintöilmoitukset` }, + { value: `H1`, name: $localize`:@@publicationClassH1:Myönnetty patentti` }, + { value: `H2`, name: $localize`:@@publicationClassH2:Keksintöilmoitus` }, + { value: `I`, name: $localize`:@@publicationClassI:Audiovisuaaliset julkaisut ja tieto- ja viestintätekniset sovellukset` }, + { value: `I1`, name: $localize`:@@publicationClassI1:Audiovisuaaliset julkaisut` }, + { value: `I2`, name: $localize`:@@publicationClassI2:Tieto- ja viestintätekniset sovellukset` } ]; // Turn into key value object @@ -1254,10 +1261,13 @@ type OrganizationAggregation = { function suffixer(locale) { const capitalized = locale.charAt(0).toUpperCase() + locale.slice(1).toLowerCase(); - return strings => strings[0].replace(/(Fi|Sv|En)(?=\.|$)/g, capitalized); -} -const path = suffixer("fi"); + // replace Fi with capitalized from middle or end of the string + // return strings => strings[0].replace(/(Fi|Sv|En)(?=\.|$)/g, capitalized); + + // replace Fi with capitalized if the following character is a dot or a capital letter or end of string + return strings => strings[0].replace(/(Fi|Sv|En)(?=[\.A-Z]|$)/g, capitalized); +} // NOTE: nested is needed for array type mapping function termsForOrganization(searchParams: SearchParams) { diff --git a/src/environments/locale.en.ts b/src/environments/locale.en.ts new file mode 100644 index 000000000..a1f375fae --- /dev/null +++ b/src/environments/locale.en.ts @@ -0,0 +1 @@ +export const locale = "en"; diff --git a/src/environments/locale.sv.ts b/src/environments/locale.sv.ts new file mode 100644 index 000000000..8d8ad389c --- /dev/null +++ b/src/environments/locale.sv.ts @@ -0,0 +1 @@ +export const locale = "sv"; diff --git a/src/environments/locale.ts b/src/environments/locale.ts new file mode 100644 index 000000000..bd6bfcf3c --- /dev/null +++ b/src/environments/locale.ts @@ -0,0 +1,2 @@ +// Intended to be used outside of Angular's Dependency Injection system. +export const locale = "fi"; diff --git a/src/i18n/messages.en.xlf b/src/i18n/messages.en.xlf index b1ee06746..ab047b703 100644 --- a/src/i18n/messages.en.xlf +++ b/src/i18n/messages.en.xlf @@ -570,6 +570,10 @@ 50 + + Ei-vertaisarvioitu + Non Peer-Reviewed + Avoin saatavuus Open access @@ -6475,6 +6479,42 @@ Tieto- ja viestintätekniset sovellukset ICT applications + + + Yliopisto + University + + + + Ammattikorkeakoulu + University of Applied Sciences + + + + Tutkimuslaitos + Research institute + + + + Yliopistollisen sairaalan erityisvastuualue + University Hospital + + + + Muu + Other + + + + Kotimainen + Domestic + + + + Kansainvälinen + International + + diff --git a/src/i18n/messages.sv.xlf b/src/i18n/messages.sv.xlf index 3f3370ab1..d4c1114d8 100644 --- a/src/i18n/messages.sv.xlf +++ b/src/i18n/messages.sv.xlf @@ -564,6 +564,10 @@ 50 + + Ei-vertaisarvioitu + Inte kollegialt utvärderad + Avoin saatavuus Öppen tillgång @@ -6479,6 +6483,42 @@ uppgifter till datalagret för forskningsinformation. De gemensamma personuppgif Tieto- ja viestintätekniset sovellukset Informations- och kommunikationstekniktillämpningar + + + Yliopisto + Universitet + + + + Ammattikorkeakoulu + Yrkeshögskola + + + + Tutkimuslaitos + Forskningsinstitut + + + + Yliopistollisen sairaalan erityisvastuualue + Universitetssjukhuset + + + + Muu + Övrig + + + + Kotimainen + Inhemsk + + + + Kansainvälinen + Internationell + + diff --git a/src/i18n/messages.xlf b/src/i18n/messages.xlf index 23ce6c10c..16b43819b 100644 --- a/src/i18n/messages.xlf +++ b/src/i18n/messages.xlf @@ -394,6 +394,9 @@ 50 + + Ei-vertaisarvioitu + Avoin saatavuus @@ -1850,6 +1853,12 @@ Muut tieteet + + Taidealat + + + Taiteenalat + Vertaisarvioidut tieteelliset artikkelit @@ -2514,6 +2523,35 @@ Tieto- ja viestintätekniset sovellukset + + + Yliopisto + + + + Ammattikorkeakoulu + + + + Tutkimuslaitos + + + + Yliopistollisen sairaalan erityisvastuualue + + + + Muu + + + + Kotimainen + + + + Kansainvälinen + +