문제

내 친구는 현재 J2EE와 Struts를 사용하여 웹 애플리케이션을 구축하고 있으며 여러 언어로 페이지를 표시할 준비가 되어 있습니다.

다국어 사이트를 지원하는 가장 좋은 방법은 다음과 같이 페이지의 모든 문자열을 저장하는 속성 파일을 사용하는 것이라고 들었습니다.

welcome.english = "Welcome!"
welcome.spanish = "¡Bienvenido!"
...

이 해결 방법은 괜찮습니다. 하지만 사이트에 뉴스나 그와 유사한 것(블로그)이 표시되면 어떻게 될까요?즉, 정적인 콘텐츠가 아니고 자주 업데이트되는 콘텐츠...사이트를 유지하는 사람들은 지원되는 각 언어로 모든 새 항목을 작성하고 항목의 각 버전을 데이터베이스에 저장해야 합니다.애플리케이션은 사용자가 선택한 언어로 된 항목만 로드합니다.

이러한 종류의 구현을 지원하기 위해 데이터베이스를 어떻게 설계합니까?

감사해요.

도움이 되었습니까?

해결책

이전에 제가 데이터베이스를 디자인한 방식은 NewsID(int), NewsPubDate(datetime), NewsAuthor(varchar/int)와 같은 기본 정보가 포함된 News-table을 갖고 다음 열이 있는 연결된 테이블 NewsText를 갖는 것입니다.NewsID(int), NewsText(텍스트), NewsLanguageID(int).그리고 마침내 LanguageID(int)와 LanguageName(varchar)이 있는 Language-table이 생겼습니다.

그런 다음 사용자에게 뉴스 페이지를 표시하려면 다음을 수행하십시오.

SELECT NewsText FROM News INNER JOIN NewsText ON News.NewsID = NewsText.NewsID
WHERE NewsText.NewsLanguageID = <<Session["UserLanguageID"]>>

해당 세션 비트는 사용자가 로그인하거나 사이트에 처음 들어갈 때 사용자의 언어를 저장하는 로컬 변수입니다.

다른 팁

경고:저는 자바 해커가 아니기 때문에 YMMV이지만...

"속성" 목록을 사용할 때의 문제점은 많은 규율이 필요하다는 것입니다.사용자에게 출력되어야 하는 문자열을 추가할 때마다 속성 파일을 열고 해당 문자열(또는 이와 대략 동등한 항목)이 이미 파일에 있는지 확인한 다음 새 속성을 추가해야 합니다. 그렇지 않다면.게다가, 처리를 위해 외부 번역 팀에 제공하려는 경우 속성 파일이 상당히 사람이 읽고 편집할 수 있기를 바랄 것입니다.

데이터베이스 기반 접근 방식은 모든 데이터베이스 기반 콘텐츠에 유용합니다.이상적으로는 콘텐츠 조각을 번역과 쉽게 연결하는 것이 좋습니다.실제로 출력하려는 ​​모든 위치에 대해서만 해당됩니다. 그렇지 않다 데이터베이스 외부(오류 메시지 등).

우리가 여전히 잘 작동하고 있는 상당히 오래된 기술 중 하나는 gettext를 사용하는 것입니다.Gettext 또는 일부 변형은 대부분의 언어 및 플랫폼에서 사용할 수 있는 것 같습니다.기본 전제는 다음과 같이 특수 함수 호출로 출력을 래핑한다는 것입니다.

echo _("Please do not press this button again");

그런 다음 소스 코드에 대해 gettext 도구를 실행하면 "po" 파일로 래핑된 모든 인스턴스가 추출됩니다.여기에는 다음과 같은 항목이 포함됩니다.

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr ""

그리고 적절한 위치에 번역을 추가할 수 있습니다:

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr "s’il vous plaît ne pas appuyer sur le bouton ci-dessous à nouveau"

이후에 gettext 도구를 실행하면 po 파일이 업데이트됩니다.소스에서 po 파일을 추출할 필요조차 없습니다.당신이 당신을 알고 있다면 5월 사이트를 한 줄 아래로 번역하고 싶다면 위에 표시된 형식(밑줄 표시된 기능)을 모든 출력에 사용하면 됩니다.po 파일을 제공하지 않으면 따옴표 안에 넣은 내용만 반환됩니다.gettext는 로케일과 함께 작동하도록 설계되었으므로 사용자 로케일이 적절한 po 파일을 검색하는 데 사용됩니다.이를 통해 새로운 번역을 추가하는 것이 정말 쉬워졌습니다.

Gettext 전문가

  • 코딩하는 동안 방해가 되지 않습니다.
  • 번역 추가가 매우 쉽습니다.
  • PO 파일은 속도를 위해 컴파일될 수 있습니다.
  • 대부분의 언어/플랫폼에 사용할 수 있는 라이브러리가 있습니다.
  • 번역을 처리하기 위한 좋은 크로스 플랫폼 도구가 있습니다.실제로 다음과 같은 도구를 사용하여 번역 팀을 구성하는 것이 가능합니다. po편집 번역 프로젝트를 매우 쉽게 관리할 수 있도록

Gettext 단점

  • 사이트의 "가구" 요구 사항을 해결하지만 일반적으로 데이터베이스 기반 콘텐츠에 대한 데이터베이스 기반 접근 방식을 원할 것입니다.

gettext에 대한 자세한 내용은 다음을 참조하세요. 이 위키피디아 페이지

Java 웹 애플리케이션은 Java 표준 태그 라이브러리를 사용하여 국제화를 지원합니다.

정말 두 가지 문제가 있습니다.정적 콘텐츠와 동적 콘텐츠.

정적 콘텐츠의 경우 사용할 수 있습니다 jstl.자바를 사용한다 리소스번들이것을 달성하는 것입니다.나는 을 얻을 수 있었다 데이터베이스 기반 번들 이 사이트의 도움을 받아 작업합니다.

두 번째 문제는 동적 콘텐츠입니다.이 문제를 해결하려면 사용자의 로케일에 따라 다양한 번역을 검색할 수 있도록 데이터를 저장해야 합니다.(로케일에는 국가 및 언어가 포함됩니다.)

사소한 것은 아니지만 사전에 약간의 계획만 세우면 할 수 있는 일입니다.

@아우론

그것이 우리가 적용하는 것입니다.우리 앱은 모두 PHP이지만 gettext는 오랜 전통을 가지고 있습니다.

있는 것 같습니다. 좋은 자바 구현

JSP를 사용하는 경우 태그 라이브러리는 괜찮지만 다음과 같은 템플릿 기반 기술을 사용하여 I18N을 달성할 수도 있습니다. 프리마커.

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