로케일(locale)은 언어와 사용자의 위치를 명시하여 서식 지정자(formatter)가 사용자 프레퍼런스를 고려할 수 있게 해준다.
구성요소 5가지
로케일은 로케일 요소를 하이픈으로 연결한 문자열 태그로 나타낸다.
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);