Android
Локализация ресурсов на Android
Поиск…
валюта
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
Добавление перевода в приложение для Android
Вам нужно создать другой файл strings.xml для каждого нового языка.
- Щелкните правой кнопкой мыши папку res
- Выберите Новый файл ресурсов → Значения
- Выберите локаль из доступных квалификаторов
- Нажмите кнопку « Далее» (>>)
- Выберите язык
- Назовите файл strings.xml
strings.xml
<resources>
<string name="app_name">Testing Application</string>
<string name="hello">Hello World</string>
</resources>
strings.xml (привет)
<resources>
<string name="app_name">परीक्षण आवेदन</string>
<string name="hello">नमस्ते दुनिया</string>
</resources>
Программирование программно:
public void setLocale(String locale) // Pass "en","hi", etc.
{
myLocale = new Locale(locale);
// Saving selected locale to session - SharedPreferences.
saveLocale(locale);
// Changing locale.
Locale.setDefault(myLocale);
android.content.res.Configuration config = new android.content.res.Configuration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
config.setLocale(myLocale);
} else {
config.locale = myLocale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
getBaseContext().createConfigurationContext(config);
} else {
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
}
Вышеуказанная функция изменит текстовые поля, на которые ссылаются строки strings.xml . Например, предположим, что у вас есть следующие два текстовых вида:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello"/>
Затем, после изменения языкового стандарта, строки языка, имеющие идентификаторы app_name и hello будут соответственно изменены.
Тип каталогов ресурсов в папке «res»
Когда требуется локализация различных типов ресурсов, каждый из них имеет свой собственный дом в структуре проекта Android. Ниже приведены различные каталоги, которые мы можем разместить в каталоге \res . Типы ресурсов, размещенные в каждом из этих каталогов, описаны в следующей таблице:
| каталог | Тип ресурса |
|---|---|
| аниматор / | XML-файлы, которые определяют анимацию свойств. |
| аним / | XML-файлы, которые определяют анимацию анимации. (Имущественная анимация также может быть сохранена в этом каталоге, но каталог аниматора / предпочтительнее для анимации свойств, чтобы различать два типа.) |
| цвет/ | XML-файлы, которые определяют список состояний цветов. См. Раздел «Список состояний цвета» |
| рисуем / | «Растровые файлы (.png, .9.png, .jpg, .gif) или файлы XML, которые скомпилированы в следующие подтипы поддающихся ресурсам:: Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " |
| мипмап / | Файлы с возможностью рисования для различных значений плотности значков пусковых установок. Дополнительные сведения об управлении значками запуска с помощью mipmap / folders см. В разделе «Управление проектами». |
| макет / | XML-файлы, которые определяют макет пользовательского интерфейса. См. «Ресурс компоновки». |
| меню/ | XML-файлы, которые определяют меню приложений, например меню параметров, контекстное меню или подменю. См. «Ресурс меню». |
| сырье / | Произвольные файлы для сохранения в исходном виде. Чтобы открыть эти ресурсы с помощью сырого InputStream, вызовите Resource.openRawResource () с идентификатором ресурса, который является R.raw.filename. |
| Однако, если вам нужен доступ к исходным именам файлов и иерархии файлов, вы можете рассмотреть возможность сохранения некоторых ресурсов в каталоге assets / resources (вместо ofres / raw /). Файлы в активах / не получают идентификатор ресурса, поэтому вы можете читать их только с помощью AssetManager. | |
| ценности/ | XML-файлы, содержащие простые значения, такие как строки, целые числа и цвета, а также стили и темы |
| XML / | Произвольные XML-файлы, которые можно прочитать во время выполнения, вызывая Resource.getXML (). Здесь должны быть сохранены различные файлы конфигурации XML, такие как конфигурация, доступная для поиска. |
Типы конфигурации и имена квалификаторов для каждой папки в каталоге «res»
Каждый каталог ресурсов в папке res (перечисленный в примере выше) может иметь разные варианты содержащихся ресурсов в каталоге с одинаковым именем, суффикс с различными qualifier-values для каждого configuration-type .
Пример вариаций `` каталог с разными значениями классификатора, которые часто встречаются в наших проектах для Android:
- рисуем /
- рисуем-ан /
- вытяжка-FR-ПКА /
- вытяжка-ен-порт /
- вытяжка-ен-NoTouch-12key /
- вытяжка-порт-ldpi /
- вытяжка-порт-NoTouch-12key /
Исчерпывающий список всех разных типов конфигурации и их значений квалификатора для ресурсов android:
| конфигурация | Квалификационные значения |
|---|---|
| MCC и MNC | Примеры: |
| mcc310 | |
| mcc310-mnc004 | |
| mcc208-mnc00 | |
| и т.п. | |
| Язык и регион | Примеры: |
| ан | |
| фр | |
| ан-РУСЬ | |
| фр-RFR | |
| фр-РКА | |
| Направление макета | ldrtl |
| ldltr | |
| smallestWidth | swdp |
| Примеры: | |
| sw320dp | |
| sw600dp | |
| sw720dp | |
| Доступная ширина | WDP |
| w720dp | |
| w1024dp | |
| Доступная высота | HDP |
| h720dp | |
| h1024dp | |
| Размер экрана | маленький |
| нормальный | |
| большой | |
| XLarge | |
| Аспект экрана | долго |
| недолго | |
| Круглый экран | круглый |
| notround | |
| Ориентация экрана | порт |
| земельные участки | |
| Режим пользовательского интерфейса | автомобиль |
| стол письменный | |
| телевидение | |
| appliancewatch | |
| Ночной режим | ночь |
| notnight | |
| Плотность пикселей экрана (dpi) | ldpi |
| MDPI | |
| ИПЧР | |
| xhdpi | |
| xxhdpi | |
| xxxhdpi | |
| nodpi | |
| tvdpi | |
| anydpi | |
| Тип сенсорного экрана | без касаний |
| Палец | |
| Доступность клавиатуры | keysexposed |
| keyshidden | |
| keyssoft | |
| Метод первичного ввода текста | nokeys |
| БУКВ | |
| 12key | |
| Доступ к навигационной клавише | navexposed |
| navhidden | |
| Первичный метод без касания | nonav |
| DPad | |
| трекбол | |
| рулевое колесо | |
| Версия платформы (уровень API) | Примеры: |
| v3 | |
| v4 | |
| v7 |
Измените язык приложения Android
В приведенных выше примерах вы понимаете, как локализовать ресурсы приложения. В следующем примере объясните, как изменить языковой стандарт приложения внутри приложения, а не на устройстве. Чтобы изменить только локализацию приложения, вы можете использовать утилиту ниже locale.
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.preference.PreferenceManager;
import android.view.ContextThemeWrapper;
import java.util.Locale;
/**
* Created by Umesh on 10/10/16.
*/
public class LocaleUtils {
private static Locale mLocale;
public static void setLocale(Locale locale){
mLocale = locale;
if(mLocale != null){
Locale.setDefault(mLocale);
}
}
public static void updateConfiguration(ContextThemeWrapper wrapper){
if(mLocale != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
Configuration configuration = new Configuration();
configuration.setLocale(mLocale);
wrapper.applyOverrideConfiguration(configuration);
}
}
public static void updateConfiguration(Application application, Configuration configuration){
if(mLocale != null && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1){
Configuration config = new Configuration(configuration);
config.locale = mLocale;
Resources res = application.getBaseContext().getResources();
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
}
public static void updateConfiguration(Context context, String language, String country){
Locale locale = new Locale(language,country);
setLocale(locale);
if(mLocale != null){
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
configuration.locale = mLocale;
res.updateConfiguration(configuration,res.getDisplayMetrics());
}
}
public static String getPrefLangCode(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString("lang_code","en");
}
public static void setPrefLangCode(Context context, String mPrefLangCode) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString("lang_code",mPrefLangCode);
editor.commit();
}
public static String getPrefCountryCode(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getString("country_code","US");
}
public static void setPrefCountryCode(Context context,String mPrefCountryCode) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString("country_code",mPrefCountryCode);
editor.commit();
}
}
Инициализируйте язык, который пользователь предпочитает, из класса Application.
public class LocaleApp extends Application{
@Override
public void onCreate() {
super.onCreate();
LocaleUtils.setLocale(new Locale(LocaleUtils.getPrefLangCode(this), LocaleUtils.getPrefCountryCode(this)));
LocaleUtils.updateConfiguration(this, getResources().getConfiguration());
}
}
Вам также необходимо создать базовый актив и распространить эту активность на все другие действия, чтобы вы могли изменить язык приложения только в одном месте:
public abstract class LocalizationActivity extends AppCompatActivity {
public LocalizationActivity() {
LocaleUtils.updateConfiguration(this);
}
// We only override onCreate
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
Примечание. Всегда инициализируйте локаль в конструкторе.
Теперь вы можете использовать LocalizationActivity, как показано ниже.
public class MainActivity extends LocalizationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Примечание. При изменении программного языка приложения необходимо перезапустить свою активность, чтобы изменить локальное изменение. Чтобы правильно работать для этого решения, вы и используйте локаль из общих настроек при запуске приложения, вы
android:name=".LocaleApp"в вы Manifest.xml.
Иногда Lint checker запрашивает создание сборки релиза. Чтобы решить эту проблему, выполните нижеуказанные варианты.
Первый:
Если вы хотите отключить перевод для некоторых строк, то добавьте следующий атрибут в default string.xml
<string name="developer" translatable="false">Developer Name</string>
Во- вторых:
Игнорировать все отсутствующие переводы из файла ресурсов добавить следующий атрибут Это атрибут ignore пространства имен инструментов в файле строк, как показано ниже:
<?xml version="1.0" encoding="utf-8"?>
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingTranslation" >
http://stackoverflow.com/documentation/android/3345/localization-with-resources-in-android#
<!-- your strings here; no need now for the translatable attribute -->
</resources>
В третьих:
Другой способ отключить непереводимую строку
http://tools.android.com/recent/non-translatablestrings
Если у вас много ресурсов, которые нельзя переводить, вы можете поместить их в файл с именем donottranslate.xml, и lint рассмотрит все из них непереводимые ресурсы.
В- четвертых:
Вы также можете добавить locale в файл ресурсов
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:locale="en" tools:ignore="MissingTranslation">
Вы также можете отключить проверку отсутствия перевода для lint из приложения / build.gradle
lintOptions {
disable 'MissingTranslation'
}