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

**URL:** https://meta.discourse.org/t/about-friendly-urls-and-non-latin-characters/282855
**Category:** Support
**Tags:** seo
**Created:** [2023年十月20日 03:36 UTC](https://meta.discourse.org/t/about-friendly-urls-and-non-latin-characters/282855 "2023-10-20T03:36:42Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![the220hq](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/the220hq/32/332255_2.png) [@the220hq](https://meta.discourse.org/u/the220hq)
#### Post date: [2023年十月20日 03:36 UTC](https://meta.discourse.org/t/about-friendly-urls-and-non-latin-characters/282855/1 "2023-10-20T03:36:42Z")

</div>

我尝试过编码，但实际上 URL 在浏览器地址栏中看起来很好。但是，当复制或发送它时，实际 URL 是一个转义字符串，不再友好。

我检查了 lib/slug.rb 并建议像这样更改 encoded\_generator 函数：

```plaintext
  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

```

我尝试了越南语环境并获得了想要的结果。希望它也能用于其他语言。

---

<div class="post-metadata">

### Author: ![Lhc\_fl](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lhc_fl/32/268115_2.png) [@Lhc\_fl](https://meta.discourse.org/u/Lhc_fl)
#### Post date: [2023年十月20日 03:50 UTC](https://meta.discourse.org/t/about-friendly-urls-and-non-latin-characters/282855/2 "2023-10-20T03:50:44Z")

</div>

这似乎是一个兼容性考虑。某些应用程序仅支持拉丁文本链接，并且会直接截断非拉丁文本中的链接。

---

<div class="post-metadata">

### Author: ![the220hq](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/the220hq/32/332255_2.png) [@the220hq](https://meta.discourse.org/u/the220hq)
#### Post date: [2023年十月20日 03:58 UTC](https://meta.discourse.org/t/about-friendly-urls-and-non-latin-characters/282855/3 "2023-10-20T03:58:44Z")

</div>

我不是 Ruby 代码编写者，但我阅读了文档并找到了这个：

> **[RubyDoc.info: 
      
  Method: I18n.transliterate
  
    – Documentation for...](https://www.rubydoc.info/gems/activesupport/2.3.17/I18n.transliterate)**
>
> Documenting RubyGems, Stdlib, and GitHub Projects

```plaintext
在 <locale>.yml 中设置 Hash：

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

```

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

---

<div class="post-metadata">

### Author: ![the220hq](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/the220hq/32/332255_2.png) [@the220hq](https://meta.discourse.org/u/the220hq)
#### Post date: [2023年十月20日 07:01 UTC](https://meta.discourse.org/t/about-friendly-urls-and-non-latin-characters/282855/4 "2023-10-20T07:01:44Z")

</div>

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

```plaintext
./launcher destroy app && ./launcher start app

```

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

---

<div class="post-metadata">

### Author: ![the220hq](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/the220hq/32/332255_2.png) [@the220hq](https://meta.discourse.org/u/the220hq)
#### Post date: [2023年十月20日 07:30 UTC](https://meta.discourse.org/t/about-friendly-urls-and-non-latin-characters/282855/5 "2023-10-20T07:30:07Z")

</div>

很抱歉我的打扰！

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

我在这里错在哪里了？非常感谢！

```plaintext
  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

```

---

<div class="post-metadata">

### Author: ![the220hq](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/the220hq/32/332255_2.png) [@the220hq](https://meta.discourse.org/u/the220hq)
#### Post date: [2023年十月22日 01:34 UTC](https://meta.discourse.org/t/about-friendly-urls-and-non-latin-characters/282855/6 "2023-10-22T01:34:28Z")

</div>

经过一番尝试，我发现：

- 切勿更改 ascii\_generator。这会导致 discourse 编译模板/主题/CSS 错误。
- 仅使用 encoded\_generator，并可能将其硬编码为你的区域设置，保持系统默认区域设置（英语）。
- 在 .yml 中添加 slug.rb 的更改代码，以便每次重建应用程序时都能自定义 slug.rb。

祝你有美好的一天！
