À propos des URLs conviviales et des caractères non latins

J’ai essayé l’encodage, mais l’URL s’affiche correctement dans la barre d’adresse du navigateur. Cependant, lorsque je la copie ou l’envoie, l’URL réelle est une chaîne échappée et n’est plus conviviale.

J’ai vérifié le fichier lib/slug.rb et je suggère de modifier la fonction encoded_generator comme suit :

  def self.encoded_generator(string, downcase: true)
    # Ce générateur va nettoyer la plupart des caractères spéciaux,
    # y compris les caractères réservés de la RFC3986.
    # Voir aussi 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

J’ai testé avec la locale vietnamienne et j’ai obtenu les résultats souhaités. J’espère que cela fonctionnera avec d’autres langues.

Je suppose qu’il s’agit d’une considération de compatibilité. Certaines applications ne prennent en charge que les liens textuels latins et coupent directement les liens en texte non latin.

Je ne suis pas un développeur de code Ruby, mais j’ai lu le document et j’ai trouvé ceci :

Définir un Hash dans <locale>.yml :

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

C’est donc la manière de personnaliser la translittération dans les paramètres, à la fin de la fonction, nous obtenons uniquement du texte latin (URL conviviale). J’ai essayé avec ma langue maternelle, et il n’est pas nécessaire de définir un paramètre de hash personnalisé.

Y a-t-il un moyen de conserver la modification du code ? Parce que si je faisais :

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

Le fichier ./lib/slug.rb revient au code d’origine. Je suis désolé car je suis nouveau dans l’environnement Ruby on Rails.

Je suis tellement désolé pour mon agacement !

J’ai décidé de changer l’ASCII au lieu de la fonction encodée. Je ne sais pas pourquoi, mais j’ai obtenu des résultats différents lorsque j’ai utilisé l’encodage.

Qu’est-ce qui ne va pas ici ? Merci beaucoup !

  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

Après avoir expérimenté, j’ai constaté que :

  • Ne jamais modifier ascii_generator. Cela provoque une compilation incorrecte des modèles/thèmes/CSS de Discourse.
  • Utiliser uniquement encoded_generator et éventuellement coder en dur votre locale, en conservant le paramètre de locale par défaut du système (anglais).
  • Ajouter le code modifié de slug.rb dans .yml pour conserver la personnalisation de slug.rb à chaque reconstruction de l’application.

Bonne journée !