본문 바로가기
테크 세미나/개발 Nous

ruby on rails 언어별 url 설정 방법

by Junmannn 2024. 5. 29.
반응형

내가 운영중인 혹은 제작중인 사이트가 다국어를 지원해야하는 상황이 오게 된다면 우리는 i18n 을 사용하게 될 때가 있습니다

 

i18n이란 internationalization(국제화) 라는 단어를 축약한 것입니다. i부터 n까지 18개의 문자수를 축약해서 i18n으로 나타냅니다. 국제화는 다양한 언어 및 지역에 적용할 수 있도록 프로그램을 설계하는 프로세스이죠.

 

 

rails 에서 i18n 설정하는 방법

https://guides.rubyonrails.org/i18n.html

 

Rails Internationalization (I18n) API — Ruby on Rails Guides

Rails Internationalization (I18n) APIThe Ruby I18n (shorthand for internationalization) gem which is shipped with Ruby on Rails (starting from Rails 2.2) provides an easy-to-use and extensible framework for translating your application to a single custom l

guides.rubyonrails.org

위는 rails 에서 i18n 을 하는 방법에 대해 안내한 공식 문서입니다

 

 

위의 공식 문서를 보고 코드를 작성하신 후, 아래의 내용을 추가할 시 기본적인 언어 세팅, 

 

 

application_controller.rb 기본 언어 세팅

application_controller (어플리케이션 로드시 실행되는 컨트롤러) 에서 언어를 설정해줍니다

저의 경우 def set_locale 이라는 I18n.locale 에 언어값을 저장하는 함수를 작성했습니다.

 

 

def set_locale 의 내용

1) 로그인 한 상태라면 DB 에 저장된 언어값으로 세팅

2) 로그인 하지 않았다면 Geocoder 를 사용해 현재 위치를 가져와 해당하는 언어로 세팅

3) 로그인 하지 않았다면 수동으로 설정가능하게 하고, 설정하는 경우 쿠키에 저장해서 사용 (1주일 만료짜리)

4) 로그인을 한다면 2 나 3 의 값을 User 테이블에 저장.

 

제한적인 언어 수용. 모든 언어를 처리하지는 않을 것이기 때문에 저는 4가지의 언어만 허용했습니다

def set_locale
    if (cookies[:locale] == "en") || (cookies[:locale] == "kr" || cookies[:locale] == "ja") || (cookies[:locale] == "cn")
        I18n.locale = cookies[:locale]
        puts I18n.locale
    else
        ###설정하는 코드들, Geocoder 로드하는 코드 : 개인마다 다릅니다###
        location = Geocoder.search(ip).first


        if location.present?
            if location.country == 'KR'
                # 한국에서 접속한 경우 한국어로 설정
                I18n.locale = "kr"
            elsif location.country == 'JP'
                # 한국에서 접속한 경우 한국어로 설정
                I18n.locale = "ja"
             elsif location.country == 'CN'
                  # 한국에서 접속한 경우 한국어로 설정
                 I18n.locale = "cn"
             else
                  I18n.locale = "en"
             end
        else
             # 기본 로케일 설정 (예: 영어)
             I18n.locale = "en"
         end
    end
end

 

 

그리고 해당 설정은 , 항상 먼저 실행되도록 합니다

 

class ApplicationController < ActionController::Base
 
    before_action :set_locale

 

해당 언어들만 허가하겠다는 코드를 application.rb 에도 추가를 해줍니다

 

module Kyurasi
    class Application < Rails::Application
        config.active_record.default_timezone = :utc
        config.eager_load_paths << Rails.root.join("app/services")

        # 허용을 할 언어셋들을 지정
        config.i18n.available_locales = [:en, :kr, :ja, :cn]
        config.i18n.default_locale = :en
        Dotenv.load
        config.action_controller.default_url_options = {
            locale: I18n.default_locale
        }
    end
end
 

en, kr, ja, cn 을 허용하되, default 는 en 으로 두는 설정입니다

 

언어셋 처리는
config/locale 폴더에 kr.yml, en.yml, cn.yml, ja.yml 파일을 생성 후

kr:
  date:
    home:
      swiper_under_banner_button: "자세히 보기"

 

이와 같이 만들면 됩니다. 해당 포스팅은 파일셋을 만드는 내용에 대한 포스팅이 아니므로, 글 초반에 언급한 rails i18n 가이드를 참고해주시기 바랍니다


url 에 언어를 나타내는 방법

application_controller.rb 기본 언어로 url 세팅

def redirect_if_locale_missing
    excluded_paths = [
       '/kyurasi/editType/',
        '/kyurasi/editSeed/'
    ]

    if request.get? && params[:locale].blank? && !excluded_paths.any? { |path| request.path.start_with?(path) }
        redirect_to url_for(params.permit!.merge(locale: I18n.locale))
    end
end

 

1. excluded_paths 를 설정한 이유

: modal(팝업)을 열거나, 부분적인 component 로 화면을 열 시에는 라우팅에 locale 이 들어갈 필요가 없기 때문이죠. 이미 페이지 상에서 url 에 locale 이 있고, 페이지 내의 component 에서 는 get 을 할 뿐, locale 이 포함된 routing 이 필요한게 아니기 때문이죠

 

2.   if request.get? && params[:locale].blank? && !excluded_paths.any? { |path| request.path.start_with?(path) }   의 조건을 건 이유

: 요청이 post 인 경우에 요청 url 에 locale 을 포함을 해야 할 이유는 전혀 없죠. 따라서 요청 url 이 get 인 경우에만, 그리고 excluded_paths 가 아닌 경우에만 실행하게 했습니다

 

이 부분도 먼저 실행이 되어야겠죠?

 

class ApplicationController < ActionController::Base
 
    before_action :set_locale
    before_action :redirect_if_locale_missing

 

 

전체적인 url 이 바뀌었으니 SEO 설정도 바꾸셔야 합니다. 아래의 포스팅을 참고해주세욤

 

https://kyurasi.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EA%B0%84%EB%8B%A8%ED%95%9C-SEO-%EC%84%A4%EC%A0%95-robotstxt-sitemap

 

개발자가 할 수 있는 간단한 SEO 설정 - robots.txt, sitemap

robots.txt 파일은 웹사이트의 루트 디렉터리에 위치한 텍스트 파일로, 검색 엔진 크롤러(로봇)에게 어떤 페이지나 파일을 크롤링할 수 있는지 또는 크롤링해서는 안 되는지에 대한 지침을 제공합

kyurasi.tistory.com

 

반응형