요구 사항 :
내 사이트가
인증 된 사용자로서 여러 언어 로 작동
하려면 내 사이트의 코드베이스에서 t () 함수로 수행 된 모든 번역 호출을 한 번에 번역 할 수 있어야합니다.
요구 사항 설명이 원하는 내용과 비슷합니까?
겉옷
누군가가 말했듯이 크롤러는 이론적 으로 전체 t () 호출을 등록하기 위해 전체 사이트를 통과 할 수 있습니다. 그러나 1) 크롤러는 크롤링 할 페이지를 모릅니다. 2) 크롤링 할 페이지 목록을 유지하려고하지 않습니다. 3) 크롤러를 사용하고 싶지 않습니다. 와우. 그냥 권리?
문제
- 모든 번역 문자열 목록이 없습니다.
- Drupal / PHP는 컴파일 된 C와 달리 동적 언어입니다. 예를 들어, 전체 코드베이스를 컴파일 한 다음이 함수의 모든 인스턴스를 찾은
t()
다음 데이터베이스에 해당 인스턴스를 등록 한 다음 등록 된 모든 인스턴스를 한 번에 번역하십시오 t()
. 나는 우리가 테이블에 가지고있는 옵션이라고 생각하지 않습니다.
- 정적 코드 분석 도구는 크롤러가 무력한 것과 같은 이유로 무력합니다. 나는 이것을 찾았다
t()
이 파일에서 이것을 . 큰! 어떤 URL에 사용됩니까? 문맥이 무엇입니까?
현재 도구 (Drupal 및 일부 contrib 모듈) 및 현재 제약 조건 (실시간 테마 호출-> 템플릿 파일-> t()
호출 에 의존)으로 문제를 공격하는 것은 출구가없는 골목처럼 보입니다. 상자에서 약간 생각해야 할 수도 있습니다.
우리가 필요한 것
- 현재 번역 문자열과 컨텍스트가 무엇인지 알려주는 데이터 소스, 모델이 필요합니다.
- 능동적 데이터 모델. 현재 데이터 모델이 반응 형입니다 (호출이
t()
발생할 때마다 모델이 업데이트 됨 ). 사전 예방 적 데이터 모델이 필요합니다.이 모델은 애플리케이션이 t()
실제로 고객에 의해 실행되기 전에 인스턴스 를 찾도록합니다 .
- 상황이 필요합니다.
t()
'foo'를 번역하고 있다는 것을 모르기 때문에 번역 할 대상 언어는 t()
발생 위치의 URL에 따라 다릅니다 . t()
랩퍼 호출을 사용하여 대상 언어를 호출 로 하드 코딩 할 수 있어도 목적에 맞지 않습니다.
나는 우리가 가지고 있다면 우리의 문제를 도울 수있는 몇 가지 도구를 찾아 냈다. 이 도구를 사용하여 데이터 모델로 들어가서 아직 채워지지 않은 모든 문자열을 줄 t()
수 있습니다. 이제이 번역들을 삽입하십시오. 감사합니다.
다음에 고객이 오면 번역이 이루어집니다.
이 도구들을 어떻게 만들까요?
제약
- 대상 언어는 템플릿에있을 수 없으며 URL에 의해 결정됩니다. 문자열이 모든 언어를 지원해야한다고 가정하십시오.
- 번역 된 문자열은 템플릿에있을 수 없습니다. 번역은 데이터베이스에 상주합니다.
이제 문제에 대해 더 많은 생각을하고 몇 가지 과제와 제약을 확인 했으므로 사용 가능한 솔루션을 찾거나 사용자 지정 솔루션을 만드는 것에 대해 생각할 수 있습니다.
솔루션 브레인 스토밍
"모든 것"을 묶는 무언가가 필요합니다. 엔티티는 어떻습니까?
- 번역 할 제품을 보유 할 수 있습니다.
- 엔티티는 변환해야하는 제품과 컨텍스트 간의 관계 (접착제)를 제공 할 수 있습니다.
- 엔티티는 필드에서 제품의 기본 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을 기록합니까? "컨텍스트"를 변경할 수 있습니까? 상황은 어디에 기록됩니까? "동적"템플릿이있는 경우, 즉 제품 당 하나 이상의 템플릿이있는 경우와 이러한 변형을 감지하는 방법은 무엇입니까?
항상 그렇듯이 이론 및 의사 코드는 브레인 스토밍에만 유용합니다. 그러나 개발 과정에서 프로토 타이핑을 시작할 때까지 우리가 실제로 무엇을하고 있는지 알 수 없습니다. 따라서 몇 가지 제약 조건, 가능한 솔루션 및 가능한 문제 또는 질문을 작성했습니다. 이제 개념 증명 또는 작동중인 프로토 타입을 구현할 수 있습니다. 위의 공개 질문 중 일부는이 방법으로 만 답변 할 수 있으며, 성공 또는 실패 여부에 관계없이 가장 초기에 프로토 타입을 작성하면 해당 질문에 대한 답변을 시작하거나 접근 방식을 완전히 변경할 수 있습니다. 지켜봐주세요 ~
wget
또는 무엇이든 사용할 수 있습니다 . 해 키시, 그러나 당신은 그것이 허용되었다고 말 했어요 (: