번역 된 문자열을 Drupal.locale.strings로 어떻게 가져 옵니까?


9

그래서 Drupal.t () 함수를 내 테마의 일부 사용자 정의 Javascript 코드에서 사용하려고합니다.

Drupal.locale.strings 객체에 필요한 문자열을 어떻게 얻습니까? 거기에 문자열이 있지만 물론 전체 데이터베이스를로드 할 수 없습니다. 추가하는 가장 좋은 방법은 무엇입니까? 추가 된 문자열을 Translate 인터페이스에서 편집 할 수 있도록 PHP t () 함수를 사용하고 싶습니다.

답변:


8

Drupal은 필요한 문자열을 javascript 객체에 채우는 것을 처리합니다. 전체 문자열 모음이 모든 페이지에로드되는 것은 아니지만 필요한 문자열 만 JavaScript에 추가됩니다.

나는 이것이 실제로 페이지에 추가되기 전에 스크립트 파일을 순회함으로써 이루어 졌다고 생각합니다.

따라서 Drupal.t('Some string');JavaScript 코드에 추가 하면 번역 인터페이스에서 해당 코드를 번역 할 수 있어야합니다.


그럼 그것은 일어나지 않습니다. (Drupal.t () 호출을 찾기위한 스크립트 순회). 테마의 .info 파일 (scripts [] = scripts / script.js)을 통해 스크립트를 추가하고 있습니다. 어쩌면 drupal_add_js () 통해 추가해야합니까?
JonMcL

당신이 올바른지. 나는 완전히 이해하기 위해 추적해야했지만 실제로는 자동적으로 발생합니다. Drupal 7에서 함수는 locale_js_alter () (locale.module)입니다. Javascript 파일의 전체 목록을 사용하고 _locale_parse_js_file ()에서 각 파일을 구문 분석합니다. file_get_contents ()가 제공된 경로로 JS 파일을로드 할 수 있도록주의하십시오 (예 : 테마 폴더에있는 경우 /로 경로를 시작하지 마십시오). 테마의 .info 파일에서 drupal_add_js 또는 scripts [] 설정을 사용할 수 있습니다. 물론 캐시를 지우고 문자열을 번역하십시오! :)
JonMcL

6

오늘이 같은 문제에 부딪 히고 조금 더 연구했습니다. 위의 Chris는 좋은 의견을 가지고 있지만 궁극적으로 잘못되었습니다. 작동하기 위해 Drupal.behaviors를 사용할 필요는 없습니다.

그의 마지막 주석에서 JonMcL 자신이 언급했듯이 locale.inc의 _locale_parse_js_file 함수는 1493 행 (Drupal 7.22에서)부터 Drupal.t ( "somestring") 패턴의 구문 분석을 담당합니다.

preg_match_all('~
[^\w]Drupal\s*\.\s*t\s*                       # match "Drupal.t" with whitespace
\(\s*                                         # match "(" argument list start
(' . LOCALE_JS_STRING . ')\s*                 # capture string argument
(?:,\s*' . LOCALE_JS_OBJECT . '\s*            # optionally capture str args
  (?:,\s*' . LOCALE_JS_OBJECT_CONTEXT . '\s*) # optionally capture context
?)?                                           # close optional args
[,\)]                                         # match ")" or "," to finish
~sx', $file, $t_matches);

시맨틱을 신경 쓰지 않고받는 파일에서 Drupal.t ( "something")의 모든 인스턴스를 찾기 만하는 "멍청한"구문 분석 함수일뿐입니다.

일반적인 문제점은 Drupal.t ( "translateme") 형식으로 소스 코드에 전체 문자열이 있어야한다는 것입니다. PHP에서 file_get_contents를 통해 파일을 열 때 자바 스크립트가 실행되지 않기 때문입니다. 즉, Drupal.t (somevariable)를 수행 할 수 없으며 Drupal이 Drupal.t에서 던지는 모든 문자열 포함 자바 스크립트 변수를 포착 할 수 있기를 바랍니다.

차트의 "women"을 번역하고 문자열에 컨텍스트를 제공하려는 경우 구문은 다음과 같습니다.

Drupal.t("women", {}, {context: "charts"}

또한 drush를 설치 한 경우 다음 명령으로 js 파일이 구문 분석되었는지 확인하십시오.

drush vget javascript_parsed

그런 다음 캐시를 정리할 수 있습니다

drush cc all

... 위의 vget 명령을 반복하여 이미 구문 분석 된 파일 목록이 비어 있는지 확인하십시오. 이렇게하면 다음에 파일을 다시 분석 할 수 있습니다 (확인하십시오).


1
감사합니다 drush vget javascript_parsed! 번역 스크립트 파일을 강제로 다시 작성하는 빠른 방법은을 사용하여 CSS 및 JS 파일을 제거하는 것 drush @sitealias cc css-js입니다.
lmeurs

0

Drupal 7에서 다국어 JS를 구현하는 동안 몇 가지 문제가 발생했습니다.

  1. 먼저 JS 파일이 inline에 포함되어 있지 않은지 확인하십시오 . Drupal 7.22부터 Drupal에서 JavaScript 파일을 인라인하는Drupal.locale.strings 경우 자동으로 업데이트되지 않는 것 같습니다 . 어쨌든 번역 인터페이스는 여전히 문자열을 집어 들고 혼란에 빠졌습니다.

  2. 둘째, Drupal.behaviors 를 사용하여 JS를 페이지에 연결하십시오. 규칙적인 JS 폐쇄는 Drupal의 "마법" Drupal.t()호출 분석을 트리거하지 않습니다 . 이것은 기술적으로 당신이 어쨌든해야 할 일입니다.)

거기에서 그것은 정말로 고통스럽지 않습니다. 그냥 사용 Drupal.t()하면 번역 할 텍스트를 주위 때마다이 파일을 업데이트하고 번역자의 인터페이스에서 새 문자열을 볼 수 캐시를 지 웁니다 /admin/config/regional/translate/translate. 일단 작동하면 꽤 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.