Sobre URLs amigables y caracteres no latinos

Intenté codificarlo, pero en realidad la URL se ve bien en la barra de direcciones del navegador de Internet. Sin embargo, cuando la copio o la envío, la URL real es una cadena de escape y ya no es amigable.

Revisé lib/slug.rb y sugiero cambiar la función encoded_generator de la siguiente manera:

  def self.encoded_generator(string, downcase: true)
    # Este generador saneará casi todos los caracteres especiales,
    # incluidos los caracteres reservados de RFC3986.
    # Ver también 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

Probé con la configuración regional de Vietnam y obtuve los resultados deseados. Espero que funcione con otro idioma.

Supongo que esto es una consideración de compatibilidad. Algunas aplicaciones solo admiten enlaces de texto latino y cortan directamente los enlaces en texto no latino.

No soy un escritor de código Ruby, pero leí el documento y encontré esto:

Configuración de un Hash en <locale>.yml:

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

Así que esta es la forma de personalizar la transliteración en la configuración, al final de la función, obtenemos solo texto latino (URL amigable). Lo probé con mi idioma nativo y no es necesario definir la configuración personalizada del hash.

¿Hay alguna forma de mantener el cambio de código? Porque si hiciera:

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

El archivo ./lib/slug.rb vuelve al código original. Lo siento porque soy nuevo en el entorno de ruby on rails.

¡Lo siento mucho por mi molestia!

Decido cambiar el ascii en lugar de la función codificada. No sé por qué, pero obtengo resultados diferentes cuando uso la codificación.

¿Qué hice mal aquí? ¡Muchas gracias!

  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

Después de experimentar, descubrí que:

  • Nunca cambies ascii_generator. Hace que Discourse compile incorrectamente las plantillas/temas/CSS.
  • Solo usa encoded_generator y quizás codifica a tu idioma local, manteniendo la configuración de idioma predeterminada del sistema (inglés).
  • Agrega el código modificado de slug.rb en .yml para mantener slug.rb personalizado cada vez que reconstruyas la aplicación.

¡Que tengas un buen día!