Calling all Drupal developers!
Help us get this on the first page of Digg. DIGG NOW!
Help us get this on the first page of Digg. DIGG NOW!
<?php
// $Id: i18nprofile.module,v 1.6.2.1 2008/03/14 20:30:59 jareyero Exp $
/**
* Internationalization (i18n) submodule: Profile translation
*
* Allows translation of profile categories and fields
*
* @author Jose A. Reyero, 2006
*
*/
/**
* Implementation of hook_help()
*/
function i18nprofile_help($section = 'admin/help#i18nmenu' ) {
switch ($section) {
case 'admin/modules#description' :
return t('Supports translation for profile module field names and descriptions.' );
}
}
/**
* Implementation of hook_locale().
*/
function i18nprofile_locale($op = 'groups', $group = NULL) {
switch ($op) {
case 'groups':
return array('profile' => t('Profile'));
case 'refresh':
if ($group == 'profile') {
return i18nprofile_locale_refresh();
}
}
}
/**
* Refresh strings
*/
function i18nprofile_locale_refresh() {
$result = db_query('SELECT * FROM {profile_fields}');
$categories = array();
while ($field = db_fetch_object($result)) {
// Store strings to translate: title, explanation, options
to("profile:field:$field->name", $field, array('title', 'explanation', 'options'), NULL, TRUE);
// Store category if not there yet
if (!isset($categories[$field->category])) {
tt("profile:category", $field->category, NULL, TRUE);
$categories[$field->category] = 1;
}
}
}
/**
* 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];
}