Vấn đề đồng bộ hóa dịch nút với các tham chiếu thực thể


7

Tôi có một loại nội dung với sự hỗ trợ đa ngôn ngữ (dịch nút). Kiểu nội dung này cũng có trường tham chiếu thực thể (mô-đun entityreference:).

Nội dung của tôi là:

/node/1 English story 1
/node/2 French  story 1 (translation of #1)
/node/3 English story 2 with reference to #1
/node/4 French  story 2 (translation of #3) **entityreference problem here**

Tôi đã cấu hình tham chiếu được đồng bộ hóa. Vấn đề là bất cứ khi nào tôi dịch hoặc chỉnh sửa một nút, nó sẽ cố gắng đồng bộ hóa tham chiếu với các bản dịch khác.

Vì vậy, tôi sẽ luôn luôn kết thúc với:

#3 -> #1 (correct)
#4 -> #1 (wrong)

hoặc là:

#3 -> #2 (wrong)
#4 -> #2 (correct)

Tôi có thể giải quyết vấn đề này bằng cách vô hiệu hóa đồng bộ hóa trên trường tham chiếu nhưng sau đó tôi sẽ phải duy trì các tài liệu tham khảo cho tất cả các bản dịch theo cách thủ công, đây là một vấn đề trong một trang web có nhiều bản dịch.

Câu trả lời:


3

Bạn nên thử mô-đun "Đồng bộ hóa các tham chiếu thực thể" ( i18n_entityreference) từ các đóng góp Quốc tế hóa dự án ( i18n_contrib). Cho đến nay, đối với tôi nó trông hoàn hảo. Nó thậm chí hoạt động với các widget hình thức nội tuyến.

Để cài đặt và sử dụng nó:

  1. Cài đặt và kích hoạt mô-đun. Nếu bạn sử dụng drush:

    drush dl i18n_contrib && drush en i18n_entityreference

    (Điều này yêu cầu mô-đun lõi i18n_syncvà sẽ tự động kích hoạt nó nếu chưa được thực hiện. Nó cần thiết để đồng bộ hóa các giá trị trường trên các bản dịch.)

  2. Định cấu hình "Đồng bộ hóa bản dịch" . Về cơ bản, hãy chuyển đến "Cấu trúc → Loại nội dung → [loại nội dung của bạn]" trong menu quản trị, chuyển sang tab "Đồng bộ hóa bản dịch", chọn trường tham chiếu nút của bạn và lưu. Xem ở đây để biết chi tiết .

  3. Sử dụng. Nếu bạn có nội dung hiện có, trường tham chiếu nút sẽ được đồng bộ hóa theo cách nhận biết ngôn ngữ khi bạn lưu bất kỳ nút nào của bộ dịch cho lần tiếp theo.


Cảm ơn. Sẽ thử cái này càng sớm càng tốt và lấy lại cho bạn. Tự hỏi làm thế nào nó sẽ chơi cùng với drupal.org/project/cer
cherouvim

3

Có cùng một vấn đề, đã viết cách giải quyết nhỏ này:

function YOURMODULE_i18n_sync_translation($entity_type, $translation, $translation_language, $source, $source_language, $field_names) {
  foreach ($field_names as $field_name) {
    $info = field_info_field($field_name);
    if ($info['type'] == 'entityreference') {
      $items = field_get_items($entity_type, $source, $field_name);
      foreach ($items as $delta => $item) {
        $translations = translation_node_get_translations($item['target_id']);
        if (isset($translations[$translation_language])) {
          list($id, $vid, $bundle) = entity_extract_ids($entity_type, (object) $translations[$translation_language]);
          $translation->{$field_name}['und'][$delta]['target_id'] = $id;
        }
      }
    }
  }

Lưu ý rằng nó hoạt động tốt khi thay đổi nút nguồn.
cherouvim

2

Có một mô-đun cho điều đó: https://drupal.org/project/i18n_node_Vference

Cung cấp đồng bộ hóa trường i18n cho trường node_Vference.

Các nút tham chiếu được dịch sang ngôn ngữ chính xác. Nếu không có ngôn ngữ như vậy tồn tại, nó bị bỏ qua. Đây là chức năng tương tự như được hỗ trợ bởi bản dịch tham chiếu phân loại trong i18n_taxonomy.


1
Tôi sử dụng mô-đun entityreferencevà không references. Vì vậy, điều này không áp dụng trong trường hợp của tôi.
cherouvim

2

Đoạn mã trong câu trả lời thứ hai sẽ không hoạt động khi chỉnh sửa tham chiếu trong bản dịch. Đó là bởi vì translation_node_get_translations()chấp nhận một tnid là đối số, không phải là một nid. Kiểm tra tài liệu api .

Thay đổi cuộc gọi trong đoạn mã trên thành một cái gì đó như thế này và nó sẽ hoạt động (chỉ đối với các nút, trong trường hợp này):

$referenced_node = node_load($item['target_id']);
$translations = translation_node_get_translations($referenced_node->tnid);

LƯU Ý: Tôi không thể nhận xét về câu trả lời khác, vì vậy tôi sẽ đăng bài này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.