UFO ET IT

모범 사례 자바 스크립트 및 다국어

ufoet 2020. 11. 26. 20:25
반응형

모범 사례 자바 스크립트 및 다국어


자바 스크립트로 DOM 조작을 사용하는 다국어 웹 사이트의 모범 사례는 무엇입니까? 자바 스크립트를 사용하여 웹 사이트의 일부 동적 부분을 구축합니다. 내 첫 번째 생각은 텍스트 문자열과 언어 코드를 인덱스로 사용하는 배열을 사용하는 것입니다. 이것이 좋은 생각입니까?


이전에 다국어 사이트를 만들었을 때 (그다지 큰 사이트는 아니므로 확장이 잘되지 않을 수 있음) 일련의 "언어"파일을 유지합니다.

  • lang.en.js
  • lang.it.js
  • lang.fr.js

각 파일은 기본적으로 키워드에서 언어 구문으로의 맵인 객체를 선언합니다.

// lang.en.js
lang = {
    greeting : "Hello"
};

// lang.fr.js
lang = {
    greeting : "Bonjour"
};

이러한 파일 중 하나를 동적으로로드 한 다음지도에서 키를 참조하기 만하면됩니다.

document.onload = function() {
    alert(lang.greeting);
};

물론이 작업을 수행하는 다른 많은 방법과이 스타일을 수행하는 여러 가지 방법이 있지만 더 나은 방법이 있습니다. "사전"에서 누락 된 구문을 우아하게 처리하거나 전체 작업을 수행 할 수 있도록 모든 것을 함수로 캡슐화합니다. OOP를 사용하고 파일의 동적 포함을 관리하도록하여 언어 선택기를 그릴 수도 있습니다.

var l = new Language('en');
l.get('greeting');

다국어 지원을 설계 할 때 염두에 두어야 할 몇 가지 사항이 있습니다.

1-데이터에서 코드를 분리합니다 (즉, 문자열을 함수에 바로 하드 코딩하지 마십시오)

2-현지화 차이를 처리하기 위해 서식 지정 후크 함수를 만듭니다. 다음 과 같은 이유로 형식화 가능한 문자열 ( "{0}" )을 허용하는 것이 연결 ( "Welcome to"+ value ) 보다 낫습니다 .

  • 일부 언어에서 숫자는 1,234,567.00 대신 1.234.678,00과 같은 형식으로 지정됩니다.
  • 복수형은 종종 단수 끝에 "s"를 추가하는 것만 큼 간단하지 않습니다.
  • 문법 규칙은 다르며 순서에 영향을 줄 수 있으므로 번역 후크 뒤에 동적 데이터가 추가되도록해야합니다. 예를 들어 "Welcome to {0}"(는) 일본어에서 "{0} he youkoso" 로 바뀝니다 . 거의 모든 언어, 염두에 두십시오).

3- 번역 후크가 실행 된 실제로 문자열 형식을 지정할 수 있는지 확인 하여 키를 재사용 할 수 있습니다.

4- 어떤 상황에서도 데이터베이스 출력을 변환기 유틸리티에 연결하지 마십시오 . 다국어 데이터가있는 경우 데이터베이스에 별도의 테이블 / 행을 만듭니다. 나는 사람들이 꽤 자주 (일반적으로 국가와 주 / 지방의 형태로) 잘못 이해하는 것을 보았다.

5-키 생성을위한 명시적인 코딩 관행 규칙을 만듭니다. 포매터 유틸리티 함수 ( translate ( "hello world" 와 유사 함 ) 는 키를 매개 변수로 사용하고 약간의 변형이있는 키는 유지 보수를 매우 성가 시게합니다. 예를 들어 다음 예제에서 세 개의 키로 끝날 수 있습니다. "enter you name", "enter your name :", "enter your name :". 하나의 형식 (예 : 콜론 없음, 잘림)을 선택하고 코드 검토에서 불일치를 포착합니다. 프로그래밍 방식으로 필터링하면 false를 트리거 할 수 있습니다. 긍정적.

6-번역 테이블에 HTML 마크 업이 잠재적으로 필요할 수 있다는 점에 유의하십시오 (예 : 문장에서 단어를 굵게 표시해야하거나 각주 의학 참조가 필요한 경우). 이것을 광범위하게 테스트하십시오.

7-언어 문자열을 가져 오는 방법에는 여러 가지가 있습니다. 이상적으로는 language.lang.js 파일의 여러 버전이 있어야하며 서버 측 코드로 전환하고 HTML 파일 하단에서 파일을 참조해야합니다. AJAX를 통해 파일을 가져 오는 것도 대안이지만 지연이 발생할 수 있습니다. language.js를 기본 코드 파일에 병합하는 것은 파일 캐싱의 이점을 잃기 때문에 권장되지 않습니다.

8- 대상 언어로 테스트합니다. 이것은 어리석게 들리지만 프로그래머가 키에 "é"가 있는지 확인하지 않았기 때문에 심각한 버그를 한 번 본 적이 있습니다.


function Language(lang)
{
    var __construct = function() {
        if (eval('typeof ' + lang) == 'undefined')
        {
            lang = "en";
        }
        return;
    }()

    this.getStr = function(str, defaultStr) {
        var retStr = eval('eval(lang).' + str);
        if (typeof retStr != 'undefined')
        {
            return retStr;
        } else {
            if (typeof defaultStr != 'undefined')
            {
                return defaultStr;
            } else {
                return eval('en.' + str);
            }
        }
    }
}

이것을 페이지에 추가 한 후 다음과 같이 작업 할 수 있습니다.

var en = {
    SelPlace:"Select this place?",
    Save:"Saved."
};

var tr = {
    SelPlace:"Burayı seçmek istiyor musunuz?"
};

var translator = new Language("en");
alert(translator.getStr("SelPlace")); // result: Select this place?
alert(translator.getStr("Save")); // result: Saved.
alert(translator.getStr("DFKASFASDFJK", "Default string for non-existent string")); // result: Default string for non-existent string

var translator = new Language("tr");
alert(translator.getStr("SelPlace")); // result: Burayı seçmek istiyor musunuz?
alert(translator.getStr("Save")); // result: Saved. (because it doesn't exist in this language, borrowed from english as default)
alert(translator.getStr("DFKASFASDFJK", "Default string for non-existent string")); // result: Default string for non-existent string

정의하지 않은 언어로 클래스를 호출하면 영어 ( en )가 선택됩니다.


자바 스크립트에서 i18n에 대한 멋진 기사를 찾았습니다 :
http://24ways.org/2007/javascript-internationalisation

i18n + javascript를 사용한 간단한 Google 검색은 많은 대안을 보여줍니다.

결국 그것은 당신이 원하는 깊이에 달려 있습니다. 두 가지 언어의 경우 단일 파일이면 충분합니다.

Jquery 와 같은 프레임 워크를 사용하고 스팬을 사용하여 텍스트 (클래스 포함)를 식별 한 다음 각 스팬의 ID를 사용하여 선택한 언어의 해당 텍스트를 찾을 수 있습니다.
Jquery 1 줄 완료.


nickf와 Leo의 훌륭한 답변을 읽은 후 모든 문자열을 관리하기 위해 다음 CommonJS 스타일 language.js를 만들었습니다 (선택적 으로 형식을 지정하는 Mustache ).

var Mustache = require('mustache');

var LANGUAGE = {
    general: {
        welcome: "Welcome {{name}}!"
    }
};

function _get_string(key) {
    var parts = key.split('.');
    var result = LANGUAGE, i;
    for (i = 0; i < parts.length; ++i) {
        result = result[parts[i]];
    }
    return result;
}

module.exports = function(key, params) {
    var str = _get_string(key);
    if (!params || _.isEmpty(params)) {
        return str;
    }
    return Mustache.render(str, params);
};

그리고 이것이 내가 문자열을 얻는 방법입니다.

var L = require('language');
var the_string = L('general.welcome', {name='Joe'});

Dojo, Ext, FCKEditor, TinyMCE 등과 같은 고전적인 JS 구성 요소에서 수행 된 작업을 살펴보아야합니다. 좋은 아이디어를 많이 찾을 수 있습니다.

일반적으로 태그에 설정 한 일종의 속성으로 끝나고 속성 값에 따라 태그의 내용을 번역 파일에서 찾은 번역으로 바꿉니다.

명심해야 할 한 가지는 언어 세트의 진화입니다 (코드가 발전 할 때 전체를 다시 번역해야 할 것인지 말 것인지). 번역을 PO 파일 (Gnu Gettext)에 보관하고, PO 파일을 JS 파일을 사용할 준비가 된 상태로 변환하는 스크립트가 있습니다.

게다가:

  • 항상 UTF-8을 사용하십시오-이것은 어리석은 것처럼 들리지만 처음부터 utf-8 (HTML 헤드 + JS 인코딩)을 사용하지 않는다면 빠르게 파산 될 것입니다.
  • Use the english string as a key to your translations - this way you won't end up with things like: lang.Greeting = 'Hello world' - but lang['Hello world'] = 'Hello world';

For Spring bundles and JavaScript there are simple solution: generate i18n array in template (e.g. JSP) and use it in JavaScript:

JSP:

<html>
<script type="text/javascript">
    var i18n = [];
    <c:forEach var='key' items='<%=new String[]{"common.deleted","common.saved","common.enabled","common.disabled","...}%>'>
        i18n['${key}'] = '<spring:message code="${key}"/>';
    </c:forEach>
</script>
</html>

And in JS:

alert(i18n["common.deleted"]);

See also Resolving spring:messages in javascript for i18n internationalization


This way you can use one js code for multi language by multi word :

var strings = new Object();

if(navigator.browserLanguage){
  lang = navigator.browserLanguage;
}else{
  lang = navigator.language;
}

lang = lang.substr(0,2).toLowerCase();



if(lang=='fa'){/////////////////////////////Persian////////////////////////////////////////////////////


        strings["Contents"]                              = "فهرست";
        strings["Index"]                                 = "شاخص";
        strings["Search"]                                = "جستجو";
        strings["Bookmark"]                              = "ذخیره";

        strings["Loading the data for search..."]        = "در حال جسنجوی متن...";
        strings["Type in the word(s) to search for:"]    = "لغت مد نظر خود را اینجا تایپ کنید:";
        strings["Search title only"]                     = "جستجو بر اساس عنوان";
        strings["Search previous results"]               = "جستجو در نتایج قبلی";
        strings["Display"]                               = "نمایش";
        strings["No topics found!"]                      = "موردی یافت نشد!";

        strings["Type in the keyword to find:"]          = "کلیدواژه برای یافتن تایپ کنید";

        strings["Show all"]                              = "نمایش همه";
        strings["Hide all"]                              = "پنهان کردن";
        strings["Previous"]                              = "قبلی";
        strings["Next"]                                  = "بعدی";

        strings["Loading table of contents..."]          = "در حال بارگزاری جدول فهرست...";

        strings["Topics:"]                               = "عنوان ها";
        strings["Current topic:"]                        = "عنوان جاری:";
        strings["Remove"]                                = "پاک کردن";
        strings["Add"]                                   = "افزودن";

}else{//////////////////////////////////////English///////////////////////////////////////////////////

strings["Contents"]                              = "Contents";
strings["Index"]                                 = "Index";
strings["Search"]                                = "Search";
strings["Bookmark"]                              = "Bookmark";

strings["Loading the data for search..."]        = "Loading the data for search...";
strings["Type in the word(s) to search for:"]    = "Type in the word(s) to search for:";
strings["Search title only"]                     = "Search title only";
strings["Search previous results"]               = "Search previous results";
strings["Display"]                               = "Display";
strings["No topics found!"]                      = "No topics found!";

strings["Type in the keyword to find:"]          = "Type in the keyword to find:";

strings["Show all"]                              = "Show all";
strings["Hide all"]                              = "Hide all";
strings["Previous"]                              = "Previous";
strings["Next"]                                  = "Next";

strings["Loading table of contents..."]          = "Loading table of contents...";

strings["Topics:"]                               = "Topics:";
strings["Current topic:"]                        = "Current topic:";
strings["Remove"]                                = "Remove";
strings["Add"]                                   = "Add";

}

you can add another lang in this code and set objects on your html code.

참고URL : https://stackoverflow.com/questions/228835/best-practice-javascript-and-multilanguage

반응형