Power Appsilla on kätevä toteuttaa erilaisia sovelluksia organisaation sisäiseen käyttöön. Koska organisaatiolla useimmiten on yksi virallinen kieli, toteutetaan PowerAppsien käyttöliittymät pääsääntöisesti tällä virallisella kielellä.

Joissain tilanteissa halutaan Power Appsin kuitenkin olevan monikielinen. Tällä kertaa tutustutaan erilaisiin vaihtoehtoihin toteuttaa usealla kielellä toimiva Power Apps -sovellus.

Käyttäjän kielen selvittäminen

Ensimmäinen haaste on selvittää, millä kielellä käyttöliittymä ylipäätään tulisi käyttäjälle esittää.

Käyttäjän Preferred Language -ominaisuus

Kaikkien Office 365 -käyttäjien tiedoista löytyy Preffered Languages -kenttä, johon määritellään käyttäjän ymmärtämät kielet. Käyttäjä voi ylläpitää näitä myös itse.

Kyseistä tietoa voi hyödyntää PowerAppsissa ja Flowssa Office 365 Users -yhdistimen avulla.

Set(varPreferredLanguage,Office365Users.MyProfileV2().preferredLanguage)

Näin saamme käyttäjän kielen kätevästi tietoomme. Se on tallennetu ISO 639-1 muodossa (fi, en, sv…).

Vai saammeko?

Harvassa organisaatiossa hyödynnetään Preffered Languages -ominaisuutta. Eli se on useimmiten käytännössä tyhjä.

Seuraava.

Language-funktio

PowerAppsissa on valmis Language-funktio, joka palauttaa käyttäjän kielen. Käytetäänkin sitä!

Set(varPreferredLanguage, Language())

Funktio palauttaa käyttäjän kielen IETF BCP-47 language tag -muodossa (”fi-FI”, ”en-US”, ”sv-SE”…). Päätellään kieli sen kahdesta ensimmäisestä merkistä.

Set(varPreferredLanguage, Left(Language(),2)

Mutta mistä Language-funktio päättelee käyttäjän kielen? Oletettavasti käyttöjärjestelmän / selaimen kielestä.

Mutta onko sekään aina oikea? Käyttäjällä voi olla esiasennettu työasema, jonka kieli on kaikilla englanti. Silti hän haluaisi käyttää sovelluksia suomeksi.

Onpa vaikeaa.

Käyttäjä valitsee kielen

Olenkin useimmiten päätynyt ratkaisuun, jossa käyttäjä määrittelee sovelluksen kielen itse. Joko sovelluksen asetuksissa tai kysymällä se ensimmäisellä käyttökerralla.

Valinta tulee tallentaa, jotta sovellus osaa käyttää sitä seuraavillakin käyttökerroilla.

Mikäli Power Apps hyödyntää Common Data Serviceä, on valinta luonnollista tallentaa käyttäjää kuvaavaan User-tietueeseen.

User-entiteetissä ei ole tarkoitukseen sopivaa kenttää vakiona, joten se tarvitsee ensin lisätä.

SharePoint/Microsoft -listoja käyttäessä teen usein listan, johon tallennetaan kaikki käyttäjäkohtaiset asetukset.

Power Appsin käynnistyessä tarkistetaan, löytyykö käyttäjää vastaavaa riviä User settings -listalta. Mikäli ei, luodaan sellainen oletusarvoilla.

Set(varCurrentUserEmail,User().Email);

Set(varUserSettings,LookUp('Usersettings',Title=varCurrentUserEmail));

If(IsBlank(varUserSettings),
  Patch('User settings', Defaults('User settings'),         
        {Title:varCurrentUserEmail,language: Language()}
       )
   );

Sovelluksessa tarjotaan käyttäjälle tapa vaihtaa käytettävä kieli, joka sitten tallennetaan käyttäjän asetuksiin SharePoint-listalle.

Vihdoin tiedämme käyttäjän kielen. Mutta miten toteutamme varsinaisen käyttöliittymän kieliversioinnin?

Mihin tallennan kieliversiot?

Ensimmäisenä tulee päättää, mihin tallennamme käytettävien termien eri kieliversiot.

1 – Kokoelma

Suoraviivaisin tapa on luoda sovelluksen käynnistyksen (App OnStart) yhteydessä kokoelma, joka sisältää käytetyt käyttöliittymätekstit eri kielillä.

ClearCollect(
colUIStringsAll,
{fieldname: "Cancel", label: "Cancel", language: "en"},
{fieldname: "Cancel", label: "Peruuta", language: "fi"},
{fieldname: "User", label: "User", language: "en"},
{fieldname: "User", label: "Käyttäjä", language: "fi"},
{fieldname: "Settings", label: "Settings", language: "en"},
{fieldname: "Settings", label: "Asetukset", language: "fi"}
)

Siitä voimme muodostaa oman pienemmän kokoelman, joka sisältää käyttäjän kieltä vastaavat rivit.

ClearCollect(colUIStrings, Filter(colUIStringsAll, language = varUserSettings.language))

Erittäin suorituskykyinen ratkaisu. Mutta

  1. Mikäli käyttöliittymätekstejä ja kieliä on paljon, tulee kokoelman muodostavasta lauseesta pitkä ja hankalasti ylläpidettävä.
  2. Uuden kielen / käyttöliittymätekstin lisääminen edellyttää sovelluksen uudelleenjulkaisua

Soveltuu tilanteisiin, jossa käännettäviä tekstejä on verratten vähän.

2 – Power Appsiin ladattava Excel-tiedosto

Seuraavassa vaihtoehdossa tallennetaan kaikki käyttöliittymätekstit kieliversioineen yhteen Excel-tiedostoon.

Tiedot ladataan Excelistä Power Appsiin, jonka jälkeen Excelin taulukkoa voi lukea kuin mitä tahansa tietolähdettä.

Huomaa että Excel-tiedostoa ei sellaisenaan ladata osaksi Power Appsia. Ainoastaan valittu taulukko sisältöineen. 300 riviä sisältävä Excel-tiedosto (28KB) ei kasvata Power Apps -paketin kokoa käytännössä juuri lainkaan.

Sovelluksen käynnistyessä muodostamme kokoelman, joka sisältää jälleen käyttöliittymätekstit käyttäjän valitsemalla kielellä.

ClearCollect(colUIStrings, Filter(UIStrings, Language = varUserSetings.language));

Eri kieliversiota on näppärää ylläpitää Excelissä. Excel-tiedosto on myös helppo toimittaa käännettäväksi.

Tässäkin ratkaisussa uusien kielten tai käyttöliittymätekstien lisääminen/muokkaaminen vaatii sovelluksen uudelleenjulkaisun.

3 – SharePoint-lista

Dynaamisin vaihtoehto on tallentaa käyttöliittymätekstit SharePoint-listaan. Samaa listaa voi käyttää useampi sovellus, kun lisäämme sovelluksen nimen omaksi sarakkeekseen.

Käyttöliittymätekstit ladataan käyttöön tutulla tapaa.

ClearCollect(colUIStrings, Filter('UI Strings', language = varUserSetings.language And 'App name' = "MyOfficeApp"))

Ratkaisun ehdoton etu on, että voimme muuttaa käyttöliittymätekstejä koskematta itse sovellukseen.

Mutta nyt sovellusta avattaessa käyttöliiittymätekstit ladataan listalta sovelluksen muistiin. Tämä hidastaa hieman käynnistymistä.

Voimme toki ensimmäisellä kerralla tallentaa käyttöliittymätekstit (mobiililaitteen) paikalliseen muistiin ja käyttää niitä jatkossa sieltä. Siistiä!

Samalla kuitenkin menetämme mahdollisuuden muokata tekstejä dynaamisesti.

Ellemme tallenna mobiililaitteen paikalliseen muistiin aikaleimaa, jolloin käyttöliittymätekstit on viimeksi haettu. Voimme verrata ko aikaleimaa SharePoint-listan tuoreimpaan päivitysaikaan. Mikäli tekstejä on päivitetty, haemme ne uudelleen paikalliseen muistiin.

Power Apps taipuu moneen.

Miten hyödynnän kieliversiota?

Lopuksi käydään sovellus läpi ja vaihdetaan kaikki käyttäjälle näytettävät tekstit (”Back”, ”Select language” jne) hyödyntämään luomaamme kokoelmaa (UIStrings).

Kokoelmasta haetaan oikea teksti.

Text = LookUp(colUIStrings, fieldname = "select_language").label

Varmuuden vuoksi tekstille on hyvä asettaa myös oletusarvo, jota käytetään mikäli kieliversioitua tekstiä ei löydy. Tämän voi tehdä kätevästi Coalesce-funktiolla. Sen arvo on annetuista parametreista ensimmäinen, joka ei ole tyhjä.

Text = Coalesce(LookUp(colUIStrings, fieldname = "select_language").label, "Select your language")