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é.
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.
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.