While testing / implementing i18nviews with i18nstrings we found out that we cannot implement a clean translation layer on current localization code of views.

Calling

  $views = views_get_all_views();
  foreach ($views as $view) {
    $view->save_locale_strings();
  }

Results in totally different $source received by views_plugin_localization implementing function save($source)

array(2) {
  ["value"]=> string(9) "Header Text"
  ["keys"]=> array(6) {
    [0]=> string(9) "i18n_elem"
    [1]=> string(7) "default"
    [2]=> string(4) "area"
    [3]=> string(5) "views"
    [4]=> string(4) "area"
    [5]=> string(7) "content"
  }
}

Compared to the keys received by the function translate_string($keys):

array(2) {
  [0]=>
  string(9) "Header Text"
  [1]=>
  array(2) {
    [0]=>
    string(9) "i18n_elem"
    [1]=>
    string(7) "content"
  }
}

The keys should be fully qualified and at least contain a key that is unique per translateable element.
Also we need a clear 1:1 mapping from source locale refresh to translation request.

Note that i18nstrings has the concept of:

textgroup (here always "views")
type: a static grouping of module entities (e.g. view, display, exposed-form,) NON-hierarchical
objectid: the primary ID/machine-name of the item to translate
property: the property of the item to translate (e.g. title, desc, help, label, ...)

They get reduced to a string in the form of:
textgroup:type:objectid:property
Where property (first) and objectid (second) might be left out.

While these mechanics here might be subject to change for future releases, one thing is very important and clear:
i18nstrings NEVER EVER adds strings just by calling something like t(). It only creates translateable strings when explicitly calling i18nstrings_update.
So we need reliable locale update calls here that perfectly map to the translate_string call.

Comments

miro_dietiker’s picture

Referring to the origin of this issue
#1002098: Views header not translated

dawehner’s picture

StatusFileSize
new3.12 KB

The real problem is that unpack_options is not 100% recursive like unpack_translations.

=> It doesn't keep track of all parents.

This patch currently adds the parents to the handler init method
But this will propably have to be added to plugins, too.

miro_dietiker’s picture

Confirming this adds the stack of key identifiers cleanly to the stringid.

A step in the right direction.
However, during the $view->save_locale_strings() now NULL show up in the keys stack.
devel dsm:

0 (String, 9 characters ) i18n_viewname
1 (String, 7 characters ) default
2 (NULL)
3 (String, 5 characters ) views
4 (String, 4 characters ) area
5 (String, 5 characters ) label

Also still no clear mapping between the keys stack and the final string key on translate - and no api known for that.

dawehner’s picture

Assigned: Unassigned » merlinofchaos

Assign to earl.

merlinofchaos’s picture

Status: Active » Needs review
StatusFileSize
new9.25 KB

Let's try this one.

I assume for the keys stack you can just implode it with some kind of separator to turn it into a string.

miro_dietiker’s picture

Applied patch - seems to make the interface much more consistent.

Added a test view i18n_elem as table with fields
- nid
- type
- title
- body
- edit node

This triggers the save many default elements but only some page_1 elements

views:view:i18n_elem:default:pager:items_per_page_label
views:view:i18n_elem:default:pager:items_per_page_options_all_label
views:view:i18n_elem:default:pager:offset_label
views:view:i18n_elem:default:area:views:area:label
views:view:i18n_elem:default:area:views:area:content
views:view:i18n_elem:default:area:views:area:label
views:view:i18n_elem:default:area:views:area:content
views:view:i18n_elem:default:area:views:area:label
views:view:i18n_elem:default:area:views:area:content
views:view:i18n_elem:default:field:node:nid:label
views:view:i18n_elem:default:field:node:type:label
views:view:i18n_elem:default:field:node:title:label
views:view:i18n_elem:default:field:node_revisions:body:label
views:view:i18n_elem:default:field:node:edit_node:label
views:view:i18n_elem:default:display_title
views:view:i18n_elem:default:use_more_text
views:view:i18n_elem:default:exposed_form:submit_button
views:view:i18n_elem:default:exposed_form:reset_button_label
views:view:i18n_elem:default:exposed_form:exposed_sorts_label
views:view:i18n_elem:default:exposed_form:sort_asc_label
views:view:i18n_elem:default:exposed_form:sort_desc_label
views:view:i18n_elem:default:pager:expose:items_per_page_label
views:view:i18n_elem:default:pager:expose:items_per_page_options_all_label
views:view:i18n_elem:default:pager:expose:offset_label
views:view:i18n_elem:default:area:views:area:label
views:view:i18n_elem:default:area:views:area:content
views:view:i18n_elem:default:area:views:area:label
views:view:i18n_elem:default:area:views:area:content
views:view:i18n_elem:default:area:views:area:label
views:view:i18n_elem:default:area:views:area:content
views:view:i18n_elem:default:field:node:nid:label
views:view:i18n_elem:default:field:node:type:label
views:view:i18n_elem:default:field:node:title:label
views:view:i18n_elem:default:field:node_revisions:body:label
views:view:i18n_elem:default:field:node:edit_node:label
views:view:i18n_elem:default:pager:items_per_page_label
views:view:i18n_elem:default:pager:items_per_page_options_all_label
views:view:i18n_elem:default:pager:offset_label
views:view:i18n_elem:page_1:display_title
views:view:i18n_elem:page_1:use_more_text
views:view:i18n_elem:page_1:exposed_form:submit_button
views:view:i18n_elem:page_1:exposed_form:reset_button_label
views:view:i18n_elem:page_1:exposed_form:exposed_sorts_label
views:view:i18n_elem:page_1:exposed_form:sort_asc_label
views:view:i18n_elem:page_1:exposed_form:sort_desc_label
views:view:i18n_elem:page_1:pager:expose:items_per_page_label
views:view:i18n_elem:page_1:pager:expose:items_per_page_options_all_label
views:view:i18n_elem:page_1:pager:expose:offset_label

The view itself only loads page_1 elements, but asks for some (field related) that where not saved.

views:view:i18n_elem:page_1:field:node:nid:label
views:view:i18n_elem:page_1:field:node:type:label
views:view:i18n_elem:page_1:field:node:title:label
views:view:i18n_elem:page_1:field:node_revisions:body:label
views:view:i18n_elem:page_1:field:node:edit_node:label
views:view:i18n_elem:page_1:area:views:area:label
views:view:i18n_elem:page_1:area:views:area:content
views:view:i18n_elem:page_1:area:views:area:label
views:view:i18n_elem:page_1:area:views:area:content
views:view:i18n_elem:page_1:area:views:area:label
views:view:i18n_elem:page_1:area:views:area:content
views:view:i18n_elem:page_1:pager:items_per_page_label
views:view:i18n_elem:page_1:pager:items_per_page_options_all_label
views:view:i18n_elem:page_1:pager:offset_label
views:view:i18n_elem:page_1:pager:items_per_page_label
views:view:i18n_elem:page_1:pager:items_per_page_options_all_label
views:view:i18n_elem:page_1:pager:offset_label

EDIT: As soon as i override the page_1 display fields they get saved (adding a bunch more page_1 field save lines), so the translate query matches.

miro_dietiker’s picture

Status: Needs review » Needs work

Adding note:
Headers, Footers and Empty text are currently NOT translateable.
Views needs to introduce filter information to the $source context - at least on the translation save.

In addition we've noticed that the translation trigger is not called on view save.

merlinofchaos’s picture

Status: Needs work » Needs review
StatusFileSize
new10.56 KB

This patch hopefully addresses the default display issues. It does not address formatting yet. That's going to be more difficult and may be pushed out to a followup patch.

merlinofchaos’s picture

StatusFileSize
new11.17 KB

Last patch was hideously malformed. Try this instead:

miro_dietiker’s picture

Status: Needs review » Reviewed & tested by the community

This seems to make views 3 work cleanly.

Together with i18nviews, translation works out of the box.
Extended topics / features such as translation field format has not been checked.

merlinofchaos’s picture

Version: 6.x-3.x-dev » 7.x-3.x-dev
Status: Reviewed & tested by the community » Patch (to be ported)

Committed to D6. Marking for port to D7.

dawehner’s picture

Status: Patch (to be ported) » Fixed

Commited to 7.x issue.

Status: Fixed » Closed (fixed)

Automatically closed -- issue fixed for 2 weeks with no activity.