Home Rails Internationalization I18n 국제화설정
Post
Cancel

Rails Internationalization I18n 국제화설정

기본 개념

  • 영어 및 유사 언어에 대한 기본 지원 ko, en, jp, zh…etc
  • 다른 언어를 위한 쉬운 커스터마이징과 확장
  • Rails 프레임워크의 모든 정적 문자열이 국제화되어 있음

핵심 메서드:

  • translate (별칭: t) - 텍스트 번역 조회
  • localize (별칭: l) - 날짜와 시간 객체의 지화
  • 각국에 따른 URL 변경기능

Translate (t) 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
# config/locales/ko.yml
ko:
  hello: "안녕하세요"
  welcome_message: "환영합니다 %{name}님!"
  nav:
    home: "홈"
    about: "소개"

# 컨트롤러나 뷰에서 사용
I18n.t('hello')  # => "안녕하세요"
t('nav.home')    # => "홈"
t('welcome_message', name: '홍길동')  # => "환영합니다 홍길동님!"

Localize (l) 사용 예시

1
2
3
4
5
6
# 현재 시간 로컬라이즈
I18n.l(Time.now)  # => "2024년 11월 15일 22:00"

# 다양한 포맷 사용
I18n.l(Date.today, format: :short)  # => "11월 15일"
I18n.l(Date.today, format: :long)   # => "2024년 11월 15일 금요일"

커스텀 날짜 포맷 정의

1
2
3
4
5
6
# config/locales/ko.yml
ko:
  time:
    formats:
      custom: "%Y년 %m월 %d일 %H시 %M분"
# I18n.l(Time.now, format: :custom)  # => "2024년 11월 15일 22시 00분"

설정

1
2
3
# config/application.rb
config.i18n.{언어설정} += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
config.i18n.default_locale = :ko # 한글을 고정하겠다

번역은 YAML 또는 Ruby 파일에 저장되며, 기본적으로 config/locales 디렉토리에 위치한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# config/locales/en.yml
en:
  hello_world: 
  - Hello
  - world

# config/locales/ko.yml
ko:
  hello_world: 
  - 세상아
  - 안녕
# 리턴값은 배열의 형태이다.

# 단수 복수 설정가능
I18n.backend.store_translations :en, inbox: {
  zero: 'no messages',
  one: 'one message',
  other: '%{count} messages'
}
# I18n.t('inbox', count: 0)  # => "no messages"
# I18n.t('inbox', count: 1)  # => "one message"
# I18n.t('inbox', count: 2)  # => "2 messages"
# I18n.t('inbox', count: 23) # => "23 messages"

# 예시 호출함 I18n.t('common.welcome_html', username: '주인장')
common:
  welcome_html: "<b>Welcome %{username}!</b>"

View Helper 메서드

시간 관련:

1
2
3
4
5
6
7
8
9
10
11
12
# 시간 간격을 문자열로 표현
distance_of_time_in_words(Time.now, Time.now + 15.minutes)
# => "15분" (한국어)
# => "15 minutes" (영어)

# 날짜 선택 필드 생성
datetime_select("post", "published_at")
# => 번역된 월 이름으로 select 태그가 생성됨

# 월 선택 필드
select_month(Date.today)
# => 번역된 월 이름으로 select 태그가 생성됨

숫자 관련:

1
2
3
4
5
6
7
8
9
10
11
12
# 통화 형식
number_to_currency(1234.56)
# => "₩1,234.56" (한국어)
# => "$1,234.56" (영어)

# 정밀도가 있는 숫자
number_with_precision(1234.567, precision: 2)
# => "1,234.57"

# 퍼센트
number_to_percentage(65.43)
# => "65.43%"

Active Model 메서드

모델 및 속성 이름 번역:

1
2
3
4
5
6
7
8
9
10
11
12
13
# config/locales/ko.yml
ko:
  activerecord:
    models:
      user: "사용자"
    attributes:
      user:
        name: "이름"
        email: "이메일"

# 사용
User.model_name.human # => "사용자"
User.human_attribute_name('email') # => "이메일"

에러 메시지:

1
2
3
4
5
6
7
# 에러 메시지 생성
user.errors.generate_message(:email, :blank)
# => "이메일을 입력해주세요"

# 전체 에러 메시지
user.errors.full_messages
# => ["이메일을 입력해주세요"]

Active Support 메서드

배열을 문장으로:

1
2
3
4
5
6
7
8
9
10
# config/locales/ko.yml
ko:
  support:
    array:
      words_connector: ", "
      two_words_connector: "와(과) "
      last_word_connector: ", 그리고 "

['첫번째', '두번째', '세번째'].to_sentence
# => "첫번째, 두번째, 그리고 세번째"

이러한 헬퍼 메서드들은 Rails 애플리케이션에서 일관된 다국어 지원을 제공된다고하는데…가독성은 좋을지 몰라도 유지보수에는 좋은지는 모르겠다.

참고 레일즈 가이드 문서 6.0

This post is licensed under CC BY 4.0 by the author.