Несколько дней назад я обратил внимание на мультиязычность iOS. Подробности здесь https://kynguyen.space/2018/03/29/ Different-way-i18n.html.
Работа с несколькими языками невозможна только из iOS/Android или Интернета, требуется помощь сервера. Без поддержки сервера пользователи могут получать сообщения на английском языке при использовании вьетнамского языка или уведомления на вьетнамском языке, но язык приложения — английский.
Ogenii полностью поддерживает мультиязычность от клиента до сервера. Для меня это непростая задача, потому что я просто новичок в бэкенде. Я считаю, что это не лучший способ сделать это, но это хороший способ, который я могу найти и использовать в настоящее время. Основная идея заключается в разделении всех текстов на объекты языков и получении значений по ключам.
Переместить все тексты в языковые файлы
Я поддерживаю английский и вьетнамский языки в Ogenii, поэтому добавляю 2 новых файла en.js и vi.js и перемещаю тексты в объект texts
// en.js module.exports.texts = { err_401: “Your login is expired. Login again and keep learning.”, verification_sent: ‘Your verification will be processed in 2–4 hours’, clazz_created: “Your class is created and under review. It’ll be live soon.” } // vi.js module.exports.texts = { err_401: “Phiên đăng nhập đã hết hạn. Đăng nhập lại và tiếp tục học thôi”, verification_sent: ‘Thông tin xác thực của bạn sẽ được xử lý xong trong 2–4 giờ tới’, clazz_created: “Lớp của bạn đã được tạo thành công và đang được xem xét. Lớp sẽ sớm online thôi” }
Добавить файл языкового центра
Не подключайте языковые файлы напрямую к другим. Я создаю файл в качестве центра для подключения всех поддерживаемых языков к другим файлам и называю его LangCenter.js.
- Импортируйте все поддерживаемые языки в LangCenter.
let En = require(‘./en’) let Vi = require(‘./vi’)
- Добавьте весь язык к подобному объекту. Так что плевать, сколько языков будет поддерживать.
let supported_langs = { “en”: En, “vi”: Vi }
- Добавьте объект, содержащий все ключи. Значения этого объекта должны быть в точности такими же, как ключи объекта texts в en.js и vi.js. .
module.exports.keys = { err_401: “err_401”, verification_sent: “verification_sent”, clazz_created: “clazz_created” }
- Добавьте функцию для получения переведенного текста из ключа и запрошенного языка от клиента. Добавляя языки к объекту `supported_lang`, нам не нужно условие для получения запрошенных языковых текстов здесь, это намного проще.
/** * @desc Get string by language * @param key of the text * @param lang If param `lang` is a String, it’s a language name. If it’s an object, it is a request from client. param `lang` is in the request header. * @return String in selected language */ function getText(key, lang) { if (typeof lang !== ‘string’) { lang = lang.headers[‘lang’] } let dict = supported_langs[lang].texts return dict[key] } module.exports.getText = getText
Хорошо, это сделано для всех сообщений с сервера. Любые сообщения, которые нам нужно отправить клиенту, просто добавьте в языковые файлы и объекты ключей в LangCenter.js.
Это еще не полностью поддерживается. Уведомление по-прежнему только на 1 языке. Я сохранил содержимое уведомления в базу данных, и оно не может быть динамическим для нескольких языков. Я должен был измениться. Просто сохраните элементы, чтобы генерировать только содержимое уведомлений. В зависимости от элементов я могу получить текст по языку.
Создать содержимое уведомлений по языку
Один пример для создания сообщения.
/** * @desc Generate text to tell Master when Genius book his class * @desc Text structure: Genius `<genius_name>` has just booked your class `<clazz_title>` * @param data: `genius_name`, `clazz_title` * @param lang * @return Meaningful String */ function getClazzBookedToMasterText(data, lang) { let booked = Lang.getText(LangCenter.keys.clazz_booked_to_master, lang) return `Genius ${data.genius_name} ${booked} ${data.clazz_title}` }
NodeJS не такой строгий, как Swift, поэтому я оставляю много комментариев в своем коде, особенно для параметров. Это помогает мне легче возвращаться или исправлять ошибки.
Теперь код на 95% гибок для нескольких языков. Сервер теперь возвращает содержимое уведомления на запрошенном клиентом языке.
Многоязычное push-уведомление
Последний шаг — push-уведомление на нескольких языках. Push-уведомление является динамическим с сервера, когда данные соответствуют некоторым условиям. Например, Genius бронирует класс, а сервер отправляет уведомление Мастеру. Нет запроса от Мастера, поэтому я не знаю текущий язык Мастера. Я должен сохранить язык пользователя в базе данных и получить его, когда требуется push-уведомление. Затем создайте контент с помощью функций, указанных выше, и отправьте его пользователям.
Заключение
Это все, что я делаю с несколькими языками в бэкэнде Ogenii. Он гибкий на 98%. Есть еще один крайний случай, у меня пока нет решения. У пользователя есть несколько устройств, и на каждом устройстве он выбирает другой язык. Надеюсь, я скоро найду решение для решения этого крайнего случая. Любое предложение решить эту проблему, пожалуйста, напишите мне сообщение.