λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[μš©μ–΄] κ΅­μ œν™”(i18n)및 지역화(l19n)

좜처

ChatGPT


κ΅­μ œν™”(i18n)및 지역화(l19n)λŠ” μ†Œν”„νŠΈμ›¨μ–΄μ™€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ—μ„œ μ‚¬μš©μžμ™€ μ‹œμž₯에 맞좰 ν”„λ‘œκ·Έλž¨μ„ μ„€κ³„ν•˜κ³  λ°°ν¬ν•˜κΈ° μœ„ν•œ μ€‘μš”ν•œ κ°œλ…μ΄λ‹€. 이 두 μš©μ–΄λŠ” μ œν’ˆμ΄ λ‹€μ–‘ν•œ 언어와 λ¬Έν™”κΆŒμ— 맞좰질 수 μžˆλ„λ‘ ν•˜λŠ” 과정에 κ΄€λ ¨λ˜μ–΄ μžˆλ‹€. 

 

κ΅­μ œν™”(i18n) - Internationalization

μ •μ˜

κ΅­μ œν™”(i18n)λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ‚˜ μ›Ή μ• ν”Œλ§μΌ€μ΄μ…˜μ„ λ‹€μ–‘ν•œ 언어와 μ§€μ—­μ—μ„œ μ‚¬μš©λ  수 μžˆλ„λ‘ μ„€κ³„ν•˜κ³  μ€€λΉ„ν•˜λŠ” 과정이닀. "Internationalization"μ΄λΌλŠ” λ‹¨μ–΄μ—μ„œ 첫 κΈ€μž 'i'와 λ§ˆμ§€λ§‰ κΈ€μž 'n' 사이에 18개의 κΈ€μžκ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— i18nμ΄λΌλŠ” μ•½μ–΄λ‘œ λΆˆλ¦°λ‹€.

μ£Όμš” ν™œλ™

λ¬Έμžμ—΄ μΆ”μΆœ

λͺ¨λ“  μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI) λ¬Έμžμ—΄μ„ μ½”λ“œμ—μ„œ μΆ”μΆœν•˜κ³ , μ™ΈλΆ€ λ¦¬μ†ŒμŠ€ 파일둜 κ΄€λ¦¬ν•˜μ—¬ λ²ˆμ—­μ΄ μ‰½κ²Œ 이루어지도둝 ν•œλ‹€. 예λ₯Ό λ“€μ–΄, λ©”μ‹œμ§€ 파일, λ¦¬μ†ŒμŠ€ λ²ˆλ“€ λ“±μ˜ ν˜•μ‹μœΌλ‘œ λΆ„λ¦¬ν•œλ‹€.

언어와 λ‘œμΌ€μΌ μ„€μ •

λ‚ μ§œ, ,μ‹œκ°„, 숫자, 톡화 ν˜•μ‹ λ“± λ¬Έν™”μ μœΌλ‘œ λ―Όκ°ν•œ 데이터λ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•΄ λ‘œμΌ€μΌ 섀정을 μ§€μ›ν•œλ‹€.

μœ λ‹ˆμ½”λ“œ 지원

λ‹€μ–‘ν•œ μ–Έμ–΄μ˜ 문자λ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•΄ μœ λ‹ˆμ½”λ“œλ₯Ό μ‚¬μš©ν•΄ 문자 인코딩을 μΌκ΄€λ˜κ²Œ μœ μ§€ν•œλ‹€.

λ‹€κ΅­μ–΄ μž…λ ₯κ³Ό 좜λ ₯

λ‹€κ΅­μ–΄ μž…λ ₯을 μ²˜λ¦¬ν•˜κ³ , λ‹€μ–‘ν•œ μ–Έμ–΄λ‘œ 된 ν…μŠ€νŠΈλ₯Ό μ˜¬λ°”λ₯΄κ²Œ 좜λ ₯ν•  수 μžˆλ„λ‘ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•œλ‹€.

ν”Œλž«νΌ 독립성

ν”Œλž«νΌ 및 지역에 λ…λ¦½μ μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜μ—¬, λ‹€μ–‘ν•œ 운영 μ²΄μ œμ™€ λ¬Έν™”κΆŒμ—μ„œλ„ λ™μΌν•˜κ²Œ κΈ°λŠ₯ν•˜λ„λ‘ ν•œλ‹€.

 

μ˜ˆμ‹œ

  • λ‚ μ§œ ν˜•μ‹ μ„€μ • : λ―Έκ΅­μ—μ„œλŠ” 'MM/DD/YYYY', μ˜κ΅­μ—μ„œλŠ” 'DD/MM/YYYY' ν˜•μ‹μ„ μ‚¬μš©ν•œλ‹€.
  • 톡화 κΈ°ν˜Έμ™€ λ‹¨μœ„ μ„€μ • : 'USD', 'EUR', 'β‚©', '¥' λ“± λ‹€μ–‘ν•œ 톡화 기호λ₯Ό μ§€μ›ν•œλ‹€.

μ½”λ“œ μ˜ˆμ‹œ

Javaμ—μ„œ κ΅­μ œν™”λ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ 'ResourceBundle'을 μ‚¬μš©ν•  수 μžˆλ‹€.

 

Java μ½”λ“œ 예제

import java.util.Locale;
import java.util.ResourceBundle;

public class InternationalizationExample {
    public static void main(String[] args) {
        // λ‘œμΌ€μΌ μ„€μ •
        Locale usLocale = new Locale("en", "US");
        Locale krLocale = new Locale("ko", "KR");

        // λ¦¬μ†ŒμŠ€ λ²ˆλ“€ 뢈러였기
        ResourceBundle bundleUS = ResourceBundle.getBundle("Messages", usLocale);
        ResourceBundle bundleKR = ResourceBundle.getBundle("Messages", krLocale);

        // λ²ˆλ“€μ—μ„œ λ©”μ‹œμ§€ 좜λ ₯
        System.out.println("US: " + bundleUS.getString("greeting"));
        System.out.println("KR: " + bundleKR.getString("greeting"));
    }
}

 

λ¦¬μ†ŒμŠ€ λ²ˆλ“€ μ˜ˆμ‹œ

  • Message_en_US.properties
greeting=Hello
  • Message_ko_KR.propertes
greeting=μ•ˆλ…•ν•˜μ„Έμš”

 

좜λ ₯

US: Hello
KR: μ•ˆλ…•ν•˜μ„Έμš”

 

지역화(l10n) - Localization

μ •μ˜

지역화(l10n)λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ‚˜ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ νŠΉμ • μ§€μ—­μ΄λ‚˜ λ¬Έν™”κΆŒμ˜ μš”κ΅¬μ— 맞게 λ§žμΆ€ν™”ν•˜λŠ” 과정이닀. "Localication"μ΄λΌλŠ” λ‹¨μ–΄μ—μ„œ 첫 κΈ€μž 'l'κ³Ό λ§ˆμ§€λ§‰ κΈ€μž 'n' 사이에 10개의 κΈ€μžκ°€ 있기 λ•Œλ¬Έμ— l10nμ΄λΌλŠ” μ•½μ–΄λ‘œ λΆˆλ¦°λ‹€.

 

μ£Όμš” ν™œλ™

λ²ˆμ—­

UI, λ¬Έμ„œ, 도움말 λ“± λͺ¨λ“  ν…μŠ€νŠΈλ₯Ό νŠΉμ • μ–Έμ–΄λ‘œ λ²ˆμ—­ν•œλ‹€.

문화적 λ§₯락 적용

νŠΉμ • λ¬Έν™”κΆŒμ˜ μ‚¬μš©μžμ—κ²Œ 더 μΉœμˆ™ν•œ λ‚΄μš©μœΌλ‘œ λ³€κ²½ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 색상 μ˜λ―Έλ‚˜ 이미지가 ν•΄λ‹Ή λ¬Έν™”μ—μ„œ μ μ ˆν•œμ§€ κ²€ν† ν•œλ‹€.

포맷 μ‘°μ •

λ‚ μ§œ, μ‹œκ°„, 숫자, 톡화 λ“±μ˜ ν˜•μ‹μ„ ν•΄λ‹Ή λ¬Έν™”κΆŒμ— 맞게 μ‘°μ •ν•œλ‹€.

법적 μš”κ΅¬ 사항 반영

νŠΉμ • μ§€μ—­μ˜ 법적 μš”κ΅¬ 사항을 μ€€μˆ˜ν•΄ ν”„λ‘œκ·Έλž¨μ„ μ‘°μ •ν•œλ‹€.

μ‚¬μš©μž ν™˜κ²½ μ‘°μ„±

예λ₯Ό λ“€μ–΄, 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ μ½λŠ” μ–Έμ–΄μ˜ 경우 UIλ₯Ό 적절히 μ‘°μ •ν•œλ‹€.

 

μ˜ˆμ‹œ

ν•œκΈ€λ‘œ UI λ³€κ²½ : λͺ¨λ“  μΈν„°νŽ˜μ΄μŠ€ μš”μ†Œλ₯Ό ν•œκ΅­μ–΄λ‘œ λ²ˆμ—­ν•œλ‹€.

ν•œκ΅­ μ‚¬μš©μžμ—κ²Œ λ§žμΆ€ν™”λœ μ½˜ν…μΈ  제곡 : λ¬Έν™”μ μœΌλ‘œ κ΄€λ ¨ μžˆλŠ” μ΄λ―Έμ§€λ‚˜ ν…μŠ€νŠΈλ₯Ό ν‘œμ‹œν•œλ‹€.

 

μ½”λ“œ μ˜ˆμ‹œ

Java의 경우, 지역화λ₯Ό μœ„ν•΄ λ‹€λ₯Έ λ‘œμΌ€μΌμ— 맞좰 UIλ₯Ό λ²ˆμ—­ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•œλ‹€.

 

Javaμ½”λ“œ 예제

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class LocalizationExample {
    public static void main(String[] args) {
        // ν˜„μž¬ λ‚ μ§œ κ°€μ Έμ˜€κΈ°
        Date currentDate = new Date();

        // λ‘œμΌ€μΌ μ„€μ •
        Locale usLocale = new Locale("en", "US");
        Locale krLocale = new Locale("ko", "KR");

        // λ‚ μ§œ ν˜•μ‹ μ„€μ •
        DateFormat usDateFormat = DateFormat.getDateInstance(DateFormat.LONG, usLocale);
        DateFormat krDateFormat = DateFormat.getDateInstance(DateFormat.LONG, krLocale);

        // 좜λ ₯
        System.out.println("US: " + usDateFormat.format(currentDate));
        System.out.println("KR: " + krDateFormat.format(currentDate));
    }
}

 

좜λ ₯

US: July 26, 2024
KR: 2024λ…„ 7μ›” 26일

 

κ΅­μ œν™”(i18n)와 지역화(l10n)의 차이점

νŠΉμ§• κ΅­μ œν™” i18n 지역화 l10n
λͺ©μ  λ‹€μ–‘ν•œ μ–Έμ–΄ 및 λ¬Έν™” 지원을 μœ„ν•œ μ€€λΉ„ νŠΉμ • μ§€μ—­μ˜ 문화적, 언어적 μš”κ΅¬μ— 맞좰 μ†Œν”„μ›¨μ–΄ μ‘°μ •
μ£Όμš” ν™œλ™ μ†Œν”„νŠΈμ›¨μ–΄ ꡬ쑰 μ€€λΉ„, λ¦¬μ†ŒμŠ€ 뢄리, μœ λ‹ˆμ½”λ“œ 지원 λ²ˆμ—­, 포맷 μ‘°μ •, 법적 μš”κ΅¬ 반영
μ‹œμ  개발 초기 λ‹¨κ³„μ—μ„œ μˆ˜ν–‰ κ΅­μ œν™” 이후, μ‹œμž₯ λ˜λŠ” 고객 μš”κ΅¬μ— 맞좰 μˆ˜ν–‰
λŒ€μƒ 전체 μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œ νŠΉμ • 지역 λ˜λŠ” λ¬Έν™”
μ˜ˆμ‹œ λ‹€κ΅­μ–΄ λ¦¬μ†ŒμŠ€ 파일 관리, μœ λ‹ˆμ½”λ“œ μ‚¬μš© ν•œκ΅­μ–΄ λ²ˆμ—­, ν•œκΈ€ λ‚ μ§œ ν˜•μ‹ μ‚¬μš©

 

κ²°λ‘ 

κ΅­μ œν™”(i18n)와 지역화(l10n)λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κΈ€λ‘œλ²Œ μ‹œμž₯에 μ μ‘μ‹œν‚€κΈ° μœ„ν•œ 두 가지 μ€‘μš”ν•œ 과정이닀. κ΅­μ œν™”λŠ” μ‹œμŠ€ν…œμ„ λ‹€μ–‘ν•œ 언어와 λ¬Έν™”κΆŒμ— μ‰½κ²Œ 적응할 수 μžˆλ„λ‘ μ€€λΉ„ν•˜λŠ” 것이며, μ§€μ—­ν™”λŠ” νŠΉμ • μ‹œμž₯μ΄λ‚˜ μ§€μ—­μ˜ μš”κ΅¬μ— 맞좰 μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‹€μ œλ‘œ μ‘°μ •ν•˜λŠ” 것이닀. 두 κ°œλ… λͺ¨λ‘ μ‚¬μš©μžκ°€ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‚¬μš©ν•  λ•Œ μΉœμˆ™ν•˜κ³  효율적인 κ²½ν—˜μ„ μ œκ³΅ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•œλ‹€.