Sobre URLs amigáveis e caracteres não latinos

Tentei codificar, mas na verdade o URL pode ser visto bem no endereço do navegador de internet. No entanto, ao copiar ou enviar, o URL real é uma string de escape e não é mais amigável.

Verifiquei o lib/slug.rb e sugiro alterar a função encoded_generator assim:

  def self.encoded_generator(string, downcase: true)
    # Este gerador irá higienizar quase todos os caracteres especiais,
    # incluindo caracteres reservados da RFC3986.
    # Veja também 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

Tentei com a localidade do Vietnã e obtive os resultados desejados. Espero que funcione com outro idioma.

Acho que esta é uma consideração de compatibilidade. Alguns aplicativos suportam apenas links de texto em latim e cortam diretamente links em texto não latino.

Não sou um escritor de código Ruby, mas li o documento e encontrei isto:

Definindo um Hash em <locale>.yml:

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

Portanto, esta é a maneira de personalizar a transliteração nas configurações, no final da função, obtemos apenas texto latino (URL amigável). Tentei com minha língua nativa e não precisei definir a configuração de hash personalizada.

Existe alguma maneira de manter a alteração do código? Porque se eu fizesse:

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

O arquivo ./lib/slug.rb voltaria ao código original. Desculpe, sou novo no ambiente Ruby on Rails.

Desculpe pelo meu incômodo!

Decidi mudar para ASCII em vez da função codificada. Não sei por quê, mas obtive resultados diferentes ao usar a codificação.

O que está errado aqui? Muito obrigado!

  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

Depois de experimentar, descobri que:

  • Nunca altere o ascii_generator. Isso faz com que o Discourse compile incorretamente o template/tema/css.
  • Use apenas o encoded_generator e, talvez, codifique para o seu idioma, mantendo a configuração de idioma padrão do sistema (Inglês).
  • Adicione o código alterado de slug.rb em .yml para manter o slug.rb personalizado a cada reconstrução do aplicativo.

Tenha um bom dia!