Не работает локализация уведомлений

Я хочу локализовать уведомление и обнаружил, что для этого есть свойства, например title_loc_key, body_loc_key

Поля FCM, используемые для локализации (I18N) заголовка и тела уведомления, не работают. Например:

      {
  "android" : {
    "priority" : "normal",
    "notification" : {
      "title_loc_key": "notify_title",
      "body_loc_key": "notify_body"
    }
  }
}

В документации FCM указано, что эти поля используются для локализации текста в «строковых ресурсах приложения», но у Flutter нет файла res / values ​​/ strings.xml. Я использую библиотеку flutter_localizations и поддерживаю файлы res / values ​​/ strings_.arb в соответствии с требованиями Flutter для интернационализации, но у меня нет возможности указать firebase_messaging использовать эти ресурсы.

Спасибо

3 ответа

Решение

FCM не знает о Flutter. Он ориентирован на собственные приложения. Итак, для Flutter это будет код внутри android а также ios каталоги.

Если вы хотите использовать title_loc_key а также body_loc_key, вам нужно будет добавить ярлыки к android/app/src/main/res/values/strings.xmlна Android. Они отделены от ярлыков, которые вы используете в своем коде Flutter.

Локализация push-уведомлений, содержащих значения bodyLocKey из Firebase, практически такая же для приложения Flutter, как и для собственного приложения. Однако тот факт, что Flutter является кроссплатформенной технологией, часто позволяет легко забыть о том, что в проектах Flutter все еще есть разделы собственного кода. Утверждение «поля используются для локализации текста в «строковых ресурсах приложения», но у Flutter нет файла res/values/strings.xml» не совсем корректно. На самом деле приложения Flutter содержат файл strings.xml на стороне Android. На стороне iOS мы по-прежнему можем создать файл Localizable.strings так же, как и в нативном проекте.

Настройка Android

Как указали в своем ответе dumazy, файл strings.xml для Android в проекте Flutter находится вandroid/app/src/main/res/values/strings.xml. Вы можете добавить значения для сопоставления между вашими значениями bodyLocKey и строковыми значениями, которые вы хотите отображать в push-уведомлениях, в этот файл для Android. Например,

      <string name="oven_reached_preheat_temp_notification_title">Oven reached preheat temperature</string>

Настройка iOS

Настройка преобразования между значениями bodyLocKey и строковыми значениями для iOS немного сложнее, потому что нам нужно будет использовать Xcode для создания файла Localizable.strings, в котором будет храниться сопоставление. Вот процесс:

  1. Внутри вашего проекта Flutter откройте каталог /ios в Xcode.
  2. Выбрав Runner, выберите «Файл» > «Создать» > «Файл...».

Выберите файл&amp;amp;gt; новый&amp;amp;gt; файл в Xcode

  1. В диалоговом окне выберите тип файла «Strings file».

Выберите тип файла «Strings file».

  1. Затем назовите новый файл «Localizable.strings».

Назовите новый файл «Localizable.strings».

Вот хитрость и причина, по которой мы только что сделали этот процесс в Xcode, а не создавали новый файл в Android Studio (или в вашей IDE). Если вы посмотрите на свой контроль версий, вы заметите, что у нас есть не только новый файл Localizable.strings, но и несколько ссылок на этот новый файл в файле project.pbxproj.

Использование Xcode для создания файла также изменяет project.pbxproj.

Я на самом деле не совсем понимаю, что на самом деле делают эти ссылки. Однако они являются ключом к тому, чтобы сопоставление между вашими значениями bodyLocKey и строками, которые вы хотите отобразить, действительно работало.

Последним шагом, конечно же, является добавление вашего bodyLocKey к строковым значениям в Localizable.strings. Например,

"oven_reached_preheat_temp_notification_title" = "Достигнута температура предварительного нагрева в духовке";

После перестроения вашего приложения значения bodyLocKey сообщения FCM должны быть переведены в удобные для пользователя строки.

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

iOS,Localizable.strings:

      "TRADE_REQUEST" = "You have a new offer %@ from user %@";

И отправить такое сообщение:

       "title_loc_key": "TRADE_REQUEST",
 "title_loc_args": [23456, \"John Doe\"],

(Я не знаю, почему firebase не поместил его в документы https://firebase.google.com/docs/cloud-messaging/flutter/receive#ios)

Другие вопросы по тегам