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