숫자를 올바르게 지역화하는 방법은 무엇입니까?


38

프론트 엔드 응용 프로그램에서 숫자를 지역화 할 때 어떤주의 사항을 알아야합니까?

예 : 브라질 포르투갈어 (pt-BR)에서는 점과 소수점으로 수천을 쉼표로 나눕니다. 미국 영어 (en-US)에서는 그 반대입니다. pt-BR에서는 en-US와 같은 숫자를 천 단위로 구분하여 표시합니다. 그러나 오늘 인도 영어 (en-IN)에 대해 읽으면이 보석을 발견했습니다.

숫자 그룹화에는 인도 번호 체계가 선호됩니다. 말로 쓰거나 말할 때 100,000 / 100 000 미만의 숫자는 표준 영어와 같이 표현됩니다. 100,000 / 100 000을 포함하여 10을 초과하는 숫자는 인도 번호 체계의 하위 집합으로 표현됩니다.

https://ko.wikipedia.org/wiki/Indian_English#Numbering_system

다음을 의미합니다.

1000000 units in pt-BR are formatted 1.000.000
1000000 units in en-US are formatted 1,000,000
1000000 units in en-IN are formatted 10,00,000

쉼표와 점 및 기타 특정 구분 기호 외에도 마스킹도 유효한 문제인 것 같습니다.

프론트 엔드 애플리케이션에서 숫자를 현지화 할 때 알아야 할 다른 경고 사항은 무엇입니까? 특히 비 라틴 문자 세트에 숫자를 표시하는 경우?


3
돈을 다룰 때 더 재미있어집니다! :-)
Stephan Bijzitter 2016

4
기본 6 (두 손가락 3 배)을 가진 화성 번호 시스템에 대해서는 이야기하지 않습니다. ;-) 그러나 일본어도 이상합니다 : man = 10.000은 1.0000으로, oku = 100.000.000은 일본에서 1.0000.0000으로 그리고 chō입니다. .. guess
qwerty_so

6
당신은 이것에 대해 걱정할 필요가? OS 설정을 따를 수 없습니까?
Jan Doggen

3
@JanDoggen은 소프트웨어 엔지니어링 도메인의 흥미로운 문제 중 하나 인 "사람에게 데이터를 올바르게 표시하는 방법"이기 때문입니다. 시스템을 설계 할 때 걱정해야 할 것은이 질문의 영역입니다. 그리고 우리 친구 스테판이 말했듯이 돈에 대해서도 이야기하고 있지 않습니다. 그냥 숫자입니다.
Machado

5
@ JanDoggen, 이것은 온라인 소프트웨어를 다룰 때 훨씬 더 복잡해집니다. 사용자는 미국 영어 컴퓨터에서 인도에 있지만 브라질 포르투갈어로 웹 페이지를 읽을 수 있습니다. 서버가 중국어 일 수 있습니다. 앱은 사용중인 OS 또는 서버 위치에 관계없이 사용자가 원하는 것을 이해해야합니다. 따라서 1,000.00 달러는 67.545,00 루피가됩니다. 미국 통화는 현지 환율로 변환되지만 포르투갈어 형식으로 표시됩니다.
noderman

답변:


87

대부분의 프로그래밍 언어와 프레임 워크에는 이미 사용할 수있는 합리적인 작동 메커니즘이 있습니다.

예를 들어, C # 에코 시스템에는 원하는 System.Globalization 네임 스페이스가 있으므로 Culture원하는 것을 지정할 수 있습니다 .

Console.WriteLine(myMoneyValue.ToString("C", "en-US"));

이것은 당신이 다시 발명하고 싶은 것이 아닙니다. 자주 사용하는 언어 또는 프레임 워크에서 제공하는 국제화 기능을 사용하십시오.


2
나는 이러한 종류의 복잡성을 처리하는 System.Globalization 및 기타 프레임 워크를 알고 있습니다. 내가 모르는 것은 그들이 해결하고있는 문제입니다. 예를 들어 .ToString ( "#, ## 0.00", locale)과 같이 ToString에서 특정 마스킹을 사용하는 여러 응용 프로그램이 있지만이 번호를 인도 사람에게 표시하면 해당 마스크 당 se가 유효하지 않습니다. 따라서 "특정 마스크를 사용하지 마십시오"외에 다른 무엇을 알고 있어야합니까?
Machado

7
내가 아는 것은 없습니다. 프레임 워크를 올바르게 사용하면 제대로 작동합니다. 국제화 문제에 대한 특정한 경우가 있지만 포괄적 인 목록을 작성하는 것은 여기서 우리가하는 것이 아닙니다. 이 예제를 참조하십시오 .
Robert Harvey

5
이것이 정답입니다 : 로케일을 설정 한 다음 사용자에게 표시하기 전에 i18n 레이어를 통해 값을 푸시하고 프레임 워크 작성자가 처리하도록하십시오. 숫자, 통화 값, 번역 된 문자열, 날짜 및 모든 항목에 해당됩니다.

2
완벽한 답변. "바퀴를 재발 명하지 마십시오"는 이와 같은 일반적인 문제를 처리 할 때 항상 고려해야 할 사항입니다. 한 번 이상 공표 할 수없는 것은 유감입니다.
BgrWorker

3
@Machado "예를 들어, 여러 응용 프로그램에서 .ToString ("#, ## 0.00 ", locale)과 같이 ToString에서 특정 마스킹을 사용하지만이 번호를 인도인에게 표시하면 해당 마스크 당 유효하지 않습니다. " -명확하지는 않지만 ,형식 문자열 의 위치 는 크게 관련이 없으며 "#, 0.00"은 동일한 효과를 나타냅니다. ,단순히 "로케일로 지정된 방식으로 숫자 그룹 구분 기호 사용"을 의미합니다.
hvd

23

여기에 몇 가지 훌륭한 답변이 있지만 잊어 버리지 않는 것이 중요하다고 생각하는 한 가지 언급하지 않았습니다. 숫자 서식이 발생하는 곳마다 출력이 사용되는 것이 분명하거나 제어 할 수 있는지 확인하십시오.

  • 사용자 인터페이스 용인 경우 현지화 된 형식을 적용해야합니다.

  • 번호가 파일에 쓰거나 네트워크를 통해 전송 될 때 또는 번호가 기계 판독 가능 형식으로 필요한 다른 형식으로 전송 될 때 현재 문화권에 따라 형식이 지정 되지 않고 고정 된 설정에 따라 형식이 지정 되었는지 확인하십시오 예를 들어 .NET 환경에서는을 사용 InvariantCulture하십시오.

그렇지 않으면 문화권 A를 사용하여 숫자를 쓰거나 보낼 때 문화권 B를 사용하여 읽거나받을 때 문제가 발생합니다.

내 경험상 이것은 숫자의 적절한 지역화를 수행하는 데 가장 큰 장애물 중 하나입니다. 숫자 서식 및 변환을 중앙 집중화하려는 시도에서 사람들은 서식에 대해 일반적이고 재사용 가능한 기능을 만들기 시작한 다음 전체에서 사용하기 시작합니다. 장소. 그러나 프로그램의 다른 곳에서 기계가 읽을 수있는 문자열 형식으로 숫자를 필요로하는 즉시 현지화 된 형식과 현지화되지 않은 형식의 두 가지 변형이 필요합니다. 이로 인해 두 가지 형식의 변환이 혼동 될 위험이 높습니다 (특히 개발자와 테스트 머신에 UI가 아닌 형식에 사용되는 "고정"설정과 유사한 기본 로케일 설정이 있지만 사용자 기반의 일부는 그렇지 않은 경우).

부록 :이 문제는 번호가 기계 나 사람 (또는 둘 다)에 의해 처리 될 것인지 사전에 명확하지 않은 상황에서 실제로 불쾌해질 수 있습니다. 예를 들어, 로그 파일 출력의 일부로. 이 경우 점을 소수점 구분 기호로 사용하지 않고 구분 기호를 사용하지 않는 "중립"표준을 따르는 것이 가장 좋습니다.


2
그리고 현대의 많은 그림 언어는 표준 라이브러리의 명백한 / 기본 기능이 "현지화되어"있습니다. 따라서 개발자가 현지화에 대해 알지 못하거나 신경 쓰지 않으면 결과적으로 응용 프로그램이 외부 시스템에서 추악한 것보다는 작동하지 않을 수 있습니다.
Peter Green

4
나도 똑같이 나쁘다. UI에서 로컬 숫자 규칙을 따르지 않는 도구는 계속 사용할 수 있습니다. 숫자 규칙 불일치로 인해 자체 데이터 파일을 읽지 못하거나 서버와 통신하지 못하는 도구는 사용할 수 없을 가능성이 훨씬 높습니다.
Peter Green

5
이에 대한 일화 : en-ZA의 소수점 구분 기호는 Win 7과 Win 8 사이에서 변경되었습니다. 이전에 로컬로 저장된 값은 직렬화 해제에 실패했습니다
Caleth

1
@PeterGreen : UI에서 로컬 숫자 규칙을 따르지 않는 도구 여전히 사용 가능하거나 특정 사용 사례에서 완전히 사용 불가능할 있습니다. 나는 그런 가정을 할 때 매우 조심해야합니다. 많은 개발자들이 숫자의 지역화를 잘못하는 이유는 바로 이런 종류의 가정입니다.
Doc Brown

1
@DocBrown 표준 라이브러리의 지역화 된 정수 / 부동 구문 분석 루틴으로 인해 유지되는 가장 끔찍한 레거시 코드가 있습니다. 이러한 작업의 기본 루틴이 현지화되지 않은 경우 현지화를 신경 쓰지 않고 작성된 프로그램 은 일부 상황에서 사용할 없을 수도 있지만 기본 루틴이 현지화 된 경우 프로그램 은 항상 중단됩니다. 전역 로캘이 영어가 아닌 컴퓨터에서 실행됩니다.
Sebastian Redl

9

적절한 현지화는 매우 어렵습니다. 대부분의 프로그래밍 생태계는 현지화를위한 솔루션을 시도하지만 제 경험상 그것들은 다소 손상되었습니다. 그러므로 나는 제안 할 것이다 :

  • 현지화를 자동화하지 마십시오. 항상 작동하지는 않습니다. 문제를 파악하고 사용자를 실망시키는 것은 어렵습니다.

  • 일관성 유지 : 영어 텍스트의 브라질 식 소수 구분 기호와 같이 다른 언어와 서식 규칙을 혼용하지 마십시오.

  • 지정된 로케일 세트를 명시 적으로 지원합니다. 번역자와 협력하여 날짜와 숫자의 형식을 알아냅니다. 대부분의 문제는 기존 라이브러리에 위임 할 수 있지만 자체 지역화 툴킷을 만들 수도 있습니다.

  • 날짜 및 시간 형식, 소수점 구분 기호, 기본 통화,… 등 각 사용자가 구성 할 수있는 간단한 형식을 선택하십시오. 이는 언어, 언어와 독립적으로 여러 지역 또는 문화를 혼합해야하는 여행자, 국외 거주자 또는 기타 사람들에게 특히 유용합니다.


18
또한 많은 수의 사용자가 "로케일에 맞는"규칙으로 간주되는 규칙을 싫어 하고, 끔찍한 레거시 관행으로 간주하고, 전혀 그룹화하거나 다른 종류의 그룹화를 원하지 않습니다. 따라서 전원을 끄거나 수동으로 재정의하는 옵션이있을 수 있습니다.
R ..

2

중요한 고려 사항 : 충분한 양을 결정해야합니다. 완벽하게 현지화하려는 토끼 구멍을 내려 가면 점점 복잡해지기 때문입니다.

"n 개의 항목을 선택했습니다"와 같은 일반적인 레이블을 사용하십시오. 하나의 항목 만 선택한 경우 잘못 읽습니다. 추악하지만 실용적인 해결책은 "n 개의 항목을 선택했습니다."라고 쓰는 것입니다. 그러나 올바르게 수행하려면 n에 따라 두 가지 다른 텍스트가 필요합니다. 여러 로케일에서이 작업을 시도하면 언어마다 문법이 다르기 때문에 매우 복잡해집니다. 일부 언어의 경우 하나, 둘 및 여러 항목에 대해 서로 다른 활용이 있습니다. 이러한 이유로, 알고있는 사람들은 항상 기존 지역화 프레임 워크가 충분하지 않다고 불평 할 것입니다.

그러나 전투를 선택하고 어느 수준의 정교함이 충분한지를 결정해야합니다. 많은 목적을 위해 숫자와 날짜를 형식화하기위한 표준 지역화 라이브러리로 충분해야합니다.


이것은 ICU (MessageFormat)에 의해 해결됩니다. 단점은 많은 언어에서 ICU 채택이 여전히 약하다는 것입니다. 그러나 개발자는 여전히 올바른 방식으로 메시지를 구성해야합니다. 실제로 엔지니어링 측면 이상입니다. userguide.icu-project.org/formatparse/messages
noderman

이것은 GNU gettext에서 더 널리 사용되는 ngettext 함수로 해결되지만 MessageFormat 클래스는 ngettext가 아닌 몇 가지 추가 문제를 해결하는 것으로 보입니다.
hvd

2

언어의 모든 경고를 알 수는 없습니다. 당신은 숫자에 대해 이야기하고 있지만, 복수, 성별, 데이터 정렬이 있습니다. 이들이 존재하고 다른 사람들, 특히 ICU 및 CLDR 프로젝트가 수행 한 광범위한 작업에 의존하고 있음을 알아야합니다.

대부분의 현대 언어는 이러한 프로젝트의 일부 또는 모든 기능을 구현하지만 그렇지 않은 경우에도이 프로젝트에 대해 읽으면 무엇을 찾아야할지에 대한 좋은 아이디어를 얻을 수 있습니다.

http://site.icu-project.org

http://cldr.unicode.org

최신 정보

CLDR 측량 도구는 모든 패턴에 대한 액세스를 제공합니다. 특정 언어 및 지역에서 숫자를 형식화하는 방법을 보여줍니다. 예를 들어 포르투갈어 (포르투갈) :

http://st.unicode.org/cldr-apps/v#/pt_PT/Number_Formatting_Patterns/

모든 데이터를 확인하고 사용하려면 GitHub에서 CLDR을 JSON 형식으로 다운로드하십시오.

https://github.com/unicode-cldr/cldr-json#cldr-json

다운로드에 대한 자세한 정보는 여기 :

http://cldr.unicode.org/index/downloads


의견을 보내 주셔서 감사하지만 지금은 대부분 숫자에 관심이 있습니다. :)
Machado

확실한. 방금 조사 범위를 좁힐 수있는 설문 조사 도구에 대한 링크를 포함하도록 응답을 편집했습니다.
noderman

차이점을 확인하기 위해 브라질을 변경하려고했지만 시각화를 활성화하지 않는 것 같습니다 : st.unicode.org/cldr-apps/v#/pt_BR/Number_Formatting_Patterns 그렇지 않으면 도구가 꽤 좋아 보입니다.
Machado

브라질이 모국어이기 때문입니다. 측량 도구는 실제로 CLDR 데이터를 변경하는 데 사용되므로 루트에는 특수 계정이 필요합니다. GitHub로 가서 모든 정보를 직접 얻을 수 있습니다 : github.com/unicode-cldr/cldr-numbers-modern/tree/master/main 구체적으로 브라질은 여기 있습니다 : github.com/unicode-cldr/cldr-numbers-modern/ blob / master / main / pt /…
noderman

0

글쎄, 여기에있는 모든 답변에 만족하지만 실제로는 하나 하나를 정답으로 표시하기 위해 각 답변에 개별적으로 만족하지 않습니다.

지금까지 숫자를 지역화 할 때 알아야 할 사항은 다음과 같습니다.

인간을 위해 :

  • 수천 개의 구분 기호가 항상 수천으로 분리되는 것은 아닙니다. 문제의 인도 사례를 참조하십시오.
  • 천과 소수는 문화에 따라 문화가 다릅니다. 예를 들어, 독일어에서는 공백을 사용하여 수천 개가 나뉘어져 있습니다. 영어에서는 쉼표이고 포르투갈어에서는 점입니다.
  • 왼쪽에서 오른쪽으로, 오른쪽에서 왼쪽으로 쓰는 언어가 서로 다른 경우에는 정보가 없습니다.
  • 지원되는 특정 현지화 세트를 제공하고 사용자에게 명확하게하십시오.
  • 사용자가 기본 현지화를 지원되는 현지화 중 하나로 변경할 수 있도록 허용하면 관대하고 신이 많기 때문에 기쁘고 감사하게 케이크를 보낼 수 있습니다. :);

컴퓨터의 경우 :

  • 머신은 관대하지 않으며 숫자를 직렬화 및 직렬화 해제하는 동안 항상 동일한 형식을 수신해야합니다.
  • 단일 형식을 고수하십시오.
  • 가능한 최소 형식을 사용하십시오. 수천 개의 분리를 피하십시오. 10 진수는 직렬화 및 역 직렬화에 충분해야합니다.

개발자 :

  • (아래 @hyde에서 제안한대로) : 현지화를 위해 기존 라이브러리를 사용하십시오.
  • 가능하면 기본 테스터를 사용하고 현지화 / 국제화 테스트 사례를 지정하고 그렇지 않으면 라이브러리를 신뢰하십시오.
  • 현지화는 대부분 해결되는 문제입니다. 모든 주요 언어에는 숫자, 날짜 및 시간을 현지화 할 수있는 기본 또는 외부 라이브러리가 있습니다.

1
누락 된 항목 : 개발자의 경우 현지화에 기존 라이브러리를 사용하십시오. 가능하면 기본 테스터를 사용하고 현지화 / 국제화 테스트 사례를 지정하고 그렇지 않으면 라이브러리를 신뢰하십시오.
hyde dec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.