Текст уведомления службы использует системный язык

#android #service #locale #android-notifications #foregroundnotification

#Android #Обслуживание #язык #android-уведомления #Уведомление переднего плана

Вопрос:

Мое приложение поддерживает 2 языка: английский и иврит. Когда я меняю язык на английский и сворачиваю приложение, текст уведомления службы отображается на иврите вместо английского. Помимо уведомления, перевод работает отлично.

Теперь, как я упоминал в названии, я понял, что это происходит потому, что мой системный язык — иврит.

Как я могу преодолеть эту проблему?

Спасибо!

Редактировать:

Кнопка изменения языка (только MainActivity, из всплывающего меню) —

         popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            public boolean onMenuItemClick(MenuItem menu_item) {
                int itemId = menu_item.getItemId();
                if (itemId == R.id.English) {
                        changeLang(getApplicationContext(), "en");
                        getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_LTR);


                    finish();
                    startActivity(new Intent(getApplicationContext(), MainActivity.class));
                } else if (itemId == R.id.Hebrew) {

                        changeLang(getApplicationContext(), "iw");
                        getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

                    finish();
                    startActivity(new Intent(getApplicationContext(), MainActivity.class));
                }
                return true;
            }
        });


    @Override
    protected void attachBaseContext(Context newBase) {

        SharedPreferences preferences = 
  PreferenceManager.getDefaultSharedPreferences(newBase);
        LANG_CURRENT = preferences.getString("Language", "en");

        super.attachBaseContext(MyContextWrapper.wrap(newBase, LANG_CURRENT));
    }

    public void changeLang(Context context, String lang) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("Language", lang);
        editor.apply();
    }
 

Сервис onCreate —

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        if (MainActivity.LANG_CURRENT.equals("en")) {
            changeLang(getApplicationContext(),"en");
            Lang = "en";
        } else {
            changeLang(getApplicationContext(),"iw");
            Lang = "iw";
        }
        }
 

Уведомление службы —

 NotificationCompat.Action action = new NotificationCompat.Action(R.drawable.ic_launch, getString(R.string.launch), activityPendingIntent);
NotificationCompat.Action action2 = new NotificationCompat.Action(R.drawable.ic_cancel, getString(R.string.stop), servicePendingIntent);


NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
Notification notification = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
        .setContentTitle(getString(R.string.launch))
        .addAction(action)
        .addAction(action2)
        .setColor(getColor(R.color.foreGroundBackgroundColor))
        .setPriority(NotificationManager.IMPORTANCE_HIGH)
        .setCategory(Notification.CATEGORY_SERVICE)
        .setSmallIcon(R.drawable.applogo)
        .build();

startForeground(2, notification);
 

Перевод отлично работает для всех действий, за исключением уведомления о службе..

РЕШЕНИЕ БЛАГОДАРЯ @Eyosiyas —

Активность службы —

В onStartCommand я сделал это —

 if (MainActivity.LANG_CURRENT.equals("en")) {
    
    Locale locale = new Locale("en");
    Locale.setDefault(locale);
    Resources resources = this.getResources();
    Configuration config = resources.getConfiguration();
    config.setLocale(locale);
    resources.updateConfiguration(config, resources.getDisplayMetrics());

} else {
    
    Locale locale = new Locale("iw");
    Locale.setDefault(locale);
    Resources resources = this.getResources();
    Configuration config = resources.getConfiguration();
    config.setLocale(locale);
    resources.updateConfiguration(config, resources.getDisplayMetrics());
    
}
 

Комментарии:

1. Опубликуйте некоторый код, который мы можем просмотреть.

2. @Eyosiyas Спасибо за ваш ответ, код добавлен.

3. Где находится serice?

Ответ №1:

Метод onCreate вашего сервиса. При необходимости внесите необходимые изменения.

 Locale locale = new Locale(language);
Locale.setDefault(locale);

Resources resources = context.getResources();

Configuration configuration = resources.getConfiguration();
configuration.locale = locale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
 

Оптимизированный код для onStartCommand

 Locale locale;
if (MainActivity.LANG_CURRENT.equals("en"))
    locale = new Locale("en");
else
    locale = new Locale("iw");

Locale.setDefault(locale);
Resources resources = this.getResources();
Configuration config = resources.getConfiguration();
config.setLocale(locale);
resources.updateConfiguration(config, resources.getDisplayMetrics());
 

Комментарии:

1. Прежде всего, спасибо, он работает! НО каждый раз, когда я меняю язык с помощью кнопки, действие перезапускается, и все строки полностью меняются, кроме уведомления, только когда я полностью перезапускаю приложение, уведомление окончательно меняется. Как я могу это сделать, не перезапуская приложение? Еще раз спасибо!

2. Перезапустите службу.

3. Служба еще не работает, и все же, когда служба запускается в первый раз после смены языка, она не меняется, только когда я перезапускаю приложение

4. Переместите языковую логику с onCreate на onStartCommand.

Ответ №2:

Это решение будет работать только в том случае, если у вас есть предопределенная строка уведомлений.Нравится String.format("Your order id %s has been processed!",orderId);

В вашей службе, при привязке метаданных уведомлений, разрешите службе обращаться к текущему выбранному языку. В соответствии с языком передайте строку формата в отдельный метод, который возвращает переведенный заголовок и сообщение

Комментарии:

1. Спасибо за ответ, я предварительно определил свою строку уведомления, используя переведенную строку xml. Я называю это так: getString(R.string. запуск)