친화적 URL과 비라틴 문자에 대해

인코딩을 시도해 보았지만, 실제로는 인터넷 브라우저 주소창에서 URL이 잘 보입니다. 다만, 복사하거나 전송할 경우 실제 URL은 이스케이프 문자열이 되어 더 이상 보기 좋지가 않습니다.

lib/slug.rb 파일을 확인해 보았으며, encoded_generator 함수를 다음과 같이 수정하는 것을 제안합니다:

  def self.encoded_generator(string, downcase: true)
    # This generator will sanitize almost all special characters,
    # including reserved characters from RFC3986.
    # See also 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"

따라서 설정을 통해 음절 변환(transliterate)을 커스터마이즈하는 방법은 이것입니다. 함수의 마지막에 라틴 문자(친화적 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만 사용하고, 필요하면 로케일에 하드코딩하세요. 시스템 기본 로케일 설정(영어)은 그대로 유지하세요.
  • slug.rb의 변경된 코드를 .yml 파일에 추가하여, 앱을 다시 빌드할 때마다 사용자 정의 slug.rb가 유지되도록 하세요.

좋은 하루 보내세요!