최고 기록을 관행을 위한 지역화된 텍스트에서는 C++크로스-플랫폼 응용 프로그램은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/403747

  •  03-07-2019
  •  | 
  •  

문제

현재 C++표준(C++03),재미있는 사양에 대한 텍스트 현지화와는 C++개발자의 삶을 어렵게 평소보다 작업을 할 때 지역화된 텍스트(확실하게 C++0x 표준이 여기에 도움이 될 것입 후에).

가정하면 다음과 같은 시나리오(에서 실시 PC-Mac 게임 개발의 경우):

  1. 반응성(실시간)응용 프로그램:응용 프로그램를 최소화할 수 있도 응답 시간은"눈에 띄지 않습니다",그렇게 속도 실행은 중요합니다.
  2. 지역화된 텍스트:표시된 텍스트가 현지화에서 두 개 이상의 언어로,잠재적으로 더 기대하지 않는 고정 숫자의 언어를 쉽게 확장할 수 있습니다.
  3. 언어에서 정의된 런타임:텍스트 안에서 컴파일 응용 프로그램(도는 당 하나의 응용 프로그램용어),당신이 선택한 언어로 정보에는 응용 프로그램 실행-의미하는 몇 가지 종류의 텍스트니다.
  4. 크로스-플랫폼:응용 프로그램의 코드와 플랫폼에서 마음(Windows-Linux/Ubuntu-Mac OSX)그래서 지역화된 텍스트 시스템이 있을 수 크로스 플랫폼을 너무입니다.
  5. 독립 실행형 응용 프로그램:응용 프로그램 제공에 필요한 모든 그것을 실행;그것은 사용하지 않는 모든 환경관 또는 사용자가 설치하는 것이 아닌 OS(좋아 대부분의 게임에 대한 예).

가장 좋은 방법은 무엇을 관리하는 지역화된 텍스트에서는 C++에서 이러한 종류의 응용 프로그램?

동물이 어미가 총을 맞았기 때문에 왔 이는 지난해에는 유일한 것 나의는 당신이 사용해야 한다 std::wstringstd::basic_string<ABigEnoughType> 를 조작하는 텍스트에서는 응용 프로그램.내연구었기 때문에 작업에 더 많은"텍스트 표시"제(의 경우에 실시간 3D),그러나 나는 거기에 몇 가지 모범 사례 관리 지역화된 텍스트에서 원료 C++넘어는"유니코드를 사용하".

그래서,모든 최고의 모범 사례,제안과 정보를(크로스-플랫폼 어렵 나는 생각한다)을 환영합니다!

도움이 되었습니까?

해결책

에서 작은 비디오 게임 회사,검은 랜턴 스튜디오,나는 리드한 개발자라는 게임 리오넬 열차 DS.우리는 지역화된 영어,스페인어,프랑스어,독일어로 표시됩니다.우리가 알고 있는 모든 언어의 앞에,그래서 그들을 포함하여 컴파일 시간 유일한 선택이었다.(그들은 불을 ROM,당신이 볼 수)

나에 관한 정보를 제공할 수 있습의 어떤 것들을 우리는 않았다.우리의 문자열로드 배열로 시작할 때 기반으로 언어를 선택합니다.각 언어 갔으로 별도의 파일과 문자열을 모두 같은 순서입니다.문자열을 1 항상 게임의 제목,문자열을 2 항상 처음 메뉴 옵션을니다.우리는 잠긴 배열의 enum, 로 integer 인덱싱이 매우 빠르고,그리고 게임에서,속도 모든 것입니다.(솔루션 연결 중 하나에서 다른 답변을 사용하는 string 조회는 것을 피하는 경향이있다.) 를 표시할 때 문자열을,우리가 사용 printf() 입력 기능을 대체하는 마커를 가진 값입니다."훈련 3 항도시 1."

지금의 일부는 함정이 있습니다.

1)사이의 언어,문구를 위해 완전히 다른 것입니다."훈련 3 항도시 1."독일어와 다시 인 끝"도시에서 1,Train3 항".를 사용하는 경우 같은 뭔가 printf() 과 당신의 문자열입니다"기차%d 항 시%d."독일의 끝날 것이 말하는"도시에서 3 개,기차 1 입니다."는 완전히 잘못입니다.우리는 이것을 해결하도록 하여 번역을 유지하는 동일한 단어 순서지만,결국 우리와 함께 몇 가지 꽤 끊긴 독일어.나는 그것을 반드시 함수를 작성하는 문자열로-기반으로 배열의 값을 넣습니다.그때 나는 마커를 사용하여 다음과 같 %0%1, 기본적으로 포함시키는 배열 색인으로 문자열입니다. 업데이트:@조나단 Leffler 는 POSIX 호환 printf() 을 사용하여 지원합 %2$s 형 마커치 2$ 부분에 지시합 printf() 을 채우는 마커를 가진 두 번째 매개 변수입니다.는 것이 매우 편리,그래서 그것은 충분히 빠르다.사용자 지정 솔루션을 수 있습니다 여전히 빨리,그래서 당신이 원하는지 확인하고 테스트니다.

2)언어 크게 다릅니다.무엇이었는 캐릭터 30 영어에서 나왔을 때로는 만큼 110 문자는 독일입니다.이 의미는 그것은 종종 맞지 않을 것이라고 화면의 우리에 넣어.이것은 아마도 미만의 문제한 게임을,하지만 당신은 어떤 작업을 수행 하는 텍스트를 적응해야에서 정의한 상자를 원할 것입니다 이것을 고려하십시오.이 문제를 해결하기 위해,우리가 벗으로 많은 형용사에서는 우리의 텍스트에 대한 가능한 한 다른 언어가 있습니다.이 단축되는 문장이나 보존되는 의미를,잃어버린 경우 조금의 맛이다.나중에 응용 프로그램을 설계할 수 있는 우리가 사용하는 것을 포함하는 글꼴 및 크기와 수 있는 번역가 자신의 수정을 얻을 텍스트에 적합합니다.가 확실하지 않으면 그들이 구현한다.하는 것을 고려해야 할 수 있습니다 데크 지역의 텍스트,이 문제가있는 경우.

3)만큼 크로스 플랫폼,우리가 쓴 꽤 많은 순수한 C++에 대한 우리의 현지화 시스템입니다.우리가 쓴 사용자 지정 인코딩된 바이너리 파일을 로드하고 사용자 지정 변환하는 프로그램에서 CSV 의 언어를 텍스트로 .h 와 함께 열거하고 파일 언어,지도 및 .lang 각 언어입니다.가장 특정 플랫폼 것은 우리가 사용하는 글꼴과 printf() 기능입니다,하지만 당신은 뭔가를 위해 적당한 어디든지 당신을 개발하거나 쓸 수 있는 경우에 당신의 자신을 필요합니다.

다른 팁

gnu gettext 모든 것을합니다.

나는 받아 들여진 대답에 강력하게 동의하지 않습니다. 먼저, 정적 배열 조회를 사용하여 텍스트 조회 속도를 높이는 것에 대한 부분은 최적화를하는 사람은 매우 경험이 없습니다 - 상기 텍스트의 레이아웃 계산 및 렌더링은 텍스트는 해시 조회보다 2-4 배 더 많은 시간을 사용합니다. 누구든지 자신의 언어 라이브러리를 구현하고 싶다면 정적 배열을 기반으로하지 않아야합니다.

그러나 그것은 실제로 관련이 없습니다 자신의 게임에서 사용할 언어 라이브러리를 작성하면 더 나쁩니다. 무의미한 조기 최적화보다. 매우 좋은 이유가 몇 가지 있습니다 자신의 현지화 도서관을 쓰지 마십시오:

  1. 현지화 라이브러리를 사용할 시간을 계획하는 것은 훨씬 쉽습니다. 그리고 현지화 라이브러리를 작성할 시간을 계획합니다. 현지화 라이브러리가 존재하고, 일하며, 많은 사람들이 그것들을 사용했습니다.

  2. 현지화는 까다로워서 상황이 잘못 될 것입니다. 모든 언어는 새로운 기발함을 추가합니다. 즉, 자신의 자체 제작 된 현지화 라이브러리에 새로운 언어를 추가 할 때마다 단점을 설명하기 위해 코드를 다시 변경해야합니다. 문제의 항목 수에 따라 일부 언어에는 2 개 이상의 복수형 형태가 있다는 것을 알고 있습니까? 2 명 이상의 성별 (10, 심지어도)? 또한 숫자와 날짜 형식은 여러 언어마다 다릅니다.

  3. 응용 프로그램이 성공하면 더 많은 언어에 대한 지원을 추가하기를 원할 것입니다. 당신의 팀의 어느 누구도 유창하게 말하지 않습니다. 번역을 쓰기 위해 누군가를 고용하는 것이 될 것입니다 상당히 저렴합니다 그들이 이미 협력하고있는 도구를 알고 있다면.

매우 잘 알려져 있고 완전한 현지화 라이브러리가 있습니다 gnu gettext, GPL을 사용하므로 상업적 작업을 피해야합니다. 대신 부스트 라이브러리를 사용할 수 있습니다 boost.locale GetText 파일과 함께 작동하며 모든 종류의 상업 및 비상업적 프로젝트에 무료로 사용하고 수정할 수 있습니다.

내가 알 수있는 한 C ++ 0X 표준에는 추가 기능이 없습니다. 나는위원회가 이것을 제 3 자 도서관의 문제로 간주한다고 생각한다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top