关于友好网址和非拉丁字符

我尝试过编码,但实际上 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 中设置 Hash:

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

所以这是在设置中自定义音译的方式,在函数结束时,我们只得到拉丁文本(友好的 URL)。我尝试用我的母语进行测试,不需要定义自定义 Hash 设置。

有什么办法可以保留代码更改吗?因为如果我执行:

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

文件 ./lib/slug.rb 会恢复到原始代码。抱歉,我对 Ruby on Rails 环境不太熟悉。

很抱歉我的打扰!

我决定改用 ASCII 而不是编码函数。我不知道为什么,但使用编码函数时我得到了不同的结果。

我在这里错在哪里了?非常感谢!

  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,并可能将其硬编码为你的区域设置,保持系统默认区域设置(英语)。
  • 在 .yml 中添加 slug.rb 的更改代码,以便每次重建应用程序时都能自定义 slug.rb。

祝你有美好的一天!