Android fejlesztés – Mindenféle jóság

Android fejlesztési tippek-trükkök: lokalizáció, ActionBar, Push Notification Parse módra! – írta: Sianis, 12 éve

Lokalizálható szövegek mindenféle módon

Mióta van a jól működő Lint, azóta szépen kis jelölést kapunk Eclipse-ben, ha egy-egy szöveget beégetünk akár XML Layoutban, akár Java kódban.

Ez kerülendő dolog, mivel egyrészt így nem lesz lokalizálható az adott szöveg, másrészt, meg szembe megyünk az androidos irányelvekkel. Egyikre sem lehetnénk túl büszkék. Külön praktikum, hogy ha külön fájlba vannak elhelyezve a szövegek, akkor egy laikus is át tudja fogalmazni a szövegeket úgy, hogy azzal nekünk további dolgunk ne legyen.

Minden androidos projekthez létrejön egy strings.xml fájl, ebbe kell beleszuszakolni minden olyan szöveget ami statikus vagy legalábbis azzá tehető.

Pár példa, amiknek használatát röviden ismertetem is:

<resources>
<string name="search">Keresés</string>
<string name="search_result">Keresés: %1$s</string>
<string name="details_line">&lt;i>(%1$d)&lt;/i> %2$s</string>
</resources>

Az első eset a legegyszerűbb, semmilyen dinamikus tartalom nincs benne, mégis bármikor lokalizálható.

Használata:

<TextView
android:id="@android:id/title"
style="@style/HoloTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/search" />

Illetve:

((TextView)v.findViewById(android.R.id.title)).setText(R.string.search);

A második eset már kicsit érdekesebben néz ki, de semmi vészes nincs benne. A %1$s résszel egyszerűen annyit mondunk, hogy ide adott esetben egy szöveget kell majd behelyettesíteni, mégpedig a később megadottak közül is az elsőt. Itt még nincs sok jelentősége annak, hogy első, de a következő esetben már lesz.

Használata már csak programkódból lehetséges, de éppen ezért dinamikus:

((TextView)v.findViewById(android.R.id.title)).setText(getString(R.string.search_result,"Android"));

Ennek kimenete a felületen a Keresés: Android szöveg lesz. Jelen esetben én most egy beégetett szöveget használtam, de nyilván mindenki kitalálta, hogy bármilyen tetszőleges szöveg beilleszthető.

A harmadik és egyben legérdekesebb eset, amikor több dinamikus rész is van, ezek ráadásul különböző típusúak (egyik szám, a másik szöveg) és a szöveg bizonyos részét még formázni is akarjuk, pl. dőltté kívánjuk tenni.
Itt nyer igazán értelmet a sorrendiség, mivel az első tag %1$d, míg a második %2$s formában megadja, hogy behelyettesítéskor melyik érték melyik dinamikus részbe helyettesítődjön be, így lehetőség van arra, hogy különféle nyelveken felcseréljük az egyes szövegrészek helyét, anélkül, hogy a programkódot módosítani kellene.

Használata megegyezik az előző példával:

((TextView)v.findViewById(android.R.id.title)).setText(getString(R.string.details_line, 5, "Csillag"));

A felületen ilyenkor a (5) Csillag szöveg jelenik meg.

További hasznos információk erről a témáról az angol nyelvű dokumentációban.

A cikk még nem ért véget, kérlek, lapozz!

Azóta történt