О дружественных URL и символах не латинского алфавита

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

Я проверил файл lib/slug.rb и предлагаю изменить функцию encoded_generator следующим образом:

  def self.encoded_generator(string, downcase: true)
    # Этот генератор очищает почти все специальные символы,
    # включая зарезервированные символы из RFC3986.
    # См. также URI::REGEXP::PATTERN.
    string = I18n.transliterate(string, locale: SiteSetting.default_locale)

    string = string.strip.gsub(/\s+/, "-").gsub(CHAR_FILTER_REGEXP, "")

    string = string.downcase if downcase

    string
    #CGI.escape(string)
  end

Я протестировал это с локалью «Вьетнам» и получил желаемый результат. Надеюсь, это сработает и для других языков.

Полагаю, это вопрос совместимости. Некоторые приложения поддерживают только ссылки на латинице и просто обрезают ссылки, содержащие текст на других алфавитах.

Я не пишу код на Ruby, но прочитал документацию и обнаружил следующее:

Настройка хеша в файле <locale>.yml:

i18n:
  transliterate:
    rule:
      ü: "ue"
      ö: "oe"

Таким образом, это способ настроить транслитерацию через конфигурацию: в конце работы функции мы получаем только латинский текст (дружественный URL). Я пробовал это со своим родным языком, и определять пользовательский хеш не потребовалось.

Есть ли способ сохранить изменения в коде? Потому что если я выполню:

./launcher destroy app && ./launcher start app

то файл ./lib/slug.rb вернётся к исходному коду. Извините, я новичок в среде Ruby on Rails.

Мне очень жаль, что я вас беспокою!

Я решил использовать функцию ascii вместо encoded. Не знаю почему, но при использовании encoded я получаю другие результаты.

В чём моя ошибка? Большое спасибо!

  def self.ascii_generator(string)
    #I18n.with_locale(SiteSetting.default_locale) { string.tr("'", "").parameterize }
    string = I18n.transliterate(string, :locale => SiteSetting.default_locale)
    string = string.strip.gsub(/\s+/, "-").gsub(CHAR_FILTER_REGEXP, "")
    string
  end

После некоторых экспериментов я выяснил следующее:

  • Никогда не меняйте ascii_generator. Это приводит к тому, что Discourse компилирует шаблоны, темы и CSS неправильно.
  • Используйте только encoded_generator и, возможно, жёстко задайте свой локаль, сохраняя системную настройку локаля по умолчанию (английский).
  • Добавляйте изменённый код файла slug.rb в .yml, чтобы сохранять кастомизированный slug.rb при каждой пересборке приложения.

Хорошего дня!