태그 보관물: 7

7

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

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

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



답변

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

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

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


답변

오늘이 같은 문제에 부딪 히고 조금 더 연구했습니다. 위의 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 명령을 반복하여 이미 구문 분석 된 파일 목록이 비어 있는지 확인하십시오. 이렇게하면 다음에 파일을 다시 분석 할 수 있습니다 (확인하십시오).


답변

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. 일단 작동하면 꽤 좋습니다.


답변