{"id":7231,"date":"2026-02-12T09:24:55","date_gmt":"2026-02-12T09:24:55","guid":{"rendered":"https:\/\/poeditor.com\/blog\/?p=7231"},"modified":"2026-02-25T11:53:51","modified_gmt":"2026-02-25T11:53:51","slug":"android-localization","status":"publish","type":"post","link":"https:\/\/poeditor.com\/blog\/android-localization\/","title":{"rendered":"A practical guide to Android localization with string resources"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"754\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization-1024x754.png\" alt=\"\" class=\"wp-image-7243\" srcset=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization-1024x754.png 1024w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization-300x221.png 300w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization-768x565.png 768w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization-1536x1131.png 1536w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization-2048x1508.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Android provides a <a href=\"https:\/\/developer.android.com\/guide\/topics\/resources\/localization\" rel=\"nofollow\">built-in localization system<\/a> based on string resources. By defining user-facing text in XML files and organizing them by locale, Android can automatically load the correct translations at runtime based on the user\u2019s language settings.<\/p>\n\n\n\n<p>In most apps, this starts with <code>&lt;string&gt;<\/code> entries in <code>strings.xml<\/code>. However, for real-world use cases, you also have to deal with pluralized strings, values that shouldn\u2019t be translated, and collections of strings defined as arrays.<\/p>\n\n\n\n<p>This guide walks through localizing an Android application that includes standard <code>&lt;string&gt;<\/code> resources, pluralized strings using <code>&lt;plurals&gt;<\/code>, non-translatable values using <code>translatable=\"false\"<\/code> and a <code>string-array<\/code> defined in a separate file and populated using references.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How Android handles localized string resources<\/h2>\n\n\n\n<p>Android handles localization through its resource system. Instead of switching languages in code, you provide multiple versions of the same resource, and Android selects the appropriate one at runtime based on the user\u2019s language settings.<\/p>\n\n\n\n<p>For strings, this is done using resource directories under <code>res\/values<\/code>. Every Android project includes a default <code>values<\/code> directory:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>res\/\n\u2514\u2500 values\/\n   \u2514\u2500 strings.xml\n<\/code><\/pre>\n\n\n\n<p>This file represents the app\u2019s base language. If Android cannot find a localized version of a string for the current locale, it falls back to the value defined here.<\/p>\n\n\n\n<p>Because of that, <code>res\/values\/strings.xml<\/code> should always be complete. Any string that may appear in the UI should exist in this file, even if translations are provided elsewhere.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Locale-specific string resources<\/h3>\n\n\n\n<p>To support additional languages, you add locale-specific <code>values-*<\/code> directories alongside the default one:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>res\/\n\u251c\u2500 values\/\n\u2502  \u2514\u2500 strings.xml\n\u251c\u2500 values-es\/\n\u2502  \u2514\u2500 strings.xml\n\u2514\u2500 values-ar\/\n   \u2514\u2500 strings.xml\n<\/code><\/pre>\n\n\n\n<p>Each directory contains a translated version of <code>strings.xml<\/code>. The file name stays the same, but the folder name and the string values change.<\/p>\n\n\n\n<p>When the app runs, Android checks the user\u2019s preferred language and loads the matching resource set automatically. On <a href=\"https:\/\/developer.android.com\/about\/versions\/13\" rel=\"nofollow\">Android 13<\/a> and later, users can also choose a language specifically for an app from system settings. This doesn\u2019t change how resources are defined or resolved.<\/p>\n\n\n<div class=\"call-action my-4 d-flex justify-content-between align-items-md-center gap-4 flex-column flex-lg-row\"><div><h3 class=\"fs-4\">Improve your localization process<\/h3><span class=\"fs-6\">Discover an easy to use and affordable localization app.<\/span><\/div><a class=\"btn btn-b-primary d-flex align-items-center justify-content-center px-4 py-3 flex-shrink-0\" \n\t\t\t\t\thref=\"https:\/\/poeditor.com\/register\/?utm_source=blog&#038;utm_medium=btn&#038;utm_campaign=cta_register\">Get started<\/a><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Create a new Android project<\/h2>\n\n\n\n<p>In <a href=\"https:\/\/developer.android.com\/studio\" rel=\"nofollow\">Android Studio<\/a>, create a new project with the <strong>Empty Activity<\/strong> template. Also select the <strong>Kotlin<\/strong> language and use <a href=\"https:\/\/developer.android.com\/tools\/releases\/platforms\" rel=\"nofollow\">minimum SDK<\/a> of <strong>API 24 or higher<\/strong>. API 24 is sufficient for everything covered in this guide and avoids extra compatibility code that isn\u2019t relevant to localization.<\/p>\n\n\n\n<p>You can give your project any name and then click <strong>Finish<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"682\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1024x682.png\" alt=\"\" class=\"wp-image-7232\" srcset=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1024x682.png 1024w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-300x200.png 300w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-768x512.png 768w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1536x1023.png 1536w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Once the project is created, you should have a structure similar to this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app\/\n\u2514\u2500 src\/\n   \u2514\u2500 main\/\n      \u251c\u2500 java\/ (or kotlin\/)\n      \u2502  \u2514\u2500 MainActivity.kt\n      \u2514\u2500 res\/\n         \u2514\u2500 values\/\n            \u2514\u2500 strings.xml\n<\/code><\/pre>\n\n\n\n<p>At this point, <code>strings.xml<\/code> will contain only a default <code>app_name<\/code> entry, and the UI will likely be showing placeholder text generated by the template.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Localizing standard string resources<\/h2>\n\n\n\n<p>With the basic UI in place, the first step toward localization is to move user-facing text out of the code and into string resources.<\/p>\n\n\n\n<p>Android does not translate anything automatically. If a string is hardcoded in code or in a layout, Android has no way to replace it for different locales. To make a string localizable, it must live in a resource file.<\/p>\n\n\n\n<p>Open <code>res\/values\/strings.xml<\/code>. You should see a file similar to this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;resources&gt;\n    &lt;string name=\"app_name\"&gt;Demo Localization&lt;\/string&gt;\n&lt;\/resources&gt;<\/code><\/pre>\n\n\n\n<p>We\u2019ll start by adding a few basic strings that will be displayed on screen. Update the file as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;resources&gt;\n    &lt;string name=\"app_name\"&gt;Demo Localization&lt;\/string&gt;\n\n    &lt;string name=\"name\"&gt;John Doe&lt;\/string&gt;\n    &lt;string name=\"title\"&gt;Android Developer&lt;\/string&gt;\n    &lt;string name=\"bio\"&gt;\n        A passionate developer who loves building beautiful and functional Android apps.\n    &lt;\/string&gt;\n&lt;\/resources&gt;\n\n<\/code><\/pre>\n\n\n\n<p>Each string is defined using a unique name. These names are what you\u2019ll reference from code. The actual text values are what will change per language.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Referencing string resources in code<\/h3>\n\n\n\n<p>Next, update <code>MainActivity.kt<\/code> to read strings from resources instead of hardcoding them. Replace the previous contents of <code>MainActivity.kt<\/code> with this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.example.demolocalization\n\nimport android.os.Bundle\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\n\nclass MainActivity : ComponentActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        setContent {\n            Surface(color = MaterialTheme.colorScheme.background) {\n                Column(modifier = Modifier.padding(16.dp)) {\n                    Text(text = stringResource(R.string.name))\n                    Text(text = stringResource(R.string.title))\n                    Text(\n                        text = stringResource(R.string.bio),\n                        modifier = Modifier.padding(top = 8.dp)\n                    )\n                }\n            }\n        }\n    }\n}\n\n<\/code><\/pre>\n\n\n\n<p><strong>Note:<\/strong> The package name used in the code examples (<code>com.example.demolocalization<\/code>) will depend on how you created your project. If your package name is different, make sure the <code>package<\/code> declaration at the top of your Kotlin files matches your project\u2019s namespace.<\/p>\n\n\n\n<p>The key change here is the use of <code>stringResource(...)<\/code>. This tells Compose to fetch the string value from Android\u2019s resource system instead of using a literal value.<\/p>\n\n\n\n<p>At runtime, Android resolves the string based on the current locale.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"413\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1-1024x413.png\" alt=\"\" class=\"wp-image-7233\" srcset=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1-1024x413.png 1024w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1-300x121.png 300w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1-768x310.png 768w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1-1536x620.png 1536w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-1.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Adding a second language<\/h3>\n\n\n\n<p>In your project, right-click the res folder and select <strong>New<\/strong> &gt; <strong>Android Resource Directory<\/strong>. A modal appears, use strings as the file name, ensure the <strong>Resource type<\/strong> is set to values. Then for the <strong>Available qualifiers<\/strong>, click <strong>Locales<\/strong> and the arrow shown below:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"605\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-2-1024x605.png\" alt=\"\" class=\"wp-image-7234\" srcset=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-2-1024x605.png 1024w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-2-300x177.png 300w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-2-768x454.png 768w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-2-1536x908.png 1536w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-2.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>This loads up all languages and then you can select your preferred language, leave the region as <strong>Any Region<\/strong> and then click the <strong>OK<\/strong> button. You will notice that the Directory name changes to use <code>values-*<\/code>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"605\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-3-1024x605.png\" alt=\"\" class=\"wp-image-7235\" srcset=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-3-1024x605.png 1024w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-3-300x177.png 300w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-3-768x454.png 768w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-3-1536x908.png 1536w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image-3.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Note:<\/strong> Android Studio\u2019s <em>Android<\/em> view groups locale-specific resource files together. Even though <code>strings.xml (es)<\/code> and <code>strings.xml (ar)<\/code> appear under the same values node, they are stored in separate <code>values-es<\/code> and <code>values-ar<\/code> directories on disk.<\/p>\n\n\n\n<p>Inside the new <code>strings.xml<\/code> file, add the same string keys, but with translated values:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;resources&gt;\n    &lt;string name=\"app_name\"&gt;Demo Localization&lt;\/string&gt;\n\n    &lt;string name=\"name\"&gt;Juan P\u00e9rez&lt;\/string&gt;\n    &lt;string name=\"title\"&gt;Desarrollador de Android&lt;\/string&gt;\n    &lt;string name=\"bio\"&gt;\n        Un desarrollador apasionado al que le encanta crear aplicaciones de Android hermosas y funcionales.\n    &lt;\/string&gt;\n&lt;\/resources&gt;\n<\/code><\/pre>\n\n\n\n<p>The important rule here is that the string names must match exactly. Android uses the name to look up the value; the folder determines which language version is used.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verifying the result<\/h3>\n\n\n\n<p>Run the app with the device or emulator language set to English and then to Spanish.<\/p>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"644\" height=\"480\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image2new.gif\" alt=\"\" class=\"wp-image-7280 size-full\"\/><\/figure><div class=\"wp-block-media-text__content\">\n<p><\/p>\n<\/div><\/div>\n\n\n\n<p>You should see the same UI, but with text changing automatically based on the selected language.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Handling plural strings with <code>&lt;plurals&gt;<\/code><\/h2>\n\n\n\n<p>Simple string replacement isn\u2019t enough when text depends on a number. Different languages have different grammatical rules for quantities, and handling that logic manually in code doesn\u2019t scale.<\/p>\n\n\n\n<p>Android solves this with plural resources, defined using the <code>&lt;plurals&gt;<\/code> element. This lets you define all grammatical variants of a string in one place and have Android select the correct one at runtime.<\/p>\n\n\n\n<p>Open the default <code>res\/values\/strings.xml<\/code> file and add a plural definition for a project count:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plurals name=\"project_count\"&gt;\n    &lt;item quantity=\"one\"&gt;%d project&lt;\/item&gt;\n    &lt;item quantity=\"other\"&gt;%d projects&lt;\/item&gt;\n&lt;\/plurals&gt;<\/code><\/pre>\n\n\n\n<p>Here <code>project_count<\/code> is the resource name, <code>%d<\/code> is a placeholder for the number, one and other are plural categories used by English.<\/p>\n\n\n\n<p>Android follows <a href=\"https:\/\/cldr.unicode.org\/index\/cldr-spec\/plural-rules\" rel=\"nofollow\">CLDR plural rules<\/a> under the hood, so the categories you define depend on the language.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using plurals in Compose<\/h3>\n\n\n\n<p>To use this plural resource in code, update <code>MainActivity.kt<\/code> to include a numeric value and fetch the plural string using <code>pluralStringResource()<\/code>.Update the content inside <code>setContent<\/code> as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import androidx.compose.ui.res.pluralStringResource\n\nval projectCount = 5\n\nText(\n    text = pluralStringResource(\n        id = R.plurals.project_count,\n        count = projectCount,\n        projectCount\n    )\n)<\/code><\/pre>\n\n\n\n<p>The <code>count<\/code> argument determines which plural form Android selects, while the final argument supplies the value for the <code>%d<\/code> placeholder.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Adding translations for plurals<\/h3>\n\n\n\n<p>Just like regular strings, plural resources must be translated per locale. Open <code>res\/values-es\/strings.xml<\/code> and add a Spanish version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plurals name=\"project_count\"&gt;\n    &lt;item quantity=\"one\"&gt;%d proyecto&lt;\/item&gt;\n    &lt;item quantity=\"other\"&gt;%d proyectos&lt;\/item&gt;\n&lt;\/plurals&gt;<\/code><\/pre>\n\n\n\n<p>The resource name stays the same. Only the values change.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Languages with complex plural rules<\/h3>\n\n\n\n<p>Some languages require more plural categories than English. Arabic, for example, defines categories such as <code>zero<\/code>, <code>one<\/code>, <code>two<\/code>, <code>few<\/code>, <code>many<\/code>, and <code>other.<\/code><\/p>\n\n\n\n<p>In <code>res\/values-ar\/strings.xml<\/code>, the same plural resource might look like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;plurals name=\"project_count\"&gt;\n    &lt;item quantity=\"zero\"&gt;\u0644\u0627 \u0645\u0634\u0627\u0631\u064a\u0639&lt;\/item&gt;\n    &lt;item quantity=\"one\"&gt;\u0645\u0634\u0631\u0648\u0639 \u0648\u0627\u062d\u062f&lt;\/item&gt;\n    &lt;item quantity=\"two\"&gt;\u0645\u0634\u0631\u0648\u0639\u0627\u0646&lt;\/item&gt;\n    &lt;item quantity=\"few\"&gt;%d \u0645\u0634\u0627\u0631\u064a\u0639&lt;\/item&gt;\n    &lt;item quantity=\"many\"&gt;%d \u0645\u0634\u0631\u0648\u0639\u064b\u0627&lt;\/item&gt;\n    &lt;item quantity=\"other\"&gt;%d \u0645\u0634\u0631\u0648\u0639&lt;\/item&gt;\n&lt;\/plurals&gt;<\/code><\/pre>\n\n\n\n<p>Android selects the correct form automatically based on the number and the current locale.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Using placeholders in localized strings<\/h2>\n\n\n\n<p>In addition to static text and plurals, Android string resources can also contain placeholders. Placeholders allow you to inject dynamic values into a localized string at runtime, while still keeping the full sentence translatable.<\/p>\n\n\n\n<p>This is commonly used for greetings, labels that include user input, or messages that reference dynamic values such as names or titles. They are defined directly in <code>strings.xml <\/code>using standard formatting tokens, such as <code>%s<\/code> for strings.<\/p>\n\n\n\n<p>In the default <code>res\/values\/strings.xml<\/code>, add the following entry:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;string name=\"greeting\"&gt;Hello %s&lt;\/string&gt;<\/code><\/pre>\n\n\n\n<p>Next, add translated versions in your locale-specific files. For Spanish (<code>res\/values-es\/strings.xml<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;string name=\"greeting\"&gt;Hola %s&lt;\/string&gt;<\/code><\/pre>\n\n\n\n<p>The placeholder itself stays the same across languages. What changes is the surrounding text and, if needed, the position of the placeholder within the sentence.<\/p>\n\n\n\n<p>To use a string with placeholders in Jetpack Compose, you pass the dynamic values directly to <code>stringResource()<\/code>. For example, to display a greeting that includes the user\u2019s name:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Text(\n    text = stringResource(\n        R.string.greeting,\n        stringResource(R.string.name)\n    )\n)<\/code><\/pre>\n\n\n\n<p>When you run the app and switch the device or emulator language. You should see the greeting update automatically, for example:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"806\" height=\"670\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image3new.gif\" alt=\"\" class=\"wp-image-7282\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Excluding strings from translation<\/h2>\n\n\n\n<p>Not every string in an Android app should be translated. Brand names, company names, product identifiers, and certain technical terms are often meant to stay the same across all languages.<\/p>\n\n\n\n<p>Android allows you to explicitly mark these values using the <code>translatable=\"false\"<\/code> attribute:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;string name=\"brand_name\" translatable=\"false\"&gt;Acme Corp&lt;\/string&gt;<\/code><\/pre>\n\n\n\n<p>This tells both Android and any localization tools that the string should be ignored during translation.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using non-translatable strings in code<\/h3>\n\n\n\n<p>You reference non-translatable strings the same way as any other string resource. For example, in Compose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Text(text = stringResource(R.string.brand_name))<\/code><\/pre>\n\n\n\n<p><strong>Note:<\/strong> Strings marked with <code>translatable=\"false\"<\/code> should exist only in the default values directory. There\u2019s no reason to duplicate them in locale-specific folders, and doing so can cause confusion in translation workflows. This pattern works well with localization platforms like <a href=\"https:\/\/poeditor.com\/\">POEditor<\/a>. Since these tools usually import <code>strings.xml<\/code>, marking non-translatable strings explicitly prevents them from being flagged or accidentally translated.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Defining a string-array in a separate file<\/h2>\n\n\n\n<p>In addition to individual strings, Android also supports string arrays. These are useful when you need a fixed list of related values, such as menu options, labels, or system-defined items.<\/p>\n\n\n\n<p>A <code>string-array<\/code> is defined using the <code>&lt;string-array&gt;<\/code> element and contains multiple <code>&lt;item&gt;<\/code> entries. By default, these arrays are often placed directly in strings.xml, but that you can also manage them separately, if the localization tool you\u2019re working with does not support arrays.<\/p>\n\n\n\n<p>There are multiple advantages to keeping all translatable text in <code>strings.xml<\/code> and referencing strings to string array items, including:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>decreased translation volumes: you do not need to translate the array items multiple times, should they occur multiple times<\/li>\n\n\n\n<li>improved translation consistency: using the same array item whenever it occurs in your app, you avoid translation discrepancies&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>In the <code>res\/values<\/code> directory, create a new XML file (for example, <code>string_array.xml<\/code>) and add the following content:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;resources&gt;\n    &lt;string-array name=\"system\"&gt;\n        &lt;item&gt;@string\/item0&lt;\/item&gt;\n        &lt;item&gt;@string\/item1&lt;\/item&gt;\n        &lt;item&gt;@string\/item2&lt;\/item&gt;\n    &lt;\/string-array&gt;\n&lt;\/resources&gt;<\/code><\/pre>\n\n\n\n<p>Notice that the array does not contain any hardcoded text. Each item references a string defined elsewhere using <code>@string\/...<\/code>.<\/p>\n\n\n\n<p>Next, open <code>res\/values\/strings.xml<\/code> and add the referenced strings:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;string name=\"item0\"&gt;Item 0&lt;\/string&gt;\n&lt;string name=\"item1\"&gt;Item 1&lt;\/string&gt;\n&lt;string name=\"item2\"&gt;Item 2&lt;\/string&gt;<\/code><\/pre>\n\n\n\n<p>These strings now live alongside all other translatable content. To localize them, add the corresponding entries to your locale-specific files, for example in <code>res\/values-es\/strings.xml<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using the string array in a dropdown<\/h3>\n\n\n\n<p>So far, the string array is defined in a separate file and populated using references to strings defined in <code>strings.xml<\/code>. The next step is to verify that this setup works correctly in a real UI component.<\/p>\n\n\n\n<p>A common use case for string arrays is a dropdown or selection menu. In Compose, we can populate a dropdown using the values returned by <code>stringArrayResource()<\/code>.<\/p>\n\n\n\n<p>First, read the array from resources:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import androidx.compose.ui.res.stringArrayResource\n\nval systemItems = stringArrayResource(R.array.system)<\/code><\/pre>\n\n\n\n<p>Next, use those values in a simple dropdown component:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Composable\nfun SystemItemsDropdown() {\n    val items = stringArrayResource(R.array.system)\n    var expanded by remember { mutableStateOf(false) }\n    var selectedItem by remember { mutableStateOf(items.first()) }\n\n    ExposedDropdownMenuBox(\n        expanded = expanded,\n        onExpandedChange = { expanded = !expanded }\n    ) {\n        TextField(\n            readOnly = true,\n            value = selectedItem,\n            onValueChange = {},\n            label = { Text(stringResource(R.string.label_system_items)) },\n            trailingIcon = {\n                ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded)\n            },\n            modifier = Modifier.menuAnchor()\n        )\n\n        ExposedDropdownMenu(\n            expanded = expanded,\n            onDismissRequest = { expanded = false }\n        ) {\n            items.forEach { item -&gt;\n                DropdownMenuItem(\n                    text = { Text(item) },\n                    onClick = {\n                        selectedItem = item\n                        expanded = false\n                    }\n                )\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>Finally, add the dropdown to your UI (for example, inside the main screen or card component):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SystemItemsDropdown()<\/code><\/pre>\n\n\n\n<p>The dropdown now displays the values defined by the system string array:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"784\" height=\"646\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/image7new.gif\" alt=\"\" class=\"wp-image-7283\"\/><\/figure>\n\n\n\n<p><strong>Note:<\/strong> Because the dropdown uses a label (<code>label_system_items<\/code>), make sure to define it in the translation files.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Managing translations in POEditor<\/h2>\n\n\n\n<p>The setup we\u2019ve built so far is intentional as all translatable strings live in <code>strings.xml<\/code>. That means <code>strings.xml<\/code> is the only file you need to send to POEditor to translate everything, including values used inside the array.<\/p>\n\n\n\n<p>Instead of editing these files manually within your IDE, you upload them to POEditor, where you (or your team) can manage all the translations through a web interface.<\/p>\n\n\n\n<p>To get started, <a href=\"https:\/\/poeditor.com\/help\/how_to_translate_android_app\">create a project<\/a> and add your app\u2019s default language. From the Project page, use <strong>Import<\/strong> to upload your Android XML file (<code>strings.xml<\/code>).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"848\" src=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-05-at-11.10.44-1024x848.png\" alt=\"\" class=\"wp-image-7241\" srcset=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-05-at-11.10.44-1024x848.png 1024w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-05-at-11.10.44-300x248.png 300w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-05-at-11.10.44-768x636.png 768w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-05-at-11.10.44-1536x1271.png 1536w, https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/Screenshot-2026-02-05-at-11.10.44.png 1584w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Once translations are done, you export each language from POEditor and download the resulting Android XML.<\/p>\n\n\n\n<p>You can do this manually through the dashboard, or automate it with the <a href=\"https:\/\/poeditor.com\/docs\/api\">POEditor API<\/a>. Here\u2019s what an upload request looks like using <code>curl<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>url -X POST \"https:\/\/api.poeditor.com\/v2\/projects\/upload\" \\\n  -F api_token=\"YOUR_API_TOKEN\" \\\n  -F id=\"YOUR_PROJECT_ID\" \\\n  -F language=\"en\" \\\n  -F updating=\"terms_translations\" \\\n  -F file=@app\/src\/main\/res\/values\/strings.xml<\/code><\/pre>\n\n\n\n<p>This imports your translation keys and values into POEditor so you can start translating immediately. See the <a href=\"https:\/\/poeditor.com\/docs\/api#projects_upload\">upload docs<\/a> for everything you can tweak.<\/p>\n\n\n\n<p>Once your translations are done, you can <a href=\"https:\/\/poeditor.com\/docs\/api#projects_export\">export updated files<\/a> using their API too. For example, to download the Spanish version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST \"https:\/\/api.poeditor.com\/v2\/projects\/export\" \\\n  -d api_token=\"YOUR_API_TOKEN\" \\\n  -d id=\"YOUR_PROJECT_ID\" \\\n  -d language=\"es\" \\\n  -d type=\"android_strings\"<\/code><\/pre>\n\n\n\n<p>The export response returns a downloadable file URL (that you then fetch and save as <code>values-es\/strings.xml<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wrapping up<\/h2>\n\n\n\n<p>Android\u2019s localization system is simple in principle, but the way string resources are structured makes a big difference once translations enter the picture.<\/p>\n\n\n\n<p>By keeping all translatable text in <code>strings.xml<\/code> and using references from supporting resources like <code>string_array.xml<\/code>, you end up with a structure that is easier to reason about and works cleanly with localization tools such as POEditor.<\/p>\n\n\n\n<p>This approach avoids duplicating translations, keeps resource files predictable, and makes it clear which files are part of the translation workflow and which are not. It also scales well as the number of supported languages grows, without requiring changes to application code.<\/p>\n\n\n<div class=\"call-action my-4 d-flex justify-content-between align-items-md-center gap-4 flex-column flex-lg-row\"><div><h3 class=\"fs-4\">Ready to power up localization?<\/h3><span class=\"fs-6\">Subscribe to the POEditor platform today!<\/span><\/div><a class=\"btn btn-b-primary d-flex align-items-center justify-content-center px-4 py-3 flex-shrink-0\" \n\t\t\t\t\thref=\"https:\/\/poeditor.com\/pricing\/?utm_source=blog&#038;utm_medium=btn&#038;utm_campaign=cta_pricing\">See pricing<\/a><\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Android provides a built-in localization system based on string resources. By defining user-facing text in XML files and organizing them by locale, Android can automatically load the correct translations at runtime based on the user\u2019s language settings. In most apps, this starts with &lt;string&gt; entries in strings.xml. However, for real-world use cases, you also have [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-7231","post","type-post","status-publish","format-standard","hentry","category-localization"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>A practical guide to Android localization with string resources - POEditor Blog<\/title>\n<meta name=\"description\" content=\"Master Android localization with this step-by-step guide. Learn how to implement string resources, handle pluralization, and more.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/poeditor.com\/blog\/android-localization\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A practical guide to Android localization with string resources - POEditor Blog\" \/>\n<meta property=\"og:description\" content=\"Master Android localization with this step-by-step guide. Learn how to implement string resources, handle pluralization, and more.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/poeditor.com\/blog\/android-localization\/\" \/>\n<meta property=\"og:site_name\" content=\"POEditor Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/POEditor\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-12T09:24:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-25T11:53:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2194\" \/>\n\t<meta property=\"og:image:height\" content=\"1615\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Joel Olawanle\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@poeditor\" \/>\n<meta name=\"twitter:site\" content=\"@poeditor\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Joel Olawanle\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/\"},\"author\":{\"name\":\"Joel Olawanle\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#\\\/schema\\\/person\\\/7c32041b74b3e09061cabde6e194862b\"},\"headline\":\"A practical guide to Android localization with string resources\",\"datePublished\":\"2026-02-12T09:24:55+00:00\",\"dateModified\":\"2026-02-25T11:53:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/\"},\"wordCount\":2007,\"publisher\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/android-localization-1024x754.png\",\"articleSection\":[\"Localization\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/\",\"url\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/\",\"name\":\"A practical guide to Android localization with string resources - POEditor Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/android-localization-1024x754.png\",\"datePublished\":\"2026-02-12T09:24:55+00:00\",\"dateModified\":\"2026-02-25T11:53:51+00:00\",\"description\":\"Master Android localization with this step-by-step guide. Learn how to implement string resources, handle pluralization, and more.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/#primaryimage\",\"url\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/android-localization.png\",\"contentUrl\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/android-localization.png\",\"width\":2194,\"height\":1615,\"caption\":\"android localization\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/android-localization\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A practical guide to Android localization with string resources\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/\",\"name\":\"POEditor Blog\",\"description\":\"All about translation and localization management\",\"publisher\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#organization\",\"name\":\"POEditor\",\"url\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/logo_head_512_transparent.png\",\"contentUrl\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/logo_head_512_transparent.png\",\"width\":512,\"height\":512,\"caption\":\"POEditor\"},\"image\":{\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/POEditor\",\"https:\\\/\\\/x.com\\\/poeditor\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/poeditor\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCXAk1u8N49VRMAqNneENCFA\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/#\\\/schema\\\/person\\\/7c32041b74b3e09061cabde6e194862b\",\"name\":\"Joel Olawanle\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/30f391dce10587a611158f3f46b79cabfc72e00d891bf7ae84dd80cec0a6d71b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/30f391dce10587a611158f3f46b79cabfc72e00d891bf7ae84dd80cec0a6d71b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/30f391dce10587a611158f3f46b79cabfc72e00d891bf7ae84dd80cec0a6d71b?s=96&d=mm&r=g\",\"caption\":\"Joel Olawanle\"},\"url\":\"https:\\\/\\\/poeditor.com\\\/blog\\\/author\\\/joel-olawanle\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"A practical guide to Android localization with string resources - POEditor Blog","description":"Master Android localization with this step-by-step guide. Learn how to implement string resources, handle pluralization, and more.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/poeditor.com\/blog\/android-localization\/","og_locale":"en_US","og_type":"article","og_title":"A practical guide to Android localization with string resources - POEditor Blog","og_description":"Master Android localization with this step-by-step guide. Learn how to implement string resources, handle pluralization, and more.","og_url":"https:\/\/poeditor.com\/blog\/android-localization\/","og_site_name":"POEditor Blog","article_publisher":"https:\/\/www.facebook.com\/POEditor","article_published_time":"2026-02-12T09:24:55+00:00","article_modified_time":"2026-02-25T11:53:51+00:00","og_image":[{"width":2194,"height":1615,"url":"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization.png","type":"image\/png"}],"author":"Joel Olawanle","twitter_card":"summary_large_image","twitter_creator":"@poeditor","twitter_site":"@poeditor","twitter_misc":{"Written by":"Joel Olawanle","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/poeditor.com\/blog\/android-localization\/#article","isPartOf":{"@id":"https:\/\/poeditor.com\/blog\/android-localization\/"},"author":{"name":"Joel Olawanle","@id":"https:\/\/poeditor.com\/blog\/#\/schema\/person\/7c32041b74b3e09061cabde6e194862b"},"headline":"A practical guide to Android localization with string resources","datePublished":"2026-02-12T09:24:55+00:00","dateModified":"2026-02-25T11:53:51+00:00","mainEntityOfPage":{"@id":"https:\/\/poeditor.com\/blog\/android-localization\/"},"wordCount":2007,"publisher":{"@id":"https:\/\/poeditor.com\/blog\/#organization"},"image":{"@id":"https:\/\/poeditor.com\/blog\/android-localization\/#primaryimage"},"thumbnailUrl":"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization-1024x754.png","articleSection":["Localization"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/poeditor.com\/blog\/android-localization\/","url":"https:\/\/poeditor.com\/blog\/android-localization\/","name":"A practical guide to Android localization with string resources - POEditor Blog","isPartOf":{"@id":"https:\/\/poeditor.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/poeditor.com\/blog\/android-localization\/#primaryimage"},"image":{"@id":"https:\/\/poeditor.com\/blog\/android-localization\/#primaryimage"},"thumbnailUrl":"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization-1024x754.png","datePublished":"2026-02-12T09:24:55+00:00","dateModified":"2026-02-25T11:53:51+00:00","description":"Master Android localization with this step-by-step guide. Learn how to implement string resources, handle pluralization, and more.","breadcrumb":{"@id":"https:\/\/poeditor.com\/blog\/android-localization\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/poeditor.com\/blog\/android-localization\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/poeditor.com\/blog\/android-localization\/#primaryimage","url":"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization.png","contentUrl":"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2026\/02\/android-localization.png","width":2194,"height":1615,"caption":"android localization"},{"@type":"BreadcrumbList","@id":"https:\/\/poeditor.com\/blog\/android-localization\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/poeditor.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A practical guide to Android localization with string resources"}]},{"@type":"WebSite","@id":"https:\/\/poeditor.com\/blog\/#website","url":"https:\/\/poeditor.com\/blog\/","name":"POEditor Blog","description":"All about translation and localization management","publisher":{"@id":"https:\/\/poeditor.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/poeditor.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/poeditor.com\/blog\/#organization","name":"POEditor","url":"https:\/\/poeditor.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/poeditor.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2019\/11\/logo_head_512_transparent.png","contentUrl":"https:\/\/poeditor.com\/blog\/wp-content\/uploads\/2019\/11\/logo_head_512_transparent.png","width":512,"height":512,"caption":"POEditor"},"image":{"@id":"https:\/\/poeditor.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/POEditor","https:\/\/x.com\/poeditor","https:\/\/www.linkedin.com\/company\/poeditor\/","https:\/\/www.youtube.com\/channel\/UCXAk1u8N49VRMAqNneENCFA"]},{"@type":"Person","@id":"https:\/\/poeditor.com\/blog\/#\/schema\/person\/7c32041b74b3e09061cabde6e194862b","name":"Joel Olawanle","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/30f391dce10587a611158f3f46b79cabfc72e00d891bf7ae84dd80cec0a6d71b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/30f391dce10587a611158f3f46b79cabfc72e00d891bf7ae84dd80cec0a6d71b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/30f391dce10587a611158f3f46b79cabfc72e00d891bf7ae84dd80cec0a6d71b?s=96&d=mm&r=g","caption":"Joel Olawanle"},"url":"https:\/\/poeditor.com\/blog\/author\/joel-olawanle\/"}]}},"_links":{"self":[{"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/posts\/7231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/comments?post=7231"}],"version-history":[{"count":5,"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/posts\/7231\/revisions"}],"predecessor-version":[{"id":7284,"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/posts\/7231\/revisions\/7284"}],"wp:attachment":[{"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/media?parent=7231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/categories?post=7231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/poeditor.com\/blog\/wp-json\/wp\/v2\/tags?post=7231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}