Lokalisatie is meer dan alleen de vertaling van de tekenreeksen in uw toepassing in andere talen. Het omvat ook het weergeven van gegevens, zoals datums en tijden, in het juiste formaat voor uw gebruikers. Zelfs als u alleen een Engelse versie van uw applicatie wilt, is het goed om te weten wat lokalisatie inhoudt. Op die manier bent u klaar als u besluit om ondersteuning voor aanvullende landinstellingen toe te voegen en hoeft u niet te zoeken naar tekenreeksen en waarden in de codebase van uw toepassing..
Met de Android SDK is de taal van de gelokaliseerde tekenreeksen en het formaat dat wordt gebruikt voor het weergeven van waarden afhankelijk van de landinstelling van het apparaat. De locale is een combinatie van de taal en het land. De taal wordt gedefinieerd door de ISO 639-1 standaard terwijl het land wordt gedefinieerd door de ISO 3166-1 standaard. Dit betekent dat de locale van Android compatibel is met de cultuur of locale die wordt gebruikt door de meeste andere programmeertalen en frameworks.
De enige locale die gegarandeerd aanwezig is op elk Android-apparaat is Engels zoals gesproken in de Verenigde Staten. Het wordt vertegenwoordigd door de nl code, met nlzijnde de taalcode voor Engels en ONS zijnde de landcode voor de Verenigde Staten. U kunt ook de nlalleen taalcodeals locatie voor alle Engelssprekende landen en regio's.
Om een toepassing voor een taal of voor een specifiek land en taal te lokaliseren, moet u de bronnen voor die taal opnemen in de / res map van uw applicatie. Dit bevat meestal tekenreeksbronnen in de / Res / waardes map, maar het kan ook andere soorten bronnen bevatten, zoals afbeeldingen en lay-outs. De Android SDK identificeert de verschillende alternatieve bronnen met kwalificaties voor configuratie, die vervolgens worden gebruikt om de map met die bronnen een naam te geven. De configuratievoorraad voor de locale is de taalcode, optioneel gevolgd door de landcode.De gelokaliseerde tekenreeksbronnen voor uw toepassing moeten zich dus in de/res / waardes-
Houd er rekening mee dat de bronnen die worden geïdentificeerd met een configuratiekwalificatie voor een specifieke landinstelling belangrijker zijn dan de meeste andere bronnen. Andere gebruikelijke configuratieconfiguraties voor bronnen met lagere prioriteit zijn schermgrootte en schermpixeldichtheid om verschillende lay-outs te beschrijven afhankelijk van de grootte van het scherm. Alleen bronnen die zijn geïdentificeerd met een kwalificeerder voor de kwalificatie voor mobiele landen (MCC) hebben een hogere prioriteit dan tekenreeksbronnen die zijn geïdentificeerd met een locale-configuratievalidator. De mobiele landcode wordt gebruikt om middelen voor een land te definiëren, die optioneel kunnen worden gevolgd met de mobiele netwerkcode (MNC) vanaf een SIM-kaart om een specifieke mobiele provider in dat land te targeten. Het wordt gebruikt om inhoud specifiek te maken voor een land zoals een contract of een privacybeleid.
Elke Android-applicatie moet al zijn stringbronnen in de /res/values/strings.xml het dossier. Dit maakt hergebruik van reeksen mogelijk in uw toepassing, zelfs als er geen lokalisatie nodig is. Ook als dit niet beschikbaar is voor de huidige locale van het apparaat bestand wordt gebruikt. Als u er geen hebt en uw toepassing probeert toegang te krijgen tot een tekenreeksresource die alleen beschikbaar is in a strings.xml bestand specifiek voor een locale, uw applicatie zal zonder waarschuwing crashen, omdat bronnen worden geladen tijdens runtime en niet tijdens compilatie.
EEN strings.xml bestand specifiek voor een locale hoeft niet alle tekenreeksresources uit de /res/values/strings.xml het dossier. Dit betekent dat als een bron, zoals de naam van uw toepassing, niet hoeft te worden gelokaliseerd, u het niet in elk tekenbestand hoeft te plaatsen.
Tijdens runtime, de /res / waardes-
Als u bijvoorbeeld uw toepassing voor alle Franstalige regio's en landen wilt lokaliseren zonder een specifieke doelgroep te targeten, plaatst u de tekenreeks voor de toepassing in de / res / fr-waarden /strings.xml het dossier. Als u echter bepaalde strings wilt lokaliseren met spelling specifiek voor het Frans zoals geschreven in Frankrijk, moet u ze in de /res/values-fr-rFr/strings.xml het dossier. Zorg ervoor dat u de r voor de landcode in de naam van de map of deze wordt niet tijdens runtime gevonden wanneer de toepassing gelokaliseerd is.
Hier is een voorbeeld van een / Res / waarden /strings.xml bestand met een paar stringbronnen in het Engels:
Android Localization Demo Hallo Wereld! Hallo% s!
En hier is een / RES / waarden-fr /strings.xmlbestand met dezelfde bronnen in het Frans:
Démo de localization Android Bonjour le monde! Bonjour% s!
De tekenreeksen in uw lay-outs moeten tekenreeksen zijn. In feite wordt een lintwaarschuwing weergegeven als een string hard gecodeerd is. U kunt overal bronnen gebruiken waar u strings in lay-outs zou plaatsen. Stringbronnen worden geïdentificeerd door @draad/
gevolgd door de naam van de bron van de strings.xml het dossier. Het volgende toont het Hallo Wereld
string uit het vorige voorbeeld in a Tekstweergave
volgens de locale van het apparaat:
Dit toont "Bonjour le monde!"op een Android-apparaat ingesteld op een landinstelling met de Franse taal. Voor alle andere locaties, de "Hallo-wereld!" string wordt getoond.
U moet ook strings uit uw code lokaliseren als u besturingselementen buiten uw lay-outs maakt of wijzigt. Om die snaren te lokaliseren, moet je eerst de android.content.res.Resources
object dat alle bronnen in het pakket van de toepassing voor de huidige context bevat. Je belt dan de getString
methode op dat object, die de ID van de tekenreeks doorgeeft om weer te geven. In het volgende codeblok ziet u bijvoorbeeld hoe u de tekst van a instelt Tekstweergave
voorwerp:
// Haal de vertaalde tekenreeks uit de tekenreeksbron android.content.res.Resources res = context.getResources (); String helloWorld = res.getString (R.string.hello_world); // Stel de tekenreeks in op de tekstweergave TextView helloTextView; helloTextView = (TextView) findViewById (R.id.hello_world_textview); helloTextView.setText (helloworld);
Meer complexe strings, met een of meer variabele componenten, moet u format strings gebruiken. Met indelingsstrings kunt u de waarden opgeven voor de weer te geven parameters. De parameters in de opmaakreeks worden geïdentificeerd met indelingsspecificaties. De meest gebruikte formaatspecificatie is % s
, die een string vertegenwoordigt. In feite alle strings van het formaat van de java.util.Formatter
klasse is beschikbaar. Als er meerdere parameters nodig zijn, moet u ook uw indelingsspecificaties nummeren. In het geval van specificatoren voor stringformaten, moet de eerste zijn % 1 $ s
, de seconde % 2 $ s
, enzovoorts.
Nadat opmaakstrings zijn opgegeven, gebruikt u de String.Format
methode om de parameters door te geven die aan uw string worden getoond. Hier ziet u hoe u de tekst instelt die moet worden weergegeven in a Tekstweergave
met de hello_world_name
format string van de strings.xml het dossier. Deze opmaakreeks bevat een indelingsspecificatie voor de naam van de gebruiker:
// Haal de opmaakreeks android.content.res.Resources res = context.getResources (); String helloFormatString = res.getString (R.string.hello_world_name); String userName = "Bob"; // Voeg de naam in de notatiereeks String toe helloWorldName = String.format (helloFormatString, userName); // Tekst instellen van de tekstweergave TextView helloTextView; helloTextView = (TextView) findViewById (R.id.hello_world_textview); helloTextView.setText (helloWorldName);
Dit toont de "Bonjour Bob!"tekenreeks voor een Android-apparaat met een landinstelling die de Franse taal bevat. Voor alle andere locales de "Hallo Bob!" string wordt getoond.
Als de strings van uw applicatie al gelokaliseerd zijn, is uw applicatie al in een goede conditie. Mogelijk moet u in veel gevallen datums en tijden aan de gebruiker laten zien. Die datums en tijden moeten ook worden aangepast aan de huidige locale van het apparaat. Gelukkig bevat de Android SDK klassen die datums en tijden opmaken volgens de locale.
In de Android SDK worden datums en tijden beheerd door de Datum
klas uit de java.util
namespace. De huidige datum en tijd van het apparaat worden geretourneerd door de java.util.Calendar
.
Datums kunnen worden opgemaakt met behulp van een instantie van de Datumnotatie
formatter van de java.text
namespace. U moet de gebruiken Datumnotatie
klasse van de Android SDK in de android.text.format
naamruimte om de juiste formatter voor de locale van het apparaat te krijgen. Het volgende codefragment laat zien hoe u een string krijgt met de huidige datum die is opgemaakt voor de landinstelling van het apparaat:
// Haalt de huidige datum en tijd op Date currentDate = Calendar.getInstance (). GetTime (); // Haalt de standaard datumformatter voor de huidige locale van // het apparaat java.text.DateFormat dateFormat; dateFormat = android.text.format.DateFormat.getDateFormat (this); // Formatteert de huidige datum volgens de landinstelling String formattedCurrentDate = dateFormat.format (currentDate);
Als de huidige locale van het apparaat Engels is zoals gesproken in de Verenigde Staten, bevat de tekenreeks de huidige datum in een korte datumnotatie, 2014/11/30. De Datumnotatie
klasse bevat een aantal andere datumnotaties. Bijvoorbeeld de getLongDateFormat
methode retourneert een lange datumnotatie, Zondag 30 november 2014.
Sinds tijden worden weergegeven als Datum
objecten door de Android SDK moeten ze ook worden weergegeven met behulp van een formatter die wordt geretourneerd door de Datumnotatie
klas uit de android.text.format
namespace. De getTimeFormat
methode retourneert een indeling die alleen de tijd van a weergeeft Datum
voorwerp. In het volgende codefragment wordt weergegeven hoe u een tekenreeks ophaalt met de huidige tijd die is opgemaakt voor de landinstelling van het apparaat:
// Krijgt de huidige datum en tijd java.util.Date currentDate = Calendar.getInstance (). GetTime (); // Krijgt een datumformatter voor de huidige locale van het apparaat // die tijden weergeeft. java.text.DateFormat timeFormat; timeFormat = android.text.format.DateFormat.getTimeFormat (this); // Formatteert de huidige tijd volgens de landinstelling String formattedTime = timeFormat.format (currentDate);
Als de huidige locale van het apparaat Engels is zoals gesproken in de Verenigde Staten, bevat de tekenreeks de huidige tijd in het volgende formaat, 20:15 uur.
Het is belangrijk om alleen de tekenreeksen te lokaliseren die worden gebruikt in de gebruikersinterface van de toepassing. Het is bijvoorbeeld niet nodig om foutopsporingsberichten te lokaliseren die alleen worden gebruikt tijdens de ontwikkeling of voor diagnostische doeleinden. Merk ook op dat u geen gelokaliseerde datums en tijden naar schijf of naar een database hoeft te schrijven. Niet alleen kan de locale van een apparaat veranderen, het werken met gelokaliseerde datums en tijden maakt ontwikkeling onnodig moeilijk en complex.