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'
}