diff --git modules/field/views_handler_field_field.inc modules/field/views_handler_field_field.inc index d2ac0e4..cdbdc85 100644 --- modules/field/views_handler_field_field.inc +++ modules/field/views_handler_field_field.inc @@ -100,6 +100,13 @@ class views_handler_field_field extends views_handler_field { if ($use_groupby || !empty($this->definition['add fields to query'])) { $this->ensure_my_table(); $this->add_additional_fields($fields); + + // Filter by language, if field translation is enabled. + $field = $this->definition['field_info']; + if (field_is_translatable($this->entity_type, $field)) { + $column = $this->table_alias . ".language"; + $this->query->add_where(0, $column, $this->query->options['field_language']); + } } // The revision id inhibits grouping. @@ -124,7 +131,7 @@ class views_handler_field_field extends views_handler_field { function option_definition() { $options = parent::option_definition(); - $field = field_info_field($this->definition['field_name']); + $field = $this->definition['field_info']; $field_type = field_info_field_types($field['type']); $column_names = array_keys($field['columns']); @@ -151,7 +158,7 @@ class views_handler_field_field extends views_handler_field { function options_form(&$form, &$form_state) { parent::options_form($form, $form_state); - $field = field_info_field($this->definition['field_name']); + $field = $this->definition['field_info']; $formatters = _field_view_formatter_options($field['type']); $column_names = array_keys($field['columns']); @@ -299,11 +306,32 @@ class views_handler_field_field extends views_handler_field { 'label' => 'hidden', ); - $render_array = field_view_field($entity_type, $entity, $this->definition['field_name'], $display); + $langcode = $this->field_language(); + $render_array = field_view_field($entity_type, $entity, $this->definition['field_name'], $display, $langcode); return drupal_render($render_array); } else { return ''; } } + + /** + * Return the language code of the language the field should be displayed in, + * according to the settings. + */ + function field_language() { + global $language_content; + + if (field_is_translatable($this->entity_type, $this->definition['field_info'])) { + $default_language = language_default('language'); + $language = str_replace(array('***CURRENT_LANGUAGE***', '***DEFAULT_LANGUAGE***'), + array($language_content->language, $default_language), + $this->query->options['field_language']); + + return $language; + } + else { + return LANGUAGE_NONE; + } + } } diff --git modules/locale/views_handler_filter_locale_language.inc modules/locale/views_handler_filter_locale_language.inc index 678197d..6407ba6 100644 --- modules/locale/views_handler_filter_locale_language.inc +++ modules/locale/views_handler_filter_locale_language.inc @@ -8,10 +8,13 @@ class views_handler_filter_locale_language extends views_handler_filter_in_opera function get_value_options() { if (!isset($this->value_options)) { $this->value_title = t('Language'); - $languages = array('***CURRENT_LANGUAGE***' => t("Current user's language"), '***DEFAULT_LANGUAGE***' => t("Default site language"), '***NO_LANGUAGE***' => t('No language')); + $languages = array( + '***CURRENT_LANGUAGE***' => t("Current user's language"), + '***DEFAULT_LANGUAGE***' => t("Default site language"), + LANGUAGE_NONE => t('No language') + ); $languages = array_merge($languages, locale_language_list()); $this->value_options = $languages; } } } - diff --git modules/translation/views_handler_filter_node_language.inc modules/translation/views_handler_filter_node_language.inc index 64ac921..01de09c 100644 --- modules/translation/views_handler_filter_node_language.inc +++ modules/translation/views_handler_filter_node_language.inc @@ -7,10 +7,13 @@ class views_handler_filter_node_language extends views_handler_filter_in_operato function get_value_options() { if (!isset($this->value_options)) { $this->value_title = t('Language'); - $languages = array('***CURRENT_LANGUAGE***' => t("Current user's language"), '***DEFAULT_LANGUAGE***' => t("Default site language"), '***NO_LANGUAGE***' => t('No language')); + $languages = array( + '***CURRENT_LANGUAGE***' => t("Current user's language"), + '***DEFAULT_LANGUAGE***' => t("Default site language"), + LANGUAGE_NONE => t('No language') + ); $languages = array_merge($languages, locale_language_list()); $this->value_options = $languages; } } } - diff --git plugins/views_plugin_query_default.inc plugins/views_plugin_query_default.inc index ba8931f..192a9fb 100644 --- plugins/views_plugin_query_default.inc +++ plugins/views_plugin_query_default.inc @@ -170,6 +170,9 @@ class views_plugin_query_default extends views_plugin_query { 'default' => FALSE, 'bool' => TRUE, ); + $options['field_language'] = array( + 'default' => '***CURRENT_LANGUAGE***', + ); return $options; } @@ -197,6 +200,36 @@ class views_plugin_query_default extends views_plugin_query { '#description' => t('This will make the query attempt to connect to a slave server if available. If no slave server is defined or available, it will fall back to the default server.'), '#default_value' => !empty($this->options['slave']), ); + + $entities = entity_get_info(); + $entity_tables = array(); + $has_translation_handlers = FALSE; + foreach ($entities as $type => $entity_info) { + $entity_tables[] = $entity_info['base table']; + + if (!empty($entity_info['translation'])) { + $has_translation_handlers = TRUE; + } + } + + // Doesn't make sense to show a field setting here if we aren't querying + // an entity base table, or if there's only one language defined. + if (in_array($this->base_table, $entity_tables) && $has_translation_handlers) { + $languages = array( + '***CURRENT_LANGUAGE***' => t("Current user's language"), + '***DEFAULT_LANGUAGE***' => t("Default site language"), + LANGUAGE_NONE => t('No language') + ); + $languages = array_merge($languages, locale_language_list()); + + $form['field_language'] = array( + '#type' => 'select', + '#title' => t('Field Language'), + '#description' => t('All fields which support translations will be displayed in the selected language.'), + '#options' => $languages, + '#default_value' => $this->options['field_language'], + ); + } } // ---------------------------------------------------------------- @@ -780,7 +813,7 @@ class views_plugin_query_default extends views_plugin_query { * The caller is reponsible for ensuring that all fields are fully qualified * (TABLE.FIELD) and that the table already exists in the query. * Internally the dbtng method "where" is used. - * + * * @param $group * The WHERE group to add these to; groups are used to create AND/OR * sections. Groups cannot be nested. Use 0 as the default group. @@ -814,7 +847,7 @@ class views_plugin_query_default extends views_plugin_query { /** * Add a simple HAVING clause to the query. - * + * * The caller is responsible for ensuring that all fields are fully qualified * (TABLE.FIELD) and that the table and an appropriate GROUP BY already exist in the query. * Internally the dbtng method "havingCondition" is used. diff --git views.module views.module index 7b131a7..3412399 100644 --- views.module +++ views.module @@ -133,7 +133,7 @@ function views_theme($existing, $type, $theme, $path) { * The existing cache of theme hooks to test against. * @param $path * The path to search. - * + * * @see drupal_find_theme_templates */ function _views_find_module_templates($cache, $path) { @@ -1290,13 +1290,12 @@ function views_theme_functions($hook, $view, $display = NULL) { * Substitute current time; this works with cached queries. */ function views_views_query_substitutions($view) { - global $language; + global $language_content; return array( '***CURRENT_VERSION***' => VERSION, '***CURRENT_TIME***' => REQUEST_TIME, - '***CURRENT_LANGUAGE***' => $language->language, + '***CURRENT_LANGUAGE***' => $language_content->language, '***DEFAULT_LANGUAGE***' => language_default('language'), - '***NO_LANGUAGE***' => '', ); }