diff --git a/plugins/views_plugin_display.inc b/plugins/views_plugin_display.inc index db124de..0fe553c 100644 --- a/plugins/views_plugin_display.inc +++ b/plugins/views_plugin_display.inc @@ -2960,6 +2960,24 @@ class views_plugin_display extends views_plugin { return $output; } + function unpack_translatable(&$translatable, $storage, $option, $definition, $parents, $keys = array()) { + // Do not export options for which we have no settings. + if (!isset($storage[$option])) { + return; + } + + // Special handling for display extenders. + if (isset($definition['unpack_translatable']) && !method_exists($this, $definition['unpack_translatable'])) { + foreach ($this->extender as $extender) { + if (method_exists($extender, $definition['unpack_translatable'])) { + return $extender->{$definition['unpack_translatable']}($translatable, $storage, $option, $definition, $parents, $keys); + } + } + } + + parent::unpack_translatable($translatable, $storage, $option, $definition, $parents, $keys); + } + function unpack_style($indent, $prefix, $storage, $option, $definition, $parents) { $output = ''; $style_plugin = $this->get_plugin(); diff --git a/tests/test_plugins/views_test_plugin_display_extender.inc b/tests/test_plugins/views_test_plugin_display_extender.inc index e69de29..4ae8708 100644 --- a/tests/test_plugins/views_test_plugin_display_extender.inc +++ b/tests/test_plugins/views_test_plugin_display_extender.inc @@ -0,0 +1,27 @@ + array(), 'unpack_translatable' => 'unpack_string_array'); + } + + function unpack_string_array(&$translatable, $storage, $option, $definition, $parents, $keys = array()) { + $strings = $storage[$option]; + if (!empty($strings)) foreach ($strings as $index => $string) { + $translation_keys = array_merge($keys, array($index)); + $translatable[] = array( + 'value' => $string, + 'keys' => $translation_keys, + 'format' => NULL, + ); + } + } +} diff --git a/tests/views_translatable_display_extender.test b/tests/views_translatable_display_extender.test index e69de29..eaeb7cb 100644 --- a/tests/views_translatable_display_extender.test +++ b/tests/views_translatable_display_extender.test @@ -0,0 +1,239 @@ + 'Display extender translatable test', + 'description' => 'Tests the pluggable translations with display extenders', + 'group' => 'Views Plugins', + ); + } + + /** + * The views plugin definition. Override it if you test provides a plugin. + */ + public function viewsPlugins() { + return array( + 'localization' => array( + 'test' => array( + 'no ui' => TRUE, + 'title' => t('Test'), + 'help' => t('This is a test description.'), + 'handler' => 'views_plugin_localization_test', + 'parent' => 'parent', + 'path' => drupal_get_path('module', 'views') .'/tests', + ), + ), + 'display_extender' => array( + 'test_display_extender' => array( + 'title' => t('Views test display extender'), + 'path' => drupal_get_path('module', 'views') .'/tests/test_plugins', + 'handler' => 'views_test_plugin_display_extender', + ), + ), + ); + } + + public function setUp() { + parent::setUp(); + + variable_set('views_localization_plugin', 'test'); + variable_set('views_display_extenders', array('test_display_extender')); + // Reset the plugin data. + views_fetch_plugin_data(NULL, NULL, TRUE); + $this->strings = array('Master1', 'Apply1', 'Sort By1', 'Asc1', 'Desc1', 'more1', 'Reset1', 'Offset1', 'Master1', 'title1', 'Items per page1', 'fieldlabel1', 'filterlabel1', 'String1', 'String2'); + $this->enableViewsUi(); + } + + /** + * Tests the unpack translation funtionality. + */ + public function testUnpackTranslatable() { + $view = $this->view_unpack_translatable(); + $view->init_localization(); + + $this->assertEqual('views_plugin_localization_test', get_class($view->localization_plugin), 'Make sure that init_localization initializes the right translation plugin'); + + $view->export_locale_strings(); + + $expected_strings = $this->strings; + $result_strings = $view->localization_plugin->get_export_strings(); + $this->assertEqual(sort($expected_strings), sort($result_strings), 'Make sure that the localization plugin got every translatable string.'); + } + + public function testUi() { + // Make sure that the string is not translated in the UI. + $view = $this->view_unpack_translatable(); + $view->save(); + views_invalidate_cache(); + + $admin_user = $this->drupalCreateUser(array('administer views', 'administer site configuration')); + $this->drupalLogin($admin_user); + + $this->drupalGet("admin/structure/views/view/$view->name/edit"); + $this->assertNoText('-translated', 'Make sure that no strings get translated in the UI.'); + } + + /** + * Make sure that the translations get into the loaded view. + */ + public function testTranslation() { + $view = $this->view_unpack_translatable(); + $view->set_display('default'); + $this->executeView($view); + + $expected_strings = array(); + foreach ($this->strings as $string) { + $expected_strings[] = $string .= '-translated'; + } + $this->assertEqual(sort($expected_strings), sort($view->localization_plugin->translated_strings), 'Make sure that every string got loaded translated'); + } + + /** + * Make sure that the different things have the right translation keys. + */ + public function testTranslationKey() { + $view = $this->view_unpack_translatable(); + $view->editing = TRUE; + $view->init_display(); + + // Don't run translation. We just want to get the right keys. + + foreach ($view->display as $display_id => $display) { + $translatables = array(); + $display->handler->unpack_translatables($translatables); + + $this->string_keys = array( + 'Apply1' => array('exposed_form', 'submit_button'), + 'Sort By1' => array('exposed_form', 'exposed_sorts_label'), + 'Asc1' => array('exposed_form', 'sort_asc_label'), + 'Desc1' => array('exposed_form', 'sort_desc_label'), + 'more1' => array('use_more_text'), + 'Reset1' => array('exposed_form', 'reset_button_label'), + 'Offset1' => array('pager', 'expose', 'offset_label'), + 'title1' => array('title'), + 'Tag first1' => array('pager', 'tags', 'first'), + 'Tag prev1' => array('pager', 'tags', 'previous'), + 'Tag next1' => array('pager', 'tags', 'next'), + 'Tag last1' => array('pager', 'tags', 'last'), + 'Items per page1' => array('pager', 'expose', 'items_per_page_label'), + 'fieldlabel1' => array('field', 'node', 'nid', 'label'), + 'filterlabel1' => array('filter', 'node', 'nid', 'expose', 'label'), + '- All -' => array('pager', 'expose', 'items_per_page_options_all_label'), + 'Header1' => array('header', 'views', 'area', 'content'), + 'String1' => array('string1'), + 'String2' => array('string2'), + ); + + $formats = array( + 'Header1' => 'filtered_html', + ); + + foreach ($translatables as $translatable) { + $this->assertEqual($translatable['keys'], $this->string_keys[$translatable['value']]); + + // Make sure the format is correct. + if (isset($formats[$translatable['value']])) { + $this->assertEqual($translatable['format'], $formats[$translatable['value']]); + } + else { + $this->assertNull($translatable['format'], 'No format defined'); + } + + // Unset the test array. It should be empty at the end of this loop. + unset($this->string_keys[$translatable['value']]); + } + + $this->assert(empty($this->string_keys), t('Missed the following strings: !strings', array('!strings' => implode(', ', array_keys($this->string_keys))))); + } + } + + public function view_unpack_translatable() { + $view = new view; + $view->name = 'view_unpack_translatable'; + $view->description = ''; + $view->tag = ''; + $view->base_table = 'node'; + $view->api_version = '3.0-alpha1'; + $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */ + + /* Display: Master */ + $handler = $view->new_display('default', 'Master1', 'default'); + $handler->display->display_options['title'] = 'title1'; + $handler->display->display_options['use_more_text'] = 'more1'; + $handler->display->display_options['access']['type'] = 'none'; + $handler->display->display_options['cache']['type'] = 'none'; + $handler->display->display_options['query']['type'] = 'views_query'; + $handler->display->display_options['exposed_form']['type'] = 'basic'; + $handler->display->display_options['exposed_form']['options']['submit_button'] = 'Apply1'; + $handler->display->display_options['exposed_form']['options']['reset_button'] = TRUE; + $handler->display->display_options['exposed_form']['options']['reset_button_label'] = 'Reset1'; + $handler->display->display_options['exposed_form']['options']['exposed_sorts_label'] = 'Sort By1'; + $handler->display->display_options['exposed_form']['options']['sort_asc_label'] = 'Asc1'; + $handler->display->display_options['exposed_form']['options']['sort_desc_label'] = 'Desc1'; + $handler->display->display_options['pager']['type'] = 'full'; + $handler->display->display_options['pager']['options']['items_per_page'] = '10'; + $handler->display->display_options['pager']['options']['offset'] = '0'; + $handler->display->display_options['pager']['options']['id'] = '0'; + $handler->display->display_options['pager']['options']['quantity'] = '9'; + $handler->display->display_options['pager']['options']['tags']['first'] = 'Tag first1'; + $handler->display->display_options['pager']['options']['tags']['previous'] = 'Tag prev1'; + $handler->display->display_options['pager']['options']['tags']['next'] = 'Tag next1'; + $handler->display->display_options['pager']['options']['tags']['last'] = 'Tag last1'; + $handler->display->display_options['pager']['options']['expose']['items_per_page'] = TRUE; + $handler->display->display_options['pager']['options']['expose']['items_per_page_label'] = 'Items per page1'; + $handler->display->display_options['pager']['options']['expose']['offset'] = TRUE; + $handler->display->display_options['pager']['options']['expose']['offset_label'] = 'Offset1'; + $handler->display->display_options['style_plugin'] = 'default'; + $handler->display->display_options['row_plugin'] = 'fields'; + /* Global: Header */ + $handler->display->display_options['header']['area']['id'] = 'area'; + $handler->display->display_options['header']['area']['table'] = 'views'; + $handler->display->display_options['header']['area']['field'] = 'area'; + $handler->display->display_options['header']['area']['empty'] = FALSE; + $handler->display->display_options['header']['area']['content'] = 'Header1'; + $handler->display->display_options['header']['area']['format'] = 'filtered_html'; + $handler->display->display_options['header']['area']['tokenize'] = 0; + /* Field: Content: Nid */ + $handler->display->display_options['fields']['nid']['id'] = 'nid'; + $handler->display->display_options['fields']['nid']['table'] = 'node'; + $handler->display->display_options['fields']['nid']['field'] = 'nid'; + $handler->display->display_options['fields']['nid']['label'] = 'fieldlabel1'; + $handler->display->display_options['fields']['nid']['alter']['alter_text'] = 0; + $handler->display->display_options['fields']['nid']['alter']['make_link'] = 0; + $handler->display->display_options['fields']['nid']['alter']['trim'] = 0; + $handler->display->display_options['fields']['nid']['alter']['word_boundary'] = 1; + $handler->display->display_options['fields']['nid']['alter']['ellipsis'] = 1; + $handler->display->display_options['fields']['nid']['alter']['strip_tags'] = 0; + $handler->display->display_options['fields']['nid']['alter']['html'] = 0; + $handler->display->display_options['fields']['nid']['hide_empty'] = 0; + $handler->display->display_options['fields']['nid']['empty_zero'] = 0; + $handler->display->display_options['fields']['nid']['link_to_node'] = 0; + /* Filter: Content: Nid */ + $handler->display->display_options['filters']['nid']['id'] = 'nid'; + $handler->display->display_options['filters']['nid']['table'] = 'node'; + $handler->display->display_options['filters']['nid']['field'] = 'nid'; + $handler->display->display_options['filters']['nid']['exposed'] = TRUE; + $handler->display->display_options['filters']['nid']['expose']['operator_id'] = 'nid_op'; + $handler->display->display_options['filters']['nid']['expose']['label'] = 'filterlabel1'; + $handler->display->display_options['filters']['nid']['expose']['identifier'] = 'nid'; + $handler->display->display_options['filters']['nid']['expose']['multiple'] = 1; + $handler->display->display_options['filters']['nid']['expose']['reduce'] = 0; + $handler->display->display_options['strings'] = array( + 'string1' => 'String1', + 'string2' => 'String2', + ); + + return $view; + } +} diff --git a/views.info b/views.info index 474510c..e4577f6 100644 --- a/views.info +++ b/views.info @@ -282,6 +282,7 @@ files[] = tests/handlers/views_handler_sort.test files[] = tests/test_handlers/views_test_area_access.inc files[] = tests/test_plugins/views_test_plugin_access_test_dynamic.inc files[] = tests/test_plugins/views_test_plugin_access_test_static.inc +files[] = tests/test_plugins/views_test_plugin_display_extender.inc files[] = tests/test_plugins/views_test_plugin_style_test_mapping.inc files[] = tests/plugins/views_plugin_display.test files[] = tests/styles/views_plugin_style_jump_menu.test @@ -303,6 +304,7 @@ files[] = tests/views_module.test files[] = tests/views_pager.test files[] = tests/views_plugin_localization_test.inc files[] = tests/views_translatable.test +files[] = tests/views_translatable_display_extender.test files[] = tests/views_query.test files[] = tests/views_upgrade.test files[] = tests/views_test.views_default.inc