Android
Lokalizacja z zasobami w Androidzie
Szukaj…
Waluta
Currency currency = Currency.getInstance("USD");
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setCurrency(currency);
format.format(10.00);
Dodawanie tłumaczenia do aplikacji na Androida
Musisz utworzyć inny plik strings.xml
dla każdego nowego języka.
- Kliknij prawym przyciskiem myszy folder res
- Wybierz Nowy → Plik zasobów wartości
- Wybierz ustawienia regionalne z dostępnych kwalifikatorów
- Kliknij przycisk Dalej (>>)
- Wybierz język
- Nazwij plik strings.xml
strings.xml
<resources>
<string name="app_name">Testing Application</string>
<string name="hello">Hello World</string>
</resources>
strings.xml (cześć)
<resources>
<string name="app_name">परीक्षण आवेदन</string>
<string name="hello">नमस्ते दुनिया</string>
</resources>
Programowe ustawienie języka:
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());
}
}
Powyższa funkcja zmieni pola tekstowe, do których istnieją odwołania z strings.xml . Załóżmy na przykład, że masz dwa następujące widoki tekstu:
<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"/>
Następnie, po zmianie ustawień regionalnych, łańcuchy językowe o identyfikatorach app_name
i hello
zostaną odpowiednio zmienione.
Typ katalogów zasobów w folderze „res”
Podczas lokalizowania wymagane są różne rodzaje zasobów, z których każdy ma swój dom w strukturze projektu Androida. Poniżej znajdują się różne katalogi, które możemy umieścić w katalogu \res
. Typy zasobów umieszczone w każdym z tych katalogów są wyjaśnione w poniższej tabeli:
Informator | Typ zasobu |
---|---|
animator/ | Pliki XML, które definiują animacje właściwości. |
anim / | Pliki XML, które definiują animacje animacji. (Animacje właściwości można również zapisać w tym katalogu, ale katalog animator / jest preferowany, aby animacje właściwości rozróżniały oba typy). |
kolor/ | Pliki XML, które definiują listę stanów kolorów. Zobacz Zasób listy stanów kolorów |
wysuwany / | „Pliki bitmap (.png, .9.png, .jpg, .gif) lub pliki XML, które są kompilowane w następujące podtypy zasobów do rysowania:: Bitmap files - Nine-Patches (re-sizable bitmaps) - State lists - Shapes - Animation drawables - Other drawables - " |
mipmap / | Pliki do rysowania dla różnych gęstości ikon programu uruchamiającego. Aby uzyskać więcej informacji na temat zarządzania ikonami programu uruchamiającego za pomocą mipmap / folderów, zobacz Omówienie zarządzania projektami. |
układ/ | Pliki XML, które definiują układ interfejsu użytkownika. Zobacz Zasób układu. |
menu/ | Pliki XML, które definiują menu aplikacji, takie jak menu opcji, menu kontekstowe lub podmenu. Zobacz Zasób menu. |
surowy/ | Pliki arbitralne do zapisania w surowej formie. Aby otworzyć te zasoby za pomocą surowego InputStream, wywołaj Resources.openRawResource () z identyfikatorem zasobu, którym jest R.raw.filename. |
Jeśli jednak potrzebujesz dostępu do oryginalnych nazw plików i hierarchii plików, możesz rozważyć zapisanie niektórych zasobów w katalogu resources / (zamiastresres / raw /). Pliki w zasobach / nie mają identyfikatora zasobu, więc można je odczytać tylko za pomocą AssetManager. | |
wartości / | Pliki XML zawierające proste wartości, takie jak ciągi, liczby całkowite i kolory, a także style i motywy |
xml / | Dowolne pliki XML, które można odczytać w czasie wykonywania, wywołując Resources.getXML (). Należy zapisać tutaj różne pliki konfiguracyjne XML, takie jak konfigurowalna wyszukiwarka. |
Typy konfiguracji i nazwy kwalifikatorów dla każdego folderu w katalogu „res”
Każdy katalog zasobów w folderze res
(wymienionym w powyższym przykładzie) może mieć różne odmiany zawartych w nim zasobów w podobnie nazwanym katalogu z różnymi qualifier-values
dla każdego typu configuration-type
.
Przykład wariantów katalogu `` z różnymi przyrostkami wartości kwalifikatora, które są często widoczne w naszych projektach na Androida:
- wysuwany /
- drawable-pl /
- drawable-fr-rCA /
- drawable-en-port /
- drawable-en-notouch-12key /
- drawable-port-ldpi /
- drawable-port-notouch-12key /
Wyczerpująca lista wszystkich różnych typów konfiguracji i ich wartości kwalifikujących dla zasobów Androida:
Konfiguracja | Wartości kwalifikatora |
---|---|
MCC i MNC | Przykłady: |
mcc310 | |
mcc310-mnc004 | |
mcc208-mnc00 | |
itp. | |
Język i region | Przykłady: |
en | |
fr | |
en-rUS | |
fr-rFR | |
fr-rCA | |
Układ strony | ldrtl |
ldltr | |
najmniejsza szerokość | swdp |
Przykłady: | |
sw320dp | |
sw600dp | |
sw720dp | |
Dostępna szerokość | wdp |
w720dp | |
w1024dp | |
Dostępna wysokość | hdp |
h720dp | |
h1024dp | |
Rozmiar ekranu | mały |
normalna | |
duży | |
xlarge | |
Aspekt ekranu | długo |
nie długo | |
Okrągły ekran | okrągły |
nie zaokrąglone | |
Orientacja ekranu | Port |
wylądować | |
Tryb interfejsu użytkownika | samochód |
biurko | |
telewizja | |
zegarek | |
Tryb nocny | noc |
noc | |
Gęstość pikseli ekranu (dpi) | ldpi |
mdpi | |
hdpi | |
xhdpi | |
xxhdpi | |
xxxhdpi | |
nodpi | |
tvdpi | |
anydpi | |
Typ ekranu dotykowego | nie dotykać |
palec | |
Dostępność klawiatury | klucz narażony |
klucz ukryty | |
keyssoft | |
Podstawowa metoda wprowadzania tekstu | nokeys |
qwerty | |
12key | |
Dostępność klucza nawigacyjnego | navexposed |
ukryty | |
Podstawowa metoda nawigacji bezdotykowej | nonav |
dpad | |
trackball | |
koło | |
Wersja platformy (poziom API) | Przykłady: |
v3 | |
v4 | |
wersja 7 |
Programowo zmieniaj ustawienia regionalne aplikacji na Androida
W powyższych przykładach wiesz, jak zlokalizować zasoby aplikacji. Poniższy przykład wyjaśnia, jak zmienić ustawienia regionalne aplikacji w aplikacji, a nie z urządzenia. Aby zmienić tylko ustawienia regionalne aplikacji, możesz użyć poniższych ustawień regionalnych.
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();
}
}
Zainicjuj ustawienia narodowe preferowane przez użytkownika z klasy 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());
}
}
Musisz również utworzyć działanie podstawowe i rozszerzyć to działanie na wszystkie inne działania, aby zmienić ustawienia regionalne aplikacji tylko w jednym miejscu w następujący sposób:
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);
}
}
Uwaga: Zawsze inicjuj ustawienia regionalne w Konstruktorze.
Teraz możesz użyć LocalizationActivity w następujący sposób.
public class MainActivity extends LocalizationActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Uwaga: Kiedy programowo zmieniasz ustawienia regionalne aplikacji, musisz ponownie uruchomić swoją aktywność, aby uzyskać efekt zmiany ustawień regionalnych. Aby działać poprawnie w tym rozwiązaniu, ty i używasz ustawień regionalnych ze wspólnych preferencji podczas uruchamiania aplikacji,
android:name=".LocaleApp"
w ty Manifest.xml.
Czasami Lint Checker wyświetla monit o utworzenie kompilacji wydania. Aby rozwiązać taki problem, wykonaj poniższe opcje.
Pierwszy:
Jeśli chcesz wyłączyć tłumaczenie tylko dla niektórych ciągów, dodaj następujący atrybut do domyślnego ciągu string.xml
<string name="developer" translatable="false">Developer Name</string>
Druga:
Zignoruj wszystkie brakujące tłumaczenia z pliku zasobów dodaj następujący atrybut Jest to atrybut ignorowania przestrzeni nazw narzędzi w pliku ciągów, w następujący sposób:
<?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>
Trzeci:
Kolejny sposób na wyłączenie nieprzetłumaczalnego łańcucha
http://tools.android.com/recent/non-translatablestrings
Jeśli masz wiele zasobów, których nie powinno się tłumaczyć, możesz umieścić je w pliku o nazwie donottranslate.xml, a lint uzna je za nieprzekształcalne.
Czwarty:
Możesz także dodać ustawienia regionalne w pliku zasobów
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:locale="en" tools:ignore="MissingTranslation">
Możesz także wyłączyć sprawdzanie brakującego tłumaczenia dla linków z app / build.gradle
lintOptions {
disable 'MissingTranslation'
}