Uutiset:

SMF 2.1.4 has been released! Take it for a spin! Read more.

Main Menu
Advertisement:

Forum Title Language Context Issue

Aloittaja dinsdale, helmikuu 03, 2008, 03:15:16 IP

« edellinen - seuraava »

dinsdale

I've tried to find a programmed option that allows the forum title to change to the current language, but haven't been successful. 

As readers may know, there's only one field in the administration part of SMF to enter the forum title.  The default language is presumed to be permanent context of the forum title.  If you localize the forum to a language other than the forum default, the forum title remains in the default language.

What I wanted to do was have a bilingual site, with the capability to change the forum title between the two chosen languages.  In my particular case, the languages were to be English and Russian.

Not able to find a pre-existing way to do that,  I came up with a solution that involved changing three files: Settings.php (in the forum root dir), Load.php (in the Sources subdir), and index.template.php (within the themes of choice).

Having set the Forum Title field to something like this, delimited by a forward slash, to wit, Forum Name/Имя Форума, I proceeded to use the split method to extract the two versions.

In Settings.php I modified the following section:

########## Forum Info ##########
$mbname = 'Forum Name/Имя Форума';      # The name of your forum.
list($fnEnglish, $fnRussian) = split('/', $mbname);
$mbname = $fnEnglish;

In Load.php, the following was added just above $context['forum_name'] = &$mbname;:

   //mod for dual forum name.

global $context, $mbname, $fnEnglish, $fnRussian;

if ($context['user']['language'] == 'russian') {

$mbname = $fnRussian;
$context['forum_name'] = &$fnRussian;

}

else {

$mbname = $fnEnglish;
$context['forum_name'] = &$fnEnglish;

}

I then commented out the original assignment:

   //$context['forum_name'] = &$mbname;

In the index.template.php file I added the following at the top of function template_main_above() {:

   global $context, $settings, $options, $scripturl, $txt, $modSettings, $mbname, $fnEnglish, $fnRussian;

if ($context['user']['language'] == 'russian') {

$mbname = $fnRussian;
$context['forum_name'] = $fnRussian;

}

else {

$mbname = $fnEnglish;
$context['forum_name'] = $fnEnglish;

}

The pre-existing list of globals were replaced with an augmented list.

This seems to work, tho, I'm not certain it is consistent throughout.  When the language is changed, by, e.g., appending ?language=russian or ?language=english, the forum title changes as intended to match the language context.

On the off chance that anyone here might know of a more efficient and perhaps less dangerous way of achieving the same result, I would greatly appreciate it if they would share that information here.  Thanks.


metallica48423

Well, you could change it to being a $txt string loaded in the language files instead of the option, which is designed only for one title.

if you search index.template.php for $context['forum_name'] (i think thats it, and i believe theres more than one of them), change it to $txt['forum_name'] and then in /Themes/default/languages/index.english.php, add above the ?> at the bottom $txt['forum_name'] = 'title here'; Then it should load that string when using that language.

Similarly, you can edit the other language's index.language.php to achieve the same with the other language
Justin O'Leary
Ex-Project Manager
Ex-Lead Support Specialist

LainaaMicrosoft wants us to "Imagine life without walls"...
I say, "If there are no walls, who needs Windows?"


Useful Links:
Online Manual!
How to Help us Help you
Search
Settings Repair Tool

dinsdale

Thanks for your reply.  That sounds very promising.  I'll give it a go.

I suppose I could do the same thing with forum category and topic names as well.

dinsdale

#3
Okay, I guess I don't yet have a grasp of what to do to make the forum check the language files for forum title.  Simply changing the index.template.php file as advised and adding the $txt['forum_name'] lines to the bottom of index.language.php for each of the languages in the default directory didn't change things.

What else do you need to do to get the forum to look for the alternate titles?

Remember that Load.php has the following assignment (alias):

   $context['forum_name'] = &$mbname;

Also, the Settings.php file has the $mbname variable assignment, the assigned data generated by the form submission under Server Settings.

metallica48423

Don't worry about those -- this bypasses those things.

Can you attach your index.template.php?
Justin O'Leary
Ex-Project Manager
Ex-Lead Support Specialist

LainaaMicrosoft wants us to "Imagine life without walls"...
I say, "If there are no walls, who needs Windows?"


Useful Links:
Online Manual!
How to Help us Help you
Search
Settings Repair Tool

dinsdale

#5
This is the modified index.template.php I was using to test your suggestion.  The only item in that file that contained a $context['forum_name'] was the RSS link.  When I checked source in the web browser (firefox) there was nothing replacing $txt['forum_name'] in that location.


// Version: 1.1; index

/* This template is, perhaps, the most important template in the theme.  It
contains the main template layer that displays the header and footer of
the forum, namely with main_above and main_below.  It also contains the
menu sub template, which appropriately displays the menu; the init sub
template, which is there to set the theme up; (init can be missing.) and
the linktree sub template, which sorts out the link tree.

The init sub template should load any data and set any hardcoded options.

The main_above sub template is what is shown above the main content, and
should contain anything that should be shown up there.

The main_below sub template, conversely, is shown after the main content.
It should probably contain the copyright statement and some other things.

The linktree sub template should display the link tree, using the data
in the $context['linktree'] variable.

The menu sub template should display all the relevant buttons the user
wants and or needs.

For more information on the templating system, please see the site at:
http://www.simplemachines.org/
*/

// Initialize the template... mainly little settings.
function template_init()
{
global $context, $settings, $options, $txt;

/* Use images from default theme when using templates from the default theme?
if this is 'always', images from the default theme will be used.
if this is 'defaults', images from the default theme will only be used with default templates.
if this is 'never' or isn't set at all, images from the default theme will not be used. */
$settings['use_default_images'] = 'never';

/* What document type definition is being used? (for font size and other issues.)
'xhtml' for an XHTML 1.0 document type definition.
'html' for an HTML 4.01 document type definition. */
$settings['doctype'] = 'xhtml';

/* The version this template/theme is for.
This should probably be the version of SMF it was created for. */
$settings['theme_version'] = '1.1';

/* Set a setting that tells the theme that it can render the tabs. */
$settings['use_tabs'] = false;

/* Use plain buttons - as oppossed to text buttons? */
$settings['use_buttons'] = false;

/* Show sticky and lock status seperate from topic icons? */
$settings['seperate_sticky_lock'] = false;
}

// The main sub template above the content.
function template_main_above()
{

global $context, $settings, $options, $scripturl, $txt, $modSettings;

// Show right to left and the character set for ease of translating.
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"', $context['right_to_left'] ? ' dir="rtl"' : '', '><head>
<meta http-equiv="Content-Type" content="text/html; charset=', $context['character_set'], '" />
<meta name="description" content="', $context['page_title'], '" />', empty($context['robot_no_index']) ? '' : '
<meta name="robots" content="noindex" />', '
<meta name="keywords" content="PHP, MySQL, bulletin, board, free, open, source, smf, simple, machines, forum" />
<script language="JavaScript" type="text/javascript" src="', $settings['default_theme_url'], '/script.js?fin11"></script>
<script language="JavaScript" type="text/javascript"><!-- // --><![CDATA[
var smf_theme_url = "', $settings['theme_url'], '";
var smf_images_url = "', $settings['images_url'], '";
var smf_scripturl = "', $scripturl, '";
var smf_iso_case_folding = ', $context['server']['iso_case_folding'] ? 'true' : 'false', ';
var smf_charset = "', $context['character_set'], '";
// ]]></script>
<title>', $context['page_title'], '</title>
<link rel="stylesheet" type="text/css" href="', $settings['theme_url'], '/style.css?fin11" />
<link rel="stylesheet" type="text/css" href="', $settings['default_theme_url'], '/print.css?fin11" media="print" />';

/* Internet Explorer 4/5 and Opera 6 just don't do font sizes properly. (they are big...)
Thus, in Internet Explorer 4, 5, and Opera 6 this will show fonts one size smaller than usual.
Note that this is affected by whether IE 6 is in standards compliance mode.. if not, it will also be big.
Standards compliance mode happens when you use xhtml... */
if ($context['browser']['needs_size_fix'])
echo '
<link rel="stylesheet" type="text/css" href="', $settings['default_theme_url'], '/fonts-compat.css" />';

// Show all the relative links, such as help, search, contents, and the like.
echo '
<link rel="help" href="', $scripturl, '?action=help" target="_blank" />
<link rel="search" href="' . $scripturl . '?action=search" />
<link rel="contents" href="', $scripturl, '" />';

// If RSS feeds are enabled, advertise the presence of one.
if (!empty($modSettings['xmlnews_enable']))
echo '
<link rel="alternate" type="application/rss+xml" title="', $txt['forum_name'], ' - RSS" href="', $scripturl, '?type=rss;action=.xml" />';

// If we're viewing a topic, these should be the previous and next topics, respectively.
if (!empty($context['current_topic']))
echo '
<link rel="prev" href="', $scripturl, '?topic=', $context['current_topic'], '.0;prev_next=prev" />
<link rel="next" href="', $scripturl, '?topic=', $context['current_topic'], '.0;prev_next=next" />';

// If we're in a board, or a topic for that matter, the index will be the board's index.
if (!empty($context['current_board']))
echo '
<link rel="index" href="' . $scripturl . '?board=' . $context['current_board'] . '.0" />';

// Output any remaining HTML headers. (from mods, maybe?)
echo $context['html_headers'], '
</head>
<body>';

// The logo, user information, news, and menu.
echo '
<table cellspacing="0" cellpadding="0" border="0" align="center" width="95%" class="tborder">
<tr style="background-color: #ffffff;">
<td valign="middle" align="left"><img src="', !empty($settings['header_logo_url']) ? $settings['header_logo_url'] : $settings['images_url'] . '/' . $context['user']['language'] . '/smflogo.png', '" alt="" /></td>
<td valign="middle">';

// If the user is logged in, display stuff like their name, new messages, etc.
if ($context['user']['is_logged'])
{
echo '
', $txt['hello_member'], ' <b>', $context['user']['name'], '</b>', $context['allow_pm'] ? ', ' . $txt[152] . ' <a href="' . $scripturl . '?action=pm">' . $context['user']['messages'] . ' ' . ($context['user']['messages'] != 1 ? $txt[153] : $txt[471]) . '</a>' . $txt['newmessages4'] . ' ' . $context['user']['unread_messages'] . ' ' . ($context['user']['unread_messages'] == 1 ? $txt['newmessages0'] : $txt['newmessages1']) : '', '.';

// Are there any members waiting for approval?
if (!empty($context['unapproved_members']))
echo '<br />
', $context['unapproved_members'] == 1 ? $txt['approve_thereis'] : $txt['approve_thereare'], ' <a href="', $scripturl, '?action=viewmembers;sa=browse;type=approve">', $context['unapproved_members'] == 1 ? $txt['approve_member'] : $context['unapproved_members'] . ' ' . $txt['approve_members'], '</a> ', $txt['approve_members_waiting'];

// Is the forum in maintenance mode?
if ($context['in_maintenance'] && $context['user']['is_admin'])
echo '<br />
<b>', $txt[616], '</b>';
}
// Otherwise they're a guest - so politely ask them to register or login.
else
echo '
', $txt['welcome_guest'];

echo '
<br />', $context['current_time'], '
</td>
</tr>
<tr class="windowbg2">
<td colspan="2" valign="middle" align="center" class="tborder" style="border-width: 1px 0 0 0; font-size: smaller;">';

// Show the menu here, according to the menu sub template.
template_menu();

echo '
</td>
</tr>';

// Show a random news item? (or you could pick one from news_lines...)
if (!empty($settings['enable_news']))
echo '
<tr class="windowbg2">
<td colspan="2" height="24" class="tborder" style="border-width: 1px 0 0 0; padding-left: 1ex;">
<b>', $txt[102], ':</b> ', $context['random_news_line'], '
</td>
</tr>';

echo '
</table>

<br />
<table cellspacing="0" cellpadding="10" border="0" align="center" width="95%" class="tborder">
<tr><td valign="top" style="background-color: #ffffff;">';
}

function template_main_below()
{
global $context, $settings, $options, $scripturl, $txt;

echo '
</td></tr>
</table>';

// Show a vB style login for quick login?
if ($context['show_quick_login'])
{
echo '
<table cellspacing="0" cellpadding="0" border="0" align="center" width="95%">
<tr><td nowrap="nowrap" align="right">
<script language="JavaScript" type="text/javascript" src="', $settings['default_theme_url'], '/sha1.js"></script>

<form action="', $scripturl, '?action=login2" method="post" accept-charset="', $context['character_set'], '"', empty($context['disable_login_hashing']) ? ' onsubmit="hashLoginPassword(this, \'' . $context['session_id'] . '\');"' : '', '><br />
<input type="text" name="user" size="7" />
<input type="password" name="passwrd" size="7" />
<select name="cookielength">
<option value="60">', $txt['smf53'], '</option>
<option value="1440">', $txt['smf47'], '</option>
<option value="10080">', $txt['smf48'], '</option>
<option value="43200">', $txt['smf49'], '</option>
<option value="-1" selected="selected">', $txt['smf50'], '</option>
</select>
<input type="submit" value="', $txt[34], '" /><br />
', $txt['smf52'], '
<input type="hidden" name="hash_passwrd" value="" />
</form>
</td></tr>
</table>';
}

// Don't show a login box, just a break.
else
echo '
<br />';

// Show the "Powered by" and "Valid" logos, as well as the copyright.  Remember, the copyright must be somewhere!
echo '
<br />

<table cellspacing="0" cellpadding="3" border="0" align="center" width="95%" class="tborder">
<tr style="background-color: #ffffff;">
<td width="28%" valign="middle" align="right">
<a href="http://www.mysql.com/" target="_blank"><img src="', $settings['images_url'], '/mysql.gif" alt="', $txt['powered_by_mysql'], '" width="88" height="31" border="0" /></a>
<a href="http://www.php.net/" target="_blank"><img src="', $settings['images_url'], '/php.gif" alt="', $txt['powered_by_php'], '" width="88" height="31" border="0" /></a>
</td>
<td width="44%" valign="middle" align="center">
', theme_copyright(), '
</td>
<td width="28%" valign="middle" align="left">
<a href="http://validator.w3.org/check/referer" target="_blank"><img src="', $settings['images_url'], '/valid-xhtml10.gif" alt="', $txt['valid_xhtml'], '" width="88" height="31" border="0" /></a>
<a href="http://jigsaw.w3.org/css-validator/check/referer" target="_blank"><img src="', $settings['images_url'], '/valid-css.gif" alt="', $txt['valid_css'], '" width="88" height="31" border="0" /></a>
</td>
</tr>
</table>';

// Show the load time?
if ($context['show_load_time'])
echo '
<div align="center" class="smalltext">
', $txt['smf301'], $context['load_time'], $txt['smf302'], $context['load_queries'], $txt['smf302b'], '
</div>';

// The following will be used to let the user know that some AJAX process is running
echo '
<div id="ajax_in_progress" style="display: none;', $context['browser']['is_ie'] && !$context['browser']['is_ie7'] ? 'position: absolute;' : '', '">', $txt['ajax_in_progress'], '</div>';

// And then we're done!
echo '
</body>
</html>';
}

// Show a linktree.  This is that thing that shows "My Community | General Category | General Discussion"..
function theme_linktree()
{
global $context, $settings, $options;

// Folder style or inline?  Inline has a smaller font.
echo '<span class="nav"', $settings['linktree_inline'] ? ' style="font-size: smaller;"' : '', '>';

// Each tree item has a URL and name.  Some may have extra_before and extra_after.
foreach ($context['linktree'] as $link_num => $tree)
{
// Show the | | |-[] Folders.
if (!$settings['linktree_inline'])
{
if ($link_num > 0)
echo str_repeat('<img src="' . $settings['images_url'] . '/icons/linktree_main.gif" alt="| " border="0" />', $link_num - 1), '<img src="' . $settings['images_url'] . '/icons/linktree_side.gif" alt="|-" border="0" />';
echo '<img src="' . $settings['images_url'] . '/icons/folder_open.gif" alt="+" border="0" />&nbsp; ';
}

// Show something before the link?
if (isset($tree['extra_before']))
echo $tree['extra_before'];

// Show the link, including a URL if it should have one.
echo '<b>', $settings['linktree_link'] && isset($tree['url']) ? '<a href="' . $tree['url'] . '" class="nav">' . $tree['name'] . '</a>' : $tree['name'], '</b>';

// Show something after the link...?
if (isset($tree['extra_after']))
echo $tree['extra_after'];

// Don't show a separator for the last one.
if ($link_num != count($context['linktree']) - 1)
echo $settings['linktree_inline'] ? ' &nbsp;|&nbsp; ' : '<br />';
}

echo '</span>';
}

// Show the menu up top.  Something like [home] [help] [profile] [logout]...
function template_menu()
{
global $context, $settings, $options, $scripturl, $txt;

// Show the [home] and [help] buttons.
echo '
<a href="', $scripturl, '">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/home.gif" alt="' . $txt[103] . '" border="0" />' : $txt[103]), '</a>', $context['menu_separator'], '
<a href="', $scripturl, '?action=help">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/help.gif" alt="' . $txt[119] . '" border="0" />' : $txt[119]), '</a>', $context['menu_separator'];

// How about the [search] button?
if ($context['allow_search'])
echo '
<a href="', $scripturl, '?action=search">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/search.gif" alt="' . $txt[182] . '" border="0" />' : $txt[182]), '</a>', $context['menu_separator'];

// Is the user allowed to administrate at all? ([admin])
if ($context['allow_admin'])
echo '
<a href="', $scripturl, '?action=admin">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/admin.gif" alt="' . $txt[2] . '" border="0" />' : $txt[2]), '</a>', $context['menu_separator'];

// Edit Profile... [profile]
if ($context['allow_edit_profile'])
echo '
<a href="', $scripturl, '?action=profile">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/profile.gif" alt="' . $txt[79] . '" border="0" />' : $txt[467]), '</a>', $context['menu_separator'];

// The [calendar]!
if ($context['allow_calendar'])
echo '
<a href="', $scripturl, '?action=calendar">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/calendar.gif" alt="' . $txt['calendar24'] . '" border="0" />' : $txt['calendar24']), '</a>', $context['menu_separator'];

// If the user is a guest, show [login] and [register] buttons.
if ($context['user']['is_guest'])
{
echo '
<a href="', $scripturl, '?action=login">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/login.gif" alt="' . $txt[34] . '" border="0" />' : $txt[34]), '</a>', $context['menu_separator'], '
<a href="', $scripturl, '?action=register">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/register.gif" alt="' . $txt[97] . '" border="0" />' : $txt[97]), '</a>';
}
// Otherwise, they might want to [logout]...
else
echo '
<a href="', $scripturl, '?action=logout;sesc=', $context['session_id'], '">', ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/logout.gif" alt="' . $txt[108] . '" border="0" />' : $txt[108]), '</a>';
}

// Generate a strip of buttons, out of buttons.
function template_button_strip($button_strip, $direction = 'top', $force_reset = false, $custom_td = '')
{
global $settings, $buttons, $context, $txt, $scripturl;

if (empty($button_strip))
return '';

// Create the buttons...
foreach ($button_strip as $key => $value)
{
if (isset($value['test']) && empty($context[$value['test']]))
{
unset($button_strip[$key]);
continue;
}
elseif (!isset($buttons[$key]) || $force_reset)
$buttons[$key] = '<a href="' . $value['url'] . '" ' .( isset($value['custom']) ? $value['custom'] : '') . '>' . ($settings['use_image_buttons'] ? '<img src="' . $settings['images_url'] . '/' . ($value['lang'] ? $context['user']['language'] . '/' : '') . $value['image'] . '" alt="' . $txt[$value['text']] . '" border="0" />' : $txt[$value['text']]) . '</a>';

$button_strip[$key] = $buttons[$key];
}

echo '
<td ', $custom_td, '>', implode($context['menu_separator'], $button_strip) , '</td>';
}


dinsdale

So, basically you're saying you don't have any solution to this issue.  Is that a correct reading of your response?

metallica48423

not what i said, i just have to loook at the file, will revisit when i return home
Justin O'Leary
Ex-Project Manager
Ex-Lead Support Specialist

LainaaMicrosoft wants us to "Imagine life without walls"...
I say, "If there are no walls, who needs Windows?"


Useful Links:
Online Manual!
How to Help us Help you
Search
Settings Repair Tool


dinsdale

#9
Okay, in the meantime, I've sort of done what you recommended, but it was a bit more involved.  Thanks to BBEdit multifile search and replace I was able to make changes to files, quickly.  It also helps to have a testbed set up on the Mac desktop.

I replaced every instance of $context['forum_name'] with $txt['forum_name'] by running the BBEdit process from the forum root directory.

In the language index files, in this case, index.english.php and index.russian.php (the UTF-8 encoded version), I added near the top of the file the the assignments to $txt['forum_name'].  There are instances of this further down.  Certainly do not put them at the bottom of the files.

There was one part that didn't respond to these changes and that was the linktree part.  I traced the assignment to a section of the Load.php file, to wit:



// Set the top level linktree up.

array_unshift($context['linktree'], array(
'url' => &$scripturl,
'name' => &$txt['forum_name']
));

$txt = array();



This starts at line 1360.  Of course, the original file had $context['forum_name'] in place of what you see there now.  It turns out, the source of the problem was this bit: $txt = array().  However, I eventually found that if I simply move it above the linktree set-up:



        $txt = array();

        // Set the top level linktree up.


array_unshift($context['linktree'], array(
'url' => &$scripturl,
'name' => &$txt['forum_name']
));



the top level linktree thingie would work the way it's was meant to and thus complete the localization of the forum title.

That's about it, I think.

There was one other thing I discovered while searching through files for things.  There was an instance of $context['forum_name'] without the quotes around forum_name.  That was discovered after having done a search and replace on it.

metallica48423

what theme is it?  I can see if its a default problem with the theme.

SO did that work out for you? :)
Justin O'Leary
Ex-Project Manager
Ex-Lead Support Specialist

LainaaMicrosoft wants us to "Imagine life without walls"...
I say, "If there are no walls, who needs Windows?"


Useful Links:
Online Manual!
How to Help us Help you
Search
Settings Repair Tool

Advertisement: