13장 국제화

Jasik·2021년 12월 14일
0

로케일

로케일(locale)은 언어와 사용자의 위치를 명시하여 서식 지정자(formatter)가 사용자 프레퍼런스를 고려할 수 있게 해준다.

로케일 지정하기

구성요소 5가지

  • 언어 ex) en, de
  • 스크립트 ex) Latn, Cyrl
  • 국가 혹은 지역 ex) US, CH
  • 변형
  • 확장

로케일은 로케일 요소를 하이픈으로 연결한 문자열 태그로 나타낸다.
ex) en-US

Locale usEnglish = Locale.forLanguageTag("en-US");

Locale.CANADA
LOCALE.CANADA_FRENCH
Locale.KOREA
...

기본 로케일 가져오기

Locale displayLocale = Locale/getDefault(Locale.Category.DISPLAY);

가상 머신 기본 로케일 변경하기

Locale.setDefault(newLocale);
Locale.setDefault(category, newLocale);

숫자 형식

java.text.NumberFormat
getNumberInstance, getCurrencyInstance, getPercentInstance
팩토리 메서드 제공.
숫자의 서식을 지정하고 파싱할 수 있는 서식 지정자를 만들어냄.

Locale loc = Locale.KOREA;
NumberFormat formatter = NumberFormat.getCurrencyInstance(loc);
double amt = 123456.78;
String result = formatter.format(amt);

₩123,457

String input = "100,000\\";
NumberFormat formatter = NumberFormat.getNumberInstance();
Number parsed = formatter.parse(input);
double result = parsed.doubleValue();
System.out.println(result);

100000.0

통화

NumberFormat.getCurrencyInstance()

NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.US);
formatter.setCurrency(Currency.getInstance("EUR"));
System.out.println(formatter.format(20.000));

€20.00

날짜와 시간 서식 지정

FormatStyle style = FormatStyle.FULL;
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(style);
System.out.println(dateTimeFormatter.format(zonedDateTimeInstance));

Tuesday, December 14, 2021 at 9:39:28 PM Korean Standard Time

FormatStyle style = FormatStyle.FULL;
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofLocalizedDateTime(style).withLocale(Locale.GERMANY);;
System.out.println(dateTimeFormatter.format(zonedDateTimeInstance));

Dienstag, 14. Dezember 2021 um 21:47:07 Koreanische Normalzeit

컬레이션과 정규화

단어들의 배열을 사전순으로 정렬할 때 국가별로 원하는 순서가 다를 수 있다.

List<String> words = ...;
Collator collator = Collator.getInstance(Locale.US);
words.sort(collator);

메시지 서식 지정

String message = MessageFormat.format("{0} has {1} messages", "Pierre", 42);

Pierre has 42 messages

리소스 번들

메시지 문자열, 버튼 레이블, 그 외 번역이 필요한 텍스트를 분리하는게 좋다. 이런 텍스트를 리소스 번들(resource bundle)에 넣을 수 있다.

리소스 번들 구성하기

프로퍼티 파일은 키/값 쌍을 담고 확장자가 .properties 인 텍스트 파일.
ex) messages_de_DE.properties

computeButton=Rechnen
cancelButton=A2bbrechen
defaultPaperSize=A4
ResourceBundle res = ResourceBundle.getBundle(번들명);
ResourceBundle res = ResourceBundle.getBundle(번들명, locale);
profile
가자~

0개의 댓글