템플릿의 문자열을 모든 페이지에서 번역 할 수있게 만드는 방법은 무엇입니까?


14

t()* .tpl.php 파일에 대한 호출이 있습니다. 예를 들어, products와 product.tpl.php 파일에 대해 이야기한다고 가정 해 봅시다.

템플릿의 문자열은 실제로 사용될 때까지 인식되지 않습니다. 거기에 있었다 Drupal.org 스레드 그것에 대해와 나는 그것이 정확 발견했다. 안타깝게도 http://example.com/pl/product/200 으로 이동하면 해당 문자열이 필드가로 설정된 {locales_source}테이블에 저장 location됩니다 /pl/product/200.

현지화 클라이언트 모듈의 현장 번역 도구를 사용하여 번역 할 수있는 사용자가 필요 하므로 실제로 번역중인 내용을 실제로 볼 수 있습니다. 소스 위치가로 설정된 경우 /pl/product/200ID가 200 인 제품 만이 문자열이 번역 된 것으로 표시됩니다. 더 나쁜 것은 사용자가 특정 제품을 번역하도록 강요 할 수 있다면 러시아어로 번역 할 수 있어야하며 위치가로 설정된 제품이 없습니다 /ru/product/PID.

l10n_client 도구에서 모든 제품에 모든 문자열이 표시되도록 데이터베이스에서 위치 문자열을 다시 형식화하는 방법이 있습니까?

나는 그것을 설정하려고 시도했다.

  • ; sites/default/themes/mytheme/product.tpl.php,
  • sites/default/themes/mytheme/product.tpl.php,
  • sites/default/modules/mymodule/mymodule.module (테마 데이터를 생성하는 모듈)

그러나 번역 도구에는 보이지 않습니다.

Localization client 의 버그가 아니라고 확신합니다 .이 문자열이 발생했다는 문자열을 보여줍니다. 그리고 그것은 Drupal 7 번역 시스템에서도 "작동하는 방식"인 것 같습니다. 이미 논의되고보고되었지만 아무런 변화가 없었습니다. 따라서 이것은 버그 리포트가 아니며, 우리가 다루어야 할 작업을 수행하는 방법을 묻습니다.


데이터 모듈이 작동 하는 것과 관련이 없는 텍스트에 대해 이야기 하고 있습니다. 제품을 번역하고 싶지 않고 제품 이미지 갤러리 템플릿의 이전-다음과 같이 제품 자체와 관련이없는 템플릿 문자열 만 있습니다.

예를 들어, 모듈은 썸네일 15 개를 반환하며 한 번에 5 개를 표시하는 것은 테마 작업입니다. 그리고 이전 / 다음 링크 요구 alttitle속성. 번역했습니다. 그러나 내 모듈은 그것을 모른다. 그리고 절대로 필요하지 않습니다.


원하는 것을 완전히 이해했는지 확실하지 않지만 모든 언어로 사이트를 크롤링하는 것으로 충분합니까? 예를 들어 사용할 수 있습니다. xmlsitemap을 사용하여 여러 언어로 링크를 생성 한 후 wget또는 무엇이든 사용할 수 있습니다 . 해 키시, 그러나 당신은 그것이 허용되었다고 말 했어요 (:
Andy

@Andy Localization Client를 사용하면 페이지 하단의 막대를 열고 해당 페이지에 표시되는 텍스트를 볼 때 직접 번역 할 수 있습니다. 모든 텍스트를 올바로 내보낼 수 있지만 그게 정확한 것은 아닙니다.
Mołot

1
drupal_set_message ()와 dpm ()에서 page.tpl.php에서 호출 될 경우이 메시지들은 다음 요청을 위해 대기 할 것임을 기억합니다. 메시지가 처리 된 후 템플릿은 일반적으로 요청에서 상당히 늦게 처리되기 때문입니다. t () 및 현지화 클라이언트의 경우와 비슷한 경우가 있습니다.
donquixote

좋은 질문. 좋은 문제입니다.
아마추어 바리 스타

단지 제안 ... 사용자가 언제든지 어떤 언어로 tpl t () 문자열을 번역 할 수있게하려면 번역 템플릿 추출기 ( drupal.org/project/potx )를 사용 하여이 문자열을 추출 하고 Poedit와 같은 도구로 번역 할 수있는 ( poedit.net ). 이 문자열을 정적 문자열로 제시하면 각 번역가가 한 번에 작업을 수행합니다.
Kojo

답변:


5

요구 사항 :
내 사이트가
인증 된 사용자로서 여러 언어 로 작동
하려면 내 사이트의 코드베이스에서 t () 함수로 수행 된 모든 번역 호출을 한 번에 번역 할 수 있어야합니다.

요구 사항 설명이 원하는 내용과 비슷합니까?


겉옷

누군가가 말했듯이 크롤러는 이론적 으로 전체 t () 호출을 등록하기 위해 전체 사이트를 통과 할 수 있습니다. 그러나 1) 크롤러는 크롤링 할 페이지를 모릅니다. 2) 크롤링 할 페이지 목록을 유지하려고하지 않습니다. 3) 크롤러를 사용하고 싶지 않습니다. 와우. 그냥 권리?


문제

  1. 모든 번역 문자열 목록이 없습니다.
  2. Drupal / PHP는 컴파일 된 C와 달리 동적 언어입니다. 예를 들어, 전체 코드베이스를 컴파일 한 다음이 함수의 모든 인스턴스를 찾은 t()다음 데이터베이스에 해당 인스턴스를 등록 한 다음 등록 된 모든 인스턴스를 한 번에 번역하십시오 t(). 나는 우리가 테이블에 가지고있는 옵션이라고 생각하지 않습니다.
  3. 정적 코드 분석 도구는 크롤러가 무력한 것과 같은 이유로 무력합니다. 나는 이것을 찾았다t()이 파일에서 이것을 . 큰! 어떤 URL에 사용됩니까? 문맥이 무엇입니까?

현재 도구 (Drupal 및 일부 contrib 모듈) 및 현재 제약 조건 (실시간 테마 호출-> 템플릿 파일-> t()호출 에 의존)으로 문제를 공격하는 것은 출구가없는 골목처럼 보입니다. 상자에서 약간 생각해야 할 수도 있습니다.


우리가 필요한 것

  1. 현재 번역 문자열과 컨텍스트가 무엇인지 알려주는 데이터 소스, 모델이 필요합니다.
  2. 능동적 데이터 모델. 현재 데이터 모델이 반응 형입니다 (호출이 t()발생할 때마다 모델이 업데이트 됨 ). 사전 예방 적 데이터 모델이 필요합니다.이 모델은 애플리케이션이 t()실제로 고객에 의해 실행되기 전에 인스턴스 를 찾도록합니다 .
  3. 상황이 필요합니다. t()'foo'를 번역하고 있다는 것을 모르기 때문에 번역 할 대상 언어는 t()발생 위치의 URL에 따라 다릅니다 . t()랩퍼 호출을 사용하여 대상 언어를 호출 로 하드 코딩 할 수 있어도 목적에 맞지 않습니다.

나는 우리가 가지고 있다면 우리의 문제를 도울 수있는 몇 가지 도구를 찾아 냈다. 이 도구를 사용하여 데이터 모델로 들어가서 아직 채워지지 않은 모든 문자열을 줄 t()수 있습니다. 이제이 번역들을 삽입하십시오. 감사합니다.

다음에 고객이 오면 번역이 이루어집니다.

이 도구들을 어떻게 만들까요?


제약

  1. 대상 언어는 템플릿에있을 수 없으며 URL에 의해 결정됩니다. 문자열이 모든 언어를 지원해야한다고 가정하십시오.
  2. 번역 된 문자열은 템플릿에있을 수 없습니다. 번역은 데이터베이스에 상주합니다.

이제 문제에 대해 더 많은 생각을하고 몇 가지 과제와 제약을 확인 했으므로 사용 가능한 솔루션을 찾거나 사용자 지정 솔루션을 만드는 것에 대해 생각할 수 있습니다.

솔루션 브레인 스토밍

"모든 것"을 묶는 무언가가 필요합니다. 엔티티는 어떻습니까?

  • 번역 할 제품을 보유 할 수 있습니다.
  • 엔티티는 변환해야하는 제품과 컨텍스트 간의 관계 (접착제)를 제공 할 수 있습니다.
  • 엔티티는 필드에서 제품의 기본 URL 위치를 지정할 수 있습니다.
  • 토큰은 제품이 나타날 대체 위치 (언어?)를 지정하는 데 사용될 수 있습니다.
  • 엔티티는 우리에게 필요한 사전 예방 적 데이터 모델을 제공하며 컨텍스트입니다. 데이터베이스로 이동하여 모든 제품 엔터티를 가져오고 필드 X, Y 및 Z에 대한 번역 문자열이없는 경우 해당 번역 문자열을 만듭니다.

그런 다음 고객이를 /pl/product/200가져 오면 DB로 이동하여 제품 200을 찾은 후 기존 pl번역을 가져옵니다 . 해당 제품에 대한 제목 및 캡션 필드가 있습니까? 번역도 있어야합니다.

사용중인 번역 모듈 측면에서 매우 모호하고 일반적입니다. 자신의 번역 모듈을 사용하여 결과를 얻을 수 있습니다. 대부분의 경우입니다. 지금까지 Drupal에서 본 모든 번역 모델 (D7부터 아직 D8을 보지 않았 음)은 사전 대응 적이 지 않고 반응 적입니다.

간단히 말해서

이론적으로, 필요한 것을 구축하는 도구가 있습니다. 엔티티는 모든 것을 하나로 묶는 핵심 구성 요소입니다.-데이터 (번역 문자열),-대상 언어. 엔티티 자체에있을 필요는 없으며, 제품 언어에 대해 분류 어 어휘를 사용하는 것이 좋습니다. 또는 다른 엔티티에 대한 일반적인 분류법 일 수도 있습니다. -맥락. 엔터티가 나타나는 URL입니다. URL에는 토큰이 포함되며 토큰은 대상 언어 분류 체계를 참조합니다.

이 세 가지 요소를 사용하면 다음과 같이 말할 수 있습니다. 모든 product엔터티를 URL alias가져와 필드 로 이동 하여 분류 토큰을 가져오고 가능한 모든 용어 조합을 순환하며 매우 큰 못생긴 형태 또는 AJAX를 사용하여 현재 사용자에게 모든 조합을 제시하십시오. 다단계 양식 (그와 비슷한 것)을 사용하고 현재 로그인 한 사용자가 제품 200의 다양한 언어를 번역 할 때 데이터베이스의 어딘가에 저장하십시오

데이터베이스 어딘가에 엔티티의 필드 API 필드, 각 엔티티에 속하는 설정 필드 (정확한 필드 API는 아니지만 여전히 데이터를 보유 할 수 있음) 또는이를 위해 사용하는 별도의 테이블이있을 수 있습니다. 엔터티에 데이터를 저장하면 코드와 데이터를 더 깔끔하고 쉽게 유지할 수 있다고 생각합니다.


그것을 구축 : 가능한 솔루션

  • D8MI (Drupal 8 다국어 이니셔티브)
  • 사용자 정의 코드 : 사용 가능한 번들 및 관련 테마 후크 구현을 프로그래밍 방식으로 쿼리하고 렌더링하여 t ()로 템플리트에서 사용 가능한 "인덱스"변환.

의사 코드

(x 유형의) Foreach 엔티티, 모든 언어 (제품과 관련된 택 소노 미 또는 핵심 언어 )
찾기
, 엔티티 렌더링
-t () 번역 문자열을 감지하기 위해
-렌더링 호출 theme (). 제품 데이터 모델 자체가 아니라 제품

결과 :
-각 언어로 엔티티 템플리트를 렌더링하기위한 첫 번째 호출은 각 호출에 대한 기본 언어 구현을 리턴합니다.
-템플릿의 t () 매개 변수가 이제 Drupal에 캐시되고 번역 할 준비가되었습니다 (각 제품 인스턴스가 아닌 각 언어 인스턴스에 대해).
- "번역자"역할을 가진 사용자는 이제 번역 인터페이스로 이동하여 각 언어에 대해 사용 가능한 모든 t () 매개 변수를 번역 할 수 있습니다.
-사이트 소유자는 고객이 프로그래밍 방식으로 각 제품 페이지를 방문하거나 각 제품 페이지를 수동으로 방문 할 때까지 기다릴 필요가 없습니다.

열린 질문 :
-문맥이 무엇입니까? 각“제품”엔터티 번들에 대해 theme ()을 프로그래밍 방식으로 호출하면 호출 한 위치가 기록됩니까? 노드의 URL을 기록합니까? "컨텍스트"를 변경할 수 있습니까? 상황은 어디에 기록됩니까? "동적"템플릿이있는 경우, 즉 제품 당 하나 이상의 템플릿이있는 경우와 이러한 변형을 감지하는 방법은 무엇입니까?

항상 그렇듯이 이론 및 의사 코드는 브레인 스토밍에만 유용합니다. 그러나 개발 과정에서 프로토 타이핑을 시작할 때까지 우리가 실제로 무엇을하고 있는지 알 수 없습니다. 따라서 몇 가지 제약 조건, 가능한 솔루션 및 가능한 문제 또는 질문을 작성했습니다. 이제 개념 증명 또는 작동중인 프로토 타입을 구현할 수 있습니다. 위의 공개 질문 중 일부는이 방법으로 만 답변 할 수 있으며, 성공 또는 실패 여부에 관계없이 가장 초기에 프로토 타입을 작성하면 해당 질문에 대한 답변을 시작하거나 접근 방식을 완전히 변경할 수 있습니다. 지켜봐주세요 ~


1
전체 게시물을 읽지 않아도 이런 종류의 답변은
공감할만한

요점은 Drupal 7에 필요한 작업을 수행하고 있다고 주장하는 도구가 이미 존재한다는 것입니다. Drupal은 이러한 문자열을 잘못된 메타 데이터로 저장하는 데 문제가 있습니다. 그러나 문자열이 수집되면 문제가없는 db의 메타 데이터를 변경할 수 있습니다. 도구를 볼 수 있도록 무엇을 설정해야하는지 알아야합니다. 또는 적어도 그것이 필요한 것이라고 믿었습니다. 그리고 가장 중요한 것은 제품을 번역하고 싶지 않고 제품 이미지 갤러리 템플릿의 이전-다음과 같이 제품 자체와 관련이없는 템플릿 문자열입니다 .
Mołot

2

Ok, Localization 클라이언트 및 엔터티 번역 모듈을 사용하여 동일한 시나리오를 재현하는 데 시간을 더 보냈습니다. 이 답변은 이전 답변과 완전히 다르므로 별도의 주석으로 추가하십시오.

  1. 하나 / 첫 번째 노드에서 언어에 추가 된 번역은 모든 노드에서 사용할 수 있습니다.

    예를 들면 다음과 같습니다.

    • nid 200과 동일한 유형의 새 제품을 추가하고 pl 변환을 통해 새 노드 (예 : pl / product / 204)를 방문하면 pl / product / 200에 동일한 번역 문자열이 표시됩니다.

    • 차이점은 로컬라이제이션 클라이언트에 나타나지 않는다는 것입니다. 우리는 모듈의 이슈 큐에서이 기능을 요청할 수 있지만, 번역이 현재 페이지에만 국한되지 않고 모든 페이지에 영향을 미치기 때문에 더 혼란을 야기 할 수 있습니다 (예 : pl / product / 200 & pl / product / 204).

    • 두 노드가 서로 다른 두 사람에 의해 생성되고 나중에 노드가 변환을 변경하려면 인터페이스 변환을 사용해야합니다.

  2. 문자열은 동일한 노드에 대해 처음 방문한 언어의 현지화 클라이언트에서 사용 가능합니다.

    예를 들면 다음과 같습니다.

    • 신제품 nid 199를 추가하고 'pl'언어 (nid 200) 및 'rs'언어 (nid 201)에 대한 번역을 생성하면 'rs'페이지가 아니라 'pl'페이지에서만 문자열을 볼 수 있습니다. 다시 말하지만 이는 로컬라이제이션 클라이언트 모듈의 제한 사항처럼 보입니다.

1

템플릿 또는 모듈 파일 수준에서 번역 문자열을 추가하는 방법은 인터페이스 번역 UI에는 효과적이지만 현지화 클라이언트에는 적합하지 않습니다.

분명히 제품 200의 러시아어 버전을 사용하는 경우 Localization 클라이언트를 사용하여 번역 할 수있는 새 노드 (예 : / ru / product / 201)가됩니다.

생각 : 인터페이스 번역 UI에서 모든 언어로 번역 될 수있는 문자열을 찾고 실제로 필요할 때 고객에게 제품 레벨을 번역하도록 요청하십시오. 예를 들면 다음과 같습니다.

"이것은 카테고리 바의 제품 foo입니다"

'foo'& 'bar'이외의 것이 공통 일 수 있다고 확신한다면

$vars['product_title'] = t('This is product @product of category @category')

전처리에서.

.tpl.php 파일은

<?php t($product_title, array('@product' => t('foo'),  '@category' => t('bar')); ?>

title이미지 회전기의 화살표 텍스트에 대한 자세한 내용 입니다. 내 모듈은 테마가 15 개의 이미지를 표시하는 방법에 신경 쓰지 않습니다. 테마는 한 번에 5 개씩 표시 alt되며 title, 필요하고 번역해야하는 "이전"및 "다음"화살표가 표시됩니다 . 프론트 엔드가 변경 될 때마다 모듈을 변경하는 것이 가능하지만 반드시 필요한 것은 아닙니다. 이 문자열은 모듈 자체와 관련없습니다 . 마지막으로, 테마가 변경 된 문자열을 단순히 알지 못할 수도 있습니다. 또는 모듈로 마이그레이션 할 수 없습니다.
Mołot

IMHO,이 경우는 현지화 클라이언트 대신 인터페이스 변환 UI에서 처리해야합니다.
vijaycs85

현지화 클라이언트는 "문제가 표시되면 사이트에서 번역을 수정" 하는 것을 목표로 합니다. -왜 템플릿 파일에 적용되지 않아야합니까? tpl의 문자열은 상황에 따라 더 민감합니다.
Mołot

1

번역 템플릿 추출기 를 사용하여 AFAIK 를 사용하면 t()함수 에 대한 모든 호출 내에서 문자열을 추출 할 수 있습니다 .

번역 템플릿 추출기는 Drupal을위한 웹 기반 명령 줄 Gettext 번역 템플릿 추출기 인터페이스와 번역 가능한 문자열 및 번역 오류를 찾는 재사용 가능한 API를 제공합니다. 이 도구는 http://localize.drupal.org/ 의 후드 아래에서 사용 되며 Drupal.org 프로젝트 릴리스의 구문 분석 기계 역할을합니다.

모듈 번역 방법을 읽어보십시오 .

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