57.2. 프로그래머의 경우

57.2.1. 역학

이 섹션에서는 다음의 일부인 프로그램이나 라이브러리에서 모국어 지원을 구현하는 방법을 설명합니다.PostgreSQL배포. 현재는 C 프로그램에만 적용됩니다.

프로그램에 NLS 지원 추가

  1. 프로그램 시작 순서에 다음 코드를 삽입하세요:

    #ifdef ENABLE_NLS
    #include <locale.h
    #endif
    
    ...
    
    #ifdef ENABLE_NLS
    setlocale(LC_ALL, "");
    바인딩텍스트도메인("토토 사이트램명", LOCALEDIR);
    텍스트도메인("토토 사이트램명");
    #endif

    (그토토 사이트램명실제로는 자유롭게 선택할 수 있습니다.)

  2. 번역할 메시지가 발견되는 곳마다 호출gettext()을 삽입해야 합니다. 예:

    fprintf(stderr, "패닉 레벨 %d\n", lvl);

    다음으로 변경됩니다:

    fprintf(stderr, gettext("패닉 레벨 %d\n"), lvl);

    (gettextNLS 지원이 구성되지 않은 경우 작동하지 않는 것으로 정의됩니다.)

    이것은 많은 혼란을 추가하는 경향이 있습니다. 일반적인 단축키 중 하나는 다음을 사용하는 것입니다.

    #define _(x) gettext(x)

    프로그램이 다음과 같은 하나 또는 몇 가지 기능을 통해 많은 통신을 수행하는 경우 또 다른 솔루션이 가능합니다.ereport()백엔드에서. 그런 다음 이 함수를 호출합니다.gettext내부적으로 모든 입력 문자열에 대해.

  3. 파일 추가nls.mk프로그램 소스가 있는 디렉토리에. 이 파일은 makefile로 읽혀집니다. 여기서는 다음 변수 할당을 수행해야 합니다.

    CATALOG_NAME

    다음에 제공된 프로그램 이름텍스트도메인()전화하세요.

    AVAIL_LANGUAGES

    제공된 번역 목록 — 처음에는 비어 있습니다.

    GETTEXT_FILES

    번역 가능한 문자열을 포함하는 파일 목록, 즉 다음으로 표시된 파일 목록gettext또는 대체 솔루션. 결국 여기에는 토토 사이트램의 거의 모든 소스 파일이 포함됩니다. 이 목록이 너무 길면 첫 번째 목록을 만들 수 있습니다.파일되다+그리고 두 번째 단어는 한 줄에 하나의 파일 이름을 포함하는 파일입니다.

    GETTEXT_TRIGGERS

    번역자가 작업할 메시지 카탈로그를 생성하는 도구는 어떤 함수 호출에 번역 가능한 문자열이 포함되어 있는지 알아야 합니다. 기본적으로만gettext()호출이 알려져 있습니다. 사용한 경우_또는 여기에 나열해야 하는 기타 식별자입니다. 번역 가능한 문자열이 첫 번째 인수가 아닌 경우 항목은 다음 형식이어야 합니다.func:2(두 번째 인수의 경우). 복수형 메시지를 지원하는 함수가 있는 경우 항목은 다음과 같아야 합니다.func:1,2(단수 및 복수 메시지 인수 식별).

빌드 시스템은 메시지 카탈로그 구축 및 설치를 자동으로 처리합니다.

57.2.2. 메시지 작성 지침

다음은 쉽게 번역할 수 있는 메시지 작성에 대한 몇 가지 지침입니다.

  • 런타임에 다음과 같은 문장을 구성하지 마십시오:

    printf("파일은 %s입니다.\n", 플래그 ? "복사됨" : "제거됨");

    문장 내의 단어 순서는 다른 언어에서는 다를 수 있습니다. 또한 기억하고 전화를 했어도gettext()각 조각에서 조각이 개별적으로 잘 번역되지 않을 수 있습니다. 번역할 각 메시지가 일관된 전체가 되도록 작은 코드를 복제하는 것이 좋습니다. 숫자, 파일 이름 및 이와 유사한 런타임 변수만 런타임 시 메시지 텍스트에 삽입되어야 합니다.

  • 비슷한 이유로 이것은 작동하지 않습니다:

    printf("복사된 %d 파일%s", n, n!=1 ? "s" : "");

    왜냐하면 복수형이 어떻게 형성되는지 가정하기 때문입니다. 다음과 같이 문제를 해결할 수 있다고 생각했다면:

    if (n==1)
        printf("1개의 파일을 복사했습니다.");
    그렇지 않으면
        printf("%d개의 파일을 복사했습니다", n):

    그러면 실망하세요. 일부 언어에는 몇 가지 독특한 규칙이 있는 두 가지 이상의 형식이 있습니다. 다음과 같이 문제를 완전히 방지하기 위해 메시지를 디자인하는 것이 가장 좋습니다.

    printf("복사된 파일 수: %d", n);

    정말로 적절하게 복수형 메시지를 구성하고 싶다면 이를 지원하지만 약간 어색합니다. 기본 또는 세부 오류 메시지를 생성할 때ereport(), 다음과 같이 작성할 수 있습니다.

    errmsg_plural("%d 파일을 복사했습니다",
                  "%d개의 파일을 복사했습니다",
                  엔,
                  n)

    첫 번째 인수는 영어 단수형에 적합한 형식 문자열이고, 두 번째 인수는 영어 복수형에 적합한 형식 문자열이며, 세 번째 인수는 사용할 복수형을 결정하는 정수 제어 값입니다. 후속 인수는 평소와 같이 형식 문자열에 따라 형식이 지정됩니다. (보통 복수형 제어 값도 포맷할 값 중 하나이기 때문에 두 번 써야 합니다.) 영어에서는 여부만 중요합니다.n은 1이거나 1이 아니지만 다른 언어에서는 다양한 복수형이 있을 수 있습니다. 번역자는 두 개의 영어 형식을 하나의 그룹으로 보고 여러 대체 문자열을 제공할 기회를 가지며, 런타임 값에 따라 적절한 문자열이 선택됩니다.n.

    다음으로 직접 전달되지 않는 메시지를 복수화해야 하는 경우errmsg또는errdetail보고서, 기본 함수를 사용해야 합니다gettext. gettext 문서를 참조하세요.

  • 메시지가 다른 출력과 어떻게 정렬되는지와 같이 번역자에게 무언가를 전달하려면 문자열 앞에 다음으로 시작하는 주석을 추가하십시오.번역자, 예:

    /* 번역자: 이 메시지는 보이는 것과 다릅니다. */

    이 설명은 번역자가 볼 수 있도록 메시지 카탈로그 파일에 복사됩니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.