문자열 및 레이블의 지역화 및 세계화에 대한 모범 사례
저는 개발자가 20 명 이상인 팀의 일원입니다. 각 개발자는 별도의 모듈 (10 개 모듈 근처)에서 작업합니다. 각 모듈에는 적어도 50 개의 CRUD 형식이있을 수 있습니다. 이는 현재 500 개의 추가 버튼 , 저장 버튼 , 편집 버튼 등 이 있음을 의미합니다 .
그러나 응용 프로그램을 세계화하려는 경우 응용 프로그램에서 텍스트를 번역 할 수 있어야합니다. 예를 들어, 어디에서나 add 라는 단어 는 프랑스 사용자에게있어 주류 가되어야 합니다.
우리가 지금까지 한 일은 UI 또는 Presentation Layer의 각보기마다 키 / 값 쌍의 사전을 가지고 있다는 것입니다. 그런 다음 뷰를 렌더링하는 동안이 사전을 사용하여 필요한 텍스트와 문자열을 번역합니다. 그러나이 접근 방식에서는 500 개의 사전에 500 개 정도의 값이 추가 됩니다. 이것은 우리가 DRY 교장을 위반했음을 의미합니다.
반면에 add 를 한곳에 배치하는 것과 같이 공통 문자열을 중앙 집중화 하고 개발자에게 어디서나 사용하도록 요청하면 중앙 사전에 문자열이 이미 정의되어 있는지 확실하지 않은 문제가 발생합니다.
또 다른 옵션은 번역 사전이없고 Google Translate, Bing Translator 등과 같은 온라인 번역 서비스를 사용하는 것입니다.
우리가 직면 한 또 다른 문제는 프로젝트를 정시에 제공해야하는 일부 개발자는 번역 키를 기억할 수 없다는 것 입니다. 예를 들어, 추가 버튼의 텍스트에 대해 개발자는 add 를 사용 하고 다른 개발자는 new 등을 사용했습니다 .
응용 프로그램의 문자열 리소스를 세계화 및 지역화하는 가장 좋은 방법 또는 가장 잘 알려진 방법은 무엇입니까?
내가 아는 localeplanet
한 JavaScript에는 현지화 및 국제화 라는 훌륭한 라이브러리가 있습니다. 또한 네이티브라고 생각하며 다른 라이브러리 (예 : jQuery)에 대한 종속성이 없습니다.
도서관 웹 사이트는 다음과 같습니다. http://www.localeplanet.com/
Mozilla 의이 기사를 보시면 클라이언트 측 번역을위한 매우 좋은 방법과 알고리즘을 찾을 수 있습니다 : http://blog.mozilla.org/webdev/2011/10/06/i18njs-internationalize-your-javascript-with- json 및 서버에서 약간의 도움
모든 기사 / 라이브러리의 공통 부분 은를 검색 / 변환하기 위해 i18n
클래스와 get
메소드 (어떻게 든 더 작은 함수 이름을 정의 함 _
)를 사용 key
한다는 것 value
입니다. 내 설명에서 key
번역하려는 문자열과 value
번역 된 문자열을 의미합니다.
그런 다음, 당신은 저장소에 JSON 문서가 필요 key
의와 value
의를.
예를 들면 다음과 같습니다.
var _ = document.webL10n.get;
alert(_('test'));
그리고 여기 JSON이 있습니다 :
{ test: "blah blah" }
현재 인기있는 라이브러리 솔루션을 사용하는 것이 좋은 접근 방법이라고 생각합니다.
당신이 해결해야 할 문제에 직면했을 때 (그리고 솔직히 요즘 누가 그렇지 않습니까?) 일반적으로 우리 컴퓨터 사람들이 취하는 기본 전략을 "분열 및 정복"이라고합니다. 다음과 같이 진행됩니다.
- 특정 문제를 일련의 작은 하위 문제로 개념화하십시오.
- 각각의 작은 문제를 해결하십시오.
- 결과를 특정 문제의 해결책으로 결합하십시오.
그러나“분열하고 정복”하는 것이 가능한 유일한 전략은 아닙니다. 보다 일반적인 접근 방식을 취할 수도 있습니다.
- 특정 문제를보다 일반적인 문제의 특수한 사례로 개념화하십시오.
- 어떻게 든 일반적인 문제를 해결하십시오.
- 일반적인 문제의 해결책을 특정 문제에 맞게 조정하십시오.
-에릭 리퍼 트
ASP.Net/C#과 같은 서버 측 언어에는이 문제에 대한 많은 솔루션이 이미 존재한다고 생각합니다.
문제의 주요 측면 중 일부를 설명했습니다
문제 : 원하는 언어에 대해서만 데이터를로드해야합니다
해결책 :이를 위해 각 언어마다 별도의 파일로 데이터를 저장합니다
전의. res.de.js, res.fr.js, res.en.js, res.js (기본 언어의 경우)
문제 : 각 페이지의 리소스 파일을 분리하여 필요한 데이터 만 가져와야합니다.
해결책 : 우리는 https://github.com/rgrove/lazyload 와 같이 이미 존재하는 도구를 사용할 수 있습니다
문제 : 데이터를 저장하려면 키 / 값 쌍 구조가 필요합니다
해결책 : 문자열 / 문자열 대신 자바 스크립트 객체를 제안합니다. IDE의 인텔리전스를 활용할 수 있습니다
문제 : 일반 회원은 공개 파일에 저장해야하며 모든 페이지가 해당 파일에 액세스해야합니다.
Solution: For this purpose I make a folder in the root of web application called Global_Resources and a folder to store global file for each sub folders we named it 'Local_Resources'
Issue: Each subsystems/subfolders/modules member should override the Global_Resources members on their scope
Solution: I considered a file for each
Application Structure
root/ Global_Resources/ default.js default.fr.js UserManagementSystem/ Local_Resources/ default.js default.fr.js createUser.js Login.htm CreateUser.htm
The corresponding code for the files:
Global_Resources/default.js
var res = {
Create : "Create",
Update : "Save Changes",
Delete : "Delete"
};
Global_Resources/default.fr.js
var res = {
Create : "créer",
Update : "Enregistrer les modifications",
Delete : "effacer"
};
The resource file for the desired language should be loaded on the page selected from Global_Resource - This should be the first file that is loaded on all the pages.
UserManagementSystem/Local_Resources/default.js
res.Name = "Name";
res.UserName = "UserName";
res.Password = "Password";
UserManagementSystem/Local_Resources/default.fr.js
res.Name = "nom";
res.UserName = "Nom d'utilisateur";
res.Password = "Mot de passe";
UserManagementSystem/Local_Resources/createUser.js
// Override res.Create on Global_Resources/default.js
res.Create = "Create User";
UserManagementSystem/Local_Resources/createUser.fr.js
// Override Global_Resources/default.fr.js
res.Create = "Créer un utilisateur";
manager.js file (this file should be load last)
res.lang = "fr";
var globalResourcePath = "Global_Resources";
var resourceFiles = [];
var currentFile = globalResourcePath + "\\default" + res.lang + ".js" ;
if(!IsFileExist(currentFile))
currentFile = globalResourcePath + "\\default.js" ;
if(!IsFileExist(currentFile)) throw new Exception("File Not Found");
resourceFiles.push(currentFile);
// Push parent folder on folder into folder
foreach(var folder in parent folder of current page)
{
currentFile = folder + "\\Local_Resource\\default." + res.lang + ".js";
if(!IsExist(currentFile))
currentFile = folder + "\\Local_Resource\\default.js";
if(!IsExist(currentFile)) throw new Exception("File Not Found");
resourceFiles.push(currentFile);
}
for(int i = 0; i < resourceFiles.length; i++) { Load.js(resourceFiles[i]); }
// Get current page name
var pageNameWithoutExtension = "SomePage";
currentFile = currentPageFolderPath + pageNameWithoutExtension + res.lang + ".js" ;
if(!IsExist(currentFile))
currentFile = currentPageFolderPath + pageNameWithoutExtension + ".js" ;
if(!IsExist(currentFile)) throw new Exception("File Not Found");
Hope it helps :)
jQuery.i18n is a lightweight jQuery plugin for enabling internationalization in your web pages. It allows you to package custom resource strings in ‘.properties’ files, just like in Java Resource Bundles. It loads and parses resource bundles (.properties) based on provided language or language reported by browser.
to know more about this take a look at the How to internationalize your pages using JQuery?
'programing tip' 카테고리의 다른 글
iter와 into_iter의 차이점은 무엇입니까? (0) | 2020.08.06 |
---|---|
Angular 2 템플릿에서 let- *는 무엇입니까? (0) | 2020.08.06 |
C에서이 "[0… 255] ="구문은 무엇입니까? (0) | 2020.08.06 |
정적 메소드가 인스턴스 메소드를 호출하는 C # 컴파일러가 오류 코드를 작성하지 않는 이유는 무엇입니까? (0) | 2020.08.06 |
Java 객체를 null로 설정하면 더 이상 아무것도하지 않습니까? (0) | 2020.08.06 |