#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. запуск)