t('Profile')); } } /** * Implementation of hook_menu_alter(). * * Replace title callbacks for profile categories */ function i18nprofile_menu_alter(&$items) { $empty_account = new stdClass(); if (($categories = _user_categories($empty_account)) && (count($categories) > 1)) { foreach ($categories as $key => $category) { // 'account' is already handled by the MENU_DEFAULT_LOCAL_TASK. $path = 'user/%user_category/edit/'. $category['name']; if ($category['name'] != 'account' && !empty($items[$path])) { $items[$path]['title callback'] = 'i18nprofile_translate_category'; // Was 'check_plain', $items[$path]['title arguments'] = array($category['title']); // Was array($category['title']) } } } } function i18nprofile_translate_category($title) { return check_plain(tt('profile:category', $title)); } /** * Implementation of hook_profile_alter() * * Translates categories and fields */ function i18nprofile_profile_alter(&$account) { foreach (profile_categories() as $category) { $name = $category['name']; if (!empty($account->content[$name])) { // First ranslate category title then fields $account->content[$name]['#title'] = tt('profile:category', $account->content[$name]['#title']); foreach (element_children($account->content[$name]) as $field) { i18nprofile_form_translate_field($account->content[$name], $field); // Translate value if options field if (!empty($account->content[$name][$field]['#value']) && $options = i18nprofile_field_options($field)) { // Get the value from the account because this one may have been formatted if (isset($options[$account->$field])) { // It may be a link or a paragraph, trick for not loading the field again if ($account->content[$name][$field]['#value'] == check_markup($account->$field)) { $account->content[$name][$field]['#value'] = check_markup($options[$account->$field]); // Plain html } else { // Link $account->content[$name][$field]['#value'] == check_markup(l($account->$field, 'profile/'. $field .'/'. $account->$field)); } } } } } } } /** * Implementation of hook_form_alter() */ function i18nprofile_form_alter(&$form, $form_state, $form_id) { switch ($form_id) { case 'profile_field_form': $form['#submit'][] = 'i18nprofile_field_form_submit'; break; case 'user_profile_form': if (($category = $form['_category']['#value']) && $category != 'account') { i18nprofile_form_translate_category($form, $category); } break; /* elseif ($form_id == 'user_register') { i18nprofile_form_translate_all($form_id, $form); } */ break; } } /** * Process profile_field_form submissions. */ function i18nprofile_field_form_submit($form, &$form_state) { $values = (object)$form_state['values']; // Check old field name in case it has changed $oldname = $form['fields']['name']['#default_value']; if ($oldname != 'profile_' && $oldname != $values->name) { i18nstrings_update_context("profile:field:$oldname:*", "profile:field:$values->name:*"); } // Store category tt("profile:category", $values->category, NULL, TRUE); // Store strings to translate: title, explanation, options to("profile:field:$values->name", $values, array('title', 'explanation', 'options'), NULL, TRUE); } /** * Translate form fields for a given category */ function i18nprofile_form_translate_category(&$form, $category){ if (!empty($form[$category])) { $form[$category]['#title'] = tt('profile:category', $form[$category]['#title']); foreach (element_children($form[$category]) as $field) { i18nprofile_form_translate_field($form[$category], $field); } } } /** * Translate form field * */ function i18nprofile_form_translate_field(&$form, $field) { if (!empty($form[$field]['#title'])) { $form[$field]['#title'] = tt("profile:field:$field:title", $form[$field]['#title']); } if (!empty($form[$field]['#description'])) { $form[$field]['#description'] = tt("profile:field:$field:description", $form[$field]['#description']); } if (!empty($form[$field]['#options'])) { if ($options = i18nprofile_field_options($field, $form[$field]['#options'])) { $form[$field]['#options'] = $options; } } } /** * Translates field options */ function i18nprofile_field_options($field, $source = array()) { if ($translation = tt("profile:field:$field:options", '')) { // Troubles when doing the split, produces empty lines, quick fix $translation = str_replace("\n\r", "\n", $translation); $translation = split("[,\n]", $translation); if ($source) { $options = $source; } else if($source = db_result(db_query("SELECT options FROM {profile_fields} WHERE name = '%s'", $field))) { $source = split("[,\n\r]", $source); $options = array(); } else { return NULL; } foreach ($source as $value) { if ($value != '--') { $string = $translation ? trim(array_shift($translation)) : trim($value); $options[trim($value)] = $string; } } return $options; } } /** * Translate form fields for all categories * * This is useful when we don't know which categories we have, like in the user register form */ function i18nprofile_form_translate_all($form_id, &$form) { $categories = profile_categories(); if(is_array($categories)) { foreach($categories as $category) { if(isset($form[$category['name']])) { i18nprofile_form_translate($form_id, $form, $category['name']); } } } } /** * Returns translated categories * * @ TODO Drupal 6 * * Note: weight must be minor than profile module's for them to be added first * * @param $getraw * Return the raw array of translations */ function i18nprofile_categories($getraw = FALSE) { $language = i18n_get_lang(); if ($translation = variable_get('i18nprofile_'.$language, 0)) { if($getraw) { return $translation; } foreach($translation as $name => $value) { $categories[] = array('name' => $name, 'title' => $value, 'weight' => 2); } return $categories; } else { return array(); } } /** * Returns field translations * * @ TODO Drupal 6 */ function i18nprofile_fields($category){ static $_fields; $language = i18n_get_lang(); if(!isset($_fields[$category])) { $_fields[$category] = array(); // Some special categories $result = db_query("SELECT p.name, p.type, t.* FROM {profile_fields} p INNER JOIN {i18n_profile_fields} t ON p.fid = t.fid WHERE LOWER(p.category) = LOWER('%s') AND t.language='%s'", $category, $language); while($field = db_fetch_object($result)) { $_fields[$category][$field->name] = $field; } } return $_fields[$category]; }