2016-05-28 6 views
2

Я хотел бы применить локализацию в своем приложении динамически, так что можно определить строки в java-файле и извлечь эти строки в наш XML-файл макета, т. Е. Мы делаем @ string/anystringname, заменяя это строками, определенными в java-файле, на наш макет файл @somestring, определенный для java-файла ????Возможно ли обновить файл string.xml во время выполнения в android?

+0

'Можно ли ...' ** NO **. Вы не можете изменять файлы ресурсов во время выполнения. –

+0

Но должен быть какой-то способ программно и получить идентификатор? – Shailee

ответ

3

В основном, №

Вы не можете манипулировать файл ресурсов динамически. Вам необходимо реализовать такую ​​функциональность самостоятельно.

Вот пример:

english.json

{ 
    "hello": "Hello" 
} 

french.json

{ 
    "hello": "Bonjour" 
} 
public class StringManager { 
    private static StringManager sInstance = null; 
    private static String sDefaultLanguageCode = "en"; 

    private Map<String, JSONObject> mLanguageMap = new ArrayMap<>(); 

    private StringManager() { 
    } 

    public static StringManager getInstance() { 
     if (sInstance == null) { 
      synchronized (StringManager.class) { 
       if (sInstance == null) 
        sInstance = new StringManager(); 
      } 
     } 
     return sInstance; 
    } 

    public static void setDefaultLanguageCode(String languageCode) { 
     sDefaultLanguageCode = languageCode; 
    } 

    public void addLanguage(String languageCode, JSONObject json) { 
     mLanguageMap.put(languageCode, json); 
    } 

    public String getString(String key) { 
     return mLanguageMap.get(mDefaultLanguageCode).getString(key); 
    } 

    public String getString(String languageCode, String key) { 
     return mLanguageMap.get(languageCode).getString(key); 
    } 
} 

public class SomeActivity extends Activity { 
    ... 
    public void initStringResources() { 
     // assume englishJsonObject is created from english.json 
     StringManager.getInstance().addLanguage("en", englishJsonObject); 
     StringManager.getInstance().addLanguage("fr", frenchJsonObject); 

     StringManager.setDefaultLanguageCode("fr"); 
    } 

    public void useSomeString() { 
     String helloString = StringManager.getInstance().getString("hello"); 
     // helloString will be "Bonjour" 

     // and you can get specific language string 
     String englishHelloString = StringManager.getInstance().getString("en", "hello"); 
    } 

    // this may be called from Button or other UI component 
    public void onLanguageChanged(String languageCode) { 
     StringManager.setDefaultLanguageCode(languageCode); 
     // and update UI components that display localized strings 
    } 
} 
+0

hii..tried ur solution, но его не работает. сохраните файл в папке с ресурсами, а затем после прочтения этого файла этот файл может использоваться в макете – Shailee

+0

Как я уже упоминал, вы не можете изменять файлы xml во время выполнения. Если вы пробовали мое решение, например, '' это, конечно, не сработает. Вместо этого вы можете запрограммировать текст TextView. Если вы объявляете TextView в xml-файле следующим образом: '' Вы можете использовать мое решение следующим образом: TextView textView = (TextView) findViewById (R.id.my_textview); textView.setText (StringManager.getInstance(). GetString ("hello")); – nexus5x

+0

okay получил ваше решение .. Мне нужно сделать это программно, только создав одну общую функцию для всех и callin-строку – Shailee

-2
<TextView 
android:id="@+id/tv" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/tv" 
/> 

<string name="tv">old text</string>//old text 

final TextView textView = (TextView) findViewById(R.id.rate); 
textView.setText("new text");//new text 
0

Это невозможно. Тем не менее, можно изменить язык вашего приложения во время выполнения. Это позволяет вам переключаться между strings.xml для разных языков. Библиотека, которую я использовал для этого: Android localization library Все ваши действия должны расширить LocalizationActivity, которая расширяет AppCompatActivity. Вам просто нужно позвонить setLanguage ("en"); Чтобы изменить язык приложений и использовать другие строки.xml

В this thread вы можете узнать больше возможных решений.

+0

папка yaa throug values ​​для разных языков возможно извлекать все строки, но как это сделать динамически без ввода всех разных языковых строк? i.e, если я создаю json для всех строк, хранящихся в db, получая значения ключей и использую эту строку в моем файле макета – Shailee

+0

@Shailee это решение работает только при включении локализации в файле strings.xml. Библиотека позволяет вам переключать язык. Теперь используется strings.xml для другого языка. Это позволяет динамическую локализацию. Если вы хотите получить локализованные строки из базы данных. Ваш лучший вариант, вероятно, относится к подклассу TextView и добавляет пользовательский атрибут. https://developer.android.com/training/custom-views/create-view.html. В вашем текстовом представлении вы можете реализовать логику для чтения правильной строки. – Rockney

+0

ok, так можно динамически менять языки на своей кнопке, щелкая по этой библиотеке локализации, не создавая новый файл строк для разных языков? – Shailee

Смежные вопросы