フレンドリーURLと非ラテン文字について

URLをエンコードしましたが、実際にはインターネットブラウザのアドレスバーでは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のコードライターではありませんが、ドキュメントを読んで、これを見つけました。

Setting a Hash in <locale>.yml:

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

したがって、これが設定で転写をカスタマイズする方法です。関数の最後に、ラテン文字のテキスト(フレンドリーなURL)のみを取得します。私の母国語で試しましたが、カスタムハッシュ設定を定義する必要はありませんでした。

コードの変更を維持する方法はありますか?なぜなら、もし私が以下を実行した場合:

./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 のみを使用し、必要であればロケールをハードコーディングしてください。システムのデフォルトロケール設定(英語)は維持してください。
  • slug.rb の変更コードを .yml に追加して、アプリを再構築するたびに slug.rb をカスタマイズできるようにしてください。

良い一日を!