Несколько дней назад я обратил внимание на мультиязычность 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%. Есть еще один крайний случай, у меня пока нет решения. У пользователя есть несколько устройств, и на каждом устройстве он выбирает другой язык. Надеюсь, я скоро найду решение для решения этого крайнего случая. Любое предложение решить эту проблему, пожалуйста, напишите мне сообщение.