Не работает локализация уведомлений
Я хочу локализовать уведомление и обнаружил, что для этого есть свойства, например 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, в котором будет храниться сопоставление. Вот процесс:
- Внутри вашего проекта Flutter откройте каталог /ios в Xcode.
- Выбрав Runner, выберите «Файл» > «Создать» > «Файл...».
Выберите файл&amp;gt; новый&amp;gt; файл в Xcode
- В диалоговом окне выберите тип файла «Strings file».
Выберите тип файла «Strings file».
- Затем назовите новый файл «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)